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: X_NUCLEO_53L1A2
Diff: main.cpp
- Revision:
- 0:d8fe7004e61a
- Child:
- 1:52cac9f5ed6a
diff -r 000000000000 -r d8fe7004e61a main.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Sun Nov 08 15:59:44 2020 +0000
@@ -0,0 +1,232 @@
+/*
+ * This VL53L1X Expansion board test application performs range measurements
+ * using the onboard embedded centre sensor, in singleshot, polling 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
+
+PinName CentreIntPin = A2;
+// the satellite pins depend on solder blobs on the back of the shield.
+// they may not exist or may be one of two sets.
+// the centre pin always exists
+PinName LeftIntPin = D9;
+PinName RightIntPin = D4;
+// alternate set
+//PinName LeftIntPin = D8;
+//PinName RightIntPin = D2;
+
+
+static XNucleo53L1A1 *board=NULL;
+
+// MBed V6.4 has renamed wait_ms and UnbufferedSerial replaces Serial
+#if (MBED_VERSION > 60300)
+UnbufferedSerial pc(SERIAL_TX, SERIAL_RX);
+extern "C" void wait_ms(int ms);
+#else
+Serial pc(SERIAL_TX, SERIAL_RX);
+#endif
+
+
+
+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
+ static VL53L1_RangingMeasurementData_t RangingData;
+ uint32_t polling_time_ms;
+ uint32_t start_time_ms;
+ uint32_t current_time_ms;
+
+ pc.baud(115200); // baud rate is important as printf statements take a lot of time
+
+ printf("Polling Lite-Ranging mbed = %d \r\n",MBED_VERSION);
+// 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, CentreIntPin, LeftIntPin, RightIntPin);
+ printf("board created!\r\n");
+
+ /* init the 53L1A1 expansion board with default values */
+ status = board->init_board();
+ if (status) {
+ printf("Failed to init board!\r\n");
+ return 0;
+ }
+
+
+ printf("board initiated! - %d\r\n", status);
+
+ // for each sensor, if it exists, initialise and configure
+ for (ToFSensor=0;ToFSensor< NUM_SENSORS;ToFSensor++){
+ switch(ToFSensor){
+ case 0:
+ if (board->sensor_centre== NULL ) continue;
+ Dev=&devCentre;
+ Sensor=board->sensor_centre;
+ Dev->i2c_slave_address = NEW_SENSOR_CENTRE_ADDRESS;
+ printf("configuring centre channel \n");
+ break;
+ case 1:
+ 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;
+ }
+
+ Dev->comms_speed_khz = 400;
+ Dev->comms_type = 1;
+
+ Sensor->VL53L1_RdWord(Dev, 0x01, &wordData);
+ printf("VL53L1X: %02X %d\n\r", wordData,Dev->i2c_slave_address);
+ /* 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);
+ }
+
+ if (board->sensor_centre!= NULL )
+ {
+ Dev=&devCentre;
+ Sensor=board->sensor_centre;
+ Dev->i2c_slave_address = NEW_SENSOR_CENTRE_ADDRESS;
+ }
+
+ if (board->sensor_left!= NULL )
+ {
+ Dev=&devLeft;
+ Sensor=board->sensor_left;
+ Dev->i2c_slave_address = NEW_SENSOR_LEFT_ADDRESS;
+ }
+
+
+ if (board->sensor_right!= NULL )
+ {
+ Dev=&devRight;
+ Sensor=board->sensor_right;
+ Dev->i2c_slave_address = NEW_SENSOR_RIGHT_ADDRESS;
+ }
+
+ while(1) {
+ for (ToFSensor=0;ToFSensor< NUM_SENSORS;ToFSensor++){
+ switch(ToFSensor){
+ case 0:
+ if (board->sensor_centre== NULL ) continue;
+ Dev=&devCentre;
+ Sensor=board->sensor_centre;
+ Dev->i2c_slave_address = NEW_SENSOR_CENTRE_ADDRESS;
+ break;
+ case 1:
+ if (board->sensor_left== NULL ) continue;
+ Dev=&devLeft;
+ Sensor=board->sensor_left;
+ Dev->i2c_slave_address = NEW_SENSOR_LEFT_ADDRESS;
+ break;
+ case 2:
+ if (board->sensor_right== NULL ) continue;
+ Dev=&devRight;
+ Sensor=board->sensor_right;
+ Dev->i2c_slave_address = NEW_SENSOR_RIGHT_ADDRESS;
+ break;
+ default:
+ printf("default \n");
+ break;
+ } // switch
+
+ start_time_ms = us_ticker_read() / 1000;
+ status = Sensor->vl53L1_StartMeasurement();
+
+ status = Sensor->vl53L1_WaitMeasurementDataReady();
+
+ if(!status)
+ {
+ status = Sensor->vl53L1_GetRangingMeasurementData( &RangingData);
+ current_time_ms = us_ticker_read() / 1000;
+
+ if((status==0) && (RangingData.RangeStatus != 10)) {
+ printf("data %d,%d,%d,%.2f,%.2f\n", ToFSensor,RangingData.RangeStatus,RangingData.RangeMilliMeter,
+ (RangingData.SignalRateRtnMegaCps/65536.0),RangingData.AmbientRateRtnMegaCps/65336.0);
+
+ }
+ } // if status
+ else
+ {
+ printf("VL53L1_WaitMeasurementDataReady failed %d \n",status);
+ }
+
+ status = Sensor->vl53L1_ClearInterruptAndStartMeasurement();
+ status = Sensor->vl53L1_WaitMeasurementDataReady();
+ if(!status)
+ {
+ status = Sensor->vl53L1_GetRangingMeasurementData( &RangingData);
+
+ polling_time_ms = current_time_ms - start_time_ms;
+ if((status==0) && (RangingData.RangeStatus != 10)) {
+ printf("data %d,%d,%d,%.2f,%.2f %d\n", ToFSensor,RangingData.RangeStatus,RangingData.RangeMilliMeter,
+ (RangingData.SignalRateRtnMegaCps/65536.0),RangingData.AmbientRateRtnMegaCps/65336.0,polling_time_ms);
+ }
+ }
+
+ status = Sensor->vl53L1_ClearInterruptAndStartMeasurement();
+
+
+ status = Sensor->vl53L1_StopMeasurement();
+ } // endwhile(1)
+
+ }
+
+
+}
+
+
+#if (MBED_VERSION > 60300)
+void wait_ms(int ms)
+ {
+ thread_sleep_for(ms);
+ }
+#endif
+