I have two Lidar Lites, connected to one APM. I have no issue with getting data from one of them, i use the code below
#include <I2C.h>
#define LIDARLite_ADDRESS 0x62 // Default I2C Address of LIDAR-Lite.
#define RegisterMeasure 0x00 // Register to write to initiate ranging.
#define MeasureValue 0x04 // Value to initiate ranging.
#define RegisterHighLowB 0x8f // Register to get both High and Low bytes in 1 call.
void setup(){
Serial.begin(9600); //Opens serial connection at 9600bps.
I2c.begin(); // Opens & joins the irc bus as master
delay(100); // Waits to make sure everything is powered up before sending or receiving data
I2c.timeOut(50); // Sets a timeout to ensure no locking up of sketch if I2C communication fails
}
void loop(){
// Write 0x04 to register 0x00
uint8_t nackack = 100; // Setup variable to hold ACK/NACK resopnses
while (nackack != 0){ // While NACK keep going (i.e. continue polling until sucess message (ACK) is received )
nackack = I2c.write(LIDARLite_ADDRESS,RegisterMeasure, MeasureValue); // Write 0x04 to 0x00
delay(1); // Wait 1 ms to prevent overpolling
}
byte distanceArray[2]; // array to store distance bytes from read function
// Read 2byte distance from register 0x8f
nackack = 100; // Setup variable to hold ACK/NACK resopnses
while (nackack != 0){ // While NACK keep going (i.e. continue polling until sucess message (ACK) is received )
nackack = I2c.read(LIDARLite_ADDRESS,RegisterHighLowB, 2, distanceArray); // Read 2 Bytes from LIDAR-Lite Address and store in array
delay(1); // Wait 1 ms to prevent overpolling
}
int distance = (distanceArray[0] << 8) + distanceArray[1]; // Shift high byte [0] 8 to the left and add low byte [1] to create 16-bit int
// Print Distance
Serial.println(distance);
}
i can get the distance fine, now have two connected, as follows
So my noob question is how to i get data from the 2, my guess is the wiring is ok.
I am using the code from https://github.com/PulsedLight3D/LIDARLite_v2_Arduino_Library
any help would be appreciated. thanks.
1 Answer 1
Connect one at a time and run the change address sketch mentioned by Yeti.
Naturally change each one (one at a time) to different addresses (ex. 0x62, 0x64, 0x66).
i still don't know whats the address of the 2nd one
The address is what you change it to.
Then connect them all back up again and run the I2C scanner. You should see all 3 addresses.
documents state that address changes will be gone when i power it off
If that is true, save the address for each module in EEPROM. Then use that code to change the module address in setup
.
See the address in the code you posted?
#define LIDARLite_ADDRESS 0x62 // Default I2C Address of LIDAR-Lite.
If you don't want to save the address in EEPROM just upload three versions of the sketch with a different address in each one. Note that the address must be even (eg. 0x62, 0x64, 0x66).
But it would be very simple just to read from EEPROM in setup
and keep the address in a variable rather than a #define.
-
documents state that address changes will be gone when i power it off.Jinah Adam– Jinah Adam2016年01月18日 05:03:41 +00:00Commented Jan 18, 2016 at 5:03
-
Then turn off two lidars with transistors, program the first one, turn on the second one, program it, then turn the last one on. That way there are no address conflicts while programming it as all the addresses are different while programming any of them.Avamander– Avamander2016年02月05日 22:03:38 +00:00Commented Feb 5, 2016 at 22:03
changeAddressMultisensor
function in your setup(). See Change I2C Address for Single Sensor You may have to use CTRL+F (find on page) "Change I2C Address for Single Sensor" as the href doesn't seem to work right on chrome or firefox.