Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed VL53L1ExpansionBoard
Revision 0:d6a9ba597c26, committed 2020-10-27
- Comitter:
- charlesmn
- Date:
- Tue Oct 27 12:37:48 2020 +0000
- Commit message:
- A sample program that talks to up to 3 VL53L1 ToF sensors on a nucleo shield. The sensor is in lite-ranging mode and interrupts occur when a measurement is available. MBed V2
Changed in this revision
diff -r 000000000000 -r d6a9ba597c26 VL53L1ExpansionBoard.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/VL53L1ExpansionBoard.lib Tue Oct 27 12:37:48 2020 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/teams/ST-Expansion-SW-Team/code/VL53L1ExpansionBoard/#91e6528a6780
diff -r 000000000000 -r d6a9ba597c26 main.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Tue Oct 27 12:37:48 2020 +0000
@@ -0,0 +1,262 @@
+/*
+ * This VL53L1X Expansion board test application performs range measurements
+ * using the onboard embedded centre sensor and two satelites, in Lite-ranging, interrupt mode.
+ * Measured ranges are ouput on the Serial Port, running at 115200 baud.
+ *
+ *
+ * This is designed to work with MBed V2 , MBed V5 and MBed V6.
+ *
+ *
+ * The Reset button can be used to restart the program.
+ */
+
+#include <stdio.h>
+
+#include "mbed.h"
+#include "XNucleo53L1A1.h"
+#include "ToF_I2C.h"
+#include <time.h>
+
+
+// define the i2c comms pins
+#define I2C_SDA D14
+#define I2C_SCL D15
+
+#define NUM_SENSORS 3
+
+
+static XNucleo53L1A1 *board=NULL;
+Serial pc(SERIAL_TX, SERIAL_RX);
+
+static int int_centre_result = 0;
+static int int_left_result = 0;
+static int int_right_result = 0;
+
+
+class WaitForMeasurement {
+public:
+
+
+// this class services the interrupts from the ToF sensors.
+// There is a limited amount you can do in an interrupt routine; printfs,mutexes break them among other things.
+// We keep things simple by only raising a flag so all the real work is done outside the interrupt.
+// This is designed around MBED V2 which doesn't have the RTOS features that would make this work nicely e.g. semaphores/queues.
+WaitForMeasurement(): _interrupt(A1)
+{
+}
+
+
+ // constructor - Sensor is not used and can be removed
+ WaitForMeasurement(PinName pin,VL53L1_DEV Dev) : _interrupt(pin) // create the InterruptIn on the pin specified to Counter
+ {
+ Devlocal = Dev;
+ _interrupt.rise(callback(this, &WaitForMeasurement::got_interrupt)); // attach increment function of this counter instance
+
+ }
+
+ void process_right_interrupt()
+ {
+ printf("processing right interrupt\n");
+ }
+
+ // function is called every time an interupt is seen. A flag is raised which allows the main routine to service the interupt.
+ void got_interrupt()
+ {
+
+ _count++;
+
+ if (Devlocal->i2c_slave_address == NEW_SENSOR_CENTRE_ADDRESS)
+ int_centre_result = 1; //flag to main that interrupt happened
+ if (Devlocal->i2c_slave_address == NEW_SENSOR_LEFT_ADDRESS)
+ int_left_result = 1; //flag to main that interrupt happened
+ if (Devlocal->i2c_slave_address == NEW_SENSOR_RIGHT_ADDRESS)
+ {
+ int_right_result = 1; //flag to main that interrupt happened
+ }
+ }
+
+ //destructor
+ ~WaitForMeasurement()
+ {
+ printf("destruction \n");
+ }
+
+private:
+ InterruptIn _interrupt;
+ volatile int _count;
+ VL53L1_DEV Devlocal;
+ int status;
+
+};
+
+
+
+VL53L1_Dev_t devCentre;
+VL53L1_Dev_t devLeft;
+VL53L1_Dev_t devRight;
+VL53L1_DEV Dev = &devCentre;
+
+
+/*=================================== Main ==================================
+=============================================================================*/
+int main()
+{
+ int status;
+ VL53L1X * Sensor;
+ uint16_t wordData;
+ uint8_t ToFSensor = 1; // 0=Left, 1=Center(default), 2=Right
+
+
+ WaitForMeasurement* int2;
+ WaitForMeasurement* int1;
+ WaitForMeasurement* int3;
+
+ pc.baud(115200); // baud rate is important as printf statements take a lot of time
+
+ printf("Interrupt Lite-ranging\r\n");
+
+// create i2c interface
+ ToF_DevI2C *dev_I2C = new ToF_DevI2C(I2C_SDA, I2C_SCL);
+
+ dev_I2C->frequency(400000); //also needs doing in spi_interface.c
+
+ /* creates the 53L1A1 expansion board singleton obj */
+ board = XNucleo53L1A1::instance(dev_I2C, A2, D8, D2);
+ printf("board created!\r\n");
+
+ /* init the 53L1A1 expansion board with default values */
+ status = board->init_board();
+ if (status) {
+ return 0;
+ }
+
+
+ printf("board initiated! - %d\r\n", status);
+
+
+ // create sensor controller classes for each vl53l1 and configure each vl53l1
+ for (ToFSensor=0;ToFSensor<NUM_SENSORS ;ToFSensor++)
+ {
+ switch(ToFSensor){
+ case 1:
+ if (board->sensor_centre== NULL ) continue; // don't create if sensor not detected
+ Dev=&devCentre;
+ Sensor=board->sensor_centre;
+ Dev->i2c_slave_address = NEW_SENSOR_CENTRE_ADDRESS;
+ printf("configuring centre channel \n");
+ break;
+ case 0:
+ if (board->sensor_left== NULL ) continue;
+ Dev=&devLeft;
+ Sensor=board->sensor_left;
+ Dev->i2c_slave_address = NEW_SENSOR_LEFT_ADDRESS;
+ printf("configuring left channel \n");
+ break;
+ case 2:
+ if (board->sensor_right== NULL ) continue;
+ Dev=&devRight;
+ Sensor=board->sensor_right;
+ Dev->i2c_slave_address = NEW_SENSOR_RIGHT_ADDRESS;
+ printf("configuring right channel \n");
+ break;
+ default:
+ printf(" error in switch, invalid ToF sensor \n");
+ } // end of switch
+
+// configure the sensors
+ Dev->comms_speed_khz = 400;
+ Dev->comms_type = 1;
+
+ /* Device Initialization and setting */
+ status = Sensor->vl53L1_DataInit();
+ status = Sensor->vl53L1_StaticInit();
+ status = Sensor->vl53L1_SetPresetMode( VL53L1_PRESETMODE_LITE_RANGING);
+ status = Sensor->vl53L1_SetDistanceMode( VL53L1_DISTANCEMODE_LONG);
+ // status = Sensor->vl53L1_SetMeasurementTimingBudgetMicroSeconds( 50000);
+ // status = Sensor->vl53L1_SetInterMeasurementPeriodMilliSeconds( 100);
+ } // end of sensor loop
+ printf("starting sensors \n");
+
+ // initialise sensor interrupts
+ if (board->sensor_centre!= NULL )
+ {
+ Sensor=board->sensor_centre;
+ devCentre.i2c_slave_address = NEW_SENSOR_CENTRE_ADDRESS;
+ int1 = new WaitForMeasurement(A2,&devCentre); // initialise sensor interrupts
+ status = Sensor->vl53L1_StartMeasurement();
+ printf("started interrupt centre %d\n",status);
+ }
+
+
+ if (board->sensor_left!= NULL )
+ {
+ Sensor=board->sensor_left;
+ devLeft.i2c_slave_address = NEW_SENSOR_LEFT_ADDRESS;
+ int2 = new WaitForMeasurement(D8,&devLeft);
+ status = Sensor->vl53L1_StartMeasurement();
+ printf("started interrupt left %d\n",status);
+ }
+
+ if (board->sensor_right!= NULL )
+ {
+ Sensor=board->sensor_right;
+ devRight.i2c_slave_address = NEW_SENSOR_RIGHT_ADDRESS;
+ int3 = new WaitForMeasurement(D2,&devRight);
+ status = board->sensor_right->vl53L1_StartMeasurement();
+ printf("started interrupt sensor_right %d\n",status);
+ }
+
+
+
+ // loop waiting for interrupts to happen. This is signaled by int_centre_result,int_left_result or int_right_result
+ // being non zero. The are set back to zero when processing is completed
+ while (1)
+ {
+ static VL53L1_RangingMeasurementData_t RangingData;
+
+ wait_ms( 1 * 30);
+ if (int_centre_result != 0)
+ {
+ // read result
+ status = board->sensor_centre->vl53L1_GetRangingMeasurementData( &RangingData);
+ // if valid result print it
+ if (RangingData.RangeStatus != 255)
+ printf("c %d,%d \n",RangingData.RangeStatus,RangingData.RangeMilliMeter);
+ // clear interrupt flag
+ int_centre_result = 0;
+ // clear theinterrupt and wait for another result
+ status = board->sensor_centre->vl53L1_ClearInterruptAndStartMeasurement();
+ }
+
+
+ if (int_left_result != 0)
+ {
+ // read result
+ status = board->sensor_left->vl53L1_GetRangingMeasurementData( &RangingData);
+ // if valid result print it
+ if (RangingData.RangeStatus != 255)
+ printf("l %d,%d\n",RangingData.RangeStatus,RangingData.RangeMilliMeter);
+ // clear interrupt flag
+ int_left_result = 0;
+ // clear theinterrupt and wait for another result
+ status = board->sensor_left->vl53L1_ClearInterruptAndStartMeasurement();
+ }
+
+
+ if (int_right_result != 0)
+ {
+ // read result
+ status = board->sensor_right->vl53L1_GetRangingMeasurementData( &RangingData);
+ // if valid result print it
+ if (RangingData.RangeStatus != 255)
+ printf("r %d,%d\n",RangingData.RangeStatus,RangingData.RangeMilliMeter);
+ // clear interrupt flag
+ int_right_result = 0;
+ // clear theinterrupt and wait for another result
+ status = board->sensor_right->vl53L1_ClearInterruptAndStartMeasurement();
+ }
+
+ }
+ printf("terminated");
+ }
+
\ No newline at end of file
diff -r 000000000000 -r d6a9ba597c26 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Tue Oct 27 12:37:48 2020 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400 \ No newline at end of file