A sample program getting measurements from a VL53L1CB ToF sensors which are connected thru a shield to the STM32F401. Copes with one sensor. Polling mode. VL53L1 is operated in multizone mode. MBed V6.
Dependencies: X_NUCLEO_53L1A2
Diff: main.cpp
- Revision:
- 0:50b05f035d13
- Child:
- 1:49e2fad70dfe
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Oct 26 13:34:03 2020 +0000 @@ -0,0 +1,180 @@ +/* + * This VL53L1X Expansion board test application performs range measurements + * using the onboard embedded centre sensor, in multizone, polling mode. + * Measured ranges are ouput on the Serial Port, running at 115200 baud. + * + * + * This is designed to work with MBed V2 ,MBed V5 and MBed V6. + * + * + * The Reset button can be used to restart the program. + */ + +#include <stdio.h> + +#include "mbed.h" +#include "XNucleo53L1A1.h" +#include "ToF_I2C.h" +#include <time.h> + + +// define the i2c comms pins +#define I2C_SDA D14 +#define I2C_SCL D15 + + + +static XNucleo53L1A1 *board=NULL; +Serial pc(SERIAL_TX, SERIAL_RX); + +void process_interrupt( VL53L1X * sensor,VL53L1_DEV dev ); +void print_results( int devSpiNumber, VL53L1_MultiRangingData_t *pMultiRangingData ); + +VL53L1_Dev_t devCentre; +VL53L1_Dev_t devLeft; +VL53L1_Dev_t devRight; +VL53L1_DEV Dev = &devCentre; + + +/*=================================== Main ================================== +=============================================================================*/ +int main() +{ + int status; + VL53L1X * Sensor; + uint16_t wordData; + + + pc.baud(115200); // baud rate is important as printf statements take a lot of time + printf("Polling single multizone\r\n"); + +// create i2c interface + ToF_DevI2C *dev_I2C = new ToF_DevI2C(I2C_SDA, I2C_SCL); + + /* creates the 53L1A1 expansion board singleton obj */ + board = XNucleo53L1A1::instance(dev_I2C, A2, D8, D2); + + printf("board created!\r\n"); + + /* init the 53L1A1 expansion board with default values */ + status = board->init_board(); + if (status) { + printf("Failed to init board!\r\n"); + return 0; + } + + + printf("board initiated! - %d\r\n", status); + // create the sensor controller classes + + + + Dev=&devCentre; + Sensor=board->sensor_centre; + Dev->i2c_slave_address = NEW_SENSOR_CENTRE_ADDRESS; + printf("configuring centre channel \n"); + + +// configure the sensors + Dev->comms_speed_khz = 400; + + Dev->comms_type = 1; + + Sensor->VL53L1_RdWord(Dev, 0x01, &wordData); + printf("VL53L1X: %02X %d\n\r", wordData,Dev->i2c_slave_address); +/* Device Initialization and setting */ + status = Sensor->vl53L1_DataInit(); + status = Sensor->vl53L1_StaticInit(); + status = Sensor->vl53L1_SetPresetMode( VL53L1_PRESETMODE_MULTIZONES_SCANNING); +// status = Sensor->vl53L1_SetDistanceMode( VL53L1_DISTANCEMODE_LONG); +// status = Sensor->vl53L1_SetMeasurementTimingBudgetMicroSeconds( 100 * 1000); +// status = Sensor->vl53L1_SetInterMeasurementPeriodMilliSeconds( 100); + + + VL53L1_RoiConfig_t roiConfig; + roiConfig.NumberOfRoi =3; + roiConfig.UserRois[0].TopLeftX = 0; + roiConfig.UserRois[0].TopLeftY = 9; + roiConfig.UserRois[0].BotRightX = 4; + roiConfig.UserRois[0].BotRightY = 5; + roiConfig.UserRois[1].TopLeftX = 5; + roiConfig.UserRois[1].TopLeftY = 9; + roiConfig.UserRois[1].BotRightX = 9; + roiConfig.UserRois[1].BotRightY = 4; + roiConfig.UserRois[2].TopLeftX = 11; + roiConfig.UserRois[2].TopLeftY = 9; + roiConfig.UserRois[2].BotRightX = 15; + roiConfig.UserRois[2].BotRightY = 5; + status = Sensor->vl53L1_SetROI( &roiConfig); + printf("VL53L1_SetROI %d \n",status); + + devCentre.i2c_slave_address = NEW_SENSOR_CENTRE_ADDRESS; + status = board->sensor_centre->vl53L1_StartMeasurement(); + + // looping polling for results + while (1) + { + VL53L1_MultiRangingData_t MultiRangingData; + VL53L1_MultiRangingData_t *pMultiRangingData = &MultiRangingData; + + // wait for result + status = board->sensor_centre->vl53L1_WaitMeasurementDataReady(); + // get the result + status = board->sensor_centre->vl53L1_GetMultiRangingData( pMultiRangingData); + // if valid, print it + if(status==0) { + print_results(devCentre.i2c_slave_address, pMultiRangingData ); + status = board->sensor_centre->vl53L1_ClearInterruptAndStartMeasurement(); + + } //if(status==0) + else + { + printf("VL53L1_GetMultiRangingData centre %d \n",status); + } + + wait_ms( 1 * 10); + } +} + + + + // prints the range result seen above +void print_results( int devSpiNumber, VL53L1_MultiRangingData_t *pMultiRangingData ) +{ + int no_of_object_found=pMultiRangingData->NumberOfObjectsFound; + + int RoiNumber=pMultiRangingData->RoiNumber; +// int RoiStatus=pMultiRangingData->RoiStatus; + + if (( no_of_object_found < 10 ) && ( no_of_object_found != 0)) + { + + // printf("MZI Count=%5d, ", pMultiRangingData->StreamCount); + // printf("RoiNumber%1d, ", RoiNumber); + // printf("RoiStatus=%1d, \n", RoiStatus); + for(int j=0;j<no_of_object_found;j++){ + if ((pMultiRangingData->RangeData[j].RangeStatus == VL53L1_RANGESTATUS_RANGE_VALID) || + (pMultiRangingData->RangeData[j].RangeStatus == VL53L1_RANGESTATUS_RANGE_VALID_NO_WRAP_CHECK_FAIL)) + { + printf("*****************\t spiAddr=%d \t RoiNumber=%d \t status=%d, \t D=%5dmm, \t Signal=%2.2f Mcps, \t Ambient=%2.2f Mcps \n", + devSpiNumber, + RoiNumber, + pMultiRangingData->RangeData[j].RangeStatus, + pMultiRangingData->RangeData[j].RangeMilliMeter, + pMultiRangingData->RangeData[j].SignalRateRtnMegaCps/65536.0, + pMultiRangingData->RangeData[j].AmbientRateRtnMegaCps/65536.0); + } + else + { +// printf("RangeStatus %d %d\n",j, pMultiRangingData->RangeData[j].RangeStatus); + } + } + } // if (( no_of_object_found < 10 ) && ( no_of_object_found != 0)) + else + { +// printf("no_of_object_found %d \n",no_of_object_found); + } + +} + + \ No newline at end of file