charles macneill
/
VL53L3CX_NoShield_1Sensors_interrupt
Uses Ayoub's Custom library.
Diff: main.cpp
- Revision:
- 0:137ce045e2a2
- Child:
- 1:3151ff0b9da9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Jul 14 14:40:24 2021 +0000 @@ -0,0 +1,193 @@ +/* + * This VL53L3 Expansion board test application performs range measurements + * using the onboard embedded sensor, and satellite boards, in interrupt mode. + * Measured ranges are output on the Serial Port, running at 115200 baud. + * Only supports one sensor at a time. Only tested on centre sensor. + * + * The Reset button can be used to restart the program. + * + * *** Note : + * Default Mbed build system settings disable printf floating-point support. + * Online builds seem unable to configure this. + * Offline builds can enable printf floating-point support. + * https://github.com/ARMmbed/mbed-os/blob/master/platform/source/minimal-printf/README.md + * .\mbed-os\platform\mbed_lib.json + * + */ + +#include <stdio.h> +#include <time.h> + +#include "mbed.h" + +#include "vl53L3_I2c.h" +#include "vl53lx_platform_user_data.h" +#include "custom_ranging_sensor.h" +#include "Custom_RangingClass.h" +#include "pinmap.h" + + +#if (MBED_VERSION > 60300) +UnbufferedSerial pc(USBTX, USBRX); +extern "C" void wait_ms(int ms); +#else +Serial pc(SERIAL_TX, SERIAL_RX); +#endif + +/* Private define ------------------------------------------------------------*/ +#define SENSOR_LEFT_NUMBER 0 +#define SENSOR_CENTRE_NUMBER 1 +#define SENSOR_RIGHT_NUMBER 2 + + + + +PinName InterruptPins[] ={D8,A2,D2}; // interrupt pins for the three sensors. + +static const char *TofDevStr[] = +{ + [SENSOR_LEFT_NUMBER] = "LEFT", + [SENSOR_CENTRE_NUMBER] = "CENTER", + [SENSOR_RIGHT_NUMBER] = "RIGHT" +}; + + +/* Private variables ---------------------------------------------------------*/ +static int32_t status = 0; +CUSTOM_SENSOR *sensor; //class for sensor commands + + +/* Private function prototypes -----------------------------------------------*/ +static void MX_53L3A2_MultiSensorRanging_Init(void); +static void MX_53L3A2_MultiSensorRanging_Process(void); +static void print_result(RANGING_SENSOR_Result_t *Result); + + +//flag to signal an interrupt has occured +volatile uint8_t EventDetected = 0; + +int ToF_sensor = CUSTOM_VL53L3CX; // select the sensor to use. In custom_ranging_sensor.h + + +/* ISR callback function of the active sensor */ +/* all it does set a flag which causes the main loop to get data */ +void sensor_irq(void) +{ + EventDetected = 1; +} + + +// initialise the sensor +static void MX_53L3A2_MultiSensorRanging_Init(void) +{ + status = sensor->CUSTOM_RANGING_Init(ToF_sensor); + if (status) + { + printf("CUSTOM_RANGING_Init failed for sensor %d status %d\n",ToF_sensor,status); + } + + wait_ms(100); +} + + +// start ranging and enter an infinite loop to collect measurements +// The collection of data is triggered by a flag which is set after an interrupt occurs +static void MX_53L3A2_MultiSensorRanging_Process(void) +{ + +// config profile details + RANGING_SENSOR_Result_t Result; + RANGING_SENSOR_ProfileConfig_t Profile; + printf("MX_53L3A2_MultiSensorRanging_Process\n"); + + + Profile.RangingProfile = RS_MULTI_TARGET_LONG_RANGE; + Profile.TimingBudget = 30; /* 16 ms < TimingBudget < 500 ms */ + Profile.Frequency = 0; /* not necessary in simple ranging */ + Profile.EnableAmbient = 0; /* Enable: 1, Disable: 0 */ + Profile.EnableSignal = 0; /* Enable: 1, Disable: 0 */ + Profile.pin_gpio1 = InterruptPins[ToF_sensor]; // interrupt pin + Profile.Interrupt_Func = sensor_irq; // function that handles interrupts + Profile.EnableInterrupt = 1; // enables interupts + + printf("CUSTOM_RANGING_ConfigProfile configure sensors\n"); + sensor->CUSTOM_RANGING_ConfigProfile(ToF_sensor, &Profile); + if (status != BSP_ERROR_NONE) + { + printf("CUSTOM_RANGING_ConfigProfile failed sensor %d status %d\n",ToF_sensor,status); + } + wait_ms(100); + + + printf("CUSTOM_RANGING_Start %d\n",ToF_sensor); + status = sensor->CUSTOM_RANGING_Start(ToF_sensor, RS_MODE_BLOCKING_CONTINUOUS); + if (status != BSP_ERROR_NONE) + { + printf("CUSTOM_RANGING_Start failed sensor %d status %d\n",ToF_sensor,status); + } + + EventDetected = 1; // clear any existing interrupts + + while (1) + { + if ( EventDetected == 1 ) // irq detected + { + EventDetected = 0; + status = sensor->CUSTOM_RANGING_GetDistance(ToF_sensor, &Result); + if ((status == BSP_ERROR_NONE) && (Result.ZoneResult[0].Status[0] == BSP_ERROR_NONE )) + { + printf("\n%s\t - ", TofDevStr[ToF_sensor]); + print_result(&Result); + } + } + + + // wait_ms(2); + } +} + + + +static void print_result(RANGING_SENSOR_Result_t *Result) +{ + uint8_t j = 0; + uint8_t target = 0; + + printf(" |---> "); + printf("Status = %ld, Distance = %5ld mm \n", + Result->ZoneResult[target].Status[j], + Result->ZoneResult[target].Distance[j]); + +} + + + +/*=================================== Main ================================== +=============================================================================*/ +int main() +{ + + pc.baud(115200); // baud rate is important as printf statements take a lot of time + + sensor = new CUSTOM_SENSOR(); + + printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\r\n"); + + MX_53L3A2_MultiSensorRanging_Init(); + + while (1) + { + /* USER CODE END WHILE */ + MX_53L3A2_MultiSensorRanging_Process(); + /* USER CODE BEGIN 3 */ + } + +} + +#if (MBED_VERSION > 60300) +extern "C" void wait_ms(int ms) +{ + thread_sleep_for(ms); +} +#endif + \ No newline at end of file