enlarge functional simple ranging/interrupt example, to cater for multi-zone.
Dependencies: X_NUCLEO_53L1A2
Diff: main.cpp
- Revision:
- 4:396e4d72f19e
- Parent:
- 3:09f23aad108a
--- a/main.cpp Thu May 13 08:31:52 2021 +0000 +++ b/main.cpp Thu May 13 10:57:15 2021 +0000 @@ -73,7 +73,7 @@ InterruptIn stop_button(SW2); #endif -void process_interrupt( VL53L1 * sensor,VL53L1_DEV dev ); +//void process_interrupt( VL53L1 * sensor,VL53L1_DEV dev ); void print_results( int devSpiNumber, VL53L1_MultiRangingData_t *pMultiRangingData ); @@ -146,46 +146,54 @@ if (centerSensor) { centerSensor = false; + // get the result + status = board->sensor_centre->vl53L1_GetMultiRangingData(pMultiRangingData); status = board->sensor_centre->VL53L1_GetDistance(&distance); current = (currentSensor == 0); if (current) { + print_results(devCentre.i2c_slave_address, pMultiRangingData ); printf("Centre: %d\r\n", distance); - } - + } +// status = board->sensor_centre->vl53L1_ClearInterruptAndStartMeasurement(); status = board->sensor_centre->VL53L1_ClearInterrupt(); board->sensor_centre->enable_interrupt_measure_detection_irq(); - } /* Handle the interrupt and output the range from the left sensor */ if (leftSensor) { leftSensor = false; + // get the result + status = board->sensor_left->vl53L1_GetMultiRangingData(pMultiRangingData); status = board->sensor_left->VL53L1_GetDistance(&distance); current = (installedSensors[currentSensor] == 'L'); if (current) { + print_results(devLeft.i2c_slave_address, pMultiRangingData ); printf("Left: %d\r\n", distance); - } + } +// status = board->sensor_left->vl53L1_ClearInterruptAndStartMeasurement(); status = board->sensor_left->VL53L1_ClearInterrupt(); board->sensor_left->enable_interrupt_measure_detection_irq(); - } /* Handle the interrupt and output the range from the right sensor */ if (rightSensor) { rightSensor = false; + // get the result + status = board->sensor_right->vl53L1_GetMultiRangingData(pMultiRangingData); status = board->sensor_right->VL53L1_GetDistance(&distance); current = (installedSensors[currentSensor] == 'R'); if (current) { + print_results(devRight.i2c_slave_address, pMultiRangingData ); printf("Right: %d\r\n", distance); } +// status = board->sensor_right->vl53L1_ClearInterruptAndStartMeasurement(); status = board->sensor_right->VL53L1_ClearInterrupt(); board->sensor_right->enable_interrupt_measure_detection_irq(); - } } @@ -193,11 +201,6 @@ { int status = 0; -// Device Initialization and setting - status = Sensor->vl53L1_DataInit(); - status = Sensor->vl53L1_StaticInit(); - status = Sensor->vl53L1_SetPresetMode( VL53L1_PRESETMODE_MULTIZONES_SCANNING); - //configure the regions of interest for each sensor VL53L1_RoiConfig_t roiConfig; @@ -206,17 +209,25 @@ 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); +// 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 * 500); // error -21 is because of this. Don't know why @@ -237,6 +248,8 @@ if (board->sensor_centre != NULL) { Dev = &devCentre; Dev->i2c_slave_address = NEW_SENSOR_CENTRE_ADDRESS; + devCentre.i2c_slave_address = NEW_SENSOR_CENTRE_ADDRESS; + status = configure_sensor(board->sensor_centre); printf("configuring centre channel \n"); } @@ -244,6 +257,8 @@ if (board->sensor_left != NULL) { Dev = &devLeft; Dev->i2c_slave_address = NEW_SENSOR_LEFT_ADDRESS; + devLeft.i2c_slave_address = NEW_SENSOR_LEFT_ADDRESS; + status = configure_sensor(board->sensor_left); printf("configuring left channel \n"); } @@ -251,6 +266,8 @@ if (board->sensor_right != NULL) { Dev = &devRight; Dev->i2c_slave_address = NEW_SENSOR_RIGHT_ADDRESS; + devRight.i2c_slave_address = NEW_SENSOR_RIGHT_ADDRESS; + status = configure_sensor(board->sensor_right); printf("configuring right channel \n"); } @@ -357,16 +374,16 @@ // print out what data is required -void print_results( int devNumber, VL53L1_MultiRangingData_t *pMultiRangingData ) +void print_results(int devNumber, VL53L1_MultiRangingData_t *pMultiRangingData ) { - int no_of_object_found=pMultiRangingData->NumberOfObjectsFound; + int no_of_object_found = pMultiRangingData->NumberOfObjectsFound; int signal_rate = 0; int ambient_rate = 0; - int RoiNumber=pMultiRangingData->RoiNumber; + int RoiNumber = pMultiRangingData->RoiNumber; - if (( no_of_object_found < 10 ) && ( no_of_object_found != 0)) { - for(int j=0; j<no_of_object_found; j++) { + if ((no_of_object_found < 10) && (no_of_object_found != 0)) { + 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)) { signal_rate = pMultiRangingData->RangeData[j].SignalRateRtnMegaCps / 65535;