test

Dependencies:   mbed AsyncBuzzerLib X_NUCLEO_53L1A1_mbed WS2812

Committer:
elab
Date:
Tue Sep 29 09:08:55 2020 +0000
Revision:
0:89b87662e64b
first version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
elab 0:89b87662e64b 1 /*
elab 0:89b87662e64b 2 * This VL53L1X satellite board sample application performs range measurements
elab 0:89b87662e64b 3 * with interrupts enabled to generate a hardware interrupt each time a new
elab 0:89b87662e64b 4 * measurement is ready to be read.
elab 0:89b87662e64b 5 *
elab 0:89b87662e64b 6 * Measured ranges are output on the Serial Port, running at 115200 baud.
elab 0:89b87662e64b 7 *
elab 0:89b87662e64b 8 * On STM32-Nucleo boards :
elab 0:89b87662e64b 9 * The User Blue button stops the current measurement and entire program,
elab 0:89b87662e64b 10 * releasing all resources.
elab 0:89b87662e64b 11 *
elab 0:89b87662e64b 12 * The Black Reset button is used to restart the program.
elab 0:89b87662e64b 13 *
elab 0:89b87662e64b 14 * *** NOTE : By default hardlinks U10, U11, U15 & U18, on the underside of
elab 0:89b87662e64b 15 * the X-NUCELO-53L1A1 expansion board are not made/OFF.
elab 0:89b87662e64b 16 * These links must be made to allow interrupts from the Satellite boards
elab 0:89b87662e64b 17 * to be received.
elab 0:89b87662e64b 18 * U11 and U18 must be made/ON to allow interrupts to be received from the
elab 0:89b87662e64b 19 * INT_L & INT_R positions; or
elab 0:89b87662e64b 20 * U10 and U15 must be made/ON to allow interrupts to be received from the
elab 0:89b87662e64b 21 * Alternate INT_L & INT_R positions.
elab 0:89b87662e64b 22 * The X_NUCLEO_53L1A1 firmware library defaults to use the INT_L/INT_R
elab 0:89b87662e64b 23 * positions.
elab 0:89b87662e64b 24 * INT_L is available on expansion board Arduino Connector CN5, pin 1 as D9.
elab 0:89b87662e64b 25 * Alternate INT_L is on CN5 Connector pin 2 as D8.
elab 0:89b87662e64b 26 * INT_R is available on expansion board Arduino Connector CN9, pin 3 as D4.
elab 0:89b87662e64b 27 * Alternate INT_R is on CN9 Connector pin 5 as D2.
elab 0:89b87662e64b 28 * The pinouts are shown here : https://developer.mbed.org/components/X-NUCLEO-53L1A1/
elab 0:89b87662e64b 29 */
elab 0:89b87662e64b 30
elab 0:89b87662e64b 31 #include <stdio.h>
elab 0:89b87662e64b 32
elab 0:89b87662e64b 33 #include "mbed.h"
elab 0:89b87662e64b 34 #include "VL53L1X_I2C.h"
elab 0:89b87662e64b 35 #include "VL53L1X_Class.h"
elab 0:89b87662e64b 36 #include "LED_WS2812.h"
elab 0:89b87662e64b 37
elab 0:89b87662e64b 38 #define VL53L1_I2C_SDA D14
elab 0:89b87662e64b 39 #define VL53L1_I2C_SCL D15
elab 0:89b87662e64b 40
elab 0:89b87662e64b 41 static VL53L1X *sensor = NULL;
elab 0:89b87662e64b 42 Serial pc(SERIAL_TX, SERIAL_RX);
elab 0:89b87662e64b 43 PwmOut servo(D6);
elab 0:89b87662e64b 44
elab 0:89b87662e64b 45 /* flags that handle interrupt request for sensor and user blue button*/
elab 0:89b87662e64b 46 volatile bool int_sensor = false;
elab 0:89b87662e64b 47 volatile bool int_stop = false;
elab 0:89b87662e64b 48
elab 0:89b87662e64b 49
elab 0:89b87662e64b 50 /* ISR callback function of the sensor */
elab 0:89b87662e64b 51 void sensor_irq(void)
elab 0:89b87662e64b 52 {
elab 0:89b87662e64b 53 int_sensor = true;
elab 0:89b87662e64b 54 sensor->disable_interrupt_measure_detection_irq();
elab 0:89b87662e64b 55 }
elab 0:89b87662e64b 56
elab 0:89b87662e64b 57 /* ISR callback function of the user blue button to switch measuring sensor. */
elab 0:89b87662e64b 58 void measuring_stop_irq(void)
elab 0:89b87662e64b 59 {
elab 0:89b87662e64b 60 int_stop = true;
elab 0:89b87662e64b 61 }
elab 0:89b87662e64b 62
elab 0:89b87662e64b 63 /* Start the sensor ranging */
elab 0:89b87662e64b 64 int start_ranging()
elab 0:89b87662e64b 65 {
elab 0:89b87662e64b 66 int status = 0;
elab 0:89b87662e64b 67 /* start the measure on the sensor */
elab 0:89b87662e64b 68 if (NULL != sensor) {
elab 0:89b87662e64b 69 status = sensor->stop_measurement();
elab 0:89b87662e64b 70 if (status != 0) {
elab 0:89b87662e64b 71 return status;
elab 0:89b87662e64b 72 }
elab 0:89b87662e64b 73
elab 0:89b87662e64b 74 status = sensor->start_measurement(&sensor_irq);
elab 0:89b87662e64b 75 if (status != 0) {
elab 0:89b87662e64b 76 return status;
elab 0:89b87662e64b 77 }
elab 0:89b87662e64b 78 }
elab 0:89b87662e64b 79 return status;
elab 0:89b87662e64b 80 }
elab 0:89b87662e64b 81
elab 0:89b87662e64b 82 int range_measure(VL53L1X_DevI2C *device_i2c)
elab 0:89b87662e64b 83 {
elab 0:89b87662e64b 84 int status = 0;
elab 0:89b87662e64b 85 uint16_t distance = 0;
elab 0:89b87662e64b 86 int distance_close = 0;
elab 0:89b87662e64b 87
elab 0:89b87662e64b 88 LED_WS2812 LED(A0,12);
elab 0:89b87662e64b 89 LED.SetIntensity(5);
elab 0:89b87662e64b 90 LED.SetColor(BLACK);
elab 0:89b87662e64b 91
elab 0:89b87662e64b 92 /* Create a xshutdown pin */
elab 0:89b87662e64b 93 DigitalOut xshutdown(D7);
elab 0:89b87662e64b 94
elab 0:89b87662e64b 95 /* create instance of sensor class */
elab 0:89b87662e64b 96 sensor = new VL53L1X(device_i2c, &xshutdown, A2);
elab 0:89b87662e64b 97
elab 0:89b87662e64b 98 sensor->vl53l1_off();
elab 0:89b87662e64b 99 /* initialise sensor */
elab 0:89b87662e64b 100 sensor->init_sensor(0x52);
elab 0:89b87662e64b 101
elab 0:89b87662e64b 102 if (status) {
elab 0:89b87662e64b 103 delete sensor;
elab 0:89b87662e64b 104 sensor= NULL;
elab 0:89b87662e64b 105 printf("Sensor centre not present\n\r");
elab 0:89b87662e64b 106 }
elab 0:89b87662e64b 107
elab 0:89b87662e64b 108 status = sensor->vl53l1x_set_inter_measurement_in_ms(1000);
elab 0:89b87662e64b 109 status = sensor->vl53l1x_set_distance_threshold(50,
elab 0:89b87662e64b 110 50, 0, 0);
elab 0:89b87662e64b 111 status = start_ranging();
elab 0:89b87662e64b 112 if (status != 0) {
elab 0:89b87662e64b 113 printf("Failed to start ranging!\r\n");
elab 0:89b87662e64b 114 return status;
elab 0:89b87662e64b 115 }
elab 0:89b87662e64b 116 if (NULL != sensor) {
elab 0:89b87662e64b 117 printf("Entering loop mode\r\n");
elab 0:89b87662e64b 118 /* Main ranging interrupt loop */
elab 0:89b87662e64b 119 while (true) {
elab 0:89b87662e64b 120 if (int_sensor) {
elab 0:89b87662e64b 121
elab 0:89b87662e64b 122 servo.period_ms(20);
elab 0:89b87662e64b 123
elab 0:89b87662e64b 124 servo.pulsewidth_us(1150);
elab 0:89b87662e64b 125 wait_ms(100);
elab 0:89b87662e64b 126 servo.pulsewidth_us(1100);
elab 0:89b87662e64b 127 wait_ms(100);
elab 0:89b87662e64b 128 servo.pulsewidth_us(1050);
elab 0:89b87662e64b 129 wait_ms(100);
elab 0:89b87662e64b 130 servo.pulsewidth_us(1000);
elab 0:89b87662e64b 131 wait_ms(100);
elab 0:89b87662e64b 132 servo.pulsewidth_us(950);
elab 0:89b87662e64b 133 wait_ms(100);
elab 0:89b87662e64b 134 servo.pulsewidth_us(900);
elab 0:89b87662e64b 135 wait_ms(100);
elab 0:89b87662e64b 136
elab 0:89b87662e64b 137 servo.pulsewidth_us(850);
elab 0:89b87662e64b 138 wait_ms(100);
elab 0:89b87662e64b 139 servo.pulsewidth_us(800);
elab 0:89b87662e64b 140 wait_ms(100);
elab 0:89b87662e64b 141 servo.pulsewidth_us(750);
elab 0:89b87662e64b 142 wait_ms(100);
elab 0:89b87662e64b 143 servo.pulsewidth_us(700);
elab 0:89b87662e64b 144 // wait_ms(100);
elab 0:89b87662e64b 145 // servo.pulsewidth_us(650);
elab 0:89b87662e64b 146 // wait_ms(100);
elab 0:89b87662e64b 147 // servo.pulsewidth_us(600);
elab 0:89b87662e64b 148 // wait_ms(100);
elab 0:89b87662e64b 149 // servo.pulsewidth_us(550);
elab 0:89b87662e64b 150 // wait_ms(100);
elab 0:89b87662e64b 151 // servo.pulsewidth_us(500);
elab 0:89b87662e64b 152
elab 0:89b87662e64b 153 wait_ms(500);
elab 0:89b87662e64b 154 servo.pulsewidth_us(1150);
elab 0:89b87662e64b 155
elab 0:89b87662e64b 156 int_sensor = false;
elab 0:89b87662e64b 157 status = sensor->handle_irq(&distance);
elab 0:89b87662e64b 158 printf("distance: %d\r\n", distance);
elab 0:89b87662e64b 159 }
elab 0:89b87662e64b 160
elab 0:89b87662e64b 161 }
elab 0:89b87662e64b 162 }
elab 0:89b87662e64b 163
elab 0:89b87662e64b 164 return status;
elab 0:89b87662e64b 165
elab 0:89b87662e64b 166 }
elab 0:89b87662e64b 167
elab 0:89b87662e64b 168
elab 0:89b87662e64b 169 /*=================================== Main ==================================
elab 0:89b87662e64b 170 =============================================================================*/
elab 0:89b87662e64b 171 int main()
elab 0:89b87662e64b 172 {
elab 0:89b87662e64b 173 #if TARGET_STM // we are cross compiling for an STM32-Nucleo
elab 0:89b87662e64b 174 InterruptIn stop_button(USER_BUTTON);
elab 0:89b87662e64b 175 stop_button.rise(&measuring_stop_irq);
elab 0:89b87662e64b 176 #endif
elab 0:89b87662e64b 177 #if TARGET_Freescale // we are cross-compiling for NXP FRDM boards.
elab 0:89b87662e64b 178 InterruptIn stop_button(SW2);
elab 0:89b87662e64b 179 stop_button.rise(&measuring_stop_irq);
elab 0:89b87662e64b 180 #endif
elab 0:89b87662e64b 181 VL53L1X_DevI2C *device_i2c = new VL53L1X_DevI2C(VL53L1_I2C_SDA, VL53L1_I2C_SCL);
elab 0:89b87662e64b 182 range_measure(device_i2c); // start continuous measures
elab 0:89b87662e64b 183 }