google-site-verification: google3bd66dd162ef54c7.html

デジタルノギスのデーターをArduinoで読んでみた

 Arduinoのプログラムの勉強を兼ねて、格安のデジタルノギスに付いているインターフェイスの信号を読み出すプログラムを作ってみました。

 ちなみにネットを調べるとDROという名前で先人の方の作例がいろいろ出てきますが、PICを使ったものばかりでArduinoでやった例は見つかりませんでした。

 ノギスからは1.5Vの電圧信号でクロックとデーターが出てくるのでArduinoで受信できるようにトランジスタでインターフェイス

▼接続回路
デジタルノギスの読み取りインターフェイス
 なんだかいつもよりサイズがでかい。なんでだ、

 Arduino側でプルアップしているので単にコレクタをデジタルI/Oに接続するだけです。
 R1とR2の抵抗はあまり低くするとノギスからシンクする電流が増えて電池寿命に影響。はたまた、高すぎるとノイズに弱くなるので悩ましいところですが、こんなもんでしょう。この回路を通ると論理が反転します。

▼信号波形
デジタルノギスの出力波形
 新しく買った古いオシロ(*^_^*)なので写真の撮り方がへたくそですみません。

 上がクロック、下がデータで、約230mS周期でこんな波形が出てます。データーの間隔は150μSくらいなのでArduinoでも間に合いそうです。

 データのフォーマットは、先人の方が解析した資料によると、
・先頭から20ビットがデータで先頭側がLSB
・21ビット目が符号で、1なら負の数値を示す
・22ビットから24ビット目まではよく判りませんが、24ビット目はインチ/mmの表示に使われているらしいです。ただ、この個体は切り替えスイッチが無いので確認できてません。

 読み込みソフトは、

 データの読み込みはクロックのエッジで行うので、エッジトリガの割り込みを使った方が正確なタイミングで取り込むことができると思います。しかし、寸法測定するようなプログラムなら同時にメカの制御もやる可能性が高く、そちらの方で割り込みが必要になる可能性が高い。ということで割り込みは使わないでやってみました。

 ソフトの動きとしては値の取得は関数呼び出しで行い、戻り値として測定結果を10μ単位の値で返す仕様です。150mmのノギスなので戻り値はおよそ±15000の範囲、ならば変数はintで大丈夫です。

 スケッチはこちら(拡張子はTXTになってます)
 勉強中の新米が作っているので変なところはご容赦を。

 動作確認用に液晶シールドとシリアルポートに測定結果をたれ流すように作ってあります。

▼動作中
デジタルノギスのデータをArduinoで読めた
 うまくいってます。液晶の表示はノギスとフォーマットが一致するようゼロサプレスなどをやってます。

 ノギスのデータやクロックピンをプルアップすると高速モードに切り替わるらしいのですが、今回は試してません。

 ということで、読み込みソフトはそんなに苦労しなくて出来ました。Arduinoにほぼリアルタイムで10μmの精度の位置データが取り込めると何か応用がありそうです。

 ただ、このノギスのデータが時々5mm飛ぶのが残念。こんな不良品を掴まなければアマゾンすげーと書いたんだけどなー。

【2016/2/23追記】
 二軸用のスケッチを書いてみました。20160223XYcaliper.txt
 簡単に二軸化するため、効率の悪いプログラムになっています。また、コンパイラは通ってますが、デバッグ用の環境が無いので動作確認までやってません。そういうことで、不具合があったらすみません。なお、digitalの8,9にも上の回路図の回路が必要で、これがY軸になります。
関連記事

tag : デジタルノギス 格安 Arduino DRO 読み込み 関数 インターフェイス

コメントの投稿

管理者にだけ表示を許可する

こんにちは

ノギスはミツトヨをアナログチックに使ってますe-263
最近はバーニヤが読めない若い衆が増えて辟易
アマゾンは世界中からガラクタを収集してくれます
世界中・・・ガラクタはほぼ隣国ですけど
私の専門は元々熱可塑性プラスチックなのですが、隣国
の成型技術はお話しになりません。
だって、すぐ壊れちゃうんだもん
Q.C. PASSEDのシールが虚しい

オールトの雲さん、おはようございます

ミツトヨ、いいですよね。仕事に使うならこれ以外考えられないでしょう。
あと、アマゾンにもガラクタがあるんですね。いい勉強になりました。

ちょうど作りたかったものが

ラジオペンチさん、参考にさせていただきます。

ミツトヨのインプットツールは高いので、自作で作ってみたいなと一昨日思い立ち、とりあえずアマゾンでデジタルノギスを買った後にこのページを発見。

もうできたも同然です。

ああ、ありがたや・・・・。

re:ちょうど作りたかったものが

みつおさん今晩は。
この記事を発見していただいてありがとうございます。

念のために、記事中のスケッチを現在のArduino IDE(1.6.5)でコンパイルだけやってみましたが、エラーは出ませんでした。

ありがとうございます。

こちらの記事を見て何とかarduinoでノギスの出力を取り出せました。
ありがとうございます。

もしよろしければですが、2本のノギスを同時に表示する方法を教えて頂けませんか?
X軸とY軸の様に2行に表示したいのですが・・・

本当によろしければですが、アドバイスをお願い致します。

re:ありがとうございます。

ともさんおはようございます。この記事の内容を試していただいてありがとうございます。

X-Yテーブルで使いたいということですね。それだったら、読み出しと表示を2軸に対して順番にやればいいと思います。

回路をばらしてしまったので、うちではもう試すことが出来ませんが、今あるのがX軸として、Y軸を追加する想定でポイントを書くと、

ピン8と9をYのクロックとデーターピンとして配線。

スケッチは、変数を以下のように定義。
int clockPinX = 6; // Xクロック入力ピン番号(Trで反転)
int dataPinX = 7; // Xデータ入力ピン番号(Trで反転)
int clockPinY = 8; // Yクロック入力ピン番号(Trで反転)
int dataPinY = 9; // Yデータ入力ピン番号(Trで反転)

あとはメインループでX軸、Y軸の処理を順番にやればいいです。プログラムの行数を減らすテクニックはいろいろありますが、ここは単純にX軸用とY軸専用の関数を準備し、以下のように呼ぶのが判り易いと思います。

void loop() {
data = ReadCaliperX(); // ノギスからX軸データを読む
lcddispX(data); // 液晶に書いて
Serial.println(data); // シリアルに書き出し

data = ReadCaliperY(); // ノギスからY軸データを読む
lcddispY(data); // 液晶に書いて
Serial.println(data); // シリアルに書き出し
}

 ここでReadCaliperY()や、lcd.dispY( )の関数は元の関数をコピペで複製して作り、ピン番号などの変更部を修正すれば楽に出来ると思います。液晶にX Yなどと軸の名前を表示させるとかっこいいでしょうね。

がんばってください。判らない点があればコメント下さい。

re:ありがとうございます。

ラジオペンチさんこんばんは。

ご回答ありがとうございます。

void loop() {
data = ReadCaliperX(); // ノギスからX軸データを読む
lcddispX(data); // 液晶に書いて
Serial.println(data); // シリアルに書き出し

data = ReadCaliperY(); // ノギスからY軸データを読む
lcddispY(data); // 液晶に書いて
Serial.println(data); // シリアルに書き出し
}
の部分ですが、”data”にX/Yの指定文の様な物は要らないのでしょうか?
lcddispX(data); の部分でもXやYを入れるとエラーが出ます。

また上記の部分はセットで書いてもX/Y軸は別々の数字を表示できるのでしょうか?

僕は素人で、昔高校でベーシック言語を少し学んだ程度ですので、ハッキリ言って、まだまだ言語や関数を理解できていません。が、周りにも分かる人が居ない為、独学で必死で勉強中です。

よろしければ、もう少しアドバイスを頂きたいです。
お願い致します。

re2:ありがとうございます。

ともさん、おはようございます。

あれこれ説明するよりプログラムを改造する方が早くて、間違いが無いので、二軸用のスケッチをこの記事の後ろの方に追記しました。ダウンロードしてお使い下さい。うまく動くかちょっと心配です。少し修正が必要かも知れません。

URL直書きだと下記です、
http://blog-imgs-88-origin.fc2.com/r/a/d/radiopench/20160223XYcaliper.txt

re2:ありがとうございます。

ラジオペンチさん、おはようございます。
早々のご返信ありがとうございます。
またわざわざスケッチまでアップして頂きありがとうございます。

二軸用のスケッチが何故かループしません!?
リセット後のX軸の値だけは表示されるのですが・・・
因みにまだ1本しかノギスを繋いでいないからかもしれません。
デジタルノギスで改造・研究に使えるのがまだ1本しかない為、早急に買い足します。

それから、X軸が表示されてからリセットされる前に8・9ピンに繋ぎなおすとY軸も追加で表示されました。
ですが、やはりループはしていないようです。

あぁ!ラジオペンチさんの様な頭脳が欲しい。
今からでも小学生くらいからやり直したい!
僕の貧弱な脳みそでは無理なのかな・・・

もう少し頑張ってみます。


re3:ありがとうございます。

ともさん、了解です。

このプログラムはノギスからの信号が来なければずっと待っているので、その動作でうまく行っていると思います。ちなみに、信号が来なければ無視するようにプログラムを作るのはやっかいです。

あと、8,9ピンに繋ぐとY軸側で表示するということは、問題なく動いていると思います。

re3:ありがとうございます。

ラジオペンチさん、こんばんは。

的確なアドバイスを頂き有難う御座います。
よく考えたらブレッドボードで同じdatapinとclockpinを2本に分ければ1本のノギスで仮想2本分入力できる事に気付き、6,7と8,9に入力してみたら、やはり読み込みのタイムラグは有るものの、ちゃんとX,Y軸で表示されました。

素晴らしいです。
完璧です!

ラジオペンチさん有難う御座います。
凄い方ですね!

これで、僕のホビーライフも便利に成るかと・・・

あと分かればで良いんですが、最後に教えて下さい。
ノギス側のハード面は変えずに、arduinoからタクトスイッチで各軸リセット(ZEROボタン)は出来そうでしょうか?

書いて頂いたスケッチを見ると”int n, outData;”の”n”にでーたを保存すると言う事なのかなと思っているのですが、ボタンを押した時の寸法データに同じ数だけマイナスする様な関数を入れれば可能なのかな!?と思っているのですが、そんな簡単な事では無いのでしょうか?

お時間が有る時で大丈夫ですのでアドバイスを頂けたらなって思います。
お願い致します。

re4:ありがとうございます。

ともさん、おはようございます。

現在位置でゼロ表示にする方法ですか。これはいろんなとこ直さないといけません。操作性をどれくらいで妥協するかということもあります。

やり方としては、オフセットの値を記憶する変数を最初に定義し、
int offsetX = 0;

setupの中でピン14(アナログ0)をZEROボタンとして定義
pinMode(14, INPUT_PULLUP);

あとは、このボタンが押されていたら(14ピンがGNDに接続されていたら)offsetXに現在値を記録すればいいので、loopの中でこんな感じにやるのが簡単だと思います。
void loop() {
if(digitalRead(14) == LOW){
offsetX= readCAliperX();
}
data = ReadCaliperX(); // ノギスからデータを読む
lcddispX(data-offsetX); // 液晶に書いて
以下省略

}
これは X軸だけ書いてます。細かい間違いがある可能性があります。
あと、このやり方だと表示がゼロになるまでボタンを押し続けないといけないので操作性が悪いと思います。ちょんとボタンを押すだけで済む方法もありますが、かなり面倒です。

ということで、この先はがんばってください。

re4:ありがとうございます。(追記)

よく考えたら、こっちの方がいいです。

void loop() {
data = ReadCaliperX(); // ノギスからデータを読む
if(digitalRead(14) == LOW){ // 14ピンのスイッチが押されていたら、
offsetX= data;
}
lcddispX(data-offsetX); // 液晶に書いて
以下省略

re4:ありがとうございます。(追記)

ラジオペンチさん

おはようございます。
まず最初に書かせて下さい。

本当に有難う御座います。

ハッキリ言って楽しいです。
自分で書いたスケッチでは無いものの、目の前で小さな部品に命が吹き込まれて行く様な感じで・・・

追記を頂く前のスケッチでも何も問題無く動いていましたが、追記分を見て試してみて、こちらも問題無く作動しています。
何がどのように違うのか、順番が少し変わっただけの様に思いますが、僕の脳ミソのキャパでは分かりません。

もしラジオペンチさんが近くにお住まいなら色々とお話しして教えて頂きたい事も有るのですが、これ以上ご迷惑をお掛けできませんので、今はこれ以上求めません。
色々な方のブログ等を見て来ましたがラジオペンチさんの事を信頼して質問させて頂きました。
やはり間違いでは無かったと思っています。

有難う御座いました。

また今は少し大きな事に挑戦しておりますので、分からない事が出て来ましたら、その時はまたアドバイスを頂けたらなって思います。

re5:ありがとうございます。(追記)

ともさん、おはようございます。うまくいったようで良かったです。

ポイントだけ書いたので判り難かったと思いますが、あの文章を読んでプログラムの修正が出来れば、もう初心者のレベルは脱していると思います。

あと、追記の方がReadCaliperX(); を呼ぶ回数が少ないのでコンマ何秒かは速く動くはずです。

Dueでも

ラジオペンチさん

おはようございます。
いえいえまだまだ始めたばかりで初心者の域を脱しておりません。

先日、「少々大きな事!」と書いていましたが、「4軸+タコメーターを大きなTFT液晶に表示する!」と言う最終目標で挑戦していました。

4軸までは16x2の液晶シールドで表示("mm"を省いて)できたのですが、流石に4軸分となるとタイムラグが酷くなりとても使えるレベルでは無くなりました。

まぁでもこの辺りは予想できたので、先走ってDueを注文していました。

4軸なのでMega2560でまず配線とスケッチを確認し、やはりラグが酷かったので、Dueの84MHzだとかなり改善するかと思っていましたがほとんど変わりませんでした。

もちろん色々調べてMegaでもAVRとかって書き方で高速化するらしいとは知っていたのですが、この辺りはもう今の僕には手の出しようがないレベルで着いていけません。

で、Due様のお力をお借りしようかとやってみた次第です。

これは処理速度とは関係の無いところなのでしょうか?

それから、Due様の場合、ピンの出力がデフォルトでHIGHだという違いが有るのも知っていたのですが、そのせいなのかノギス本体側が0㎜辺りで液晶シールドには-14000位の数値をチラチラ表示します。

これは何なのでしょうか?

またまたご迷惑をお掛け致しますが、お時間のある時にでもコメント頂けましたら幸いです。

因みに、TFTは秋月からDue様対応の評価ボードと、安い4.3インチのを買ってみましたが、全く歯が立たず5時間ほど途方にくれました。(笑)

ただ何とかサンプルスケッチの表示までは出来ました。

40過ぎて始めたので、急がないと脳の細胞が42%程壊死しているので頑張ってみたのですが、まだまだ随分と早過ぎたようです・・・。

re:Dueでも

ともさんこんにちは。

 おやりになりたいことはおぼろげに判りました。でも私、DueやMegaなどは使ったことが無いし、今後もたぶん使わないので、アドバイスは無理です。何しろSMTパッケージのCPUはチップ単体で使うことが難しいので、触る気がしません。

 ということで、一般論のアドバイスだけしか出来ません。

 このケースでの動作速度はノギスから来るデーターの速度で決まっているので、CPUをいくら早くしても効果はありません。ノギスが一つだとたぶん約0.23秒周期でデータ取り込みが出来ます。でも、二つあると、おのおのが独立したタイミングで動いているので、タイミング合わせのために2倍以上(たぶん平均3倍)の時間がかかるはずです。

 それで、考えられる対策は以下の二つだと思います。

1.ノギスからのデーター転送速度を早くする
 この記事にもちょっと書いておきましたが、高速転送モードで使えばたぶんデーターの転送速度は10倍以上速くなるはずです。
 この場合、プログラムの中でタイミング調整やっているところの値は最適値を探す必要があります。また、高速モードに設定するために、ノギスのピンを一時的にプルアップする回路も必要です。
 このあたりをやられた先人の方が何人かいらっしゃったと思います。(PICだったこも知れません)

2.並列に読み出す
 複数のノギスのデーターを同時に読み出すプログラムを作れば、軸の数が増えても処理時間はほとんど増えないはずです。やるとしたら割込みを使うことになると思いますが、かなり難しいプログラムになりそうです。

 ということですみません、アドバイスは無理で、コメントしかお返しできません。

re:Dueでも

ラジオペンチさんこんにちは。

ご返答有難う御座います。

一般論のアドバイスの部分だけで、僕の知らなかった事が沢山有りましたので、良い勉強に成りました。

当記事を見させて頂いて、対策1.ノギスからのデーター転送高速化は試していたのですが、何故か上手くいきませんでした。
pinModeでINPUT_PULLUPを使っているからかもしれませんね、またもう一度試してみます。

あと最後にもう一つ、ノギス4本→arduino4個→arduino1個→TFT液晶と言う形で有れば1つの液晶にノギス4本分の表示は理論上出来そうですか?

7セグ(1行のLCDのも含め)で3軸の物などは、某国製のが安く買えるので興味が有りません。

宜しくお願い致します。

re2:Dueでも

ともさん今晩は。

ノギスの高速転送モードの設定はこの記事の回路だけでは出来ないです。ノギスのデーターやクロックの端子をノギスの電源電圧までプルアップすることが必要で、たぶん別のポートを使って、回路を追加して操作する必要があるはずです。ひょっとしたらうまい手があるのかも知れませんが、

ともかく普通にやると4軸に各4ポート必要なので、合計16ポートが必要。LCDまで使うとUNOではピンが足らなくなりますね。ノギスの高速設定はまとめて出来そうな気がするので、ここはポートが一つか二つで出来る可能性もあると思います。

>ノギス4本→arduino4個→arduino1個→TFT液晶と
これが理論上できるかどうかと言われても困ります。情報理論ならYesですが、そんなことお尋ねじゃないですよね。

私の意見は、Arduino1個で受けるところが厄介だし、ここで苦労してもあまり報われない気がします。どうせなら、Raspberry Piなどで受けてかっこいい液晶表示をやった方が良さそうな気がします。

re2:Dueでも

ラジオペンチさん今晩は。

やはりそうですよね。
物が無い状態でややこしいこと聞かれても困りますよね。
すみません。
反省してます。

ただRaspberry Piって小さいPCのイメージが強く触った事なくて、この様な場合に自分のイメージの物を作れるのか分からなかったんですが、こういう事も出来るんですね!?
一度触って勉強してみます。

色々と教えて下さって有難う御座います。

ラジオペンチさんのおかげで随分と勉強に成りました。
と言いますか、Raspberry Piを使うって発想が無かったんで、良い事に気付かせて頂きました。
有難う御座いました。

これ以上ご迷惑をお掛けする訳にもいないので、ここからはまた自力で頑張ります!
カレンダー
07 | 2017/08 | 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
プロフィール

ラジオペンチ

Author:ラジオペンチ
電子工作を中心としたブログです。たまに近所(東京都稲城市)の話題など。60過ぎて視力や器用さの衰えを感じつつ日々挑戦!
コメントを入れる時にメールアドレスの記入は不要です。なお、非公開コメントは受け付けていません。

記事が気に入ったらクリックを!
最新記事
カテゴリ
最新コメント
リンク
FC2カウンター
検索フォーム
月別アーカイブ
RSSリンクの表示
QRコード
QRコード