ご注意
※長文注意です(^^;※あくまでも個人の実験に基づいた結果です。メーカー等に確認したものではないので情報の扱いにはご注意ください。
※なお、自己責任において実行してください。機器が壊れても当方は一切、責任を負いません。
はじめに
Amazonなどで販売されている格安デジタルダイヤルゲージ(Digital Dial Gauge = DDG) やデジタルノギスの測定値を外部から読み取る方法をメモしておきます。ここで取り扱うのは、中華製と思われる格安の静電容量式のデジタル測定器で外部出力ポートを持つものです。デジタルノギスでは数種類ありますが、中身は同じで出力されている信号も同じものと思われます。
操作ボタンとして、mm/inch切り替え、電源ON/OFF、ZERO合わせの3つのボタンが付いています。
なお、有名メーカーの高級品にも同じように外部出力をサポートしているものがありますが、そちらは扱いません。
デジタルダイヤルゲージ
ハードウェアの測定原理ですが、位置検出はセンサー電極の静電容量変化を読み取り位置を計測する方式のようです。タッチパネルの原理と同じです。市販されているものは、0.001mm精度で計測できるものがありますが、やや精密さには欠けていると感じます。が、個人用レベルでは十分でしょう。
下記の内容は全て、0.001mm精度の格安デジタルダイヤルゲージを使って計測しています。
ダイヤルゲージ機能
使用したデジタルダイヤルゲージは0.001mm精度の物です。インジケータ部分はプラスティックですが、測定子周辺はケースを含め金属製で重量があります。
計測表示反応はパラパラと表示する感じですが、外部出力されるデータはほぼリアルタイムに反応しています。
mm/inch切り替えは測定単位を切り替えます。デフォルトはmmのようです。
ZERO合わせは現在の測定子位置をゼロ合わせます。
電源ON/OFFですが、この類のDDGはOFF時の数値を記憶せず、ONするたびにゼロリセットされます。
制御方法
DDGの外部ポートは4端子になっていて、電源とGND, Clock, Data の4本が出力されています。信号線 (Clock, Data)
Clockは定期的に24ビットの周期パルスを出力しています。パルスの立ち上がりエッジに合わせてDataに計測データビットが出力されています。DataはClockに同期した24ビットのシリアルデータが出力されます。DDGの計測値、符号、単位の情報が含まれます。
信号線の電圧はHI=1.5Vとなっているので、一般的なマイコンへ入力するには電圧が足りません。レベルシフタなどを使ってマイコン入力レベルへ変換を行う必要があります。
内部回路はすべて1.5Vです。
電源 (+1.5V, GND)
DDGはボタン電池(LR44)1.5Vで駆動していますが、その電圧が出ています。電池端子に直結しているので、ここから1.5Vの外部電源を供給することができます。
静電容量式であるためか、電源ノイズには非常に弱く、不安定な電源だと測定値が暴れます。
信号線の出力の様子をオシロで観察してみます。
Clockは24ビットのパルスが周期的に流れてきます。
周期の間隔は、図を見るとだいたい120ms周期で24ビットのパルスが出力されていることが分かります。
そのClockに同期する形でDataが出力されています。24ビットのパルス幅はおおむね10msくらいです。
拡大するとClockパルスの立ち上がりでDataを読むとビットデータが取れそうです。
この辺りは、ここで解析されている内容と全く同じです。
https://hackaday.io/project/511-digital-dial-indicator-cnc-surface-probe
デジタルノギスの外部ポートも同じような出力になっているものが多く、ハック事例も多いので参考になります。
Data列の解析
24ビットパルスが流れてきます。ビット列は測定値とステータスに分けられます。ビット列はデータの下位ビット(LSB)から順に流れてきます。
測定値は1~20ビット目、ステータスは21~24ビット目になります。
ステータスのうち、21ビット目が符号情報(0 = プラス, 1 = マイナス)
24ビット目が単位(0 = mm, 1 = inch)に割り当てられています。
測定値は20ビットの実数形式になります。
操作ボタン
mm/inch切り替え、電源ON/OFF、ZERO合わせの3つのボタンですが、回路上、内部のマイコンのデジタル入力に直結しているようです。デフォルトHiで、Lowになるとボタンが押されたことになります。
よって、ボタンに接続している信号線を引き出せば外部マイコンからもスイッチ制御できます。
実験回路
Arduino Nanoを使って図のように配線します。
Nanoからの5Vをレギュレータで1.5Vに落としてDDGへ供給します。今回は必要電流も非常に小さいのでLM317LZを使用しました。他のLM317シリーズ互換品でも構いません。
信号線の1.5V <-> 5V の相互レベルシフトに格安のレベルシフタを用いています。SparkFunのコピー品のようでBSS138互換品らしく、1.5Vに対応しているか不明でしたが何となく動いています。もし、きちんとした動作範囲を保証するなら、NTB0104を使ったものの方が確実です。
DDGへはそれぞれ対応したラインへ合計6本配線します。
Arduino側から見ると、Clock, Data はINPUT、ON/OFFボタン, ZEROボタンはOUTPUTになります。
テストプログラム
プログラムのサンプルをここに置いておきます。Arduino IDEを使って書き込んでください。シリアル出力に計測値が出力され続け、測定子を動かすと数値が変化します。
プログラムはArduinoのハードウェア割り込み(INT0)を使用しています。
処理方法は単純にClockの立ち上がりエッジで割り込みがかかり、その時のDataをビット値として記録していきます。
24ビット読み切ったところで、符号判定を行い計測数値として確定させます。
ビット列の開始判定ですが、ビット列は120ms毎に送られ、かつ、ビット列の長さが10ms程度であることから、前回割り込みがかかった時間と今回割り込みの時間を比較し、その時間差が50ms以上であれば、ビット列が開始されたと判断しています。
開始されたら、続く24ビット分を有効ビットとして読み込みます。
実行させると、Arudino IDEのシリアルモニタに現在値が出力され続けます。
データ値はリアルタイムで取得できます。
また、HW割り込みを使っているので、loop処理に邪魔されることなく計測値を取得できます。
ON/OFFボタン、ZEROボタンの制御は、ピンをLowにすればそれぞれのボタンが操作された時と同じ動作をします。
プログラムでは、Clockによる割り込みが一定時間発生しなかった場合、電源OFF状態と判断し電源ONを実行しています。
問題点
このDDGですが、計測器として制御する上で少し問題があります。計測値が変化しないまま5分放置していると、オートパワーオフが働いて電源がOFFになってしまいます。
それだけならば、ON/OFF制御で再ONにすればいいのですが、OFF時の値が保存されずゼロに戻ってしまいます。つまり確実に絶対位置を取得できるとは限りません。
対策としては、ゼロリセットされない方法を考えるか、オートパワーオフを無効にするかの2つが考えられますが、残念ながらどちらもDDG内部マイコンの制御によって行われているので機能を切ることができません。
今のところ有効な手段が見つからないため、絶対位置の記憶は自前で実装するしかありません。
幸い、ON/OFFとZEROリセットは制御できるので、DDGの計測値はゼロから移動した距離として考え、絶対位置を計算する方法が考えられます。
のりきゅう様、こんばんは!
返信削除大変興味深いことをされていますね。
もし、ZEROリセットでOFFまでの時間が延長されるのであれば、動作しなくなって数秒、から十数秒程度で位置を自前で記憶してリセットし、動作した場合そこからのオフセットを自前で表示というのを繰り返せば良さそうですね。
オシロスコープの画像も拝見させて頂きましたが、文字が小さいこと以外は良さそうですね。私が気になるのは文字サイズですが・・・(@。@;
情報ありがとうございました。
そうですね。
削除移動させる毎の移動量として扱えば、フォーカサー内部での絶対位置は管理できるのでその方法をとっています。
今はどの筒にもドローチューブの長さを計測する仕組みはありませんが、機器の自動制御が主流になってくるとこういった仕組みも組み込まれていくでしょうね。