Second demo with X-NUCLEO-53L1A1.

Dependencies:   X_NUCLEO_53L1A1 X_NUCLEO_IKS01A3

Committer:
loarri
Date:
Tue Nov 23 09:00:33 2021 +0000
Revision:
5:7f6149b9cbbe
Parent:
3:d90f22c17d0c
Child:
6:054c18d427bf
up

Who changed what in which revision?

UserRevisionLine numberNew contents of line
loarri 5:7f6149b9cbbe 1 /*-----------------------------------------------------------
loarri 5:7f6149b9cbbe 2
loarri 5:7f6149b9cbbe 3 Demo usata nel Corso STM32 NUCLEO Mbed OS - Novembre 2021
loarri 5:7f6149b9cbbe 4
loarri 5:7f6149b9cbbe 5 -----------------------------------------------------------
loarri 5:7f6149b9cbbe 6 */
johnAlexander 0:6b7696e7df5e 7 /*
johnAlexander 0:6b7696e7df5e 8 * This VL53L1X Expansion board test application performs range measurements
johnAlexander 2:819f8323b02d 9 * using the onboard embedded centre sensor, and 2 Satellite boards.
johnAlexander 0:6b7696e7df5e 10 *
johnAlexander 2:819f8323b02d 11 * Measured ranges are ouput on the Serial Port, running at 115200 baud.
johnAlexander 0:6b7696e7df5e 12 *
johnAlexander 0:6b7696e7df5e 13 * The Black Reset button is used to restart the program.
johnAlexander 0:6b7696e7df5e 14 *
johnAlexander 0:6b7696e7df5e 15 * *** NOTE : By default hardlinks U10, U11, U15 & U18, on the underside of
johnAlexander 0:6b7696e7df5e 16 * the X-NUCELO-53L0A1 expansion board are not made/OFF.
johnAlexander 0:6b7696e7df5e 17 * These links must be made to allow interrupts from the Satellite boards
johnAlexander 0:6b7696e7df5e 18 * to be received.
johnAlexander 0:6b7696e7df5e 19 * U11 and U18 must be made/ON to allow interrupts to be received from the
johnAlexander 0:6b7696e7df5e 20 * INT_L & INT_R positions; or
johnAlexander 0:6b7696e7df5e 21 * U10 and U15 must be made/ON to allow interrupts to be received from the
johnAlexander 0:6b7696e7df5e 22 * Alternate INT_L & INT_R positions.
johnAlexander 0:6b7696e7df5e 23 * The X_NUCLEO_53L1A1 firmware library defaults to use the INT_L/INT_R
johnAlexander 0:6b7696e7df5e 24 * positions.
johnAlexander 0:6b7696e7df5e 25 * INT_L is available on expansion board Arduino Connector CN5, pin 1 as D9.
johnAlexander 0:6b7696e7df5e 26 * Alternate INT_L is on CN5 Connector pin 2 as D8.
johnAlexander 0:6b7696e7df5e 27 * INT_R is available on expansion board Arduino Connector CN9, pin 3 as D4.
johnAlexander 0:6b7696e7df5e 28 * Alternate INT_R is on CN9 Connector pin 5 as D2.
johnAlexander 0:6b7696e7df5e 29 * The pinouts are shown here : https://developer.mbed.org/components/X-NUCLEO-53L1A1/
johnAlexander 0:6b7696e7df5e 30 */
johnAlexander 0:6b7696e7df5e 31
johnAlexander 0:6b7696e7df5e 32 #include <stdio.h>
johnAlexander 0:6b7696e7df5e 33
johnAlexander 0:6b7696e7df5e 34 #include "mbed.h"
johnAlexander 0:6b7696e7df5e 35 #include "XNucleo53L1A1.h"
johnAlexander 3:d90f22c17d0c 36 #include "VL53L1X_I2C.h"
johnAlexander 0:6b7696e7df5e 37
johnAlexander 0:6b7696e7df5e 38 #define VL53L1_I2C_SDA D14
johnAlexander 0:6b7696e7df5e 39 #define VL53L1_I2C_SCL D15
johnAlexander 0:6b7696e7df5e 40
johnAlexander 0:6b7696e7df5e 41 static XNucleo53L1A1 *board=NULL;
johnAlexander 0:6b7696e7df5e 42
dmathew 1:b7507ca3370f 43 volatile bool polling_stop = false;
dmathew 1:b7507ca3370f 44
dmathew 1:b7507ca3370f 45 void stop_polling(void)
dmathew 1:b7507ca3370f 46 {
dmathew 1:b7507ca3370f 47 polling_stop = true;
dmathew 1:b7507ca3370f 48 }
johnAlexander 0:6b7696e7df5e 49
johnAlexander 0:6b7696e7df5e 50 /*=================================== Main ==================================
johnAlexander 0:6b7696e7df5e 51 =============================================================================*/
johnAlexander 0:6b7696e7df5e 52 int main()
johnAlexander 0:6b7696e7df5e 53 {
johnAlexander 0:6b7696e7df5e 54 int status = 0;
johnAlexander 0:6b7696e7df5e 55 uint8_t ready_centre = 0;
johnAlexander 0:6b7696e7df5e 56 uint8_t ready_left = 0;
johnAlexander 0:6b7696e7df5e 57 uint8_t ready_right = 0;
johnAlexander 0:6b7696e7df5e 58 uint16_t distance_centre = 0;
johnAlexander 0:6b7696e7df5e 59 uint16_t distance_left = 0;
johnAlexander 0:6b7696e7df5e 60 uint16_t distance_right = 0;
johnAlexander 0:6b7696e7df5e 61
johnAlexander 0:6b7696e7df5e 62 printf("Hello world!\r\n");
johnAlexander 0:6b7696e7df5e 63
johnAlexander 3:d90f22c17d0c 64 VL53L1X_DevI2C *dev_I2C = new VL53L1X_DevI2C(VL53L1_I2C_SDA, VL53L1_I2C_SCL);
johnAlexander 0:6b7696e7df5e 65
johnAlexander 0:6b7696e7df5e 66 printf("I2C device created!\r\n");
johnAlexander 0:6b7696e7df5e 67
johnAlexander 0:6b7696e7df5e 68 /* creates the 53L1A1 expansion board singleton obj */
loarri 5:7f6149b9cbbe 69 //board = XNucleo53L1A1::instance(dev_I2C, A2, D9, D2); /* original code */
loarri 5:7f6149b9cbbe 70 board = XNucleo53L1A1::instance(dev_I2C, A2, PB_13, PB_14);
johnAlexander 0:6b7696e7df5e 71 printf("board created!\r\n");
johnAlexander 0:6b7696e7df5e 72
johnAlexander 0:6b7696e7df5e 73 /* init the 53L1A1 expansion board with default values */
johnAlexander 0:6b7696e7df5e 74 status = board->init_board();
dmathew 1:b7507ca3370f 75 if (status) {
johnAlexander 0:6b7696e7df5e 76 printf("Failed to init board!\r\n");
johnAlexander 0:6b7696e7df5e 77 return status;
johnAlexander 0:6b7696e7df5e 78 }
johnAlexander 0:6b7696e7df5e 79
johnAlexander 0:6b7696e7df5e 80 printf("board initiated! - %d\r\n", status);
johnAlexander 0:6b7696e7df5e 81
johnAlexander 0:6b7696e7df5e 82 /* Start ranging on the centre sensor */
dmathew 1:b7507ca3370f 83 if (board->sensor_centre != NULL) {
johnAlexander 3:d90f22c17d0c 84 status = board->sensor_centre->vl53l1x_start_ranging();
dmathew 1:b7507ca3370f 85 if (status != 0) {
dmathew 1:b7507ca3370f 86 printf("Centre sensor failed to start ranging!\r\n");
dmathew 1:b7507ca3370f 87 return status;
dmathew 1:b7507ca3370f 88 }
johnAlexander 0:6b7696e7df5e 89 }
johnAlexander 0:6b7696e7df5e 90
johnAlexander 0:6b7696e7df5e 91 /* Start ranging on the left sensor */
dmathew 1:b7507ca3370f 92 if (board->sensor_left != NULL) {
johnAlexander 3:d90f22c17d0c 93 status = board->sensor_left->vl53l1x_start_ranging();
dmathew 1:b7507ca3370f 94 if (status != 0) {
dmathew 1:b7507ca3370f 95 printf("Left sensor failed to start ranging!\r\n");
dmathew 1:b7507ca3370f 96 return status;
dmathew 1:b7507ca3370f 97 }
johnAlexander 0:6b7696e7df5e 98 }
johnAlexander 0:6b7696e7df5e 99
johnAlexander 0:6b7696e7df5e 100 /* Start ranging on the right sensor */
dmathew 1:b7507ca3370f 101 if (board->sensor_right != NULL) {
johnAlexander 3:d90f22c17d0c 102 status = board->sensor_right->vl53l1x_start_ranging();
dmathew 1:b7507ca3370f 103 if (status != 0) {
dmathew 1:b7507ca3370f 104 printf("Right sensor failed to start ranging!\r\n");
dmathew 1:b7507ca3370f 105 return status;
dmathew 1:b7507ca3370f 106 }
johnAlexander 0:6b7696e7df5e 107 }
johnAlexander 0:6b7696e7df5e 108
johnAlexander 0:6b7696e7df5e 109 /* Ranging loop
johnAlexander 0:6b7696e7df5e 110 * Checks each sensor for data ready
johnAlexander 0:6b7696e7df5e 111 */
johnAlexander 0:6b7696e7df5e 112 while (1)
johnAlexander 0:6b7696e7df5e 113 {
dmathew 1:b7507ca3370f 114 if (polling_stop)
dmathew 1:b7507ca3370f 115 {
dmathew 1:b7507ca3370f 116 printf("\r\nEnding loop mode \r\n");
dmathew 1:b7507ca3370f 117 break;
dmathew 1:b7507ca3370f 118 }
dmathew 1:b7507ca3370f 119 if (board->sensor_centre != NULL) {
johnAlexander 3:d90f22c17d0c 120 board->sensor_centre->vl53l1x_check_for_data_ready(&ready_centre);
dmathew 1:b7507ca3370f 121 }
dmathew 1:b7507ca3370f 122 if (board->sensor_left != NULL) {
johnAlexander 3:d90f22c17d0c 123 board->sensor_left->vl53l1x_check_for_data_ready(&ready_left);
dmathew 1:b7507ca3370f 124 }
dmathew 1:b7507ca3370f 125 if (board->sensor_right != NULL) {
johnAlexander 3:d90f22c17d0c 126 board->sensor_right->vl53l1x_check_for_data_ready(&ready_right);
dmathew 1:b7507ca3370f 127 }
johnAlexander 0:6b7696e7df5e 128 if (ready_centre) {
johnAlexander 3:d90f22c17d0c 129 board->sensor_centre->vl53l1x_get_range_status(&ready_centre);
johnAlexander 3:d90f22c17d0c 130 board->sensor_centre->vl53l1x_get_distance(&distance_centre);
johnAlexander 0:6b7696e7df5e 131 }
johnAlexander 0:6b7696e7df5e 132 if (ready_left) {
johnAlexander 3:d90f22c17d0c 133 board->sensor_left->vl53l1x_get_range_status(&ready_left);
johnAlexander 3:d90f22c17d0c 134 board->sensor_left->vl53l1x_get_distance(&distance_left);
johnAlexander 0:6b7696e7df5e 135 }
johnAlexander 0:6b7696e7df5e 136 if (ready_right) {
johnAlexander 3:d90f22c17d0c 137 board->sensor_right->vl53l1x_get_range_status(&ready_right);
johnAlexander 3:d90f22c17d0c 138 board->sensor_right->vl53l1x_get_distance(&distance_right);
johnAlexander 0:6b7696e7df5e 139 }
loarri 5:7f6149b9cbbe 140
dmathew 1:b7507ca3370f 141 if (board->sensor_centre != NULL) {
johnAlexander 2:819f8323b02d 142 printf("Distance read by centre sensor is : %d\r\n", distance_centre);
dmathew 1:b7507ca3370f 143 }
loarri 5:7f6149b9cbbe 144
dmathew 1:b7507ca3370f 145 if (board->sensor_left != NULL) {
johnAlexander 2:819f8323b02d 146 printf("Distance read by left satellite sensor is : %d\r\n", distance_left);
dmathew 1:b7507ca3370f 147 }
loarri 5:7f6149b9cbbe 148
dmathew 1:b7507ca3370f 149 if (board->sensor_right != NULL) {
johnAlexander 2:819f8323b02d 150 printf("Distance read by right satellite sensor is : %d\r\n", distance_right);
dmathew 1:b7507ca3370f 151 }
loarri 5:7f6149b9cbbe 152
johnAlexander 0:6b7696e7df5e 153 }
johnAlexander 0:6b7696e7df5e 154
johnAlexander 0:6b7696e7df5e 155 return status;
johnAlexander 0:6b7696e7df5e 156 }