エクセルVBAからシリアル通信で連続計測を行う

連続計測概要(動画)

 エクセル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 コマンド 内 容
TEST 1回計測を行い、次の形式で結果を返信する。
成功時 ”OK:”+[計測値]
失敗時 ”NG: OUT OF RANGE”
AVRG 連続的に10回計測し、次の形式で結果を返信する。
成功時 ”AV:”+[計測値],[計測値],・・・・・・・,[計測値]
失敗時 ”NG: OUT OF RANGE”
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と通信する方法について知りました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です