Multiple VL53L0X time of flight sensors

Hello all,

I am trying to write some code to read the sensor values from two VL53L0X tof sensors, but I'm having some trouble.

My current code:

#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/drivers/sensor.h>
#include <zephyr/sys/printk.h>
#include <zephyr/drivers/gpio.h>

static const struct device *const leftSensor = DEVICE_DT_GET(DT_NODELABEL(right_st_vl53l0x));
static const struct device *const rightSensor = DEVICE_DT_GET(DT_NODELABEL(left_st_vl53l0x));

int main(void)
{
        struct sensor_value leftSensorValue;
        struct sensor_value rightSensorValue;
        int ret;

        k_sleep(K_MSEC(1000));

        if (!device_is_ready(leftSensor)) {
	        printk("Left Sensor: device not ready.\n");
	        return 0;
	}
        if (!device_is_ready(rightSensor)) {
	        printk("Right Sensor: device not ready.\n");
	        return 0;
	}
	while (1) {
		ret = sensor_sample_fetch(leftSensor);
		if (ret) {
			printk("sensor_sample_fetch failed ret %d\n", ret);
			return 0;
		}

		ret = sensor_channel_get(leftSensor, SENSOR_CHAN_PROX, &leftSensorValue);
		printk("prox is %d\n", leftSensorValue.val1);

		ret = sensor_channel_get(leftSensor,
					 SENSOR_CHAN_DISTANCE,
					 &leftSensorValue);
		printf("distance is %.3fm\n", sensor_value_to_double(&leftSensorValue));
                
		k_sleep(K_MSEC(1000));
	}
	return 0;
}

My devicetree:

&i2c1 {
    
    right_st_vl53l0x: right_st_vl53l0x@29{
        compatible = "st,vl53l0x";
        status = "okay";
        reg = < 0x29 >;
        xshut-gpios = < &gpio0 15 (GPIO_ACTIVE_LOW)>;
    };
    left_st_vl53l0x: left_st_vl53l0@52{
        compatible = "st,vl53l0x";
        status = "okay";
        reg = < 0x52 >;
        xshut-gpios = < &gpio0 16 (GPIO_ACTIVE_LOW)>;
    };
};
&pinctrl {
	i2c1_default: i2c1_default{
		group1 {
			psels = <NRF_PSEL(TWIM_SDA, 0, 5)>,
				<NRF_PSEL(TWIM_SCL, 0, 4)>;
		};
	};

	i2c1_sleep: i2c1_sleep{
		group1 {
			psels = <NRF_PSEL(TWIM_SDA, 0, 5)>,
				<NRF_PSEL(TWIM_SCL, 0, 4)>;
			low-power-enable;
		};
	};

};

And Kconfig:

CONFIG_STDOUT_CONSOLE=y
CONFIG_I2C=y
CONFIG_GPIO=y
CONFIG_SENSOR=y
CONFIG_VL53L0X_PROXIMITY_THRESHOLD=100
CONFIG_TFM_SECURE_UART=n
CONFIG_TFM_LOG_LEVEL_SILENCE=y
CONFIG_VL53L0X_RECONFIGURE_ADDRESS=y
#debug
#CONFIG_DEBUG=y
#CONFIG_LOG=y
#CONFIG_SENSOR_LOG_LEVEL_DBG=y
CONFIG_CBPRINTF_FP_SUPPORT=y

Whenever I run this code I get a ret error (-19) or sometimes (-5).

Any help is much appreciated!

Parents
  • Hello,

    Which Nordic chip or development kit (DK) are you using? Could you also provide details of the SDK version you are using?

    Whenever I run this code I get a ret error (-19) or sometimes (-5).

    I recommend attaching the complete log to troubleshoot the issue. Please ensure that the I2C addresses (0x29 and 0x52) are correctly set and do not conflict. Additionally, I noticed that static const struct device *const leftSensor = DEVICE_DT_GET(DT_NODELABEL(right_st_vl53l0x)); and DEVICE_DT_GET(DT_NODELABEL(left_st_vl53l0x)); refer to different labels than those used in your device tree overlay. While this might work, it is somewhat confusing.

    Kind Regards,

    Abhijith

  • Thank you for the reply,

    I am using the nrf5340dk and my SDK version is v2.7.0 rc3 but I have also tried v2.6.1.

    I don't quite follow in what you mean by attaching the complete log, furthermore I don't quite know what you mean by making sure the I2C addresses are set correctly. I was able to get readings from one VL53L0X on the default address of 0x29. I have tried multiple addresses for the second VL53L0X.

    Finally, apologies for the confusing application code on the device pointer, when I was trying to debug I swapped around the sensors and forgot to put it back.

    Best,

    Declan S

Reply
  • Thank you for the reply,

    I am using the nrf5340dk and my SDK version is v2.7.0 rc3 but I have also tried v2.6.1.

    I don't quite follow in what you mean by attaching the complete log, furthermore I don't quite know what you mean by making sure the I2C addresses are set correctly. I was able to get readings from one VL53L0X on the default address of 0x29. I have tried multiple addresses for the second VL53L0X.

    Finally, apologies for the confusing application code on the device pointer, when I was trying to debug I swapped around the sensors and forgot to put it back.

    Best,

    Declan S

Children
No Data
Related