うちのチームではもうVL53L0X(というか赤外線レーザー測距センサ)は使わない方針になったので書いたソースの供養兼ねて公開しようかなと
VL53L0Xは
・アドレス選択ピンがない(変更しなければ同一バス上で複数使うことはできない)
・内部電圧が(多分)1.8V(I2Cはレベルシフタが入っているものが多い)
なので色々と厄介です.
まず,アドレスの変更について
XSHUTピンは基板でプルアップされていることが多く,LOWにするとモジュールが無効になります.
複数使う際は1つずつ順番に有効にしていき,ライブラリのsetAddress関数を使ってスレーブアドレスを変更していきます.
有効にする時はXSHUTをArduinoでHIGHにすると5Vまたは3.3Vがかかりモジュールが壊れる可能性があるので,XSHUTに繋いだピンをINPUTにすることで基板でのプルアップでHIGHになるようにします.
以下ソース
#include <Wire.h> #include <VL53L0X.h> VL53L0X sensorR; VL53L0X sensorL; VL53L0X sensorB; #define RSHUT 6 #define LSHUT 9 #define BSHUT 8 void setup() { pinMode(13,OUTPUT); digitalWrite(13,HIGH); pinMode(RSHUT, OUTPUT); pinMode(LSHUT, OUTPUT); pinMode(BSHUT, OUTPUT); digitalWrite(RSHUT, LOW); digitalWrite(LSHUT, LOW); digitalWrite(BSHUT, LOW); delay(100); Wire.begin(); pinMode(LSHUT, INPUT); delay(150); sensorL.init(true); delay(100); sensorL.setAddress((uint8_t)24); sensorL.setTimeout(500); pinMode(BSHUT, INPUT); delay(150); sensorB.init(true); delay(100); sensorB.setAddress((uint8_t)25); sensorB.setTimeout(500); pinMode(RSHUT, INPUT); delay(150); sensorR.init(true); delay(100); sensorR.setAddress((uint8_t)23); sensorR.setTimeout(500); sensorL.startContinuous(); sensorB.startContinuous(); sensorR.startContinuous(); digitalWrite(13,LOW); Serial.begin(19200); } void loop(){ Serial.print('R:'); Serial.print(sensorR.readRangeContinuousMillimeters()); Serial.print(' L:'); Serial.print(sensorL.readRangeContinuousMillimeters()); Serial.print(' B:'); Serial.println(sensorB.readRangeContinuousMillimeters()); delay(10); }