対象物までの距離を測定できるTOFセンサーのご紹介

TOFセンサーとは

近年、自動お掃除ロボットやAI搭載ロボットなど自分自身の位置を把握して動作する機器が増えています。これらを実現する上で自分の位置情報を検知するには対象物や障害物の距離を正確に把握することが必要とされます。

今回は対象物との距離を測定するTOFセンサーをご紹介いたします。
TOFセンサーは「Time-of-Flight」の頭文字で、センサーから発したレーザが対象物に反射して返ってくるまでの時間をもとに距離を計測するセンサーです。TOFセンサーの種類や精度によりますが、数cmのから中には数百mなど遠くの対象物までの距離を測定することができます。

TOFセンサーの動作確認

数多くあるTOFセンサーの中から、今回はSTマイクロ社のVL53L1XのTOFセンサーを使ってArduino Nano 33 IoTと疎通確認を行った結果をまとめます。
VL53L1Xは最大400cmまでの距離を測定でき、インターフェースはI2CですのでRaspberry PiやArduinoなどのマイコン等で通信可能です。

注意事項として、左側の写真のセンサー表面(オレンジ色の2つの四角部分)に保護シールが貼られているので剥がして使用すること。
また、センサーから出力される赤外線レーザーはClass1(長時間直視しても安全なレーザー)ですが、安全のため直視したりのぞき込まないよう注意が必要です。

STマイクロ社のVL53L1XのTOFセンサー

VL53L1Xの仕様

  • 電源電圧:3.3~5.0V
  • 計測範囲:約10cm~約400cm(屋内使用)
  • 光源:940nm Class 1レーザー ※目に入ると危険性があるため注意
  • インターフェース:I2C
  • コネクタ:JST ZH 6P

用意するもの

名称個数備考
TOFセンサー(AE-VL53L1X)1個秋月電子通商
Arduino Nano 33 IoT1個Arduino
NANO IO シールド1個Amazon
アクリル板1枚社内在庫を加工
ネジ・ワッシャー4セット社内在庫
USBケーブル(Micro USB2.0 Type-B)1本社内在庫
Windows 10 ノートパソコン1台
Arduino IDE(ソフトウェア)Arduino

TOFセンサーとArduino Nano 33 IoTの接続

TOFセンサーとArduino Nano 33 IoTの接続は下記画像のようなイメージです。今回はアクリル板にTOFセンサーとArduino Nano 33 IoTを取り付けそれぞれを配線しています。

TOFセンサーとArduinoNanoIoT接続_表側
TOFセンサーとArduinoNanoIoT接続_裏側
TOFセンサーとArduinoNanoIoT接続_左側
TOFセンサーとArduinoNanoIoT接続_右側

ToFセンサーとArduino Nano 33 IoTの接続

名称機能配線色
V+3.3~5V
GND
SDAデータ線
SCLクロック線
XSHUTシャットダウン
GPIOGPIO(2.8Vレベル)
TOFセンサー側

接続有無
←接続→
←接続→
←接続→
←接続→
接続有無
Arduino ピン
+3V3
GND
SDA(A4)
SCL(A5)
Arduino Nano 33 IoT側

プログラム

ArduinoIDEを準備します。事前作業として、今回のTOFセンサー(AE-VL53L1X)を使うにあたりライブラリを取り込む必要があります。ArduinoIDEのメニューから「ツール」>「ライブラリを管理」を選択するとライブラリマネージャの画面が表示されます。上段の入力欄で”VL53L1X”を入力すると画面にライブラリの候補が表示されます。その中で「Pololu」の「VL53L1X」のライブラリをインストールします。

ArduinoIDEのライブラリ管理画面

ライブラリのインストールが完了するとWindowsのユーザ\document\Arduino\libraries下に(Windows 64bitの場合)今回インストールしたVL53L1Xのサンプルのプログラムとライブラリが配置されます。
(例)C:\Users\ユーザ\Documents\Arduino\libraries\VL53L1X

次にIDEでプログラムを作成します。今回はTOFセンサーの疎通確認、簡単な動作確認を目的としていますので先ほどインストールしたライブラリのサンプルプログラムをそのまま使うことができます。

(例)
C:\Users\ユーザ\Documents\Arduino\libraries\VL53L1X\examples\ContinuousWithDetails\ContinuousWithDetails.ino

#include <Wire.h>
#include <VL53L1X.h>

VL53L1X sensor;

void setup()
{
  Serial.begin(115200);
  Wire.begin();
  Wire.setClock(400000); // use 400 kHz I2C

  sensor.setTimeout(500);
  if (!sensor.init())
  {
    Serial.println("Failed to detect and initialize sensor!");
    while (1);
  }
  
  // Use long distance mode and allow up to 50000 us (50 ms) for a measurement.
  // You can change these settings to adjust the performance of the sensor, but
  // the minimum timing budget is 20 ms for short distance mode and 33 ms for
  // medium and long distance modes. See the VL53L1X datasheet for more
  // information on range and timing limits.
  sensor.setDistanceMode(VL53L1X::Long);
  sensor.setMeasurementTimingBudget(50000);

  // Start continuous readings at a rate of one measurement every 50 ms (the
  // inter-measurement period). This period should be at least as long as the
  // timing budget.
  sensor.startContinuous(50);
}

void loop()
{
  sensor.read();
  
  Serial.print("range: ");
  Serial.print(sensor.ranging_data.range_mm);
  Serial.print("\tstatus: ");
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));
  Serial.print("\tpeak signal: ");
  Serial.print(sensor.ranging_data.peak_signal_count_rate_MCPS);
  Serial.print("\tambient: ");
  Serial.print(sensor.ranging_data.ambient_count_rate_MCPS);
  
  Serial.println();
}

動作確認・結果

上記プログラムをビルド&Arduinoに書き込み、実際にテーブルと床(素材:絨毯)までの距離を測定してみます。

ToFセンサーで実際に測定する

実際の机から床までの距離は約72.5cmくらい(素人寸法)ですが、センサーの測定値は約71cm前後を示しています。(下記図の点線赤枠)誤差は約1.5cmくらいでそこそこ精度の高い値がとれました。手を近づけたり、机と床の間に物を置いたりと距離の変化にも対応できそうな結果が得られました。

参考までに実行結果は以下の画像になります。

ToFセンサー測定結果をコンソールで表示

最後に…

今回は「VL53L1X」のTOFセンサーとArduino Nano 33 IoTを使って簡単な疎通確認を行いました。ざっくり簡単に測定でき取得値も精度の高い値が取れます。今後は実用に向けて深堀を進めていきたいと考えています。

・「VL53L1X」センサーはI2CでArduino等のマイコンで簡単に疎通の確認が可能

・「VL53L1X」センサー自体の精度はある程度高いものがあり、取得値のばらつきも小さい

・今後は様々な測定対象物を検証し実用可否の選別を行う必要がある