Daniel Fulford / Mbed 2 deprecated VL53L0X_Continuous_Ranging_Example

Dependencies:   mbed vl53l0x_api

Fork of VL53L0X_Continuous_Ranging_Example by Daniel Fulford

Committer:
dfulford6
Date:
Wed Feb 15 15:46:04 2017 +0000
Revision:
2:32f0f47a19f2
Parent:
0:b6867e1a23fa
A basic continuous ranging example with the TOF sensor.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mjarvisal 0:b6867e1a23fa 1 #include "mbed.h"
mjarvisal 0:b6867e1a23fa 2 #include "vl53l0x_api.h"
mjarvisal 0:b6867e1a23fa 3 #include "vl53l0x_platform.h"
mjarvisal 0:b6867e1a23fa 4 #include "vl53l0x_i2c_platform.h"
mjarvisal 0:b6867e1a23fa 5
dfulford6 2:32f0f47a19f2 6
dfulford6 2:32f0f47a19f2 7 ///////////////////////////////////////////////////////////////////////////////
dfulford6 2:32f0f47a19f2 8 //Example program for continuous ranging//
dfulford6 2:32f0f47a19f2 9 ///////////////////////////////////////////////////////////////////////////////
dfulford6 2:32f0f47a19f2 10
dfulford6 2:32f0f47a19f2 11 Serial pc(USBTX, USBRX);
mjarvisal 0:b6867e1a23fa 12
mjarvisal 0:b6867e1a23fa 13 void print_pal_error(VL53L0X_Error Status){
mjarvisal 0:b6867e1a23fa 14 char buf[VL53L0X_MAX_STRING_LENGTH];
mjarvisal 0:b6867e1a23fa 15 VL53L0X_GetPalErrorString(Status, buf);
dfulford6 2:32f0f47a19f2 16 printf("API Status: %i : %s\r\n", Status, buf);
mjarvisal 0:b6867e1a23fa 17 }
mjarvisal 0:b6867e1a23fa 18
mjarvisal 0:b6867e1a23fa 19 void print_range_status(VL53L0X_RangingMeasurementData_t* pRangingMeasurementData){
mjarvisal 0:b6867e1a23fa 20 char buf[VL53L0X_MAX_STRING_LENGTH];
mjarvisal 0:b6867e1a23fa 21 uint8_t RangeStatus;
mjarvisal 0:b6867e1a23fa 22
mjarvisal 0:b6867e1a23fa 23 /*
mjarvisal 0:b6867e1a23fa 24 * New Range Status: data is valid when pRangingMeasurementData->RangeStatus = 0
mjarvisal 0:b6867e1a23fa 25 */
mjarvisal 0:b6867e1a23fa 26
mjarvisal 0:b6867e1a23fa 27 RangeStatus = pRangingMeasurementData->RangeStatus;
mjarvisal 0:b6867e1a23fa 28
mjarvisal 0:b6867e1a23fa 29 VL53L0X_GetRangeStatusString(RangeStatus, buf);
dfulford6 2:32f0f47a19f2 30 printf("Range Status: %i : %s\r\n", RangeStatus, buf);
mjarvisal 0:b6867e1a23fa 31
mjarvisal 0:b6867e1a23fa 32 }
mjarvisal 0:b6867e1a23fa 33
mjarvisal 0:b6867e1a23fa 34
mjarvisal 0:b6867e1a23fa 35 VL53L0X_Error WaitMeasurementDataReady(VL53L0X_DEV Dev) {
mjarvisal 0:b6867e1a23fa 36 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
mjarvisal 0:b6867e1a23fa 37 uint8_t NewDatReady=0;
mjarvisal 0:b6867e1a23fa 38 uint32_t LoopNb;
mjarvisal 0:b6867e1a23fa 39
mjarvisal 0:b6867e1a23fa 40 // Wait until it finished
mjarvisal 0:b6867e1a23fa 41 // use timeout to avoid deadlock
mjarvisal 0:b6867e1a23fa 42 if (Status == VL53L0X_ERROR_NONE) {
mjarvisal 0:b6867e1a23fa 43 LoopNb = 0;
mjarvisal 0:b6867e1a23fa 44 do {
mjarvisal 0:b6867e1a23fa 45 Status = VL53L0X_GetMeasurementDataReady(Dev, &NewDatReady);
mjarvisal 0:b6867e1a23fa 46 if ((NewDatReady == 0x01) || Status != VL53L0X_ERROR_NONE) {
mjarvisal 0:b6867e1a23fa 47 break;
mjarvisal 0:b6867e1a23fa 48 }
mjarvisal 0:b6867e1a23fa 49 LoopNb = LoopNb + 1;
mjarvisal 0:b6867e1a23fa 50 VL53L0X_PollingDelay(Dev);
mjarvisal 0:b6867e1a23fa 51 } while (LoopNb < VL53L0X_DEFAULT_MAX_LOOP);
mjarvisal 0:b6867e1a23fa 52
mjarvisal 0:b6867e1a23fa 53 if (LoopNb >= VL53L0X_DEFAULT_MAX_LOOP) {
mjarvisal 0:b6867e1a23fa 54 Status = VL53L0X_ERROR_TIME_OUT;
mjarvisal 0:b6867e1a23fa 55 }
mjarvisal 0:b6867e1a23fa 56 }
mjarvisal 0:b6867e1a23fa 57
mjarvisal 0:b6867e1a23fa 58 return Status;
mjarvisal 0:b6867e1a23fa 59 }
mjarvisal 0:b6867e1a23fa 60
mjarvisal 0:b6867e1a23fa 61 VL53L0X_Error WaitStopCompleted(VL53L0X_DEV Dev) {
mjarvisal 0:b6867e1a23fa 62 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
mjarvisal 0:b6867e1a23fa 63 uint32_t StopCompleted=0;
mjarvisal 0:b6867e1a23fa 64 uint32_t LoopNb;
mjarvisal 0:b6867e1a23fa 65
mjarvisal 0:b6867e1a23fa 66 // Wait until it finished
mjarvisal 0:b6867e1a23fa 67 // use timeout to avoid deadlock
mjarvisal 0:b6867e1a23fa 68 if (Status == VL53L0X_ERROR_NONE) {
mjarvisal 0:b6867e1a23fa 69 LoopNb = 0;
mjarvisal 0:b6867e1a23fa 70 do {
mjarvisal 0:b6867e1a23fa 71 Status = VL53L0X_GetStopCompletedStatus(Dev, &StopCompleted);
mjarvisal 0:b6867e1a23fa 72 if ((StopCompleted == 0x00) || Status != VL53L0X_ERROR_NONE) {
mjarvisal 0:b6867e1a23fa 73 break;
mjarvisal 0:b6867e1a23fa 74 }
mjarvisal 0:b6867e1a23fa 75 LoopNb = LoopNb + 1;
mjarvisal 0:b6867e1a23fa 76 VL53L0X_PollingDelay(Dev);
mjarvisal 0:b6867e1a23fa 77 } while (LoopNb < VL53L0X_DEFAULT_MAX_LOOP);
mjarvisal 0:b6867e1a23fa 78
mjarvisal 0:b6867e1a23fa 79 if (LoopNb >= VL53L0X_DEFAULT_MAX_LOOP) {
mjarvisal 0:b6867e1a23fa 80 Status = VL53L0X_ERROR_TIME_OUT;
mjarvisal 0:b6867e1a23fa 81 }
mjarvisal 0:b6867e1a23fa 82
mjarvisal 0:b6867e1a23fa 83 }
mjarvisal 0:b6867e1a23fa 84
mjarvisal 0:b6867e1a23fa 85 return Status;
mjarvisal 0:b6867e1a23fa 86 }
mjarvisal 0:b6867e1a23fa 87
mjarvisal 0:b6867e1a23fa 88
mjarvisal 0:b6867e1a23fa 89 int main()
mjarvisal 0:b6867e1a23fa 90 {
mjarvisal 0:b6867e1a23fa 91
mjarvisal 0:b6867e1a23fa 92 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
mjarvisal 0:b6867e1a23fa 93 VL53L0X_Dev_t MyDevice;
mjarvisal 0:b6867e1a23fa 94 VL53L0X_Dev_t *pMyDevice = &MyDevice;
mjarvisal 0:b6867e1a23fa 95 VL53L0X_Version_t Version;
mjarvisal 0:b6867e1a23fa 96 VL53L0X_Version_t *pVersion = &Version;
mjarvisal 0:b6867e1a23fa 97 VL53L0X_DeviceInfo_t DeviceInfo;
mjarvisal 0:b6867e1a23fa 98
mjarvisal 0:b6867e1a23fa 99 int32_t status_int;
mjarvisal 0:b6867e1a23fa 100
dfulford6 2:32f0f47a19f2 101 pc.printf("VL53L0X API Continuous Ranging Example\r\n");
mjarvisal 0:b6867e1a23fa 102
mjarvisal 0:b6867e1a23fa 103 // Initialize Comms
mjarvisal 0:b6867e1a23fa 104 pMyDevice->I2cDevAddr = 0x52;
mjarvisal 0:b6867e1a23fa 105 pMyDevice->comms_type = 1;
mjarvisal 0:b6867e1a23fa 106 pMyDevice->comms_speed_khz = 400;
mjarvisal 0:b6867e1a23fa 107
mjarvisal 0:b6867e1a23fa 108 pc.printf("Init comms\r\n");
mjarvisal 0:b6867e1a23fa 109
mjarvisal 0:b6867e1a23fa 110 if(Status == VL53L0X_ERROR_NONE)
mjarvisal 0:b6867e1a23fa 111 {
mjarvisal 0:b6867e1a23fa 112 status_int = VL53L0X_GetVersion(pVersion);
mjarvisal 0:b6867e1a23fa 113 if (status_int != 0)
mjarvisal 0:b6867e1a23fa 114 Status = VL53L0X_ERROR_CONTROL_INTERFACE;
mjarvisal 0:b6867e1a23fa 115 }
mjarvisal 0:b6867e1a23fa 116 pc.printf("VL53L0X API Version: %d.%d.%d (revision %d)\r\n", pVersion->major, pVersion->minor ,pVersion->build, pVersion->revision);
mjarvisal 0:b6867e1a23fa 117
mjarvisal 0:b6867e1a23fa 118 int addr;
mjarvisal 0:b6867e1a23fa 119
mjarvisal 0:b6867e1a23fa 120 addr = VL53L0X_scan();
dfulford6 2:32f0f47a19f2 121 //addr = 0x52;
mjarvisal 0:b6867e1a23fa 122 printf("Device found at: %i\r\n", addr);
mjarvisal 0:b6867e1a23fa 123 //uint8_t data;
mjarvisal 0:b6867e1a23fa 124 //data=0;
mjarvisal 0:b6867e1a23fa 125 if(Status == VL53L0X_ERROR_NONE)
mjarvisal 0:b6867e1a23fa 126 {
dfulford6 2:32f0f47a19f2 127 printf ("Call of VL53L0X_DataInit\r\n");
mjarvisal 0:b6867e1a23fa 128 uint16_t osc_calibrate_val=0;
mjarvisal 0:b6867e1a23fa 129 Status = VL53L0X_RdWord(&MyDevice, VL53L0X_REG_OSC_CALIBRATE_VAL,&osc_calibrate_val);
dfulford6 2:32f0f47a19f2 130 printf("%i\r\n",osc_calibrate_val);
mjarvisal 0:b6867e1a23fa 131 Status = VL53L0X_DataInit(&MyDevice); // Data initialization
mjarvisal 0:b6867e1a23fa 132 print_pal_error(Status);
mjarvisal 0:b6867e1a23fa 133 }
mjarvisal 0:b6867e1a23fa 134
mjarvisal 0:b6867e1a23fa 135 if(Status == VL53L0X_ERROR_NONE)
mjarvisal 0:b6867e1a23fa 136 {
mjarvisal 0:b6867e1a23fa 137 Status = VL53L0X_GetDeviceInfo(&MyDevice, &DeviceInfo);
mjarvisal 0:b6867e1a23fa 138 if(Status == VL53L0X_ERROR_NONE)
mjarvisal 0:b6867e1a23fa 139 {
dfulford6 2:32f0f47a19f2 140 printf("VL53L0X_GetDeviceInfo:\r\n");
mjarvisal 0:b6867e1a23fa 141 printf("Device Name : %s\n", DeviceInfo.Name);
mjarvisal 0:b6867e1a23fa 142 printf("Device Type : %s\n", DeviceInfo.Type);
mjarvisal 0:b6867e1a23fa 143 printf("Device ID : %s\n", DeviceInfo.ProductId);
mjarvisal 0:b6867e1a23fa 144 printf("ProductRevisionMajor : %d\n", DeviceInfo.ProductRevisionMajor);
dfulford6 2:32f0f47a19f2 145 printf("ProductRevisionMinor : %d\r\n", DeviceInfo.ProductRevisionMinor);
mjarvisal 0:b6867e1a23fa 146
mjarvisal 0:b6867e1a23fa 147 if ((DeviceInfo.ProductRevisionMinor != 1) && (DeviceInfo.ProductRevisionMinor != 1)) {
dfulford6 2:32f0f47a19f2 148 printf("Error expected cut 1.1 but found cut %d.%d\r\n",
mjarvisal 0:b6867e1a23fa 149 DeviceInfo.ProductRevisionMajor, DeviceInfo.ProductRevisionMinor);
mjarvisal 0:b6867e1a23fa 150 Status = VL53L0X_ERROR_NOT_SUPPORTED;
mjarvisal 0:b6867e1a23fa 151 }
mjarvisal 0:b6867e1a23fa 152 }
mjarvisal 0:b6867e1a23fa 153 print_pal_error(Status);
mjarvisal 0:b6867e1a23fa 154 }
mjarvisal 0:b6867e1a23fa 155
mjarvisal 0:b6867e1a23fa 156 VL53L0X_RangingMeasurementData_t RangingMeasurementData;
mjarvisal 0:b6867e1a23fa 157 VL53L0X_RangingMeasurementData_t *pRangingMeasurementData = &RangingMeasurementData;
mjarvisal 0:b6867e1a23fa 158 Status = VL53L0X_ERROR_NONE;
mjarvisal 0:b6867e1a23fa 159 uint32_t refSpadCount;
mjarvisal 0:b6867e1a23fa 160 uint8_t isApertureSpads;
mjarvisal 0:b6867e1a23fa 161 uint8_t VhvSettings;
mjarvisal 0:b6867e1a23fa 162 uint8_t PhaseCal;
mjarvisal 0:b6867e1a23fa 163
mjarvisal 0:b6867e1a23fa 164 if(Status == VL53L0X_ERROR_NONE)
mjarvisal 0:b6867e1a23fa 165 {
dfulford6 2:32f0f47a19f2 166 printf ("Call of VL53L0X_StaticInit\r\n");
mjarvisal 0:b6867e1a23fa 167 Status = VL53L0X_StaticInit(pMyDevice); // Device Initialization
mjarvisal 0:b6867e1a23fa 168 // StaticInit will set interrupt by default
mjarvisal 0:b6867e1a23fa 169 print_pal_error(Status);
mjarvisal 0:b6867e1a23fa 170 }
mjarvisal 0:b6867e1a23fa 171
mjarvisal 0:b6867e1a23fa 172 if(Status == VL53L0X_ERROR_NONE)
mjarvisal 0:b6867e1a23fa 173 {
dfulford6 2:32f0f47a19f2 174 printf ("Call of VL53L0X_PerformRefCalibration\r\n");
mjarvisal 0:b6867e1a23fa 175 Status = VL53L0X_PerformRefCalibration(pMyDevice,
mjarvisal 0:b6867e1a23fa 176 &VhvSettings, &PhaseCal); // Device Initialization
mjarvisal 0:b6867e1a23fa 177 print_pal_error(Status);
mjarvisal 0:b6867e1a23fa 178 }
mjarvisal 0:b6867e1a23fa 179
mjarvisal 0:b6867e1a23fa 180 if(Status == VL53L0X_ERROR_NONE)
mjarvisal 0:b6867e1a23fa 181 {
dfulford6 2:32f0f47a19f2 182 printf ("Call of VL53L0X_PerformRefSpadManagement\r\n");
mjarvisal 0:b6867e1a23fa 183 Status = VL53L0X_PerformRefSpadManagement(pMyDevice,
mjarvisal 0:b6867e1a23fa 184 &refSpadCount, &isApertureSpads); // Device Initialization
mjarvisal 0:b6867e1a23fa 185 print_pal_error(Status);
mjarvisal 0:b6867e1a23fa 186 }
mjarvisal 0:b6867e1a23fa 187
mjarvisal 0:b6867e1a23fa 188 if(Status == VL53L0X_ERROR_NONE)
mjarvisal 0:b6867e1a23fa 189 {
mjarvisal 0:b6867e1a23fa 190
dfulford6 2:32f0f47a19f2 191 printf ("Call of VL53L0X_SetDeviceMode\r\n");
dfulford6 2:32f0f47a19f2 192 Status = VL53L0X_SetDeviceMode(pMyDevice, VL53L0X_DEVICEMODE_CONTINUOUS_RANGING); // Setup in continuous ranging
mjarvisal 0:b6867e1a23fa 193 print_pal_error(Status);
mjarvisal 0:b6867e1a23fa 194 }
mjarvisal 0:b6867e1a23fa 195
mjarvisal 0:b6867e1a23fa 196 if(Status == VL53L0X_ERROR_NONE)
mjarvisal 0:b6867e1a23fa 197 {
dfulford6 2:32f0f47a19f2 198 printf ("Call of VL53L0X_StartMeasurement\r\n");
mjarvisal 0:b6867e1a23fa 199 Status = VL53L0X_StartMeasurement(pMyDevice);
mjarvisal 0:b6867e1a23fa 200 print_pal_error(Status);
mjarvisal 0:b6867e1a23fa 201 }
mjarvisal 0:b6867e1a23fa 202
dfulford6 2:32f0f47a19f2 203 while(1){
mjarvisal 0:b6867e1a23fa 204 if(Status == VL53L0X_ERROR_NONE)
mjarvisal 0:b6867e1a23fa 205 {
mjarvisal 0:b6867e1a23fa 206 uint32_t measurement;
mjarvisal 0:b6867e1a23fa 207 uint32_t no_of_measurements = 32;
mjarvisal 0:b6867e1a23fa 208
mjarvisal 0:b6867e1a23fa 209 uint16_t* pResults = (uint16_t*)malloc(sizeof(uint16_t) * no_of_measurements);
mjarvisal 0:b6867e1a23fa 210
mjarvisal 0:b6867e1a23fa 211 for(measurement=0; measurement<no_of_measurements; measurement++)
mjarvisal 0:b6867e1a23fa 212 {
mjarvisal 0:b6867e1a23fa 213
mjarvisal 0:b6867e1a23fa 214 Status = WaitMeasurementDataReady(pMyDevice);
mjarvisal 0:b6867e1a23fa 215
mjarvisal 0:b6867e1a23fa 216 if(Status == VL53L0X_ERROR_NONE)
mjarvisal 0:b6867e1a23fa 217 {
mjarvisal 0:b6867e1a23fa 218 Status = VL53L0X_GetRangingMeasurementData(pMyDevice, pRangingMeasurementData);
mjarvisal 0:b6867e1a23fa 219
mjarvisal 0:b6867e1a23fa 220 *(pResults + measurement) = pRangingMeasurementData->RangeMilliMeter;
dfulford6 2:32f0f47a19f2 221 printf("In loop measurement %lu: %d\r\n", measurement, pRangingMeasurementData->RangeMilliMeter);
mjarvisal 0:b6867e1a23fa 222
mjarvisal 0:b6867e1a23fa 223 // Clear the interrupt
mjarvisal 0:b6867e1a23fa 224 VL53L0X_ClearInterruptMask(pMyDevice, VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY);
mjarvisal 0:b6867e1a23fa 225 VL53L0X_PollingDelay(pMyDevice);
mjarvisal 0:b6867e1a23fa 226 } else {
mjarvisal 0:b6867e1a23fa 227 break;
mjarvisal 0:b6867e1a23fa 228 }
mjarvisal 0:b6867e1a23fa 229 }
dfulford6 2:32f0f47a19f2 230 /*
mjarvisal 0:b6867e1a23fa 231 if(Status == VL53L0X_ERROR_NONE)
mjarvisal 0:b6867e1a23fa 232 {
mjarvisal 0:b6867e1a23fa 233 for(measurement=0; measurement<no_of_measurements; measurement++)
mjarvisal 0:b6867e1a23fa 234 {
dfulford6 2:32f0f47a19f2 235 printf("measurement %lu: %d\r\n", measurement, *(pResults + measurement));
mjarvisal 0:b6867e1a23fa 236 }
mjarvisal 0:b6867e1a23fa 237 }
dfulford6 2:32f0f47a19f2 238 */
mjarvisal 0:b6867e1a23fa 239 free(pResults);
mjarvisal 0:b6867e1a23fa 240 }
dfulford6 2:32f0f47a19f2 241 }
mjarvisal 0:b6867e1a23fa 242
dfulford6 2:32f0f47a19f2 243 /*
mjarvisal 0:b6867e1a23fa 244
mjarvisal 0:b6867e1a23fa 245 if(Status == VL53L0X_ERROR_NONE)
mjarvisal 0:b6867e1a23fa 246 {
dfulford6 2:32f0f47a19f2 247 printf ("Call of VL53L0X_StopMeasurement\r\n");
mjarvisal 0:b6867e1a23fa 248 Status = VL53L0X_StopMeasurement(pMyDevice);
mjarvisal 0:b6867e1a23fa 249 }
mjarvisal 0:b6867e1a23fa 250
mjarvisal 0:b6867e1a23fa 251 if(Status == VL53L0X_ERROR_NONE)
mjarvisal 0:b6867e1a23fa 252 {
dfulford6 2:32f0f47a19f2 253 printf ("Wait for stop to be competed\r\n");
mjarvisal 0:b6867e1a23fa 254 Status = WaitStopCompleted(pMyDevice);
mjarvisal 0:b6867e1a23fa 255 }
mjarvisal 0:b6867e1a23fa 256
mjarvisal 0:b6867e1a23fa 257 if(Status == VL53L0X_ERROR_NONE)
mjarvisal 0:b6867e1a23fa 258 Status = VL53L0X_ClearInterruptMask(pMyDevice,
mjarvisal 0:b6867e1a23fa 259 VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY);
mjarvisal 0:b6867e1a23fa 260 while (true)
mjarvisal 0:b6867e1a23fa 261 if (pc.readable())
mjarvisal 0:b6867e1a23fa 262 pc.putc(pc.getc());
dfulford6 2:32f0f47a19f2 263
dfulford6 2:32f0f47a19f2 264 */
mjarvisal 0:b6867e1a23fa 265 }
mjarvisal 0:b6867e1a23fa 266