ST Expansion SW Team / Mbed 2 deprecated VL53L1_shield_MB2_3sensors_interrupt_lite_ranging

Dependencies:   mbed VL53L1ExpansionBoard

Files at this revision

API Documentation at this revision

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

VL53L1ExpansionBoard.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /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
--- /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
--- /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