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
main.cpp
- Committer:
- charlesmn
- Date:
- 2021-06-14
- Revision:
- 6:a71567e36ab4
- Parent:
- 5:5916ff386a94
File content as of revision 6:a71567e36ab4:
/* * 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 "XNucleo53L1A2.h" #include "ToF_I2C.h" #include <time.h> // define the i2c comms pins #define I2C_SDA D14 #define I2C_SCL D15 static XNucleo53L1A2 *board=NULL; #if (MBED_VERSION > 60300) UnbufferedSerial pc(USBTX, USBRX); extern "C" void wait_ms(int ms); #else Serial pc(SERIAL_TX, SERIAL_RX); #endif void process_interrupt( VL53L1CB * 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; VL53L1CB * Sensor; uint16_t wordData; pc.baud(115200); // baud rate is important as printf statements take a lot of time printf("Polling single multizone mbed = %d \r\n",MBED_VERSION); // create i2c interface ToF_DevI2C *dev_I2C = new ToF_DevI2C(I2C_SDA, I2C_SCL); /* creates the 53L1A1 expansion board singleton obj */ board = XNucleo53L1A2::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->VL53L1CB_RdWord(Dev, 0x01, &wordData); printf("VL53L1X: %02X %d\n\r", wordData,Dev->i2c_slave_address); /* Device Initialization and setting */ status = Sensor->VL53L1CB_DataInit(); status = Sensor->VL53L1CB_StaticInit(); status = Sensor->VL53L1CB_SetPresetMode( VL53L1_PRESETMODE_MULTIZONES_SCANNING); status = Sensor->VL53L1CB_SetDistanceMode( VL53L1_DISTANCEMODE_LONG); 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->VL53L1CB_SetROI( &roiConfig); printf("VL53L1_SetROI %d \n",status); devCentre.i2c_slave_address = NEW_SENSOR_CENTRE_ADDRESS; status = board->sensor_centre->VL53L1CB_StartMeasurement(); // looping polling for results while (1) { VL53L1_MultiRangingData_t MultiRangingData; VL53L1_MultiRangingData_t *pMultiRangingData = &MultiRangingData; // wait for result status = board->sensor_centre->VL53L1CB_WaitMeasurementDataReady(); // get the result status = board->sensor_centre->VL53L1CB_GetMultiRangingData( pMultiRangingData); // if valid, print it if(status==0) { print_results(devCentre.i2c_slave_address, pMultiRangingData ); status = board->sensor_centre->VL53L1CB_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); } } #if (MBED_VERSION > 60300) extern "C" void wait_ms(int ms) { thread_sleep_for(ms); } #endif