稼働中

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 外観

接続例

VL53L0Xは3.3Vで動作可能なのでRaspberry Pi Picoと直接接続できます。I2C接続するだけです。
I2C通信にはI2C0のSDA(GP20)SCL(GP21)を使いました。VL53L0X 接続例
接続が出来たら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」名で保管したのち、インポートして使う方法で動作テストをしました。
vl53l0x.py 入手サイト
ツールバーのNewを選択してスクリプトを貼り付けます。
Thonnyに貼り付け
ファイルの保存場所をRaspberryPi Picoを選択して「VL53L0Xc.py」名で保存します。
※一旦、This computerに保存してから、別途RaspberryPi Picoに保存してもいいです。
RaspberryPi Picoに保存
「VL53L0Xc.py」名を入力してOKをクリックします。これでインポートできるようになります。
「VL53L0Xc.py」名で保存

「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引けばほぼ正確な値になりそうです。
Thonny Shell


>>> 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 SSD1306 接続例
スクリプトは以下のようにしました。

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 の動作を確認しました。