LoginSignup
6
7

More than 1 year has passed since last update.

1つのマイコンに距離センサvl53l1xを複数つなぎたい!(センサのアドレス変更方法・同時取得方法)

Posted at

やりたい事

vl53l1xをESP32に複数つないで距離を同時に取得します。
今回はESP32のMicropythonを使用しますが、RaspberryPiやRaspberryZeroでも使用可能です。
IMG_4832.jpg (1.5 MB)
xjtlq-ik139.gif (4.0 MB)
vl53l1xはレジスタの内容を変更する事でスレーブアドレスを変更できる.
(レジスタマップはデータシートに乗ってなかった)

つなぎ方

スクリーンショット 2022-07-22 17.31.27.png (131.3 kB)    
XSHUTピンはGNDに接続するとスリープモードになる.
説明ではPIN 0,4,16を使用

アドレスの設定手順

vl53l1xは電源投入または,スリープモード復帰時のアドレスは41(0x28)になる.
スクリーンショット 2022-07-22 17.55.27.png (56.0 kB)
ここでは、I2Cで接続されたすべての距離センサをスリープモードにして、1台づつ起動とアドレスの変更を行う。

1. アドレスを変更する前にXSHUTピンに接続されているすべてのピンをLOWにする.

スクリーンショット 2022-07-22 18.06.20.png (180.4 kB)

2. 1台のXSHUTピンをHIGHにする.

スクリーンショット 2022-07-22 18.06.22.png (180.2 kB)

3. アドレス41のアドレスを変更する.

スクリーンショット 2022-07-22 18.06.26.png (187.0 kB)

2. 次のXSHUTピンをHIGHにする.

スクリーンショット 2022-07-22 18.06.28.png (181.0 kB)

3. アドレス41のアドレスを変更する.

スクリーンショット 2022-07-22 18.06.33.png (188.3 kB)

2と3を繰り返す.

すべてのセンサのアドレスが変更できるまで2と3を繰り返す.
スクリーンショット 2022-07-22 17.56.12.png (61.6 kB)

プログラム

配線方法は上記を参照

from machine import I2C,Pin
from vl53l1x import VL53L1X
import time

""" パラメータ """
# i2c関係
I2C_SCL_PIN = 22
I2C_SDA_PIN = 21

# XSHUTに接続するPin番号
x_suht_pin = [0,4,16]
""" パラメータ(終わり) """

class VL53L1X_S():
    # 複数の距離センサを取り扱うクラス

    def __init__(self, i2c, x_suht_pin):
        self.vl53l1x_s = []
        self.pin_s = []

        # Pinの初期化
        for pin_no in x_suht_pin:
            self.pin_s.append(Pin(pin_no, Pin.OUT))
            self.pin_s[-1].value(0)
    
        # 各センサの初期化(アドレス変更)
        for i in range(len(x_suht_pin)):
            time.sleep(0.2)
            self.pin_s[i].value(1)
            self.vl53l1x_s.append(VL53L1X(i2c))
            self.vl53l1x_s[-1].writeReg(0x0001, 64+i & 0x7F)
            self.vl53l1x_s[-1].address = 64 + i
            print("vl53l1x addr:%d distance:%dmm" % (64 + i , self.vl53l1x_s[-1].read()))
        
    def read_sensors(self):
        # データを配列で返却(3台の場合100msで返却)
        out = []
        for vl53l1x in self.vl53l1x_s:
            time.sleep(0.03)
            out.append(vl53l1x.read())
        time.sleep(0.01)
        return out
        
    
if __name__ == '__main__':
    i2c = I2C(scl=Pin(I2C_SCL_PIN), sda=Pin(I2C_SDA_PIN))
    vl53l1x = VL53L1X_S(i2c,x_suht_pin)


while True:
    data = vl53l1x.read_sensors()
    print("%d,%d,%d" % (data[0],data[1],data[2]))

実行

上記のプログラムを実行すると,0.1秒に1回,すべてのセンサの値を表示する.
スクリーンショット 2022-07-22 18.12.26.png (565.0 kB)

終わりに

ドローンやロボットを作成するとき、複数のセンサを1つのマイコンに取り付けることがあると思います。
そのような場合に役に立つと嬉しいです!

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7