A mbed library for the VL53L0X proximity sensor. This is a wrapper, so beware of big file sizes.

Dependents:   BigBot_v1 PololuDistanceSensorTest Lidar Ares test ... more

Committer:
joelvonrotz
Date:
Tue Jul 30 13:49:02 2019 +0000
Revision:
0:11ad6aaed10a
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
joelvonrotz 0:11ad6aaed10a 1 /**
joelvonrotz 0:11ad6aaed10a 2 * @file VL53L0X.cpp
joelvonrotz 0:11ad6aaed10a 3 * @author Joel von Rotz (joel.vonrotz@maxonmotor.com)
joelvonrotz 0:11ad6aaed10a 4 * @brief
joelvonrotz 0:11ad6aaed10a 5 * @version 0.1
joelvonrotz 0:11ad6aaed10a 6 * @date 2019-07-30
joelvonrotz 0:11ad6aaed10a 7 *
joelvonrotz 0:11ad6aaed10a 8 * @copyright Copyright (c) 2019, maxon motor ag - all rights reserved
joelvonrotz 0:11ad6aaed10a 9 *
joelvonrotz 0:11ad6aaed10a 10 */
joelvonrotz 0:11ad6aaed10a 11 #include "VL53L0X.h"
joelvonrotz 0:11ad6aaed10a 12 #include "mbed.h"
joelvonrotz 0:11ad6aaed10a 13
joelvonrotz 0:11ad6aaed10a 14 #include "vl53l0x_api.h"
joelvonrotz 0:11ad6aaed10a 15 #include "vl53l0x_platform.h"
joelvonrotz 0:11ad6aaed10a 16
joelvonrotz 0:11ad6aaed10a 17 /**
joelvonrotz 0:11ad6aaed10a 18 * @brief Construct a new VL53L0X object
joelvonrotz 0:11ad6aaed10a 19 *
joelvonrotz 0:11ad6aaed10a 20 * The constructor is used to assign the needed values to the VL53L0X-Dev structure.
joelvonrotz 0:11ad6aaed10a 21 *
joelvonrotz 0:11ad6aaed10a 22 * @param p_i2c_device A pointer to an mbed I2C-object
joelvonrotz 0:11ad6aaed10a 23 */
joelvonrotz 0:11ad6aaed10a 24 VL53L0X::VL53L0X(I2C* p_i2c_device)
joelvonrotz 0:11ad6aaed10a 25 {
joelvonrotz 0:11ad6aaed10a 26 m_vl_dev.i2c_frequency = 400000;
joelvonrotz 0:11ad6aaed10a 27 m_vl_dev.i2c_device = p_i2c_device;
joelvonrotz 0:11ad6aaed10a 28 m_vl_dev.i2c_address = ADDRESS_DEFAULT;
joelvonrotz 0:11ad6aaed10a 29
joelvonrotz 0:11ad6aaed10a 30 }
joelvonrotz 0:11ad6aaed10a 31
joelvonrotz 0:11ad6aaed10a 32 /**
joelvonrotz 0:11ad6aaed10a 33 * @brief Set new Device Address
joelvonrotz 0:11ad6aaed10a 34 *
joelvonrotz 0:11ad6aaed10a 35 * Replaces the current I2C-Address with a new one. Every value can be used.
joelvonrotz 0:11ad6aaed10a 36 * Currently there is a small problem on reseting the mbed board: after reset (no power reset) the sensor still
joelvonrotz 0:11ad6aaed10a 37 * uses it's new slave address. A power-reset is needed to reset the proximity sensors to their factory settings.
joelvonrotz 0:11ad6aaed10a 38 *
joelvonrotz 0:11ad6aaed10a 39 * @param address New desired 7-Bit address
joelvonrotz 0:11ad6aaed10a 40 * @return true no success
joelvonrotz 0:11ad6aaed10a 41 * @return false success
joelvonrotz 0:11ad6aaed10a 42 */
joelvonrotz 0:11ad6aaed10a 43 bool VL53L0X::setDeviceAddress(uint8_t address)
joelvonrotz 0:11ad6aaed10a 44 {
joelvonrotz 0:11ad6aaed10a 45 if(VL53L0X_SetDeviceAddress(&m_vl_dev, address << 1) == 0)
joelvonrotz 0:11ad6aaed10a 46 {
joelvonrotz 0:11ad6aaed10a 47 m_vl_dev.i2c_address = address;
joelvonrotz 0:11ad6aaed10a 48 return 0;
joelvonrotz 0:11ad6aaed10a 49 }
joelvonrotz 0:11ad6aaed10a 50 return 1;
joelvonrotz 0:11ad6aaed10a 51 }
joelvonrotz 0:11ad6aaed10a 52
joelvonrotz 0:11ad6aaed10a 53 /**
joelvonrotz 0:11ad6aaed10a 54 * @brief Initializes the Sensor
joelvonrotz 0:11ad6aaed10a 55 *
joelvonrotz 0:11ad6aaed10a 56 * After constructing a VL53L0X object, the sensor needs to be initialized by calling this funciton.
joelvonrotz 0:11ad6aaed10a 57 *
joelvonrotz 0:11ad6aaed10a 58 * @return true never going to happen
joelvonrotz 0:11ad6aaed10a 59 * @return false maybe a success
joelvonrotz 0:11ad6aaed10a 60 */
joelvonrotz 0:11ad6aaed10a 61 bool VL53L0X::init()
joelvonrotz 0:11ad6aaed10a 62 {
joelvonrotz 0:11ad6aaed10a 63 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 64
joelvonrotz 0:11ad6aaed10a 65 VL53L0X_GetVersion(&m_vl_version);
joelvonrotz 0:11ad6aaed10a 66
joelvonrotz 0:11ad6aaed10a 67 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 68 {
joelvonrotz 0:11ad6aaed10a 69 Status = VL53L0X_DataInit(&m_vl_dev); // Data initialization
joelvonrotz 0:11ad6aaed10a 70 }
joelvonrotz 0:11ad6aaed10a 71 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 72 {
joelvonrotz 0:11ad6aaed10a 73 Status = VL53L0X_GetDeviceInfo(&m_vl_dev, &m_vl_deviceinfo);
joelvonrotz 0:11ad6aaed10a 74 }
joelvonrotz 0:11ad6aaed10a 75 return 0;
joelvonrotz 0:11ad6aaed10a 76 }
joelvonrotz 0:11ad6aaed10a 77
joelvonrotz 0:11ad6aaed10a 78 /**
joelvonrotz 0:11ad6aaed10a 79 * @brief Set Mode to Continuous
joelvonrotz 0:11ad6aaed10a 80 *
joelvonrotz 0:11ad6aaed10a 81 * Configures the data acquisition of the sensor to 'continuous'
joelvonrotz 0:11ad6aaed10a 82 *
joelvonrotz 0:11ad6aaed10a 83 * @return true never going to happen
joelvonrotz 0:11ad6aaed10a 84 * @return false maybe a success
joelvonrotz 0:11ad6aaed10a 85 */
joelvonrotz 0:11ad6aaed10a 86 bool VL53L0X::setModeContinuous()
joelvonrotz 0:11ad6aaed10a 87 {
joelvonrotz 0:11ad6aaed10a 88 uint32_t refSpadCount;
joelvonrotz 0:11ad6aaed10a 89 uint8_t isApertureSpads;
joelvonrotz 0:11ad6aaed10a 90 uint8_t VhvSettings;
joelvonrotz 0:11ad6aaed10a 91 uint8_t PhaseCal;
joelvonrotz 0:11ad6aaed10a 92 VL53L0X_StaticInit(&m_vl_dev); // Device Initialization
joelvonrotz 0:11ad6aaed10a 93 VL53L0X_PerformRefCalibration(&m_vl_dev, &VhvSettings, &PhaseCal); // Device Initialization
joelvonrotz 0:11ad6aaed10a 94 VL53L0X_PerformRefSpadManagement(&m_vl_dev, &refSpadCount, &isApertureSpads); // Device Initialization
joelvonrotz 0:11ad6aaed10a 95 VL53L0X_SetDeviceMode(&m_vl_dev, VL53L0X_DEVICEMODE_CONTINUOUS_RANGING); // Setup in single ranging mode
joelvonrotz 0:11ad6aaed10a 96
joelvonrotz 0:11ad6aaed10a 97 return 0;
joelvonrotz 0:11ad6aaed10a 98 }
joelvonrotz 0:11ad6aaed10a 99
joelvonrotz 0:11ad6aaed10a 100 /**
joelvonrotz 0:11ad6aaed10a 101 * @brief Starts the Continuous Measurement Session
joelvonrotz 0:11ad6aaed10a 102 *
joelvonrotz 0:11ad6aaed10a 103 * @return true never going to happen
joelvonrotz 0:11ad6aaed10a 104 * @return false maybe a success
joelvonrotz 0:11ad6aaed10a 105 */
joelvonrotz 0:11ad6aaed10a 106 bool VL53L0X::startContinuous()
joelvonrotz 0:11ad6aaed10a 107 {
joelvonrotz 0:11ad6aaed10a 108 VL53L0X_StartMeasurement(&m_vl_dev);
joelvonrotz 0:11ad6aaed10a 109 return 0;
joelvonrotz 0:11ad6aaed10a 110 }
joelvonrotz 0:11ad6aaed10a 111
joelvonrotz 0:11ad6aaed10a 112 /**
joelvonrotz 0:11ad6aaed10a 113 * @brief Returns measured Range in Millimeters
joelvonrotz 0:11ad6aaed10a 114 *
joelvonrotz 0:11ad6aaed10a 115 * @return uint16_t distance in [mm]
joelvonrotz 0:11ad6aaed10a 116 */
joelvonrotz 0:11ad6aaed10a 117 uint16_t VL53L0X::getRangeMillimeters()
joelvonrotz 0:11ad6aaed10a 118 {
joelvonrotz 0:11ad6aaed10a 119 VL53L0X_GetRangingMeasurementData(&m_vl_dev, &m_vl_results);
joelvonrotz 0:11ad6aaed10a 120 return m_vl_results.RangeMilliMeter;
joelvonrotz 0:11ad6aaed10a 121 }