Sample application to show ranging with interrupts support. Uses centre sensor on X-Nucleo-53L0A1 and ranging_continuous_interrupt mode.

Dependencies:   mbed X_NUCLEO_53L0A1

Fork of Display_53L0A1 by ST

Committer:
johnAlexander
Date:
Thu Jun 06 09:04:45 2019 +0000
Revision:
4:79d9b33ebed6
Parent:
3:bd38edab685e
Use published, mbed certified board and sensor classes.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
johnAlexander 0:cd8e818d4288 1 #include "mbed.h"
johnAlexander 4:79d9b33ebed6 2 #include "XNucleo53L0A1.h"
johnAlexander 2:bdf097d93eca 3 #include <string.h>
johnAlexander 2:bdf097d93eca 4 #include <stdlib.h>
johnAlexander 2:bdf097d93eca 5 #include <stdio.h>
johnAlexander 2:bdf097d93eca 6 #include <assert.h>
johnAlexander 2:bdf097d93eca 7
johnAlexander 2:bdf097d93eca 8 /* This VL53L0X Expansion board test application performs a range measurement in interrupt mode
johnAlexander 3:bd38edab685e 9 on the center embedded sensor.
johnAlexander 2:bdf097d93eca 10 The measured data is displayed on the on-board 4-digit display, and sent to com port
johnAlexander 2:bdf097d93eca 11
johnAlexander 2:bdf097d93eca 12 User Blue button stops the current measurement and the entire program, releasing all resources.
johnAlexander 3:bd38edab685e 13 Reset button is used to restart the program.
johnAlexander 2:bdf097d93eca 14
johnAlexander 2:bdf097d93eca 15 Interrupt mode requires callback function which handles IRQ from given sensor.
johnAlexander 2:bdf097d93eca 16 */
johnAlexander 0:cd8e818d4288 17
johnAlexander 3:bd38edab685e 18 #define VL53L0_I2C_SDA D14
johnAlexander 3:bd38edab685e 19 #define VL53L0_I2C_SCL D15
johnAlexander 0:cd8e818d4288 20
johnAlexander 4:79d9b33ebed6 21 static XNucleo53L0A1 *board = NULL;
johnAlexander 2:bdf097d93eca 22 VL53L0X_RangingMeasurementData_t data_sensor;
johnAlexander 0:cd8e818d4288 23 OperatingMode operating_mode;
johnAlexander 3:bd38edab685e 24
johnAlexander 2:bdf097d93eca 25 /* flags that handle interrupt request for sensor and user blue button*/
johnAlexander 3:bd38edab685e 26 volatile bool int_sensor_centre = false;
johnAlexander 2:bdf097d93eca 27 volatile bool int_measuring_stop = false;
johnAlexander 2:bdf097d93eca 28
johnAlexander 0:cd8e818d4288 29
johnAlexander 3:bd38edab685e 30 /* ISR callback function of the centre sensor */
johnAlexander 3:bd38edab685e 31 void sensor_centre_irq(void)
johnAlexander 0:cd8e818d4288 32 {
johnAlexander 3:bd38edab685e 33 int_sensor_centre = true;
johnAlexander 3:bd38edab685e 34 board->sensor_centre->disable_interrupt_measure_detection_irq();
johnAlexander 3:bd38edab685e 35 }
johnAlexander 2:bdf097d93eca 36
johnAlexander 2:bdf097d93eca 37 /* ISR callback function of the user blue button to switch measuring sensor. */
johnAlexander 3:bd38edab685e 38 void measuring_stop_irq(void)
johnAlexander 2:bdf097d93eca 39 {
johnAlexander 2:bdf097d93eca 40 int_measuring_stop = true;
johnAlexander 0:cd8e818d4288 41 }
johnAlexander 0:cd8e818d4288 42
johnAlexander 0:cd8e818d4288 43 /* On board 4 digit local display refresh */
johnAlexander 3:bd38edab685e 44 void display_refresh(const VL53L0X_RangingMeasurementData_t &data)
johnAlexander 3:bd38edab685e 45 {
johnAlexander 2:bdf097d93eca 46 char str[4];
johnAlexander 3:bd38edab685e 47 if (data.RangeStatus == 0) { // we have a valid range.
johnAlexander 2:bdf097d93eca 48 printf("%4d; ", data.RangeMilliMeter);
johnAlexander 3:bd38edab685e 49 sprintf(str, "%4d", data.RangeMilliMeter);
johnAlexander 3:bd38edab685e 50 } else {
johnAlexander 3:bd38edab685e 51 sprintf(str, "%s", "----");
johnAlexander 2:bdf097d93eca 52 }
johnAlexander 3:bd38edab685e 53 board->display->display_string(str);
johnAlexander 0:cd8e818d4288 54 }
johnAlexander 0:cd8e818d4288 55
johnAlexander 3:bd38edab685e 56 void range_measure(DevI2C *device_i2c)
johnAlexander 3:bd38edab685e 57 {
johnAlexander 3:bd38edab685e 58 int status;
johnAlexander 3:bd38edab685e 59
johnAlexander 3:bd38edab685e 60 /* creates the 53L0A1 expansion board singleton obj */
johnAlexander 4:79d9b33ebed6 61 board = XNucleo53L0A1::instance(device_i2c, A2, D8, D2);
johnAlexander 1:c1c10e0c32b2 62
johnAlexander 3:bd38edab685e 63 board->display->display_string("53L0");
johnAlexander 3:bd38edab685e 64
johnAlexander 3:bd38edab685e 65 /* setting operating mode to continuous interrupt */
johnAlexander 3:bd38edab685e 66 operating_mode = range_continuous_interrupt;
johnAlexander 3:bd38edab685e 67
johnAlexander 3:bd38edab685e 68 /* init the 53L0A1 expansion board with default values */
johnAlexander 3:bd38edab685e 69 status = board->init_board();
johnAlexander 3:bd38edab685e 70 if (status) {
johnAlexander 3:bd38edab685e 71 printf("Failed to init board!\n\r");
johnAlexander 2:bdf097d93eca 72 return;
johnAlexander 3:bd38edab685e 73 }
johnAlexander 3:bd38edab685e 74 //Stop any measurement before setting sensor
johnAlexander 3:bd38edab685e 75 status = board->sensor_centre->stop_measurement(operating_mode);
johnAlexander 3:bd38edab685e 76 status = board->sensor_centre->start_measurement(operating_mode, &sensor_centre_irq);
johnAlexander 3:bd38edab685e 77
johnAlexander 3:bd38edab685e 78 if (!status) {
johnAlexander 3:bd38edab685e 79 printf("Entering loop mode\r\n");
johnAlexander 3:bd38edab685e 80 while (true) {
johnAlexander 3:bd38edab685e 81 if (int_sensor_centre) {
johnAlexander 3:bd38edab685e 82 int_sensor_centre = false;
johnAlexander 3:bd38edab685e 83 status = board->sensor_centre->handle_irq(operating_mode, &data_sensor);
johnAlexander 3:bd38edab685e 84 display_refresh(data_sensor);
johnAlexander 3:bd38edab685e 85 }
johnAlexander 3:bd38edab685e 86
johnAlexander 3:bd38edab685e 87 if (int_measuring_stop) {
johnAlexander 3:bd38edab685e 88 printf("\r\nEnding loop mode \r\n");
johnAlexander 3:bd38edab685e 89 break;
johnAlexander 3:bd38edab685e 90 }
johnAlexander 2:bdf097d93eca 91 }
johnAlexander 3:bd38edab685e 92 }
johnAlexander 3:bd38edab685e 93 board->display->display_string("BYE");
johnAlexander 3:bd38edab685e 94 delete board;
johnAlexander 3:bd38edab685e 95 }
johnAlexander 2:bdf097d93eca 96
johnAlexander 2:bdf097d93eca 97 /*=================================== Main ==================================
johnAlexander 3:bd38edab685e 98 Press the blue user button to stop the measurements in progress
johnAlexander 2:bdf097d93eca 99 =============================================================================*/
johnAlexander 2:bdf097d93eca 100 int main()
johnAlexander 3:bd38edab685e 101 {
johnAlexander 2:bdf097d93eca 102 #if USER_BUTTON==PC_13 // we are cross compiling for Nucleo-f401
johnAlexander 3:bd38edab685e 103 InterruptIn stop_button(USER_BUTTON);
johnAlexander 3:bd38edab685e 104 stop_button.rise(&measuring_stop_irq);
johnAlexander 3:bd38edab685e 105 #endif
johnAlexander 3:bd38edab685e 106 DevI2C *device_i2c = new DevI2C(VL53L0_I2C_SDA, VL53L0_I2C_SCL);
johnAlexander 3:bd38edab685e 107 range_measure(device_i2c); // start continuous measures
johnAlexander 0:cd8e818d4288 108 }
johnAlexander 2:bdf097d93eca 109
johnAlexander 2:bdf097d93eca 110