連続計測概要(動画)
エクセルVBAから、ステッピングモーター位置決め用とレーザー式測長センサー(AE-VL53L0X )制御用の2台のARDUINOにそれぞれシリアル通信し、連続計測する処理を行っています。
次の動画ではスライドテーブルが10mmづつ移動し、停止時に左端のクマ模様の箱までの距離を測長します。各測定ポイントでは10回計測を行い、平均値をグラフ化します。
次の写真はレーザー式測長センサーとクマの箱の位置関係を示すものです。グラフは原点復帰位置(写真位置)が0mmとなる様に換算表示しています。
接続・構成
機器構成は下の写真の通りです。エクセルVBAからコントロールは私の環境では、スライダーの位置決めに“COM4”ポート、レーザー式センサーの計測に“COM3”ポートを介して各ARDUINOにコマンドを送信し実行します。幾つか関連する確認も行っていますので、不要な配線もあります。
次の図はエクセルがある PC側 とARDUINOの接続図です。
レーザーセンサー計測プログラム
レーザー式測長センサー(AE-VL53L0X )制御用のARDUINOプログラムを示します。AE-VL53L0X のサンプルプログラムにパソコンとの通信プログラムを追加しました。
#include "Adafruit_VL53L0X.h" Adafruit_VL53L0X lox = Adafruit_VL53L0X(); void setup() { Serial.begin(9600); while (! Serial) { delay(1); } if (!lox.begin()) { while(1); } } void loop() { if ( Serial.available() > 0 ) { // \r(CR), \r\n(CR+LF) ,\n(LF) String str = Serial.readStringUntil('\n'); if ( str == "TEST") { VL53L0X_RangingMeasurementData_t measure; lox.rangingTest(&measure, false); // pass in 'true' to get debug data printout! if (measure.RangeStatus != 4) { // phase failures have incorrect data Serial.print("OK:"); Serial.println(measure.RangeMilliMeter); } else { Serial.println("NG: OUT OF RANGE"); } } else if( str == "AVRG" ){ Serial.print("AV:"); for(int i=0; i<10; i=i+1) { VL53L0X_RangingMeasurementData_t measure; lox.rangingTest(&measure, false); // pass in 'true' to get debug data printout! if (measure.RangeStatus != 4) { // phase failures have incorrect data Serial.print(measure.RangeMilliMeter); } else { Serial.print("NG: OUT OF RANGE"); } if(i < 9){ Serial.print(","); delay(50); } } Serial.println(""); } else if( str == "CHCK" ){ Serial.println("READY TO GO"); } else { Serial.println("NG: [" + str + "]"); } } delay(100); }
パソコンからの送信コマンドは下記です。(COM3)
No | コマンド | 内 容 |
1 | TEST | 1回計測を行い、次の形式で結果を返信する。 成功時 ”OK:”+[計測値] 失敗時 ”NG: OUT OF RANGE” |
2 | AVRG | 連続的に10回計測し、次の形式で結果を返信する。 成功時 ”AV:”+[計測値],[計測値],・・・・・・・,[計測値] 失敗時 ”NG: OUT OF RANGE” |
3 | CHCK | 通信可能状態かをチェックする。 成功時、”READY TO GO” を返信する。 |
エクセルVBAプログラム
ステッピングモーター制御は下記に投稿していますので、連続計測部分のみのVBAプログラムを掲載します。
① ARDUINOでのGRBLの使い方
② エクセルでステッピングモーター位置決め
Private Sub CommandButton6_Click() Dim sht Dim res Dim pos_X Dim G_CD As String Dim ln_CNT Dim ii Dim res_s Dim tmp As Variant sht = ActiveSheet.Name Worksheets(sht).Range("H11:Q31").ClearContents ln_CNT = 0 Do pos_X = Trim(Worksheets(sht).Cells(11 + ln_CNT, 3).Value) If pos_X = "" Then Exit Do G_CD = "G90G0X" & pos_X res = StartSerialComm(G_CD, "COM4") Do DoEvents res = StartSerialComm("?", "COM4") If InStr(res, "Idle") Then Exit Do End If Loop Sleep (200) res = StartSerialComm("AVRG", "COM3") res_s = Replace(res, "AV:", "") tmp = Split(res_s, ",") For ii = LBound(tmp) To UBound(tmp) Worksheets(sht).Cells(11 + ln_CNT, 8 + ii).Value = tmp(ii) Next ii DoEvents ln_CNT = ln_CNT + 1 If ln_CNT >= 25 Then Exit Do Loop MsgBox "連続運転完了(" & Trim(Str(ln_CNT)) & ")", vbOKOnly End Sub
行番17~53 の Do ~ Loop の間でスライダーの移動と計測を繰り返し行います。
行番24でCOM4を指定し、Gコード送信し、行番26~35 の Do ~ Loop 処理で移動完了を待ちます。行番39でCOM3を指定し、10回計測コマンドを送信します。結果はカンマ( , )区切りで返信されるので、行番41で先頭の “AV:” 部を除去し、行番43で tmp(配列) にカンマ区切りの文字列を分割後、格納します。行番45~47では配列の計測結果をエクセルシート上に書き出しています。この様に0~200(mm) の間を10mm 間隔で繰り返し計測します。
書き出した計測結果の平均値,最大値,最小値,グラフ等は、予め表に設定したエクセルシート関数やリンクによって自動的に実行されます。
まとめ
エクセルVBAから、2つのシリアルポートを使って、2台のARDUINOと通信する方法について知りました。