Raspberry Pi Pico(d_36)VL53L0X レーザー距離センサ
VL53L0X VCSEL (I2C)
VL53L0XはTime-of-Flightレーザ距離センサーです。
発光部に940 nm VCSELレーザー (Vertical Cavity Surface-Emitting Laser)、受光に SPAD array (Single Photon Avalanche Diodes)を使った距離測定センサーです。2mまでの距離が測れ、分解能は1mmらしいです。I2C通信で制御します。
詳細はデータシートなどを参照ください。
VL53L0Xのデータシートを見ても使い方がよくわかりませんでしたがmicropythonでVL53L0Xを簡単に使えるモジュールがありました。入手先は「https://github.com/mcauser/deshipu-micropython-vl53l0x/blob/master/vl53l0x.py」です。
micro:bit(記事e_55)では少し変更が必要でしたが、Raspberry Pi Picoはそのままで使えました。「vl53l0x.py」を使って動作確認をしました。
※開発環境はThonnyです。ThonnyでMicroPythonをRaspberry Pi Pico with RP2040にインストールして使っています。
外観
VL53L0X センサーモジュールの外観写真です。(以後はVL53L0Xと記載します)
VCSELレーザーを点灯した状態です。赤外光なので目視では発光状態は見えません。発光確認はCCDカメラ等を使って下さい。安全のため直視しない方が良いと思います。
※写真ではモジュール名(シルク)はUL53LDKになってます。偽物?
接続例
VL53L0Xは3.3Vで動作可能なのでRaspberry Pi Picoと直接接続できます。I2C接続するだけです。
I2C通信にはI2C0のSDA(GP20)SCL(GP21)を使いました。
接続が出来たらI2Cデバイスのスレーブアドレスを調べてみます。
ThonnyのShellで確認しました。
VL53L0Xのスレーブアドレスは以下のように41(0x29)でした。
>>> from machine import I2C, Pin
>>> i2c=I2C(0, scl=Pin(21), sda=Pin(20), freq=100_000)
>>> i2c.scan()
[41] # '0x29'
>>>
VL53L0Xの説明
「https://github.com/mcauser/deshipu-micropython-vl53l0x/blob/master/vl53l0x.py」から「vl53l0x.py」を入手します。
クリップボードにコピーしてThonnyに貼り付けます。
この下にスクリプトを記載しても動作確認できますが、
Raspberry Pi Picoに「VL53L0Xc.py」名で保管したのち、インポートして使う方法で動作テストをしました。
ツールバーのNewを選択してスクリプトを貼り付けます。
ファイルの保存場所をRaspberryPi Picoを選択して「VL53L0Xc.py」名で保存します。
※一旦、This computerに保存してから、別途RaspberryPi Picoに保存してもいいです。
「VL53L0Xc.py」名を入力してOKをクリックします。これでインポートできるようになります。
「VL53L0Xc.py (vl53l0x.py)」の中身を見ていくと、
VL53L0X(i2c, address=0x29)で初期化できます。先に調べたスレーブアドレスと同じなので
init、start、stop、read のメソッドがあります。
i2cは先の設定を使います。
i2c = I2C(0, scl=Pin(21), sda=Pin(20), freq=100_000)
です。
addr=0x29とあります。先に調べたVL53L0Xのスレーブアドレスと合っています。
VL53L0X(i2c)で初期化します。
ThonnyのShellでインポートして実行できるか確認してみます。
約10cm、15cmに反射物をおいて測定してみました。以下のように約10cm(100mm)くらい大きく測定されました。測定値から100引けばほぼ正確な値になりそうです。
>>> from machine import I2C,Pin
>>> from VL53L0Xc import VL53L0X
>>> i2c=I2C(0, scl=Pin(21), sda=Pin(20), freq=100_000)
>>> tof=VL53L0X(i2c) # 初期化
>>> tof.init() # VL53L0Xの初期設定
>>> tof.start() # VCSEL ON
>>> tof.read() # 距離測定 約10cm
201
>>> tof.read() # 距離測定 約15cm
248
>>> tof.stop() # VCSEL OFF
>>>
スクリプト
ディスプレイ OLED SSD1306もつないで距離測定をしてみました。SSD1306もI2C通信で制御できます。SSD1306については記事d_34、記事s_32を参照してください。
接続例は以下のようにしました。
VL53L0X、SSD1306は3.3Vで動作可能なのでRaspberry Pi Picoと直接接続できます。I2C接続するだけです。I2C通信にはI2C0のSDA(GP20)SCL(GP21)を使いました。
スクリプトは以下のようにしました。
VL53L0Xの測定値から100mmを引いて調整しています。
※Raspberry Pi Pico単独で動作させるには’main.py’としてRaspberry Pi Picoにuploadして使います。
pico_VL53L0X_test_01b.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from machine import I2C,Pin
import time
# https://github.com/mcauser/deshipu-micropython-vl53l0x/blob/master/vl53l0x.py
from VL53L0Xc import VL53L0X
# https://github.com/stlehmann/micropython-ssd1306/blob/master/ssd1306.py
from ssd1306 import SSD1306_I2C
# i2c setting
i2c=I2C(0, scl=Pin(21), sda=Pin(20), freq=100_000)
## VL53L0X is a Time of Flight distance sensor
tof=VL53L0X(i2c,0x29)
## SSD1306 OLED Display
oled = SSD1306_I2C(128, 64, i2c) #width,hight,external_vcc
# SSD1306 clear
def cls():
oled.fill(0)
oled.show()
time.sleep(1)
# display clear
cls()
#time.sleep(1)
# display read measure data
oled.text('VL53L0X ',0,0,1)
oled.text('distance sensor',0,8,1)
oled.show()
tof.init() # VL53L0X初期化
tof.start() # VCSEL ON
time.sleep(0.2)
while True:
d=(tof.read()-100)/10 # 測定cm 補正100
#print(d)
s='L= '+ str(d) +' cm'
oled.text(s ,16,32,1) # OLED 文字表示
oled.show()
time.sleep(1.0) # 待機時間
oled.text(s ,16,32,0) # OLED 文字表示
oled.show()
time.sleep(0.5) # 待機時間
#tof.stop() # VCSEL OFF 停止
実行結果 動画
適当に遮蔽物を移動させて測定した結果です。
まとめ
Raspberry Pi Picoで距離センサー VL53L0X の動作を確認しました。