ArduinoでVL53L0Xを複数同時に使う

うちのチームではもう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);
}

コメントを残す

あなたのメールアドレスは公開されません。必須項目には印がついています *