レーザー測定距離センサーを試した

海底写真

買ってみた測距センサーの条件は以下のものです。

  • UART 5V通信
  • 耐水
  • ケーブルがあるもの
  • 安価

いろいろ探していて、Wit MotionのWT-VL53R-TTLという製品を入手しました。
ただし、提供されるソフトウェアはバグだらけで使い物にならないようです。とくに設定を変えると指定どおりにならず、あの世へ飛んでいきます。
せっかく買ったセンサーを設定がおかしくなっただけで諦めたくはありません。
WIt Motionのサポートに連絡したら、かなり親切でした。
16進数を送受信するツールをくれて指示どおりのコマンドを送って、なんとかリセットできました。
いろいろやっていて変更できたのは、デフォルトではサンプリング速度20Hzですが、なんとか2Hzにはできました。
このセンサーには「距離が◯◯になったらアラームを上げる」という便利な機能がついているのですが、他のセンサーを使うかもしれないので今回は測距データから判断することにします。

このセンサーを上のボードに繋いでなんとか測距データが出るように書いてみた習作は次のとおりです。通常のシリアルも文字を書き込めばエコーされます。


#include <SoftwareSerial.h>

#define RX_PIN 9
#define TX_PIN 10
#define BUFFLEN 50

SoftwareSerial dSerial(RX_PIN, TX_PIN);

char cStr[BUFFLEN];
unsigned short usCnt = 0;

void setup() {
  // Serial baud rate 9600bps
  Serial.begin(9600);
  delay(200);
  
  // dSerial.begin(9600);
  // dSerial.begin(19200);
  // dSerial.begin(38400);
  // dSerial.begin(57600);
  dSerial.begin(115200);
  dSerial.flush();
  
  delay(200);
  Serial.println("Serial/Software Serial Ready.");
}

void loop() {
  // Echo back string
  if (Serial.available() > 0){
    String data = Serial.readString();
    Serial.print("Echo: ");
    Serial.println(data);
  }
  
  while (dSerial.available())
    {
      cStr[usCnt] = dSerial.read();
      usCnt=usCnt+1;
      // 距離が信頼できるか? 0ならOK他なら疑わしい
      if ((cStr[0] == 'S') && (cStr[1] == 't')&&(cStr[2] == 'a') )
      {
        if ((cStr[usCnt-2] == ' ') && (cStr[usCnt-1] == ','))
        {
          int state;
          sscanf(cStr, "State;%d ,", &state);
          Serial.print("State:");
          Serial.println(state);
          usCnt=0; // reset counter 
        }
      }
      else if ((cStr[0] == 'd') && (cStr[1] == ':'))
      {
        if ((cStr[usCnt-2] == '\r') && (cStr[usCnt-1] == '\n'))
        {
          int distance;
          sscanf(cStr, "d: %d\r\n", &distance);
          Serial.print("Distance:");
          Serial.print(distance);
          Serial.print(" mm");
          Serial.print("\r\n");
          usCnt=0; // reset counter
        }
      }
      else if (usCnt > 2) {
        usCnt=usCnt-1;
        memcpy(&cStr[0], &cStr[1], usCnt);
      }
    }

} 

出力はこんな感じです。なんとミリメートルで出るんですね。

なお、statusは大事で0でないと正しく測定できていません。
数メートルなら正確なのですが、極端に距離が近い、極端に遠い場合、数値は信頼できません。

使ってみた感想ですが、やはり海底といういろんなモノがあるところでは安定しません。
固体との距離を測るにはよさげで、接近センサーなどには使えそうですが。。。

水深は水圧計が正確なようです。
別に観測用機器を見るとやはり水圧で深度を測定しています。

タイトルとURLをコピーしました