2019-08-15 07:49 AM
Hi all
I have successfully implemented a single vl53l0x sensor, but wish to add more. I found the "AN4846 Application note Using multiple VL53L0X in a single design" documentation:
Under "VL53L0X API management" it specifies:
In vl53L0x_platform.h API file set VL53L0x_SINGLE_DEVICE_DRIVER macro to 0 so that API implementation will be automatically adapted to a multi-device context.
But I cannot find anything called "VL53L0x_SINGLE_DEVICE_DRIVER" in the vl53L0x_platform.h file.
Where can I find it? Or has the files updated without the documentation being updated? If so should this step just be skipped?
Solved! Go to Solution.
2019-08-17 01:52 AM
Okay, I now added the VL53L0X_ResetDevice() function before each device's VL53L0X_DataInit(). The reading still doesn't change for the second sensor. Should I reset the device before each reading, or just before the DataInit?
I then added a new struct in order to save sensors in different structs. It also didn't change anything.
I added a new variable to save the distance data in separate variables rather than overwriting one. The second sensor now only gives a reading of 0. So it would seem that the data isn't being updated when VL53L0X_PerformSingleRangingMeasurement() is called.
I checked the range status for sensor 2, it also gives 0.
When I switch the sensors (through the previously done XShut method). The 2nd sensor gives a reading, but the first sensor does not.
I also tried switching the sensors off (by bringing xshut low) when not in use. But that didn't do anything either.
I added the status+= and found a value of 236 when resetting the second sensor. If I remove the reset and just use DataInit() the status = 236. The initialization, reset and address change of the first sensor gave 0 values.
2019-08-17 12:59 PM
So I have established the device fails to reset. I don't know how to fix this other than physically disconnect and reconnecting the device. It then starts giving its own readings.
2020-06-04 07:23 PM
I'm planning to use two arrays of three VL53L0X sensors each in a robotics application using a Teensy (Arduino-ish) microcontroller. I have one array of three sensors working already, using the technique described by John. I have a fairly detailed post, with software on my blog site at https://www.fpaynter.com/2020/06/replacing-hc-sro4-ultrasonic-sensors-with-vl53l0x-arrays/
2022-06-19 11:30 AM
I have similar situation. I want to use 2 sensors, but when they are both online(XSHUT=1) measurement data is wrong and random when I use one sensor data is OK. I add my code maybe I do something wrong...
Config:
#define sensor_qty 2 // max. 2
#define original_addr 0x52
#define sensor1_addr 0x53
#define sensor2_addr 0x54
main:
uint8_t Message[64];
uint8_t MessageLen;
VL53L0X_RangingMeasurementData_t RangingData[sensor_qty];
VL53L0X_Dev_t vl53l0x_c[sensor_qty]; // center module
VL53L0X_DEV Dev = &vl53l0x_c[0];
VL53L0X_DEV Dev1 = &vl53l0x_c[1];
//
// VL53L0X initialisation stuff
//
uint32_t refSpadCount;
uint8_t isApertureSpads;
uint8_t VhvSettings;
uint8_t PhaseCal;
uint16_t sensorMeasure[sensor_qty];
Dev->I2cHandle = &hi2c1;
Dev1->I2cHandle = &hi2c1;
Dev->I2cDevAddr = Dev1->I2cDevAddr = original_addr;
HAL_GPIO_WritePin(TOF_XSHUT1_GPIO_Port, TOF_XSHUT1_Pin, GPIO_PIN_RESET); // Disable XSHUT
HAL_GPIO_WritePin(TOF_XSHUT2_GPIO_Port, TOF_XSHUT2_Pin, GPIO_PIN_RESET); // Disable XSHUT
HAL_Delay(10);
// addr change 1st sensor
HAL_GPIO_WritePin(TOF_XSHUT1_GPIO_Port, TOF_XSHUT1_Pin, GPIO_PIN_SET); // Enable XSHUT
HAL_Delay(20);
//VL53L0X_ResetDevice(Dev);
VL53L0X_WaitDeviceBooted(Dev);
VL53L0X_DataInit( Dev );
MessageLen = sprintf((char*)Message,"Addr change 1: %i \n\r\n\r", VL53L0X_SetDeviceAddress(Dev, sensor1_addr));
HAL_UART_Transmit(&huart1, Message, MessageLen, 100);
Dev->I2cDevAddr = sensor1_addr;
VL53L0X_WaitDeviceBooted( Dev );
//VL53L0X_DataInit( Dev );
VL53L0X_StaticInit( Dev );
VL53L0X_PerformRefCalibration(Dev, &VhvSettings, &PhaseCal);
VL53L0X_PerformRefSpadManagement(Dev, &refSpadCount, &isApertureSpads);
VL53L0X_SetDeviceMode(Dev, VL53L0X_DEVICEMODE_SINGLE_RANGING);
// Enable/Disable Sigma and Signal check
VL53L0X_SetLimitCheckEnable(Dev, VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, 1);
VL53L0X_SetLimitCheckEnable(Dev, VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, 1);
VL53L0X_SetLimitCheckValue(Dev, VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, (FixPoint1616_t)(0.1*65536));
VL53L0X_SetLimitCheckValue(Dev, VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, (FixPoint1616_t)(60*65536));
VL53L0X_SetMeasurementTimingBudgetMicroSeconds(Dev, 33000);
VL53L0X_SetVcselPulsePeriod(Dev, VL53L0X_VCSEL_PERIOD_PRE_RANGE, 18);
VL53L0X_SetVcselPulsePeriod(Dev, VL53L0X_VCSEL_PERIOD_FINAL_RANGE, 14);
// addr change 2nd sensor
HAL_GPIO_WritePin(TOF_XSHUT2_GPIO_Port, TOF_XSHUT2_Pin, GPIO_PIN_SET); // Enable XSHUT
HAL_Delay(20);
//VL53L0X_ResetDevice(Dev1);
VL53L0X_WaitDeviceBooted(Dev1);
//VL53L0X_DataInit( Dev1 );
MessageLen = sprintf((char*)Message,"Addr change 2: %i \n\r\n\r", VL53L0X_SetDeviceAddress(Dev1, sensor2_addr));
HAL_UART_Transmit(&huart1, Message, MessageLen, 100);
Dev1->I2cDevAddr = sensor2_addr;
VL53L0X_WaitDeviceBooted( Dev1 );
VL53L0X_DataInit( Dev1 );
VL53L0X_StaticInit( Dev1 );
VL53L0X_PerformRefCalibration(Dev1, &VhvSettings, &PhaseCal);
VL53L0X_PerformRefSpadManagement(Dev1, &refSpadCount, &isApertureSpads);
VL53L0X_SetDeviceMode(Dev1, VL53L0X_DEVICEMODE_SINGLE_RANGING);
// Enable/Disable Sigma and Signal check
VL53L0X_SetLimitCheckEnable(Dev1, VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, 1);
VL53L0X_SetLimitCheckEnable(Dev1, VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, 1);
VL53L0X_SetLimitCheckValue(Dev1, VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, (FixPoint1616_t)(0.1*65536));
VL53L0X_SetLimitCheckValue(Dev1, VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, (FixPoint1616_t)(60*65536));
VL53L0X_SetMeasurementTimingBudgetMicroSeconds(Dev1, 33000);
VL53L0X_SetVcselPulsePeriod(Dev1, VL53L0X_VCSEL_PERIOD_PRE_RANGE, 18);
VL53L0X_SetVcselPulsePeriod(Dev1, VL53L0X_VCSEL_PERIOD_FINAL_RANGE, 14);
measure loop:
if(VL53L0X_PerformSingleRangingMeasurement(Dev, &RangingData[0]) == 0){
if(RangingData[0].RangeStatus == 0){
sensorMeasure[0]= RangingData[0].RangeMilliMeter;
}else{
//MessageLen = sprintf((char*)Message, "STATUS1: %i\n\r", RangingData.RangeStatus);
//HAL_UART_Transmit(&huart1, Message, MessageLen, 100);
}
}else{
//MessageLen = sprintf((char*)Message, "BRAK POMIARU!\n\r");
//HAL_UART_Transmit(&huart1, Message, MessageLen, 100);
}
if(VL53L0X_PerformSingleRangingMeasurement(Dev1, &RangingData[1]) == 0){
if(RangingData[1].RangeStatus == 0){
sensorMeasure[1]= RangingData[1].RangeMilliMeter;
}else{
//MessageLen = sprintf((char*)Message, "STATUS2: %i\n\r", RangingData.RangeStatus);
//HAL_UART_Transmit(&huart1, Message, MessageLen, 100);
}
}else{
//MessageLen = sprintf((char*)Message, "BRAK POMIARU!\n\r");
//HAL_UART_Transmit(&huart1, Message, MessageLen, 100);
}
MessageLen = sprintf((char*)Message, "Pomiar odleglosci: %imm %imm\n\r", sensorMeasure[0], sensorMeasure[1]);
HAL_UART_Transmit(&huart1, Message, MessageLen, 100);
2022-06-19 12:14 PM
2022-06-19 01:22 PM
thx, but Your code is for Arduino my is written in Cube based on ST API. I assume here can be an issue...
2022-06-19 03:41 PM
2022-06-20 08:06 AM
thx, i will check based on Your advice!
2022-06-21 08:17 AM
I have another suggestion that might also help. There is a project on ST.com.:
STSW-IMG017 Embedded SoftwareImaging software2D LIDAR using multiple VL53L1X Time-of-Flight long distance ranging sensors.
This project is for the VL53L1X, but just look over the initialization section. It inits 9 sensors. It also
uses a Nucleo board, so that might help as well.
But I do have to admit that Knawa.1's code is pretty good and should get you rolling.
2022-06-21 08:23 AM
Oops - I found the bug. In your code
#define original_addr 0x52
#define sensor1_addr 0x53
#define sensor2_addr 0x54
your addresses are too close together.
Each I2C device has a write address and a read address. And the read is has the LSB set.
So only use even addresss to set them. That leaves the odd addresses open for the reads.
I use 62,72,82 ... but you could use 54, 56, 58... just as easily.