charles macneill
/
VL53L3CX_NoShield_1Sensors_Polling
1 sensory wired directly to the F401. Uses Ayoub's Custom library. Mb6
main.cpp@2:28f78024d00a, 2021-07-21 (annotated)
- Committer:
- charlesmn
- Date:
- Wed Jul 21 12:09:20 2021 +0000
- Revision:
- 2:28f78024d00a
- Parent:
- 1:8cfb1799974f
- Child:
- 3:ba1ee6cac90d
Fix NumberOfZones issue. Fix printing of results
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
charlesmn | 0:ba9aaa18b828 | 1 | /* |
charlesmn | 0:ba9aaa18b828 | 2 | * This VL53L3 Expansion board test application performs range measurements |
charlesmn | 0:ba9aaa18b828 | 3 | * using the onboard embedded sensor, and satellite boards, in interrupt mode. |
charlesmn | 0:ba9aaa18b828 | 4 | * Measured ranges are output on the Serial Port, running at 115200 baud. |
charlesmn | 0:ba9aaa18b828 | 5 | * |
charlesmn | 0:ba9aaa18b828 | 6 | * The Reset button can be used to restart the program. |
charlesmn | 0:ba9aaa18b828 | 7 | * |
charlesmn | 0:ba9aaa18b828 | 8 | * *** Note : |
charlesmn | 0:ba9aaa18b828 | 9 | * Default Mbed build system settings disable printf floating-point support. |
charlesmn | 0:ba9aaa18b828 | 10 | * Online builds seem unable to configure this. |
charlesmn | 0:ba9aaa18b828 | 11 | * Offline builds can enable printf floating-point support. |
charlesmn | 0:ba9aaa18b828 | 12 | * https://github.com/ARMmbed/mbed-os/blob/master/platform/source/minimal-printf/README.md |
charlesmn | 0:ba9aaa18b828 | 13 | * .\mbed-os\platform\mbed_lib.json |
charlesmn | 0:ba9aaa18b828 | 14 | * |
charlesmn | 0:ba9aaa18b828 | 15 | */ |
charlesmn | 0:ba9aaa18b828 | 16 | |
charlesmn | 0:ba9aaa18b828 | 17 | #include <stdio.h> |
charlesmn | 0:ba9aaa18b828 | 18 | #include <time.h> |
charlesmn | 0:ba9aaa18b828 | 19 | |
charlesmn | 0:ba9aaa18b828 | 20 | #include "mbed.h" |
charlesmn | 0:ba9aaa18b828 | 21 | |
charlesmn | 0:ba9aaa18b828 | 22 | #include "vl53L3_I2c.h" |
charlesmn | 0:ba9aaa18b828 | 23 | #include "vl53lx_platform_user_data.h" |
charlesmn | 0:ba9aaa18b828 | 24 | #include "custom_ranging_sensor.h" |
charlesmn | 0:ba9aaa18b828 | 25 | #include "Custom_RangingClass.h" |
charlesmn | 0:ba9aaa18b828 | 26 | |
charlesmn | 0:ba9aaa18b828 | 27 | |
charlesmn | 0:ba9aaa18b828 | 28 | #define BSP_ERROR_NONE 0 |
charlesmn | 0:ba9aaa18b828 | 29 | |
charlesmn | 0:ba9aaa18b828 | 30 | |
charlesmn | 0:ba9aaa18b828 | 31 | #if (MBED_VERSION > 60300) |
charlesmn | 0:ba9aaa18b828 | 32 | UnbufferedSerial pc(USBTX, USBRX); |
charlesmn | 0:ba9aaa18b828 | 33 | extern "C" void wait_ms(int ms); |
charlesmn | 0:ba9aaa18b828 | 34 | #else |
charlesmn | 0:ba9aaa18b828 | 35 | Serial pc(SERIAL_TX, SERIAL_RX); |
charlesmn | 0:ba9aaa18b828 | 36 | #endif |
charlesmn | 0:ba9aaa18b828 | 37 | |
charlesmn | 0:ba9aaa18b828 | 38 | |
charlesmn | 0:ba9aaa18b828 | 39 | CUSTOM_SENSOR *sensor; //class for sensor commands |
charlesmn | 0:ba9aaa18b828 | 40 | |
charlesmn | 0:ba9aaa18b828 | 41 | |
charlesmn | 0:ba9aaa18b828 | 42 | /* Private define ------------------------------------------------------------*/ |
charlesmn | 0:ba9aaa18b828 | 43 | #define POLLING_PERIOD (250U) |
charlesmn | 0:ba9aaa18b828 | 44 | |
charlesmn | 0:ba9aaa18b828 | 45 | /* Private variables ---------------------------------------------------------*/ |
charlesmn | 0:ba9aaa18b828 | 46 | static int32_t status = 0; |
charlesmn | 0:ba9aaa18b828 | 47 | int ToF_sensor = CUSTOM_VL53L3CX; // select the sensor to use. In custom_ranging_sensor.h |
charlesmn | 0:ba9aaa18b828 | 48 | |
charlesmn | 0:ba9aaa18b828 | 49 | |
charlesmn | 0:ba9aaa18b828 | 50 | /* Private function prototypes -----------------------------------------------*/ |
charlesmn | 0:ba9aaa18b828 | 51 | void MX_TOF_Process(void); |
charlesmn | 0:ba9aaa18b828 | 52 | |
charlesmn | 0:ba9aaa18b828 | 53 | |
charlesmn | 0:ba9aaa18b828 | 54 | |
charlesmn | 1:8cfb1799974f | 55 | void MX_TOF_Init(void) |
charlesmn | 0:ba9aaa18b828 | 56 | { |
charlesmn | 0:ba9aaa18b828 | 57 | |
charlesmn | 1:8cfb1799974f | 58 | uint16_t i2c_addr; |
charlesmn | 1:8cfb1799974f | 59 | uint32_t id; |
charlesmn | 1:8cfb1799974f | 60 | |
charlesmn | 0:ba9aaa18b828 | 61 | status = sensor->CUSTOM_RANGING_Init(ToF_sensor); |
charlesmn | 1:8cfb1799974f | 62 | if (status) { |
charlesmn | 1:8cfb1799974f | 63 | printf("CUSTOM_RANGING_Init failed for sensor %d status %d\n",ToF_sensor,status); |
charlesmn | 1:8cfb1799974f | 64 | } |
charlesmn | 0:ba9aaa18b828 | 65 | |
charlesmn | 0:ba9aaa18b828 | 66 | } |
charlesmn | 0:ba9aaa18b828 | 67 | |
charlesmn | 0:ba9aaa18b828 | 68 | |
charlesmn | 0:ba9aaa18b828 | 69 | |
charlesmn | 1:8cfb1799974f | 70 | void MX_TOF_Process(void) |
charlesmn | 0:ba9aaa18b828 | 71 | { |
charlesmn | 0:ba9aaa18b828 | 72 | |
charlesmn | 0:ba9aaa18b828 | 73 | RANGING_SENSOR_Result_t Result; |
charlesmn | 0:ba9aaa18b828 | 74 | RANGING_SENSOR_ProfileConfig_t Profile; |
charlesmn | 2:28f78024d00a | 75 | uint16_t zone = 0; |
charlesmn | 2:28f78024d00a | 76 | uint16_t target = 0; |
charlesmn | 1:8cfb1799974f | 77 | |
charlesmn | 0:ba9aaa18b828 | 78 | printf("MX_53L3A2_MultiSensorRanging_Process\n"); |
charlesmn | 0:ba9aaa18b828 | 79 | Profile.RangingProfile = RS_MULTI_TARGET_LONG_RANGE; |
charlesmn | 0:ba9aaa18b828 | 80 | Profile.TimingBudget = 30; /* 16 ms < TimingBudget < 500 ms */ |
charlesmn | 0:ba9aaa18b828 | 81 | Profile.Frequency = 0; /* not necessary in simple ranging */ |
charlesmn | 0:ba9aaa18b828 | 82 | Profile.EnableAmbient = 0; /* Enable: 1, Disable: 0 */ |
charlesmn | 0:ba9aaa18b828 | 83 | Profile.EnableSignal = 0; /* Enable: 1, Disable: 0 */ |
charlesmn | 1:8cfb1799974f | 84 | Profile.EnableInterrupt = 0; // disables interupts |
charlesmn | 0:ba9aaa18b828 | 85 | printf("MX_53L3A2_MultiSensorRanging_Process start sensors\n"); |
charlesmn | 0:ba9aaa18b828 | 86 | |
charlesmn | 1:8cfb1799974f | 87 | wait_ms(100); |
charlesmn | 0:ba9aaa18b828 | 88 | // sensor->VL53L3A2_RANGING_ConfigProfile(ToF_sensor, &Profile); |
charlesmn | 1:8cfb1799974f | 89 | sensor->CUSTOM_RANGING_ConfigProfile(ToF_sensor, &Profile); |
charlesmn | 1:8cfb1799974f | 90 | if (status != BSP_ERROR_NONE) { |
charlesmn | 1:8cfb1799974f | 91 | printf("CUSTOM_RANGING_ConfigProfile failed sensor %d status %d\n",ToF_sensor,status); |
charlesmn | 0:ba9aaa18b828 | 92 | } |
charlesmn | 1:8cfb1799974f | 93 | |
charlesmn | 0:ba9aaa18b828 | 94 | wait_ms(100); |
charlesmn | 1:8cfb1799974f | 95 | status = sensor->CUSTOM_RANGING_Start(ToF_sensor, RS_MODE_BLOCKING_CONTINUOUS); |
charlesmn | 1:8cfb1799974f | 96 | if (status != BSP_ERROR_NONE) { |
charlesmn | 0:ba9aaa18b828 | 97 | printf("CUSTOM_RANGING_Start failed sensor %d status %d\n",ToF_sensor,status); |
charlesmn | 0:ba9aaa18b828 | 98 | } |
charlesmn | 0:ba9aaa18b828 | 99 | |
charlesmn | 0:ba9aaa18b828 | 100 | printf("MX_53L3A2_MultiSensorRanging_Process read sensors\n"); |
charlesmn | 0:ba9aaa18b828 | 101 | |
charlesmn | 1:8cfb1799974f | 102 | // repeatedly read data and start next measurement |
charlesmn | 1:8cfb1799974f | 103 | while (1) { |
charlesmn | 1:8cfb1799974f | 104 | status = sensor->CUSTOM_RANGING_GetDistance(ToF_sensor, &Result); |
charlesmn | 2:28f78024d00a | 105 | // print results |
charlesmn | 1:8cfb1799974f | 106 | if ((status == BSP_ERROR_NONE) && |
charlesmn | 2:28f78024d00a | 107 | ( Result.ZoneResult[zone].NumberOfTargets != 0)) // is there data |
charlesmn | 1:8cfb1799974f | 108 | { |
charlesmn | 2:28f78024d00a | 109 | for ( target = 0 ; target < Result.ZoneResult[zone].NumberOfTargets; target++) |
charlesmn | 2:28f78024d00a | 110 | { |
charlesmn | 2:28f78024d00a | 111 | if (Result.ZoneResult[zone].Status[target] == VL53LX_RANGESTATUS_RANGE_VALID ) |
charlesmn | 2:28f78024d00a | 112 | { |
charlesmn | 2:28f78024d00a | 113 | printf("\n |---> "); |
charlesmn | 2:28f78024d00a | 114 | printf("Status = %d, Target %d, Distance = %5d mm", |
charlesmn | 2:28f78024d00a | 115 | Result.ZoneResult[zone].Status[target], |
charlesmn | 2:28f78024d00a | 116 | target, |
charlesmn | 2:28f78024d00a | 117 | Result.ZoneResult[zone].Distance[target]); |
charlesmn | 2:28f78024d00a | 118 | } |
charlesmn | 2:28f78024d00a | 119 | } |
charlesmn | 2:28f78024d00a | 120 | } |
charlesmn | 2:28f78024d00a | 121 | |
charlesmn | 2:28f78024d00a | 122 | wait_ms(POLLING_PERIOD); |
charlesmn | 2:28f78024d00a | 123 | } |
charlesmn | 2:28f78024d00a | 124 | } |
charlesmn | 2:28f78024d00a | 125 | /* |
charlesmn | 2:28f78024d00a | 126 | // repeatedly read data and start next measurement |
charlesmn | 2:28f78024d00a | 127 | // Note in VL53L3CX there is only one Zone so NumberOfZones is not used and is always assumed to be 1 |
charlesmn | 2:28f78024d00a | 128 | while (1) { |
charlesmn | 2:28f78024d00a | 129 | memset( &Result, 0x0,sizeof(RANGING_SENSOR_Result_t)); |
charlesmn | 2:28f78024d00a | 130 | status = sensor->VL53L3A2_RANGING_GetDistance(ToF_sensor, &Result); |
charlesmn | 2:28f78024d00a | 131 | if ((status == BSP_ERROR_NONE) && |
charlesmn | 2:28f78024d00a | 132 | ( Result.ZoneResult[zone].NumberOfTargets != 0)) |
charlesmn | 2:28f78024d00a | 133 | { |
charlesmn | 2:28f78024d00a | 134 | for ( target = 0 ; target < Result.ZoneResult[0].NumberOfTargets; target++) |
charlesmn | 2:28f78024d00a | 135 | { |
charlesmn | 2:28f78024d00a | 136 | if (Result.ZoneResult[zone].Status[target] == VL53LX_RANGESTATUS_RANGE_VALID ) |
charlesmn | 2:28f78024d00a | 137 | { |
charlesmn | 2:28f78024d00a | 138 | printf("\n |---> "); |
charlesmn | 2:28f78024d00a | 139 | printf("Status = %d, Target %d, Distance = %5d mm", |
charlesmn | 2:28f78024d00a | 140 | Result.ZoneResult[zone].Status[target], |
charlesmn | 2:28f78024d00a | 141 | target, |
charlesmn | 2:28f78024d00a | 142 | Result.ZoneResult[zone].Distance[target]); |
charlesmn | 2:28f78024d00a | 143 | } |
charlesmn | 2:28f78024d00a | 144 | } |
charlesmn | 1:8cfb1799974f | 145 | } |
charlesmn | 1:8cfb1799974f | 146 | |
charlesmn | 1:8cfb1799974f | 147 | wait_ms(POLLING_PERIOD); |
charlesmn | 0:ba9aaa18b828 | 148 | } |
charlesmn | 0:ba9aaa18b828 | 149 | } |
charlesmn | 0:ba9aaa18b828 | 150 | |
charlesmn | 2:28f78024d00a | 151 | */ |
charlesmn | 0:ba9aaa18b828 | 152 | |
charlesmn | 0:ba9aaa18b828 | 153 | /*=================================== Main ================================== |
charlesmn | 0:ba9aaa18b828 | 154 | =============================================================================*/ |
charlesmn | 0:ba9aaa18b828 | 155 | int main() |
charlesmn | 0:ba9aaa18b828 | 156 | { |
charlesmn | 1:8cfb1799974f | 157 | |
charlesmn | 1:8cfb1799974f | 158 | pc.baud(115200); // baud rate is important as printf statements take a lot of time |
charlesmn | 1:8cfb1799974f | 159 | |
charlesmn | 1:8cfb1799974f | 160 | printf("53L3A2 One Sensor Ranging demo application\n"); |
charlesmn | 0:ba9aaa18b828 | 161 | |
charlesmn | 1:8cfb1799974f | 162 | sensor = new CUSTOM_SENSOR(); |
charlesmn | 1:8cfb1799974f | 163 | |
charlesmn | 1:8cfb1799974f | 164 | MX_TOF_Init(); |
charlesmn | 0:ba9aaa18b828 | 165 | |
charlesmn | 1:8cfb1799974f | 166 | while (1) { |
charlesmn | 1:8cfb1799974f | 167 | MX_TOF_Process(); |
charlesmn | 1:8cfb1799974f | 168 | } |
charlesmn | 0:ba9aaa18b828 | 169 | |
charlesmn | 0:ba9aaa18b828 | 170 | } |
charlesmn | 0:ba9aaa18b828 | 171 | |
charlesmn | 0:ba9aaa18b828 | 172 | // needed for later versions of mbed |
charlesmn | 0:ba9aaa18b828 | 173 | #if (MBED_VERSION > 60300) |
charlesmn | 0:ba9aaa18b828 | 174 | extern "C" void wait_ms(int ms) |
charlesmn | 0:ba9aaa18b828 | 175 | { |
charlesmn | 0:ba9aaa18b828 | 176 | thread_sleep_for(ms); |
charlesmn | 0:ba9aaa18b828 | 177 | } |
charlesmn | 0:ba9aaa18b828 | 178 | #endif |
charlesmn | 1:8cfb1799974f | 179 |