AI要約
ArduinoとVL53L0Xレーザー測距センサーを用いて距離測定に挑戦。配線の解説と、検出範囲を調べる実験も行いました。
やること
ロボットの衝突防止のために近接センサーを導入するぞ、の第2弾です。
秋月電子で1200円程度で買える「レーザー距離センサーモジュール」を試してみます。
材料
VL53L0X使用 レーザー測距センサーモジュール(ToF)
VL53L0X使用 レーザー測距センサーモジュール(ToF): 計測器・センサー・ロガー 秋月電子通商-電子部品・ネット通販
電子部品,通販,販売,半導体,IC,LED,マイコン,電子工作VL53L0X使用 レーザー測距センサーモジュール(ToF)秋月電子通商 電子部品通信販売
2個買ったのですが、一台のArduinoで2個起動するのがかなり難しかったので1個だけにしました。I2C通信の難しさだと思います。

マザーボード用のビープスピーカーも接続しました(前回参照)。
接続
VCCを5V、GNDをArduinoと共通のGNDに接続します。他にSDAとSCLをArduinoのアナログピンA4, A5に接続。A4, A5はI2C通信用の指定席です。センサー1個の場合はXSHUTとGPIO1は使用しないようです。
| Arduino | センサー |
|---|---|
| A4 | VL53L0X SDA |
| A5 | VL53L0X SCL |
| D11 | ブザー + |
| GND | ブザー - |
センサーモジュールは適当な木の板にネジで固定しました。

コード
こんな感じです。
#include <Wire.h>
#include <VL53L0X.h>
//ブザーピン
const int buzzerPin = 11;
//検出しきい値[cm]
const float THRESHOLD_CM = 10.0;
//VL53L0Xオブジェクト
VL53L0X sensor;
void setup() {
Serial.begin(9600);
Wire.begin();
Wire.setClock(100000);
//センサー初期化
sensor.init();
//タイムアウト[ms]
sensor.setTimeout(10);
//ブザー初期化
pinMode(buzzerPin, OUTPUT);
digitalWrite(buzzerPin, LOW);
}
//センサーで距離[cm]を測る関数
float measureDistanceCm() {
//計測[mm]
uint16_t distanceMm = sensor.readRangeSingleMillimeters();
//タイムアウト、0や非常に大きい値は-1.0を返す
if (sensor.timeoutOccurred() || distanceMm == 0 || distanceMm > 4000) {
return -1.0;
}
//変換[mm]→[cm]
float d = distanceMm / 10.0;
return d;
}
void loop() {
//距離[cm]
float distanceCm = measureDistanceCm();
//検出結果
bool isNear = (distanceCm > 0 && distanceCm <= THRESHOLD_CM);
//検出されればブザーを鳴らす
if (isNear) {
tone(buzzerPin, 442); //4kHz
} else {
noTone(buzzerPin); // ブザー OFF
}
//ループ待機[ms]
delay(50);
}
結果
動画はしきい値30cmで検出範囲を調べています。ノイズに強くて床もしっかり検出してしまうので本体をかなり浮かせています。
検出範囲
超音波センサーに比べて角度が狭かったです。境界ギリギリはブザーが「ビ…ビ…」となりますが、範囲内は安定して鳴り続けてくれました。安定感ありますね。

おわりに
少し値段は高いですがレーザー式はいいですね。もう一つ検証したいものがあるのでまた次回。
