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

# やりたい事
vl53l1xをESP32に複数つないで距離を同時に取得します。
今回はESP32のMicropythonを使用しますが、RaspberryPiやRaspberryZeroでも使用可能です。
<img width="８00" alt="IMG_4832.jpg (1.5 MB)" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1766945/876ce4e4-8352-56c6-9bf5-f2b66425e1f8.gif">
<img width="2048" alt="xjtlq-ik139.gif (4.0 MB)" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1766945/94e589d8-a77a-2584-d82d-02a01fc22d60.jpeg">
vl53l1xはレジスタの内容を変更する事でスレーブアドレスを変更できる．
（レジスタマップは[データシート](https://www.st.com/resource/en/datasheet/vl53l1x.pdf)に乗ってなかった）

# つなぎ方
<img width="476" alt="スクリーンショット 2022-07-22 17.31.27.png (131.3 kB)" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1766945/90853575-9eca-1b82-f92c-398ae9f2ab50.png">   　　　
XSHUTピンはGNDに接続するとスリープモードになる．
説明ではPIN 0,4,16を使用

# アドレスの設定手順
vl53l1xは電源投入または，スリープモード復帰時のアドレスは41（0x28）になる．
<img width="227" alt="スクリーンショット 2022-07-22 17.55.27.png (56.0 kB)" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1766945/ccb10fc6-75f1-75ab-651a-bd2cefa2a630.png">
ここでは、I2Cで接続されたすべての距離センサをスリープモードにして、1台づつ起動とアドレスの変更を行う。   


### 1. アドレスを変更する前にXSHUTピンに接続されているすべてのピンをLOWにする． 
<img width="400" alt="スクリーンショット 2022-07-22 18.06.20.png (180.4 kB)" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1766945/7007e09c-febf-5df0-f8aa-e9c9305f5d05.png">

### 2. 1台のXSHUTピンをHIGHにする．
<img width="400" alt="スクリーンショット 2022-07-22 18.06.22.png (180.2 kB)" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1766945/4353839c-7c52-6b88-3ba9-2575b7b22cd9.png">

### 3. アドレス41のアドレスを変更する．
<img width="400" alt="スクリーンショット 2022-07-22 18.06.26.png (187.0 kB)" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1766945/0e61587e-a761-fe9b-4b1b-619d76a14f47.png">

### 2. 次のXSHUTピンをHIGHにする．
<img width="400" alt="スクリーンショット 2022-07-22 18.06.28.png (181.0 kB)" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1766945/f8aade94-245a-786f-908d-28cb6048c1a7.png">

### 3. アドレス41のアドレスを変更する．
<img width="400" alt="スクリーンショット 2022-07-22 18.06.33.png (188.3 kB)" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1766945/a5b099e2-a838-11dd-09c0-9a9ab40957b7.png">

### 2と3を繰り返す．
すべてのセンサのアドレスが変更できるまで2と3を繰り返す．
<img width="227" alt="スクリーンショット 2022-07-22 17.56.12.png (61.6 kB)" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1766945/5d1fa3f8-bfce-1b81-35af-933c2c2698e5.png">

# プログラム
配線方法は上記を参照
```python
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回，すべてのセンサの値を表示する．
<img width="200" alt="スクリーンショット 2022-07-22 18.12.26.png (565.0 kB)" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1766945/86971a89-b3c2-17a7-b076-c6fb2b6fa0a6.png">

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