Uses Ayoub's Custom library.

Dependencies:   X_NUCLEO_53L3CX

Committer:
charlesmn
Date:
Wed Jul 21 12:33:05 2021 +0000
Revision:
2:2489dfbd49d7
Parent:
1:3151ff0b9da9
Child:
3:025bcf0d211d
Fix NumberOfZones issue. Improve printing of results

Who changed what in which revision?

UserRevisionLine numberNew contents of line
charlesmn 0:137ce045e2a2 1 /*
charlesmn 0:137ce045e2a2 2 * This VL53L3 Expansion board test application performs range measurements
charlesmn 0:137ce045e2a2 3 * using the onboard embedded sensor, and satellite boards, in interrupt mode.
charlesmn 0:137ce045e2a2 4 * Measured ranges are output on the Serial Port, running at 115200 baud.
charlesmn 0:137ce045e2a2 5 * Only supports one sensor at a time. Only tested on centre sensor.
charlesmn 0:137ce045e2a2 6 *
charlesmn 0:137ce045e2a2 7 * The Reset button can be used to restart the program.
charlesmn 0:137ce045e2a2 8 *
charlesmn 0:137ce045e2a2 9 * *** Note :
charlesmn 0:137ce045e2a2 10 * Default Mbed build system settings disable printf floating-point support.
charlesmn 0:137ce045e2a2 11 * Online builds seem unable to configure this.
charlesmn 0:137ce045e2a2 12 * Offline builds can enable printf floating-point support.
charlesmn 0:137ce045e2a2 13 * https://github.com/ARMmbed/mbed-os/blob/master/platform/source/minimal-printf/README.md
charlesmn 0:137ce045e2a2 14 * .\mbed-os\platform\mbed_lib.json
charlesmn 0:137ce045e2a2 15 *
charlesmn 0:137ce045e2a2 16 */
charlesmn 0:137ce045e2a2 17
charlesmn 0:137ce045e2a2 18 #include <stdio.h>
charlesmn 0:137ce045e2a2 19 #include <time.h>
charlesmn 0:137ce045e2a2 20
charlesmn 0:137ce045e2a2 21 #include "mbed.h"
charlesmn 0:137ce045e2a2 22
charlesmn 0:137ce045e2a2 23 #include "vl53L3_I2c.h"
charlesmn 0:137ce045e2a2 24 #include "vl53lx_platform_user_data.h"
charlesmn 0:137ce045e2a2 25 #include "custom_ranging_sensor.h"
charlesmn 0:137ce045e2a2 26 #include "Custom_RangingClass.h"
charlesmn 0:137ce045e2a2 27 #include "pinmap.h"
charlesmn 0:137ce045e2a2 28
charlesmn 0:137ce045e2a2 29
charlesmn 0:137ce045e2a2 30 #if (MBED_VERSION > 60300)
charlesmn 0:137ce045e2a2 31 UnbufferedSerial pc(USBTX, USBRX);
charlesmn 0:137ce045e2a2 32 extern "C" void wait_ms(int ms);
charlesmn 0:137ce045e2a2 33 #else
charlesmn 0:137ce045e2a2 34 Serial pc(SERIAL_TX, SERIAL_RX);
charlesmn 0:137ce045e2a2 35 #endif
charlesmn 0:137ce045e2a2 36
charlesmn 0:137ce045e2a2 37 /* Private define ------------------------------------------------------------*/
charlesmn 0:137ce045e2a2 38 #define SENSOR_LEFT_NUMBER 0
charlesmn 0:137ce045e2a2 39 #define SENSOR_CENTRE_NUMBER 1
charlesmn 0:137ce045e2a2 40 #define SENSOR_RIGHT_NUMBER 2
charlesmn 0:137ce045e2a2 41
charlesmn 0:137ce045e2a2 42
charlesmn 0:137ce045e2a2 43
charlesmn 0:137ce045e2a2 44
charlesmn 0:137ce045e2a2 45 PinName InterruptPins[] ={D8,A2,D2}; // interrupt pins for the three sensors.
charlesmn 1:3151ff0b9da9 46 // these will depend on how the sensor is wired
charlesmn 0:137ce045e2a2 47
charlesmn 0:137ce045e2a2 48 static const char *TofDevStr[] =
charlesmn 0:137ce045e2a2 49 {
charlesmn 0:137ce045e2a2 50 [SENSOR_LEFT_NUMBER] = "LEFT",
charlesmn 0:137ce045e2a2 51 [SENSOR_CENTRE_NUMBER] = "CENTER",
charlesmn 0:137ce045e2a2 52 [SENSOR_RIGHT_NUMBER] = "RIGHT"
charlesmn 0:137ce045e2a2 53 };
charlesmn 0:137ce045e2a2 54
charlesmn 0:137ce045e2a2 55
charlesmn 0:137ce045e2a2 56 /* Private variables ---------------------------------------------------------*/
charlesmn 0:137ce045e2a2 57 static int32_t status = 0;
charlesmn 0:137ce045e2a2 58 CUSTOM_SENSOR *sensor; //class for sensor commands
charlesmn 0:137ce045e2a2 59
charlesmn 0:137ce045e2a2 60
charlesmn 0:137ce045e2a2 61 /* Private function prototypes -----------------------------------------------*/
charlesmn 0:137ce045e2a2 62 static void MX_53L3A2_MultiSensorRanging_Init(void);
charlesmn 0:137ce045e2a2 63 static void MX_53L3A2_MultiSensorRanging_Process(void);
charlesmn 0:137ce045e2a2 64 static void print_result(RANGING_SENSOR_Result_t *Result);
charlesmn 0:137ce045e2a2 65
charlesmn 0:137ce045e2a2 66
charlesmn 0:137ce045e2a2 67 //flag to signal an interrupt has occured
charlesmn 0:137ce045e2a2 68 volatile uint8_t EventDetected = 0;
charlesmn 0:137ce045e2a2 69
charlesmn 0:137ce045e2a2 70 int ToF_sensor = CUSTOM_VL53L3CX; // select the sensor to use. In custom_ranging_sensor.h
charlesmn 0:137ce045e2a2 71
charlesmn 0:137ce045e2a2 72
charlesmn 0:137ce045e2a2 73 /* ISR callback function of the active sensor */
charlesmn 1:3151ff0b9da9 74 /* all it does set a flag which causes the main loop to get data. */
charlesmn 1:3151ff0b9da9 75 /* Interrupts activated and defined in CUSTOM_RANGING_ConfigProfile() */
charlesmn 0:137ce045e2a2 76 void sensor_irq(void)
charlesmn 0:137ce045e2a2 77 {
charlesmn 0:137ce045e2a2 78 EventDetected = 1;
charlesmn 0:137ce045e2a2 79 }
charlesmn 0:137ce045e2a2 80
charlesmn 0:137ce045e2a2 81
charlesmn 0:137ce045e2a2 82 // initialise the sensor
charlesmn 0:137ce045e2a2 83 static void MX_53L3A2_MultiSensorRanging_Init(void)
charlesmn 0:137ce045e2a2 84 {
charlesmn 0:137ce045e2a2 85 status = sensor->CUSTOM_RANGING_Init(ToF_sensor);
charlesmn 0:137ce045e2a2 86 if (status)
charlesmn 0:137ce045e2a2 87 {
charlesmn 0:137ce045e2a2 88 printf("CUSTOM_RANGING_Init failed for sensor %d status %d\n",ToF_sensor,status);
charlesmn 0:137ce045e2a2 89 }
charlesmn 0:137ce045e2a2 90
charlesmn 0:137ce045e2a2 91 wait_ms(100);
charlesmn 0:137ce045e2a2 92 }
charlesmn 0:137ce045e2a2 93
charlesmn 0:137ce045e2a2 94
charlesmn 0:137ce045e2a2 95 // start ranging and enter an infinite loop to collect measurements
charlesmn 0:137ce045e2a2 96 // The collection of data is triggered by a flag which is set after an interrupt occurs
charlesmn 0:137ce045e2a2 97 static void MX_53L3A2_MultiSensorRanging_Process(void)
charlesmn 0:137ce045e2a2 98 {
charlesmn 0:137ce045e2a2 99
charlesmn 0:137ce045e2a2 100 // config profile details
charlesmn 0:137ce045e2a2 101 RANGING_SENSOR_Result_t Result;
charlesmn 0:137ce045e2a2 102 RANGING_SENSOR_ProfileConfig_t Profile;
charlesmn 2:2489dfbd49d7 103 uint16_t zone = 0;
charlesmn 2:2489dfbd49d7 104 uint16_t target = 0;
charlesmn 0:137ce045e2a2 105 printf("MX_53L3A2_MultiSensorRanging_Process\n");
charlesmn 0:137ce045e2a2 106
charlesmn 0:137ce045e2a2 107
charlesmn 0:137ce045e2a2 108 Profile.RangingProfile = RS_MULTI_TARGET_LONG_RANGE;
charlesmn 0:137ce045e2a2 109 Profile.TimingBudget = 30; /* 16 ms < TimingBudget < 500 ms */
charlesmn 0:137ce045e2a2 110 Profile.Frequency = 0; /* not necessary in simple ranging */
charlesmn 0:137ce045e2a2 111 Profile.EnableAmbient = 0; /* Enable: 1, Disable: 0 */
charlesmn 0:137ce045e2a2 112 Profile.EnableSignal = 0; /* Enable: 1, Disable: 0 */
charlesmn 0:137ce045e2a2 113 Profile.pin_gpio1 = InterruptPins[ToF_sensor]; // interrupt pin
charlesmn 0:137ce045e2a2 114 Profile.Interrupt_Func = sensor_irq; // function that handles interrupts
charlesmn 0:137ce045e2a2 115 Profile.EnableInterrupt = 1; // enables interupts
charlesmn 0:137ce045e2a2 116
charlesmn 0:137ce045e2a2 117 printf("CUSTOM_RANGING_ConfigProfile configure sensors\n");
charlesmn 0:137ce045e2a2 118 sensor->CUSTOM_RANGING_ConfigProfile(ToF_sensor, &Profile);
charlesmn 0:137ce045e2a2 119 if (status != BSP_ERROR_NONE)
charlesmn 0:137ce045e2a2 120 {
charlesmn 0:137ce045e2a2 121 printf("CUSTOM_RANGING_ConfigProfile failed sensor %d status %d\n",ToF_sensor,status);
charlesmn 0:137ce045e2a2 122 }
charlesmn 0:137ce045e2a2 123 wait_ms(100);
charlesmn 0:137ce045e2a2 124
charlesmn 0:137ce045e2a2 125
charlesmn 0:137ce045e2a2 126 printf("CUSTOM_RANGING_Start %d\n",ToF_sensor);
charlesmn 0:137ce045e2a2 127 status = sensor->CUSTOM_RANGING_Start(ToF_sensor, RS_MODE_BLOCKING_CONTINUOUS);
charlesmn 0:137ce045e2a2 128 if (status != BSP_ERROR_NONE)
charlesmn 0:137ce045e2a2 129 {
charlesmn 0:137ce045e2a2 130 printf("CUSTOM_RANGING_Start failed sensor %d status %d\n",ToF_sensor,status);
charlesmn 0:137ce045e2a2 131 }
charlesmn 0:137ce045e2a2 132
charlesmn 0:137ce045e2a2 133 EventDetected = 1; // clear any existing interrupts
charlesmn 1:3151ff0b9da9 134 // repeatedly read data and start next measurement
charlesmn 0:137ce045e2a2 135 while (1)
charlesmn 0:137ce045e2a2 136 {
charlesmn 0:137ce045e2a2 137 if ( EventDetected == 1 ) // irq detected
charlesmn 0:137ce045e2a2 138 {
charlesmn 0:137ce045e2a2 139 EventDetected = 0;
charlesmn 0:137ce045e2a2 140 status = sensor->CUSTOM_RANGING_GetDistance(ToF_sensor, &Result);
charlesmn 1:3151ff0b9da9 141 if ((status == BSP_ERROR_NONE) &&
charlesmn 2:2489dfbd49d7 142 ( Result.ZoneResult[zone].NumberOfTargets != 0)) // is there data
charlesmn 2:2489dfbd49d7 143 {
charlesmn 2:2489dfbd49d7 144 for ( target = 0 ; target < Result.ZoneResult[zone].NumberOfTargets; target++)
charlesmn 2:2489dfbd49d7 145 {
charlesmn 2:2489dfbd49d7 146 if (Result.ZoneResult[zone].Status[target] == VL53LX_RANGESTATUS_RANGE_VALID )
charlesmn 2:2489dfbd49d7 147 {
charlesmn 2:2489dfbd49d7 148 printf("\n |---> ");
charlesmn 2:2489dfbd49d7 149 printf("Status = %d, Target %d, Distance = %5d mm",
charlesmn 2:2489dfbd49d7 150 Result.ZoneResult[zone].Status[target],
charlesmn 2:2489dfbd49d7 151 target,
charlesmn 2:2489dfbd49d7 152 Result.ZoneResult[zone].Distance[target]);
charlesmn 2:2489dfbd49d7 153 }
charlesmn 2:2489dfbd49d7 154 }
charlesmn 2:2489dfbd49d7 155 }
charlesmn 2:2489dfbd49d7 156 /*
charlesmn 2:2489dfbd49d7 157 if ((status == BSP_ERROR_NONE) &&
charlesmn 1:3151ff0b9da9 158 (Result.NumberOfZones != 0) &&
charlesmn 1:3151ff0b9da9 159 (Result.ZoneResult[0].Status[0] == BSP_ERROR_NONE ))
charlesmn 0:137ce045e2a2 160 {
charlesmn 0:137ce045e2a2 161 printf("\n%s\t - ", TofDevStr[ToF_sensor]);
charlesmn 0:137ce045e2a2 162 print_result(&Result);
charlesmn 0:137ce045e2a2 163 }
charlesmn 2:2489dfbd49d7 164 */
charlesmn 0:137ce045e2a2 165 }
charlesmn 0:137ce045e2a2 166
charlesmn 0:137ce045e2a2 167 }
charlesmn 0:137ce045e2a2 168 }
charlesmn 0:137ce045e2a2 169
charlesmn 0:137ce045e2a2 170
charlesmn 0:137ce045e2a2 171
charlesmn 0:137ce045e2a2 172 static void print_result(RANGING_SENSOR_Result_t *Result)
charlesmn 0:137ce045e2a2 173 {
charlesmn 0:137ce045e2a2 174 uint8_t j = 0;
charlesmn 1:3151ff0b9da9 175 uint8_t zone = 0;
charlesmn 0:137ce045e2a2 176
charlesmn 0:137ce045e2a2 177 printf(" |---> ");
charlesmn 1:3151ff0b9da9 178 printf("Status = %d, Distance = %5d mm \n",
charlesmn 1:3151ff0b9da9 179 Result->ZoneResult[zone].Status[j],
charlesmn 1:3151ff0b9da9 180 Result->ZoneResult[zone].Distance[j]);
charlesmn 0:137ce045e2a2 181
charlesmn 0:137ce045e2a2 182 }
charlesmn 0:137ce045e2a2 183
charlesmn 0:137ce045e2a2 184
charlesmn 0:137ce045e2a2 185
charlesmn 0:137ce045e2a2 186 /*=================================== Main ==================================
charlesmn 0:137ce045e2a2 187 =============================================================================*/
charlesmn 0:137ce045e2a2 188 int main()
charlesmn 0:137ce045e2a2 189 {
charlesmn 0:137ce045e2a2 190
charlesmn 0:137ce045e2a2 191 pc.baud(115200); // baud rate is important as printf statements take a lot of time
charlesmn 0:137ce045e2a2 192
charlesmn 0:137ce045e2a2 193 sensor = new CUSTOM_SENSOR();
charlesmn 0:137ce045e2a2 194
charlesmn 0:137ce045e2a2 195 printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\r\n");
charlesmn 1:3151ff0b9da9 196 printf("VL53L3CX_NoShield_1Sensors_interrupt\r\n");
charlesmn 0:137ce045e2a2 197
charlesmn 0:137ce045e2a2 198 MX_53L3A2_MultiSensorRanging_Init();
charlesmn 0:137ce045e2a2 199
charlesmn 0:137ce045e2a2 200 while (1)
charlesmn 0:137ce045e2a2 201 {
charlesmn 0:137ce045e2a2 202 MX_53L3A2_MultiSensorRanging_Process();
charlesmn 0:137ce045e2a2 203 }
charlesmn 0:137ce045e2a2 204
charlesmn 0:137ce045e2a2 205 }
charlesmn 0:137ce045e2a2 206
charlesmn 0:137ce045e2a2 207 #if (MBED_VERSION > 60300)
charlesmn 0:137ce045e2a2 208 extern "C" void wait_ms(int ms)
charlesmn 0:137ce045e2a2 209 {
charlesmn 0:137ce045e2a2 210 thread_sleep_for(ms);
charlesmn 0:137ce045e2a2 211 }
charlesmn 0:137ce045e2a2 212 #endif
charlesmn 0:137ce045e2a2 213