Sample application using interrupts, and range_continuous_interrupts mode, to receive range data from the on-board and satellite sensors. Results are displayed on the on-board, 4 digit display and on the COM port.

Dependencies:   mbed X_NUCLEO_53L0A1

Fork of Display_53L0A1_Interrupts by ST

* NOTE : Hard-links U11 and U18, on the underside of the X-NUCELO-53L0A1 expansion board, must be made/ON to allow interrupts to be received from the satellite boards, on INT_L and INT_R, or U10 and U15 to receive interrupts from the alternate locations. *

Committer:
johnAlexander
Date:
Wed Jun 14 14:42:41 2017 +0000
Revision:
2:bdf097d93eca
Parent:
1:c1c10e0c32b2
Child:
3:12cb106044f9
Sample application to show ranging with interrupts support. Uses centre sensor on X-Nucleo-53L0A1 and ranging_continuous_interrupt mode. ;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
johnAlexander 0:cd8e818d4288 1 #include "mbed.h"
johnAlexander 0:cd8e818d4288 2 #include "x_nucleo_53l0a1.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 2:bdf097d93eca 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 2:bdf097d93eca 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 0:cd8e818d4288 18 #define VL53L0_I2C_SDA D14
johnAlexander 0:cd8e818d4288 19 #define VL53L0_I2C_SCL D15
johnAlexander 0:cd8e818d4288 20
johnAlexander 2:bdf097d93eca 21 static X_NUCLEO_53L0A1 *board=NULL;
johnAlexander 2:bdf097d93eca 22 VL53L0X_RangingMeasurementData_t data_sensor;
johnAlexander 0:cd8e818d4288 23 OperatingMode operating_mode;
johnAlexander 0:cd8e818d4288 24
johnAlexander 2:bdf097d93eca 25 /* flags that handle interrupt request for sensor and user blue button*/
johnAlexander 2:bdf097d93eca 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 2:bdf097d93eca 30 /* ISR callback function of the center sensor */
johnAlexander 2:bdf097d93eca 31 void SensorCenterIRQ(void)
johnAlexander 0:cd8e818d4288 32 {
johnAlexander 2:bdf097d93eca 33 int_sensor_centre=true;
johnAlexander 2:bdf097d93eca 34 board->sensor_centre->DisableInterruptMeasureDetectionIRQ();
johnAlexander 2:bdf097d93eca 35 }
johnAlexander 2:bdf097d93eca 36
johnAlexander 2:bdf097d93eca 37 /* ISR callback function of the user blue button to switch measuring sensor. */
johnAlexander 2:bdf097d93eca 38 void MeasuringStopIRQ(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 2:bdf097d93eca 44 void DisplayRefresh(const VL53L0X_RangingMeasurementData_t &data)
johnAlexander 0:cd8e818d4288 45 {
johnAlexander 2:bdf097d93eca 46 char str[4];
johnAlexander 2:bdf097d93eca 47 if (data.RangeStatus == 0) // we have a valid range.
johnAlexander 2:bdf097d93eca 48 {
johnAlexander 2:bdf097d93eca 49 printf("%4d; ", data.RangeMilliMeter);
johnAlexander 2:bdf097d93eca 50 sprintf(str,"%4d", data.RangeMilliMeter);
johnAlexander 2:bdf097d93eca 51 }
johnAlexander 2:bdf097d93eca 52 else
johnAlexander 2:bdf097d93eca 53 {
johnAlexander 2:bdf097d93eca 54 sprintf(str,"%s", "----");
johnAlexander 2:bdf097d93eca 55 }
johnAlexander 2:bdf097d93eca 56 board->display->DisplayString(str);
johnAlexander 0:cd8e818d4288 57 }
johnAlexander 0:cd8e818d4288 58
johnAlexander 2:bdf097d93eca 59 void RangeMeasure(DevI2C *device_i2c) {
johnAlexander 2:bdf097d93eca 60 int status;
johnAlexander 1:c1c10e0c32b2 61
johnAlexander 0:cd8e818d4288 62 /* creates the 53L0A1 expansion board singleton obj */
johnAlexander 0:cd8e818d4288 63 board=X_NUCLEO_53L0A1::Instance(device_i2c, A2, D8, D2);
johnAlexander 0:cd8e818d4288 64
johnAlexander 0:cd8e818d4288 65 board->display->DisplayString("53L0");
johnAlexander 2:bdf097d93eca 66
johnAlexander 2:bdf097d93eca 67 /* setting operating mode to continuous interrupt */
johnAlexander 2:bdf097d93eca 68 operating_mode=range_continuous_interrupt;
johnAlexander 2:bdf097d93eca 69
johnAlexander 0:cd8e818d4288 70 /* init the 53L0A1 expansion board with default values */
johnAlexander 2:bdf097d93eca 71 status=board->InitBoard();
johnAlexander 2:bdf097d93eca 72 if(status)
johnAlexander 2:bdf097d93eca 73 {
johnAlexander 2:bdf097d93eca 74 printf("Failed to init board!\n\r");
johnAlexander 2:bdf097d93eca 75 return;
johnAlexander 2:bdf097d93eca 76 }
johnAlexander 2:bdf097d93eca 77 //Stop any measurement before setting sensor
johnAlexander 2:bdf097d93eca 78 status=board->sensor_centre->StopMeasurement(operating_mode);
johnAlexander 2:bdf097d93eca 79 status=board->sensor_centre->StartMeasurement(operating_mode, &SensorCenterIRQ);
johnAlexander 2:bdf097d93eca 80
johnAlexander 2:bdf097d93eca 81 if(!status)
johnAlexander 0:cd8e818d4288 82 {
johnAlexander 2:bdf097d93eca 83 printf ("Entering loop mode\r\n");
johnAlexander 2:bdf097d93eca 84 while (true)
johnAlexander 2:bdf097d93eca 85 {
johnAlexander 2:bdf097d93eca 86 if (int_sensor_centre)
johnAlexander 2:bdf097d93eca 87 {
johnAlexander 2:bdf097d93eca 88 int_sensor_centre = false;
johnAlexander 2:bdf097d93eca 89 status = board->sensor_centre->HandleIRQ(operating_mode, &data_sensor);
johnAlexander 2:bdf097d93eca 90 DisplayRefresh(data_sensor);
johnAlexander 2:bdf097d93eca 91 }
johnAlexander 2:bdf097d93eca 92
johnAlexander 2:bdf097d93eca 93 if (int_measuring_stop)
johnAlexander 2:bdf097d93eca 94 {
johnAlexander 2:bdf097d93eca 95 printf("\r\nEnding loop mode \r\n");
johnAlexander 0:cd8e818d4288 96 break;
johnAlexander 2:bdf097d93eca 97 }
johnAlexander 2:bdf097d93eca 98 }
johnAlexander 0:cd8e818d4288 99 }
johnAlexander 0:cd8e818d4288 100 board->display->DisplayString("BYE");
johnAlexander 0:cd8e818d4288 101 delete board;
johnAlexander 2:bdf097d93eca 102 }
johnAlexander 2:bdf097d93eca 103
johnAlexander 2:bdf097d93eca 104 /*=================================== Main ==================================
johnAlexander 2:bdf097d93eca 105 Press the blue user button to stop the measurements in progress
johnAlexander 2:bdf097d93eca 106 =============================================================================*/
johnAlexander 2:bdf097d93eca 107 int main()
johnAlexander 2:bdf097d93eca 108 {
johnAlexander 2:bdf097d93eca 109 #if USER_BUTTON==PC_13 // we are cross compiling for Nucleo-f401
johnAlexander 2:bdf097d93eca 110 InterruptIn stop_button (USER_BUTTON);
johnAlexander 2:bdf097d93eca 111 stop_button.rise (&MeasuringStopIRQ);
johnAlexander 2:bdf097d93eca 112 #endif
johnAlexander 2:bdf097d93eca 113 DevI2C *device_i2c =new DevI2C(VL53L0_I2C_SDA, VL53L0_I2C_SCL);
johnAlexander 2:bdf097d93eca 114 RangeMeasure(device_i2c); // start continuous measures
johnAlexander 0:cd8e818d4288 115 }
johnAlexander 2:bdf097d93eca 116
johnAlexander 2:bdf097d93eca 117