Device driver for the ST VL6180X Ranging and Ambient Light Sensing (ALS) module. More...
Device driver for the ST VL6180X Ranging and Ambient Light Sensing (ALS) module.
The ST VL6180X is a low-power proximity and ambient light sensor with an I2C interface that uses time-to-flight technology for distance measurements. It can be used for ranging and/or ambient light sensing (ALS). Measurements can be automatically performed at user-defined intervals.
To minimize host operations, interrupts can be used either when new sensor data are ready to be read or when sensor values exceed configured thresholds.
The driver supports different levels of functionality, which can be enabled by using pseudomodules according to the requirements of the application. This ensures that the driver only uses as much ROM/RAM as really needed.
As basic functionality the driver supports:
The following pseudomodules are used to enable additional functionalities:
Pseudomodule | Functionality |
---|---|
vl6180x_irq | Data ready and event interrupt handling |
vl6180x_suhtdown | Power-down and power-up functions |
vl6180x_config | Functions for changing configurations at runtime |
The following table shows the mapping of which modules have to be used to enable which functions of the VL6180X.
Feature | Module |
---|---|
Ranging in single-shot or continuous mode | vl6180x_rng |
Ambient light sensing (ALS) in single-shot or continuous mode | vl6180x_als |
Data ready and event interrupt handling | vl6180x_irq |
Power-down and power-up functions | vl6180x_shutdown |
Configuration of the sensor at runtime | vl6180x_config |
vl6180x_irq
, the GPIO pin for the interrupt signal (sensor pin GPIO1) must be defined by the configuration parameter vl6180x_params_t::int_pin. The default configuration of this GPIO pin is defined by VL6180X_PARAM_INT_PIN that can be overridden by the board definition. The interrupt signal is LOW active.vl6180x_shutdown
, the GPIO pin for the shutdown signal (sensor pin GPIO0/CE) must be defined by the configuration parameter vl6180x_params_t::shutdown_pin. The default configuration of this GPIO pin is defined by VL6180X_PARAM_SHUTDOWN_PIN that can be overridden by the board definition. The shutdown signal is LOW active.The easiest way to use the driver is simply to initialize the sensor with function vl6180x_init using the default configuration parameter set vl6180x_params as defined in file vl6180x_params.h.
After initialization, the sensor is configured according to the standard configuration parameters and is fully operational.
The VL6180X can be used in two modes
vl6180x_rng
and vl6180x_als
are both used), the so-called interleaved mode is automatically used, where an ALS measurement is immediately followed by a range measurement and repeated with the defined period. The continuous mode can be stopped with function vl6180x_stop_cont, for example to start single measurements. It is also possible to restart it using function vl6180x_start_cont.To get data, the user task can use either
Function vl6180x_als_read returns one ALS data sample as raw count value and, if required, as illuminance in Lux. The range of the count value depends on
The count value is returned in parameter raw
while the illuminance is returned in parameter lux
. For either raw
or lux
also NULL
can be passed, if only one value is of interest.
If ALS value is invalid because of a measurement error, VL6180X_ERROR_ALS is returned. The vl6180x_als_status function can then be used to get an error code of type vl6180x_als_status_t.
Function vl6180x_rng_read returns the ranging data in millimeters. If ranging value is invalid because of a measurement error, VL6180X_ERROR_RNG is returned and function vl6180x_rng_status function can then be used to get an error code of type vl6180x_rng_status_t.
The VL6180X sensor allows the use of different types of interrupts on signal GPIO1 for range and ALS measurements:
vl6180x_irq
is used.These interrupts can be enabled separately for the range and ALS measurements by the interrupt mode of type vl6180x_int_mode_t
Interrupt mode | Driver symbol |
---|---|
New data are ready to be read | VL6180X_INT_DRDY |
Sensor data are below the lower threshold | VL6180X_INT_LOW |
Sensor data are above the upper threshold | VL6180X_INT_HIGH |
Sensor data are below the lower threshold or above the upper threshold | VL6180X_INT_OUT |
For event interrupts, upper and lower thresholds have to be defined, with the upper and lower thresholds defining a threshold window of type vl6180x_int_thresh_t.
In default configuration, VL6180X_INT_DRDY is used both for range and ALS measurements if module vl6180x_irq
is used.
The enabled interrupts can be changed with the vl6180x_int_enable function which takes a parameter of type vl6180x_int_config_t which simply contains the interrupt mode of type vl6180x_int_mode_t for range and ALS measurements.
If module vl6180x_config
is used, the thresholds for event interrupts can be changed using function vl6180x_int_config, for example:
All functions of the driver require direct access to the sensor via I2C which does not work in interrupt context.
Therefore, the driver prevents the direct use of the interrupts and application specific ISRs. The only way to use interrupts is to call the function vl6180x_int_wait which enables the interrupt signal for the configured MCU GPIO and then blocks the calling thread until an interrupt is triggered.
Once an interrupt is triggered, the driver handles the interrupt with an internal ISR and then returns from the vl6180x_int_wait function with the interrupt source. The interrupt mode of type vl6180x_int_mode_t respectively the composite type vl6180x_int_config_t which is used for defining enabled interrupts is also used for specifying the interrupt source. It contains a flag for each possible interrupt source which can be tested for true.
If module vl6180x_shutdown
is used, the VL6180X sensor can be shutdown when no measurements are required using the function vl6180x_power_down. The power consumption is then reduced to less than 1 uA. To restart the VL6180X in previous measurement mode, the vl6180x_power_up function can be used.
Low level level interface functions that allow direct read and write access to the registers of the sensor.
Default sensor hardware configurations are set in file vl6180x_params.h
using the following defines:
Hardware configuration | Driver name | Default Value |
---|---|---|
I2C device | VL6180X_PARAM_DEV | I2C_DEV(0) |
I2C address | VL6180X_PARAM_ADDR | VL6180X_I2C_ADDR |
Interrupt pin | VL6180X_PARAM_INT_PIN | GPIO_PIN(0,1) |
Shutdown pin | VL6180X_PARAM_SHUTDOWN_PIN | GPIO_PIN(0,2) |
These hardware configurations can be overridden either by the board definition or by defining them in the CFLAGS
variable in the make command, for example:
The default configuration of the sensor is defined in file vl6180x_params.h
using the following defines:
Parameter | Default Value | Define to be overridden |
---|---|---|
Period of continuous measurements | 200 ms | CONFIG_VL6180X_MEAS_PERIOD |
Ranging maximum convergence time | 50 ms | CONFIG_VL6180X_RNG_MAX_TIME |
Ranging interrupt mode | VL6180X_INT_DRDY | CONFIG_VL6180X_RNG_INT |
Ranging lower threshold | 20 mm | CONFIG_VL6180X_RNG_THRESH_LOW |
Ranging upper threshold | 90 mm | CONFIG_VL6180X_RNG_THRESH_HIGH |
ALS integration time | 100 ms | CONFIG_VL6180X_ALS_INT_TIME |
ALS analogue gain | VL6180X_ALS_GAIN_1 | CONFIG_VL6180X_ALS_GAIN |
ALS lux resolution lux/count*1000 | 320 | CONFIG_VL6180X_ALS_LUX_RES |
ALS interrupt mode | VL6180X_INT_DRDY | CONFIG_VL6180X_ALS_INT |
ALS lower threshold | 50 counts | CONFIG_VL6180X_ALS_THRESH_LOW |
ALS upper threshold | 2000 counts | CONFIG_VL6180X_ALS_THRESH_HIGH |
Single or all parameters of the default configuration can be overridden either by placing a modified file vl6180x_params.h
in the application directory or by defining them in the variable CFLAGS
in the make command line. For example to configure a measurement period of 500 ms and a maximum convergence time for ranging of 60 ms, the following command could be used:
If module vl6180x_config
is used, the following functions can be used to change the default sensor configuration at runtime.
Function | Functionality |
---|---|
vl6180x_rng_config | Changes the range measurement parameter configuration |
vl6180x_als_config | Changes the ALS measurement parameter configuration |
vl6180x_int_config | Changes the thresholds for event interrupts |
Files | |
file | vl6180x.h |
file | vl6180x_params.h |
Default configuration for ST VL6180X Ranging and Ambient Light Sensing (ALS) module. | |
file | vl6180x_regs.h |
Register definitions for ST VL6180X Ranging and Ambient Light Sensing (ALS) module. | |
Data Structures | |
struct | vl6180x_int_config_t |
Interrupt config. More... | |
struct | vl6180x_int_thresh_t |
Interrupt threshold configuration. More... | |
struct | vl6180x_params_t |
VL6180X device configuration. More... | |
struct | vl6180x_t |
VL6180X sensor device data structure type. More... | |
Macros | |
#define | VL6180X_I2C_ADDR (0x29) |
VNCL6180 default I2C slave address. | |
Functions | |
int | vl6180x_init (vl6180x_t *dev, const vl6180x_params_t *params) |
Initialize the VL6180X sensor device. | |
int | vl6180x_start_cont (vl6180x_t *dev) |
Start measurements in continuous mode. | |
int | vl6180x_stop_cont (vl6180x_t *dev) |
Stop measurements in continuous mode. | |
int | vl6180x_rng_data_ready (const vl6180x_t *dev) |
Range data ready status function. | |
int | vl6180x_rng_read (vl6180x_t *dev, uint8_t *mm) |
Read one ranging data sample in mm. | |
vl6180x_rng_status_t | vl6180x_rng_status (const vl6180x_t *dev) |
Get status of last range measurement. | |
int | vl6180x_rng_start_single (const vl6180x_t *dev) |
Start a single-shot range measurement. | |
int | vl6180x_rng_config (vl6180x_t *dev, uint8_t period, uint8_t max_time) |
Reconfigure range measurements at runtime. | |
int | vl6180x_als_data_ready (const vl6180x_t *dev) |
ALS data ready status function. | |
int | vl6180x_als_read (vl6180x_t *dev, uint16_t *raw, uint16_t *lux) |
Read one ambient light sensing (ALS) data sample. | |
vl6180x_als_status_t | vl6180x_als_status (const vl6180x_t *dev) |
Get status of last ALS measurement. | |
int | vl6180x_als_start_single (const vl6180x_t *dev) |
Start a single-shot ALS measurement. | |
int | vl6180x_als_config (vl6180x_t *dev, uint8_t period, uint8_t int_time, vl6180x_als_gain_t gain) |
Reconfigure ambient light sensing (ALS) during runtime. | |
int | vl6180x_power_down (const vl6180x_t *dev) |
Power down the sensor. | |
int | vl6180x_power_up (vl6180x_t *dev) |
Power down the sensor. | |
int | vl6180x_int_wait (const vl6180x_t *dev, vl6180x_int_config_t *src) |
Wait for configured interrupts and return the interrupt sources. | |
int | vl6180x_int_enable (vl6180x_t *dev, vl6180x_int_config_t mode) |
Enable and disable interrupts. | |
int | vl6180x_int_config (vl6180x_t *dev, vl6180x_int_thresh_t thresh) |
Configure thresholds for event interrupts at runtime. | |
Low level interface functions | |
int | vl6180x_reg_write (const vl6180x_t *dev, uint16_t reg, const uint8_t *data, uint8_t len) |
Direct write to register. | |
int | vl6180x_reg_read (const vl6180x_t *dev, uint16_t reg, uint8_t *data, uint8_t len) |
Direct read from register. | |
#define VL6180X_I2C_ADDR (0x29) |
enum vl6180x_als_gain_t |
Analogue gain for ALS measurements.
enum vl6180x_als_status_t |
enum vl6180x_error_t |
Error codes.
enum vl6180x_int_mode_t |
Interrupt mode.
The interrupt mode defines the different sources that can trigger an interrupt on the GPIO1 pin of the sensor. The interrupt mode is defined for range and ALS measurements separately. Interrupts can be triggered either
For threshold interrupts, upper and lower thresholds have to be defined, with the upper and lower thresholds defining a threshold window, see also vl6180x_int_thresh_t.
vl6180x_irq
is used. enum vl6180x_rng_status_t |
Range measurement status.
int vl6180x_als_config | ( | vl6180x_t * | dev, |
uint8_t | period, | ||
uint8_t | int_time, | ||
vl6180x_als_gain_t | gain | ||
) |
Reconfigure ambient light sensing (ALS) during runtime.
This function can be used to overwrite the default configuration of ambient light sensing defined by vl6180x_params_t during runtime.
For this purpose, the running ambient light sensing (ALS) is stopped and restarted after the reconfiguration if continuous mode is used (period
is not 0).
vl6180x_als
and vl6180x_config
are used.period
is used for continuous mode, in which measurements are performed in interleaved mode, setting the period with this function also affects the range measurements in continuous mode.[in] | dev | Device descriptor of VL6180X sensor |
[in] | period | Period in continuous measurement mode in steps of 10 ms. It controls also the measurement mode enabled after the initialization. If 0, single-shot mode is enabled, otherwise the continuous mode is enabled and measurement are started automatically. |
[in] | int_time | ALS integration time in ms [0...511] |
[in] | gain | ALS analogue gain for light channel |
VL6180X_OK | on success |
VL6180X_ERROR_* | a negative error code on error, see vl6180x_error_t |
int vl6180x_als_data_ready | ( | const vl6180x_t * | dev | ) |
ALS data ready status function.
vl6180x_als
is used.[in] | dev | Device descriptor of VL6180X sensor |
VL6180X_OK | new ALS data are ready |
VL6180X_ERROR_NO_DATA | no new ALS data available |
VL6180X_ERROR_* | a negative error code on any other error, see vl6180x_error_t |
int vl6180x_als_read | ( | vl6180x_t * | dev, |
uint16_t * | raw, | ||
uint16_t * | lux | ||
) |
Read one ambient light sensing (ALS) data sample.
This function returns one ALS data sample as raw count value and, if required, as illuminance in Lux. The range of the count value depends on
The count value is returned in parameter raw
while the illuminance is returned in parameter lux
. For either raw
or lux
also NULL
can be passed, if only one value is of interest.
If ALS value is invalid because of a measurement error, VL6180X_ERROR_ALS is returned. The vl6180x_als_status function can then be used to get an error code of type vl6180x_als_status_t.
vl6180x_als
is used.[in] | dev | Device descriptor of VL6180X sensor |
[out] | raw | Ambient light raw data as count value |
[out] | lux | Ambient light in Lux |
VL6180X_OK | on success |
VL6180X_ERROR_* | a negative error code on error, see vl6180x_error_t |
int vl6180x_als_start_single | ( | const vl6180x_t * | dev | ) |
Start a single-shot ALS measurement.
vl6180x_als
is used.[in] | dev | Device descriptor of VL6180X sensor |
VL6180X_OK | on success |
VL6180X_ERROR_* | a negative error code on error, see vl6180x_error_t |
vl6180x_als_status_t vl6180x_als_status | ( | const vl6180x_t * | dev | ) |
Get status of last ALS measurement.
vl6180x_als
is used.[in] | dev | Device descriptor of VL6180X sensor |
status | of type vl6180x_als_status_t |
int vl6180x_init | ( | vl6180x_t * | dev, |
const vl6180x_params_t * | params | ||
) |
Initialize the VL6180X sensor device.
After initialization, the sensor is configured according to the standard configuration parameters and is fully functional.
If the configured measurement period is 0, the single-shot mode is enabled for both the range and ALS measurements. The functions vl6180x_rng_start_single and vl6180x_als_start_single must then be used to start a single measurement. Otherwise, the continuous mode is activated for both measurements, which are started immediately after sensor initialization with the configured measurement period.
[in] | dev | Device descriptor of VL6180X sensor to be initialized |
[in] | params | Configuration parameters, see vl6180x_params_t |
VL6180X_OK | on success |
VL6180X_ERROR_* | a negative error code on error, see vl6180x_error_t |
int vl6180x_int_config | ( | vl6180x_t * | dev, |
vl6180x_int_thresh_t | thresh | ||
) |
Configure thresholds for event interrupts at runtime.
vl6180x_irq
and vl6180x_config
are used.[in] | dev | Device descriptor of VL6180X sensor |
[in] | thresh | Threshold configuration for event interrupts, see vl6180x_int_thresh_t |
VL6180X_OK | on success |
VL6180X_ERROR_* | a negative error code on error, see vl6180x_error_t |
int vl6180x_int_enable | ( | vl6180x_t * | dev, |
vl6180x_int_config_t | mode | ||
) |
Enable and disable interrupts.
Configured interrupts can be enabled or disabled with this function.
vl6180x_irq
is used.[in] | dev | Device descriptor of VL6180X sensor |
[in] | mode | Interrupts to be enabled, must be only one for each measurement type (range and ALS) |
VL6180X_OK | on success |
VL6180X_ERROR_* | a negative error code on error, see vl6180x_error_t |
int vl6180x_int_wait | ( | const vl6180x_t * | dev, |
vl6180x_int_config_t * | src | ||
) |
Wait for configured interrupts and return the interrupt sources.
To avoid I2C bus access in interrupt context, the driver prevents the direct use of interrupts and application specific ISRs. Rather, this function has to be used to wait for an interrupt. It enables the interrupt signal for the configured MCU GPIO and then blocks the calling thread until an interrupt is triggered.
Once an interrupt is triggered, the driver handles the interrupt with an internal ISR and then returns. When the function returns, the data structure of type vl6180x_int_config_t to which the src
parameter points contains the source of the triggered interrupt. It contains a flag for each possible interrupt source which can be tested for true.
vl6180x_irq
is used.[in] | dev | Device descriptor of VL6180X sensor |
[out] | src | Interrupt sources, see vl6180x_int_config_t |
VL6180X_OK | on success |
VL6180X_ERROR_* | a negative error code on error, see vl6180x_error_t |
int vl6180x_power_down | ( | const vl6180x_t * | dev | ) |
Power down the sensor.
vl6180x_shutdown
module is used.[in] | dev | Device descriptor of VL6180X sensor |
VL6180X_OK | on success |
VL6180X_ERROR_* | a negative error code on error, see vl6180x_error_t |
int vl6180x_power_up | ( | vl6180x_t * | dev | ) |
Power down the sensor.
vl6180x_shutdown
module is used.[in] | dev | Device descriptor of VL6180X sensor |
VL6180X_OK | on success |
VL6180X_ERROR_* | a negative error code on error, see vl6180x_error_t |
int vl6180x_reg_read | ( | const vl6180x_t * | dev, |
uint16_t | reg, | ||
uint8_t * | data, | ||
uint8_t | len | ||
) |
Direct read from register.
[in] | dev | Device descriptor of VL6180X sensor |
[in] | reg | address of the first register to be read |
[out] | data | pointer to the data to be read from the register |
[in] | len | number of bytes to be read from the register |
VL6180X_OK | on success |
VL6180X_ERROR_* | a negative error code on error, see vl6180x_error_t |
int vl6180x_reg_write | ( | const vl6180x_t * | dev, |
uint16_t | reg, | ||
const uint8_t * | data, | ||
uint8_t | len | ||
) |
Direct write to register.
[in] | dev | Device descriptor of VL6180X sensor |
[in] | reg | Address of the first register to be changed |
[in] | data | Pointer to the data to be written to the register |
[in] | len | Number of bytes to be written to the register |
VL6180X_OK | on success |
VL6180X_ERROR_* | a negative error code on error, see vl6180x_error_t |
int vl6180x_rng_config | ( | vl6180x_t * | dev, |
uint8_t | period, | ||
uint8_t | max_time | ||
) |
Reconfigure range measurements at runtime.
This function can be used to overwrite the default configuration of range measurements defined by vl6180x_params_t at runtime.
For this purpose, the running range measurement is stopped and restarted after the reconfiguration if continuous mode is used (period
is not 0).
vl6180x_rng
and vl6180x_config
are used.period
is used for continuous mode, in which measurements are performed in interleaved mode, setting the period with this function also affects the ALS measurements in continuous mode.[in] | dev | Device descriptor of VL6180X sensor |
[in] | period | Period in continuous measurement mode in steps of 10 ms. It controls also the measurement mode enabled after the initialization. If 0, single-shot mode is enabled, otherwise the continuous mode is enabled and measurement are started automatically. |
[in] | max_time | Maximum convergence time in ms [1...63] given to the sensor to perform range measurements |
VL6180X_OK | on success |
VL6180X_ERROR_* | a negative error code on error, see vl6180x_error_t |
int vl6180x_rng_data_ready | ( | const vl6180x_t * | dev | ) |
Range data ready status function.
The function can be used for polling to know when new ranging data are ready.
vl6180x_rng
is used.[in] | dev | Device descriptor of VL6180X sensor |
VL6180X_OK | new ranging data are ready |
VL6180X_ERROR_NO_DATA | no new ranging data available |
VL6180X_ERROR_* | a negative error code on any other error, see vl6180x_error_t |
int vl6180x_rng_read | ( | vl6180x_t * | dev, |
uint8_t * | mm | ||
) |
Read one ranging data sample in mm.
This function returns the ranging data in millimeters. If ranging value is invalid because of a measurement error, VL6180X_ERROR_RNG is returned. The vl6180x_rng_status function can then be used to get an error code of type vl6180x_rng_status_t.
vl6180x_rng
is used.[in] | dev | Device descriptor of VL6180X sensor |
[out] | mm | Ranging data in mm [0...100] |
VL6180X_OK | on success |
VL6180X_ERROR_RNG | on error during range measurement |
VL6180X_ERROR_* | a negative error code on any other error see vl6180x_error_t |
int vl6180x_rng_start_single | ( | const vl6180x_t * | dev | ) |
Start a single-shot range measurement.
vl6180x_rng
is used.[in] | dev | Device descriptor of VL6180X sensor |
VL6180X_OK | on success |
VL6180X_ERROR_* | a negative error code on error, see vl6180x_error_t |
vl6180x_rng_status_t vl6180x_rng_status | ( | const vl6180x_t * | dev | ) |
Get status of last range measurement.
vl6180x_rng
is used.[in] | dev | Device descriptor of VL6180X sensor |
status | of type vl6180x_rng_status_t |
int vl6180x_start_cont | ( | vl6180x_t * | dev | ) |
Start measurements in continuous mode.
Range and/or ALS measurements are started in continuous mode with same measurement period as defined in configuration parameter vl6180x_params_t::period.
[in] | dev | Device descriptor of VL6180X sensor to be initialized |
VL6180X_OK | on success |
VL6180X_ERROR_* | a negative error code on error, see vl6180x_error_t |
int vl6180x_stop_cont | ( | vl6180x_t * | dev | ) |
Stop measurements in continuous mode.
Continuous range and ALS measurements are stopped. Once continuous measurements are stopped, vl6180x_rng_start_single or vl6180x_als_start_single can be used to start single-shot measurements separately.
[in] | dev | Device descriptor of VL6180X sensor to be initialized |
VL6180X_OK | on success |
VL6180X_ERROR_* | a negative error code on error, see vl6180x_error_t |