A sample program getting measurements from a VL53L1 ToF sensor which is directly connected to the STM32F401. Only copes with one sensor. Polls for measurements. VL53L1 is operated in multizone mode. MBed V6.3 but will work with other MBed versions.

Dependencies:   X_NUCLEO_53L1A2

main.cpp

Committer:
charlesmn
Date:
2020-11-09
Revision:
2:014f6e21d7b3
Parent:
1:6bbe4976bc7b

File content as of revision 2:014f6e21d7b3:

/*
 *  This application performs range measurements
 *  connecting directly to  the onboard embedded centre sensor, in multizone, 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 "NoShield53L1A1.h"
#include "ToF_I2C.h"
#include <time.h>
//#include "vl53lx_class.h"
#include "vl53l1_def.h"
#include "vl53l1_platform_user_data.h"
#include "vl53l1.h"


// define the i2c comms pins
#define I2C_SDA   D14 
#define I2C_SCL   D15 

#define SENSOR_DEFAULT_ADDRESS   0x52
#define NEW_SENSOR_CENTRE_ADDRESS   0x56
#define NEW_SENSOR_LEFT_ADDRESS     0x58
#define NEW_SENSOR_RIGHT_ADDRESS    0x5a



//static NoShield53L1 *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

//void process_interrupt( VL53L1X * sensor,VL53L1_DEV dev );
void print_results( int devSpiNumber, VL53L1_MultiRangingData_t *pMultiRangingData );


VL53L1_Dev_t                   devCentre;
VL53L1_Dev_t                   devLeft;
VL53L1_Dev_t                   devRight;
VL53L1_DEV                     Dev = &devCentre;

 
/*=================================== Main ==================================
=============================================================================*/
int main()
{   
    int status;
    VL53L1 * Sensor;
    uint16_t wordData;
    DigitalOut xshutdown(D9);


    pc.baud(115200);  // baud rate is important as printf statements take a lot of time
    printf("Polling single multizone  mbed = %d \r\n",MBED_VERSION);

// create i2c interface
    ToF_DevI2C *dev_I2C = new ToF_DevI2C(I2C_SDA, I2C_SCL);
    
    /* creates the 53L1A1 expansion board singleton obj */
//   board = XNucleo51L1::instance(dev_I2C, A2, D8, D2);
   
   Sensor = new VL53L1(dev_I2C,&xshutdown,A2);
    
    printf("board created!\r\n");
    
        /* define the shutdown pins */
 //   status = board->init_board();
    status = Sensor->InitSensor(SENSOR_DEFAULT_ADDRESS);
    if (status) {
        printf("Failed to init sensor!\r\n");
        return 0;
    }
    wait_ms(250);        // wait for the sensor to initialise     
        
    printf("sensor initiated! - %d\r\n", status);
  // create the sensor controller classes                                              
  
    Dev=&devCentre;
    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_MULTIZONES_SCANNING);
    status = Sensor->vl53L1_SetDistanceMode( VL53L1_DISTANCEMODE_LONG);
    status = Sensor->vl53L1_SetMeasurementTimingBudgetMicroSeconds( 50 * 1000);
   
  // configure the region of interests  
    VL53L1_RoiConfig_t roiConfig;
    roiConfig.NumberOfRoi =3;
    roiConfig.UserRois[0].TopLeftX = 0;
    roiConfig.UserRois[0].TopLeftY = 9; 
    roiConfig.UserRois[0].BotRightX = 4;
    roiConfig.UserRois[0].BotRightY = 5; 
    roiConfig.UserRois[1].TopLeftX = 5;
    roiConfig.UserRois[1].TopLeftY = 9; 
    roiConfig.UserRois[1].BotRightX = 9;
    roiConfig.UserRois[1].BotRightY = 4; 
    roiConfig.UserRois[2].TopLeftX = 11;
    roiConfig.UserRois[2].TopLeftY = 9; 
    roiConfig.UserRois[2].BotRightX = 15;
    roiConfig.UserRois[2].BotRightY = 5; 
    status = Sensor->vl53L1_SetROI( &roiConfig);
    printf("VL53L1_SetROI %d \n",status);

    status = Sensor->vl53L1_StartMeasurement();  

       // looping polling for results
    while (1)
    {
        VL53L1_MultiRangingData_t MultiRangingData;
        VL53L1_MultiRangingData_t *pMultiRangingData = &MultiRangingData;    
        
        // wait for result
        status = Sensor->vl53L1_WaitMeasurementDataReady();  
        // get the result
        status = Sensor->vl53L1_GetMultiRangingData( pMultiRangingData);
        // if valid, print it
        if(status==0) {
            print_results(devCentre.i2c_slave_address, pMultiRangingData );
             status = Sensor->vl53L1_ClearInterruptAndStartMeasurement();

        } //if(status==0) 
        else
        {
            printf("VL53L1_GetMultiRangingData centre %d \n",status);
        }
                
        wait_ms( 1 * 10);                   
    }
}
    
    
    
 // prints the range result seen above   
void print_results( int devSpiNumber, VL53L1_MultiRangingData_t *pMultiRangingData )
{
        int no_of_object_found=pMultiRangingData->NumberOfObjectsFound;
            
        int RoiNumber=pMultiRangingData->RoiNumber;
//            int RoiStatus=pMultiRangingData->RoiStatus;

        if (( no_of_object_found < 10 ) &&  ( no_of_object_found != 0)) 
        {
            
//              printf("MZI Count=%5d, ", pMultiRangingData->StreamCount);
//             printf("RoiNumber%1d, ", RoiNumber);
//               printf("RoiStatus=%1d, \n", RoiStatus);
            for(int j=0;j<no_of_object_found;j++){
                if ((pMultiRangingData->RangeData[j].RangeStatus == VL53L1_RANGESTATUS_RANGE_VALID) || 
                    (pMultiRangingData->RangeData[j].RangeStatus == VL53L1_RANGESTATUS_RANGE_VALID_NO_WRAP_CHECK_FAIL))
                {
                    printf("*****************\t spiAddr=%d \t RoiNumber=%d   \t status=%d, \t D=%5dmm, \t Signal=%2.2f Mcps, \t Ambient=%2.2f Mcps \n",
                    devSpiNumber,
                    RoiNumber,
                    pMultiRangingData->RangeData[j].RangeStatus,
                    pMultiRangingData->RangeData[j].RangeMilliMeter,
                    pMultiRangingData->RangeData[j].SignalRateRtnMegaCps/65536.0,
                    pMultiRangingData->RangeData[j].AmbientRateRtnMegaCps/65536.0);
                }
                else
                {
//                               printf("RangeStatus %d %d\n",j, pMultiRangingData->RangeData[j].RangeStatus);
                }
            }
        } // if (( no_of_object_found < 10 ) &&  ( no_of_object_found != 0)) 


}    
     
         
#if (MBED_VERSION  > 60300) 
void wait_ms(int ms)
 {
    thread_sleep_for(ms);
 }
#endif