A sample program getting measurements from a VL53L1 ToF sensor which is directly connected to the STM32F401. Only copes with one sensor. Polls for measurements. VL53L1 is operated in multizone mode. MBed V6.3 but will work with other MBed versions.
Dependencies: X_NUCLEO_53L1A2
main.cpp@0:47d5c900dab9, 2020-10-27 (annotated)
- Committer:
- charlesmn
- Date:
- Tue Oct 27 09:01:08 2020 +0000
- Revision:
- 0:47d5c900dab9
- Child:
- 1:6bbe4976bc7b
A sample program getting measurements from a VL53L1 ToF sensor which is directly connected to the STM32F401. Only copes with one sensor. Polls for measurements. VL53L1 is operated in multizone mode. MBed V6.3 but will work with other MBed versions.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
charlesmn | 0:47d5c900dab9 | 1 | /* |
charlesmn | 0:47d5c900dab9 | 2 | * This application performs range measurements |
charlesmn | 0:47d5c900dab9 | 3 | * connecting directly to the onboard embedded centre sensor, in multizone, polling mode. |
charlesmn | 0:47d5c900dab9 | 4 | * Measured ranges are ouput on the Serial Port, running at 115200 baud. |
charlesmn | 0:47d5c900dab9 | 5 | * |
charlesmn | 0:47d5c900dab9 | 6 | * |
charlesmn | 0:47d5c900dab9 | 7 | * This is designed to work with MBed V2 ,MBed V5 and MBed V6. |
charlesmn | 0:47d5c900dab9 | 8 | * |
charlesmn | 0:47d5c900dab9 | 9 | * |
charlesmn | 0:47d5c900dab9 | 10 | * The Reset button can be used to restart the program. |
charlesmn | 0:47d5c900dab9 | 11 | */ |
charlesmn | 0:47d5c900dab9 | 12 | |
charlesmn | 0:47d5c900dab9 | 13 | #include <stdio.h> |
charlesmn | 0:47d5c900dab9 | 14 | |
charlesmn | 0:47d5c900dab9 | 15 | #include "mbed.h" |
charlesmn | 0:47d5c900dab9 | 16 | #include "NoShield53L1A1.h" |
charlesmn | 0:47d5c900dab9 | 17 | #include "ToF_I2C.h" |
charlesmn | 0:47d5c900dab9 | 18 | #include <time.h> |
charlesmn | 0:47d5c900dab9 | 19 | |
charlesmn | 0:47d5c900dab9 | 20 | |
charlesmn | 0:47d5c900dab9 | 21 | // define the i2c comms pins |
charlesmn | 0:47d5c900dab9 | 22 | #define I2C_SDA D14 |
charlesmn | 0:47d5c900dab9 | 23 | #define I2C_SCL D15 |
charlesmn | 0:47d5c900dab9 | 24 | |
charlesmn | 0:47d5c900dab9 | 25 | |
charlesmn | 0:47d5c900dab9 | 26 | |
charlesmn | 0:47d5c900dab9 | 27 | static NoShield53L1 *board=NULL; |
charlesmn | 0:47d5c900dab9 | 28 | Serial pc(SERIAL_TX, SERIAL_RX); |
charlesmn | 0:47d5c900dab9 | 29 | |
charlesmn | 0:47d5c900dab9 | 30 | void process_interrupt( VL53L1X * sensor,VL53L1_DEV dev ); |
charlesmn | 0:47d5c900dab9 | 31 | void print_results( int devSpiNumber, VL53L1_MultiRangingData_t *pMultiRangingData ); |
charlesmn | 0:47d5c900dab9 | 32 | |
charlesmn | 0:47d5c900dab9 | 33 | VL53L1_Dev_t devCentre; |
charlesmn | 0:47d5c900dab9 | 34 | VL53L1_Dev_t devLeft; |
charlesmn | 0:47d5c900dab9 | 35 | VL53L1_Dev_t devRight; |
charlesmn | 0:47d5c900dab9 | 36 | VL53L1_DEV Dev = &devCentre; |
charlesmn | 0:47d5c900dab9 | 37 | |
charlesmn | 0:47d5c900dab9 | 38 | |
charlesmn | 0:47d5c900dab9 | 39 | /*=================================== Main ================================== |
charlesmn | 0:47d5c900dab9 | 40 | =============================================================================*/ |
charlesmn | 0:47d5c900dab9 | 41 | int main() |
charlesmn | 0:47d5c900dab9 | 42 | { |
charlesmn | 0:47d5c900dab9 | 43 | int status; |
charlesmn | 0:47d5c900dab9 | 44 | VL53L1X * Sensor; |
charlesmn | 0:47d5c900dab9 | 45 | uint16_t wordData; |
charlesmn | 0:47d5c900dab9 | 46 | |
charlesmn | 0:47d5c900dab9 | 47 | |
charlesmn | 0:47d5c900dab9 | 48 | pc.baud(115200); // baud rate is important as printf statements take a lot of time |
charlesmn | 0:47d5c900dab9 | 49 | printf("Polling single multizone\r\n"); |
charlesmn | 0:47d5c900dab9 | 50 | |
charlesmn | 0:47d5c900dab9 | 51 | // create i2c interface |
charlesmn | 0:47d5c900dab9 | 52 | ToF_DevI2C *dev_I2C = new ToF_DevI2C(I2C_SDA, I2C_SCL); |
charlesmn | 0:47d5c900dab9 | 53 | |
charlesmn | 0:47d5c900dab9 | 54 | /* creates the 53L1A1 expansion board singleton obj */ |
charlesmn | 0:47d5c900dab9 | 55 | board = NoShield53L1::instance(dev_I2C, A2, D8, D2); |
charlesmn | 0:47d5c900dab9 | 56 | |
charlesmn | 0:47d5c900dab9 | 57 | printf("board created!\r\n"); |
charlesmn | 0:47d5c900dab9 | 58 | |
charlesmn | 0:47d5c900dab9 | 59 | /* define the shutdown pins */ |
charlesmn | 0:47d5c900dab9 | 60 | status = board->init_board(D9,D4,D3); |
charlesmn | 0:47d5c900dab9 | 61 | if (status) { |
charlesmn | 0:47d5c900dab9 | 62 | printf("Failed to init board!\r\n"); |
charlesmn | 0:47d5c900dab9 | 63 | return 0; |
charlesmn | 0:47d5c900dab9 | 64 | } |
charlesmn | 0:47d5c900dab9 | 65 | |
charlesmn | 0:47d5c900dab9 | 66 | |
charlesmn | 0:47d5c900dab9 | 67 | printf("board initiated! - %d\r\n", status); |
charlesmn | 0:47d5c900dab9 | 68 | // create the sensor controller classes |
charlesmn | 0:47d5c900dab9 | 69 | |
charlesmn | 0:47d5c900dab9 | 70 | |
charlesmn | 0:47d5c900dab9 | 71 | |
charlesmn | 0:47d5c900dab9 | 72 | Dev=&devCentre; |
charlesmn | 0:47d5c900dab9 | 73 | Sensor=board->sensor_centre; |
charlesmn | 0:47d5c900dab9 | 74 | Dev->i2c_slave_address = NEW_SENSOR_CENTRE_ADDRESS; |
charlesmn | 0:47d5c900dab9 | 75 | printf("configuring centre channel \n"); |
charlesmn | 0:47d5c900dab9 | 76 | |
charlesmn | 0:47d5c900dab9 | 77 | |
charlesmn | 0:47d5c900dab9 | 78 | // configure the sensors |
charlesmn | 0:47d5c900dab9 | 79 | Dev->comms_speed_khz = 400; |
charlesmn | 0:47d5c900dab9 | 80 | |
charlesmn | 0:47d5c900dab9 | 81 | Dev->comms_type = 1; |
charlesmn | 0:47d5c900dab9 | 82 | |
charlesmn | 0:47d5c900dab9 | 83 | Sensor->VL53L1_RdWord(Dev, 0x01, &wordData); |
charlesmn | 0:47d5c900dab9 | 84 | printf("VL53L1X: %02X %d\n\r", wordData,Dev->i2c_slave_address); |
charlesmn | 0:47d5c900dab9 | 85 | /* Device Initialization and setting */ |
charlesmn | 0:47d5c900dab9 | 86 | status = Sensor->vl53L1_DataInit(); |
charlesmn | 0:47d5c900dab9 | 87 | status = Sensor->vl53L1_StaticInit(); |
charlesmn | 0:47d5c900dab9 | 88 | status = Sensor->vl53L1_SetPresetMode( VL53L1_PRESETMODE_MULTIZONES_SCANNING); |
charlesmn | 0:47d5c900dab9 | 89 | status = Sensor->vl53L1_SetDistanceMode( VL53L1_DISTANCEMODE_LONG); |
charlesmn | 0:47d5c900dab9 | 90 | // status = Sensor->vl53L1_SetMeasurementTimingBudgetMicroSeconds( 100 * 1000); |
charlesmn | 0:47d5c900dab9 | 91 | // status = Sensor->vl53L1_SetInterMeasurementPeriodMilliSeconds( 100); |
charlesmn | 0:47d5c900dab9 | 92 | |
charlesmn | 0:47d5c900dab9 | 93 | |
charlesmn | 0:47d5c900dab9 | 94 | VL53L1_RoiConfig_t roiConfig; |
charlesmn | 0:47d5c900dab9 | 95 | roiConfig.NumberOfRoi =3; |
charlesmn | 0:47d5c900dab9 | 96 | roiConfig.UserRois[0].TopLeftX = 0; |
charlesmn | 0:47d5c900dab9 | 97 | roiConfig.UserRois[0].TopLeftY = 9; |
charlesmn | 0:47d5c900dab9 | 98 | roiConfig.UserRois[0].BotRightX = 4; |
charlesmn | 0:47d5c900dab9 | 99 | roiConfig.UserRois[0].BotRightY = 5; |
charlesmn | 0:47d5c900dab9 | 100 | roiConfig.UserRois[1].TopLeftX = 5; |
charlesmn | 0:47d5c900dab9 | 101 | roiConfig.UserRois[1].TopLeftY = 9; |
charlesmn | 0:47d5c900dab9 | 102 | roiConfig.UserRois[1].BotRightX = 9; |
charlesmn | 0:47d5c900dab9 | 103 | roiConfig.UserRois[1].BotRightY = 4; |
charlesmn | 0:47d5c900dab9 | 104 | roiConfig.UserRois[2].TopLeftX = 11; |
charlesmn | 0:47d5c900dab9 | 105 | roiConfig.UserRois[2].TopLeftY = 9; |
charlesmn | 0:47d5c900dab9 | 106 | roiConfig.UserRois[2].BotRightX = 15; |
charlesmn | 0:47d5c900dab9 | 107 | roiConfig.UserRois[2].BotRightY = 5; |
charlesmn | 0:47d5c900dab9 | 108 | status = Sensor->vl53L1_SetROI( &roiConfig); |
charlesmn | 0:47d5c900dab9 | 109 | printf("VL53L1_SetROI %d \n",status); |
charlesmn | 0:47d5c900dab9 | 110 | |
charlesmn | 0:47d5c900dab9 | 111 | devCentre.i2c_slave_address = NEW_SENSOR_CENTRE_ADDRESS; |
charlesmn | 0:47d5c900dab9 | 112 | status = board->sensor_centre->vl53L1_StartMeasurement(); |
charlesmn | 0:47d5c900dab9 | 113 | |
charlesmn | 0:47d5c900dab9 | 114 | // looping polling for results |
charlesmn | 0:47d5c900dab9 | 115 | while (1) |
charlesmn | 0:47d5c900dab9 | 116 | { |
charlesmn | 0:47d5c900dab9 | 117 | VL53L1_MultiRangingData_t MultiRangingData; |
charlesmn | 0:47d5c900dab9 | 118 | VL53L1_MultiRangingData_t *pMultiRangingData = &MultiRangingData; |
charlesmn | 0:47d5c900dab9 | 119 | |
charlesmn | 0:47d5c900dab9 | 120 | // wait for result |
charlesmn | 0:47d5c900dab9 | 121 | status = board->sensor_centre->vl53L1_WaitMeasurementDataReady(); |
charlesmn | 0:47d5c900dab9 | 122 | // get the result |
charlesmn | 0:47d5c900dab9 | 123 | status = board->sensor_centre->vl53L1_GetMultiRangingData( pMultiRangingData); |
charlesmn | 0:47d5c900dab9 | 124 | // if valid, print it |
charlesmn | 0:47d5c900dab9 | 125 | if(status==0) { |
charlesmn | 0:47d5c900dab9 | 126 | print_results(devCentre.i2c_slave_address, pMultiRangingData ); |
charlesmn | 0:47d5c900dab9 | 127 | status = board->sensor_centre->vl53L1_ClearInterruptAndStartMeasurement(); |
charlesmn | 0:47d5c900dab9 | 128 | |
charlesmn | 0:47d5c900dab9 | 129 | } //if(status==0) |
charlesmn | 0:47d5c900dab9 | 130 | else |
charlesmn | 0:47d5c900dab9 | 131 | { |
charlesmn | 0:47d5c900dab9 | 132 | printf("VL53L1_GetMultiRangingData centre %d \n",status); |
charlesmn | 0:47d5c900dab9 | 133 | } |
charlesmn | 0:47d5c900dab9 | 134 | |
charlesmn | 0:47d5c900dab9 | 135 | wait_ms( 1 * 10); |
charlesmn | 0:47d5c900dab9 | 136 | } |
charlesmn | 0:47d5c900dab9 | 137 | } |
charlesmn | 0:47d5c900dab9 | 138 | |
charlesmn | 0:47d5c900dab9 | 139 | |
charlesmn | 0:47d5c900dab9 | 140 | |
charlesmn | 0:47d5c900dab9 | 141 | // prints the range result seen above |
charlesmn | 0:47d5c900dab9 | 142 | void print_results( int devSpiNumber, VL53L1_MultiRangingData_t *pMultiRangingData ) |
charlesmn | 0:47d5c900dab9 | 143 | { |
charlesmn | 0:47d5c900dab9 | 144 | int no_of_object_found=pMultiRangingData->NumberOfObjectsFound; |
charlesmn | 0:47d5c900dab9 | 145 | |
charlesmn | 0:47d5c900dab9 | 146 | int RoiNumber=pMultiRangingData->RoiNumber; |
charlesmn | 0:47d5c900dab9 | 147 | // int RoiStatus=pMultiRangingData->RoiStatus; |
charlesmn | 0:47d5c900dab9 | 148 | |
charlesmn | 0:47d5c900dab9 | 149 | if (( no_of_object_found < 10 ) && ( no_of_object_found != 0)) |
charlesmn | 0:47d5c900dab9 | 150 | { |
charlesmn | 0:47d5c900dab9 | 151 | |
charlesmn | 0:47d5c900dab9 | 152 | // printf("MZI Count=%5d, ", pMultiRangingData->StreamCount); |
charlesmn | 0:47d5c900dab9 | 153 | // printf("RoiNumber%1d, ", RoiNumber); |
charlesmn | 0:47d5c900dab9 | 154 | // printf("RoiStatus=%1d, \n", RoiStatus); |
charlesmn | 0:47d5c900dab9 | 155 | for(int j=0;j<no_of_object_found;j++){ |
charlesmn | 0:47d5c900dab9 | 156 | if ((pMultiRangingData->RangeData[j].RangeStatus == VL53L1_RANGESTATUS_RANGE_VALID) || |
charlesmn | 0:47d5c900dab9 | 157 | (pMultiRangingData->RangeData[j].RangeStatus == VL53L1_RANGESTATUS_RANGE_VALID_NO_WRAP_CHECK_FAIL)) |
charlesmn | 0:47d5c900dab9 | 158 | { |
charlesmn | 0:47d5c900dab9 | 159 | printf("*****************\t spiAddr=%d \t RoiNumber=%d \t status=%d, \t D=%5dmm, \t Signal=%2.2f Mcps, \t Ambient=%2.2f Mcps \n", |
charlesmn | 0:47d5c900dab9 | 160 | devSpiNumber, |
charlesmn | 0:47d5c900dab9 | 161 | RoiNumber, |
charlesmn | 0:47d5c900dab9 | 162 | pMultiRangingData->RangeData[j].RangeStatus, |
charlesmn | 0:47d5c900dab9 | 163 | pMultiRangingData->RangeData[j].RangeMilliMeter, |
charlesmn | 0:47d5c900dab9 | 164 | pMultiRangingData->RangeData[j].SignalRateRtnMegaCps/65536.0, |
charlesmn | 0:47d5c900dab9 | 165 | pMultiRangingData->RangeData[j].AmbientRateRtnMegaCps/65536.0); |
charlesmn | 0:47d5c900dab9 | 166 | } |
charlesmn | 0:47d5c900dab9 | 167 | else |
charlesmn | 0:47d5c900dab9 | 168 | { |
charlesmn | 0:47d5c900dab9 | 169 | // printf("RangeStatus %d %d\n",j, pMultiRangingData->RangeData[j].RangeStatus); |
charlesmn | 0:47d5c900dab9 | 170 | } |
charlesmn | 0:47d5c900dab9 | 171 | } |
charlesmn | 0:47d5c900dab9 | 172 | } // if (( no_of_object_found < 10 ) && ( no_of_object_found != 0)) |
charlesmn | 0:47d5c900dab9 | 173 | else |
charlesmn | 0:47d5c900dab9 | 174 | { |
charlesmn | 0:47d5c900dab9 | 175 | // printf("no_of_object_found %d \n",no_of_object_found); |
charlesmn | 0:47d5c900dab9 | 176 | } |
charlesmn | 0:47d5c900dab9 | 177 | |
charlesmn | 0:47d5c900dab9 | 178 | } |
charlesmn | 0:47d5c900dab9 | 179 | |
charlesmn | 0:47d5c900dab9 | 180 |