0

I am trying to use a VL6180X distance sensor and an Arduino Uno board for individual sensor doing individual distance sensing. This sensor follows the I2C protocol. Since for the same type of sensor, the I2C protocol says that they would all have the same address, I am thinking about using the chip enable pin (GPIO00) on the sensor chip to toggle sensor when doing the distance measuring.

I am able to update the address of the sensor group now. But I think to obtain individual results from different sensors on the Arduino serial monitor, right now I can only do one time setup sensor thing (like I couldn't update and toggle around different sensors). Once I started to do that, the results from the serial monitor were wrong. Any advice how I can continue to toggle around the sensor and make them work using the GPIO00 pin?

The code I'm using is:

#include <Wire.h>
#include <VL6180X.h>
#define Address1 0x20
#define Address2 0x22
#define Address3 0x24
VL6180X sensor;
int pin2 = 2;
int pin3 = 3;
int pin4 = 4;
void setup() {
 Serial.begin(9600);
 Wire.begin();
 pinMode(pin2,OUTPUT);
 pinMode(pin3,OUTPUT);
 pinMode(pin4,OUTPUT);
 digitalWrite(pin2,HIGH);
 digitalWrite(pin3,HIGH);
 digitalWrite(pin4,HIGH);
 sensor.init();
 sensor.configureDefault();
 sensor.writeReg(VL6180X::SYSRANGE__MAX_CONVERGENCE_TIME, 30);
 sensor.writeReg16Bit(VL6180X::SYSALS__INTEGRATION_PERIOD, 50);
 sensor.writeReg16Bit(VL6180X::INTERLEAVED_MODE__ENABLE,0);
 sensor.setTimeout(500);
 sensor.stopContinuous();
 delay(300);
 sensor.startInterleavedContinuous(100);
}
void loop() {
 hello2();
 delay(1000);
}
void hello1(){
 sensor.setAddress(0x29);
 Serial.println(sensor.readReg(0x212),HEX);
 sensor.setAddress(Address1);
 sensor.writeReg(0x212,Address1);
 Serial.println(sensor.readReg(0x212),HEX);
 Serial.println();
 digitalWrite(pin2,HIGH);
 digitalWrite(pin3,LOW);
 digitalWrite(pin4,LOW);
 Serial.print("Ambient 1: ");
 Serial.print(sensor.readAmbientContinuous());
 if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
 Serial.print("\tRange 1: ");
 Serial.print(sensor.readRangeContinuousMillimeters());
 if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
 Serial.println();
 sensor.writeReg(0x212,0x52);
 digitalWrite(pin2,HIGH);
 digitalWrite(pin3,HIGH);
 digitalWrite(pin4,HIGH);
}
void hello2(){
 sensor.setAddress(0x52);
 Serial.println(sensor.readReg(0x212),HEX);
 sensor.setAddress(Address2);
 sensor.writeReg(0x212,Address2);
 Serial.println(sensor.readReg(0x212),HEX);
 Serial.println();
 digitalWrite(pin2,LOW);
 digitalWrite(pin3,HIGH);
 digitalWrite(pin4,LOW);
 Serial.print("Ambient 2: ");
 Serial.print(sensor.readAmbientContinuous());
 if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
 Serial.print("\tRange 2: ");
 Serial.print(sensor.readRangeContinuousMillimeters());
 if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
 Serial.println();
 sensor.writeReg(0x212,0x52);
}
void hello3(){
 sensor.setAddress(0x52);
 Serial.println(sensor.readReg(0x212),HEX);
 sensor.setAddress(Address3);
 sensor.writeReg(0x212,Address3);
 Serial.println(sensor.readReg(0x212),HEX);
 Serial.println();
 digitalWrite(pin2,LOW);
 digitalWrite(pin3,LOW);
 digitalWrite(pin4,HIGH);
 Serial.print("Ambient 3: ");
 Serial.print(sensor.readAmbientContinuous());
 if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
 Serial.print("\tRange 3: ");
 Serial.print(sensor.readRangeContinuousMillimeters());
 if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
 Serial.println();
 sensor.writeReg(0x212,0x52);
}

Any help would be appreciated!

dda
1,5951 gold badge12 silver badges17 bronze badges
asked Jun 9, 2016 at 15:26
2
  • I'm trying to do the same thing. Did you get it to work by chance? Commented Mar 8, 2017 at 22:06
  • There are ICs that expand the I2C bus allowing you to have multiple devices with the same ID on (can't remember what they are called at the mo). Commented Jun 7, 2017 at 11:56

3 Answers 3

1

You can use an I2C multiplexer (TCA9548A). One I2C input can be output to one of the eight I2C outputs.

It has 8 configurable addresses, so you can connect 64 I2C devices with the same address by using 8 multiplexer chips.

sa_leinad
3,2182 gold badges23 silver badges51 bronze badges
answered Jun 11, 2018 at 20:53
0

You are using only one VL6180 object and then changing its address repeatedly. In your setup(), since all the sensors are enabled and have the same address, you're sending init commands to all of them; I'm not sure what will happen (multiple ACK/NACKs?), but it's probably not a good thing. Your hello() functions actually changes the address of all the sensors (twice?), if the commands even work, and then enables only one to read from. A host of undefined problems is expected.

To fix this, you have to do all the config and address changes in setup():

  • Before setup(), create 3 VL6180 objects: sensor1, sensor2, sensor3
  • In setup(), enable ONLY ONE sensor, and call all the sensor initialization commands on one of the objects you created (sensor1, maybe), as usual. Then call setAddress() on that sensor object to change its address to a unique one. This object is now tied to the physical sensor which has been enabled; all future operations related to that sensor, must be done on this object.
  • Then, disable this first sensor, and enable another and repeat the same steps as before on another object (sensor2), making sure to make each sensor's address unique. This way, you configure only one sensor at a time.
  • After configuring all three, you can now use their respective objects to get readings in loop().
dda
1,5951 gold badge12 silver badges17 bronze badges
answered Jun 9, 2016 at 16:31
0

I believe, if I have read this Multiple VL6180x in a design right, then you can change the I2C addresses of the sensors. You need to hold all the sensors in reset then send it the change ID message. I'm not sure if it is permanent or you have to do it each power up.

Does that help?

answered Jun 7, 2017 at 12:02

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.