2021年07月30日 更新

ラズパイにレーザー距離センサを接続!

どうも、クラゲです。
レーザー距離センサVL53LOXをRaspberryPiに接続して、I2C通信で距離を測定します。

必要な部品

回路結線

  • V+ :RaspberryPi 3.3V
  • GND:RaspberryPi Ground
  • SDA:RaspberryPi GPIO 2pin
  • SCL:RaspberryPi GPIO 3pin
  • XSHUT:NC
  • GPIO1:NC

距離センサ側のXSHUTとGPIO1はNC(Non Connection)、つまりRaspberryPiに接続しなくてOKです。

プルアップ抵抗について

レーザー距離センサICと外部端子の間にI2Cの電圧変換があり、レーザー距離センサ側はプルアップ抵抗が有り、外部端子側はプルアップ無しです。
一方のRaspberryPiのI2C端子は内部で1.8kΩのプルアップ抵抗があるため、結果としてプルアップ抵抗は不要です。

RaspberryPiのI2Cを有効にする

ラズパイアイコン > 設定 > RaspberryPiの設定I2C有効にします。

サンプルコードをダウンロードして実行

git cloneします。

git clone https://github.com/johnbryanmoore/VL53L0X_rasp_python.git

移動してmakeします。

cd VL53L0X_rasp_python
make

実行します。

cd python
python3 VL53L0X_example.py

このような画面が出て、100回の測定が終わると自動的に終了します。
ちなみに、レーザーセンサ部に貼ってある保護フィルムを取らないと、正確な距離が出ませんので注意してください。

オリジナルでPythonコードを書く

距離センサを動作させるのに必要なファイルは先程ダウンロードしたフォルダの中にある以下3つです。

  • VL53L0X_rasp_python/bin/vl53l0x_python.so
  • VL53L0X_rasp_python/python/VL53L0X.py
  • VL53L0X_rasp_python/python/VL53L0X_example.py

この3つを自分の作業ディレクトリにコピーしてください。
vl53l0x_python.soVL53L0X.py はライブラリとしてそのまま活用します。ただし、パス構成が変わったため、VL53L0X.pyの68行目だけを書き換えます。

変更前

tof_lib = CDLL("../bin/vl53l0x_python.so")

変更後

tof_lib = CDLL("./vl53l0x_python.so")

後は、VL53L0X_example.pyの中身を書き換えればオリジナルでコードが出来ます。ファイル名を変えてもOKです。
以下はOpenCVの表示を使ってリアルタイム表示する例です。

import time
import VL53L0X
import cv2
import numpy as np

#黒画像800x600を作成
img = np.zeros((600, 800, 3), np.uint8)
img_disp = img.copy() #img_dispにimgをコピー

# Create a VL53L0X object
tof = VL53L0X.VL53L0X()

# Start ranging
tof.start_ranging(VL53L0X.VL53L0X_BETTER_ACCURACY_MODE)

# 連続測定するときに必要な時間間隔を得る
timing = tof.get_timing()
if (timing < 20000):
    timing = 20000
print ("Timing %d ms" % (timing/1000))

while True:
    #黒画でキーが押されたら終了
    key = cv2.waitKey(1)
    if key != -1:
        break

    #必要な時間間隔を空けてから距離をcm単位にして取得
    time.sleep(timing/1000000.00)
    distance = tof.get_distance()/10
    text = str(distance) + 'cm'

    #黒画に距離の文字列を描画
    img_disp = img.copy() #img_dispにimgをコピー
    cv2.putText(img_disp, text, (50, 150), cv2.FONT_HERSHEY_SIMPLEX, 4, (255, 255, 255), 16)
    cv2.imshow('black', img_disp)

#終了処理
tof.stop_ranging()
cv2.destroyAllWindows()

実行の様子

距離センサを動かすとリアルタイムに表示が変更し、キーが押されるまで無限に続けます。

以上、「ラズパイにレーザー距離センサを接続!」でした!