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
VL53L0X.cpp@0:11ad6aaed10a, 2019-07-30 (annotated)
- Committer:
- joelvonrotz
- Date:
- Tue Jul 30 13:49:02 2019 +0000
- Revision:
- 0:11ad6aaed10a
Initial commit
Who changed what in which revision?
User | Revision | Line number | New 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 | } |