ToFセンサ(VL53L1X)を、ラズパイからI2C通信で制御し、測距を行いました。
本記事では、ラズパイでToFセンサ(VL53L1X)で測距を行うために必要な情報をまとめています。
本記事が、皆様の参考になれば幸いです。
この記事で分かること
本記事を読み終わると、下記の内容が分かるようになります。
- 必要な部品
- ToFセンサ(VL53L1X)とラズパイの回路図、結線図
- ToFセンサ(VL53L1X)のPythonサンプルコード
- ToFセンサ(VL53L1X)の各測距モードのおおよその精度の目安
スポンサーリンク
使用した部品
はじめに、今回ToFセンサで測距を行うにあたり、使用した部品を紹介します。
ToFセンサ
スイッチサイエンスで、VL53L1X搭載の測距モジュールを購入しました。
ピンヘッダのハンダ付けが必要です。
■スペック
- 寸法:13 × 18 × 2 mm
- 重量:0.5 g
- 解像度:1 mm
- 最大範囲:400 cm
- 最小範囲:4 cm
- インタフェース:I2C
- 最小動作電圧:2.6 V
- 最大動作電圧:5.5 V
- 電源電流:15 mA
ブレッドボード
Amazonでベストセラーになっているブレッドボードです。
ジャンパワイヤ
オス-オス、オス-メス、メス-メスのジャンパワイヤがセットになっています。
電子工作を進めると必ず必要になるので、ひととおり持っておくことをオススメします。
スポンサーリンク
ToFセンサ(VL53L1X)とラズパイの配線図、I2C通信設定
次に、ToFセンサ(VL53L1X)とラズパイの回路について紹介します。
ラズパイのピン配置
配線図を紹介する前に、ラズパイのピン配置を載せておきます。
I2C通信を使うので、PIN番号3、5を使うことになります。
ラズパイ ピン配置
こちらが、ToFセンサ(VL53L1X)とラズパイの配線図になります。
なお、配線図に使用しているToFモジュールは、VL53L1Xが無かったので他の物を使用しています。
基本は全く同じです。
ToFセンサとラズパイのSDA同士、SCL同士を結線します。
また、ToFセンサの電源には、ラズパイの5V出力を使用しています。
GNDも忘れず接続するようにしましょう。
こちらが実際に配線した写真です。
こちらがToFセンサの正面。
この写真で気づくと思うのですが、買ったばかりだとセンサに保護シールが貼ってある場合があるので注意してください。
こちらが、ToFセンサの保護シールを剥がした後の写真になります。
ラズパイ(Raspberry Pi)のI2C通信を有効にする
次にラズパイのI2C通信を有効にします。
「設定」 → 「RaspberryPi の設定」の順に進みます。
インターフェースタブで、"I2C" を有効にします。
これで、ラズパイでI2C通信ができるようになりました。
ToFセンサ(VL53L1X)のI2Cアドレス確認
配線がおわったら、ToFセンサのI2Cアドレスを確認してみましょう。
ラズパイのターミナルに下記コマンドを入力します。
$ sudo i2cdetect -y 1
ToFセンサのI2Cアドレスが 0x29 であることが分かりました。
スポンサーリンク
ToFセンサ(VL53L1X)のPythonサンプルコード
測距に必要な、Pythonのサンプルコードを紹介します。
VL53L1Xのライブラリのインストール
まず初めに、VL53L1Xのライブラリをインストールします。
ラズパイのターミナルに下記のコマンドを入力します。
$ sudo pip3 install vl53l1x
Pythonのサンプルコード
Pythonのサンプルコードになります。
サンプルコード : ToF_test.py
### ToF_test.py
import VL53L1X
import time
tof = VL53L1X.VL53L1X(i2c_bus=1, i2c_address=0x29)
print("Python: Initialized")
tof.open()
print("Python: Opened")
time_start = time.time()
try :
while True:
### ------------------- get_time ----------------- ###
time_end = time.time()
time_elapsed = time_end - time_start
print("")
print("--- Time : {:.1f}s ---".format(time_elapsed))
### ------------------- get_distance ----------------- ###
### --- Short Range --- ###
tof.start_ranging(1) # 1 = Short Range
distance_mm = tof.get_distance()
print("Short Range Distance: {}mm".format(distance_mm))
tof.stop_ranging()
### --- Medium Range --- ###
tof.start_ranging(2) # 2 = Medium Range
distance_mm = tof.get_distance()
print("Medium Range Distance: {}mm".format(distance_mm))
tof.stop_ranging()
### --- Long Range --- ###
tof.start_ranging(3) # 3 = Long Range
distance_mm = tof.get_distance()
print("Long Range Distance: {}mm".format(distance_mm))
tof.stop_ranging()
time.sleep(1)
except KeyboardInterrupt:
print("\nCtrl+C")
※このコードでラズパイ上は動作していますが、サイト移植時にインデントを手打ちしています。
もしエラーが出た場合は、インデント部分を確認いただければと思います。
スポンサーリンク
ToFセンサの動作確認
最後に実際に動作している様子を紹介します。
ToFセンサをラズパイから制御できている様子(動画)
こちらが動画になります。
ToFセンサの各測距モードの特徴確認(簡易実験)
VL53L1Xには、距離に応じた3つの測距モードが用意されてます。
それぞれの測距モードの特徴を確認するために、簡単な実験を行ってみました。
実験環境はこちらです。
白い紙を被写体にしています。
ToFセンサと被写体の距離を変えながら、3つの測距モードで測定しています。
なお、ToFセンサから被写体までの距離は、メジャーで適当に測っているので精度はありません。
また、ToFセンサの向きや被写体の向きを正確に正対させているわけではありません。
なんとなくモードごとの特徴を把握できれば良いな、程度の実験なので、
精度についてはあまり参考にしないようにお願いします。
こちらが測定結果になります。
Short Range | Medium Range | Long Range | |
---|---|---|---|
50cm | 47.6cm | 47.5cm | 46.2cm |
100cm | 96.9cm | 99.2cm | 99.8cm |
150cm | 154.9cm | 156.1cm | 157.1cm |
200cm | 184.1cm | 189.5cm | 192.2cm |
250cm | 204.5cm | 217.8cm | 235.1cm |
300cm | 166.9cm | 205.2cm | 255.4cm |
被写体距離が近い場合は、モードごとに有意差はありませんでしたが、
被写体距離が250cmを超えたあたりから、Short Rangeモードではうまく測定ができなくなりました。
この結果は被写体の反射率や、形状でも変わることが予測されますので、
あくまで参考程度にして頂ければと思います。
スポンサーリンク
まとめ
ToFセンサ(VL53L1X)をラズパイからI2C通信で制御し、測距を行う方法について紹介していきました。
ToFセンサVL53L1Xは、専用のライブラリがあるので、Pythonで簡単に制御することができます。
是非、ToFセンサを使った電子工作にチャレンジしてみてください。
本記事が、皆様の参考になれば幸いです。
スポンサーリンク