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:56:11 2019 +0000
Revision:
1:ccc67c76fecb
Parent:
0:11ad6aaed10a
updated to mbed doc-format

Who changed what in which revision?

UserRevisionLine numberNew contents of line
joelvonrotz 0:11ad6aaed10a 1 /**
joelvonrotz 0:11ad6aaed10a 2 * @file VL53L0X.h
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 #ifndef VL53L0X_H
joelvonrotz 0:11ad6aaed10a 12 #define VL53L0X_H
joelvonrotz 0:11ad6aaed10a 13
joelvonrotz 0:11ad6aaed10a 14 #include "mbed.h"
joelvonrotz 0:11ad6aaed10a 15 #include "vl53l0x_platform.h"
joelvonrotz 0:11ad6aaed10a 16 #include "vl53l0x_def.h"
joelvonrotz 0:11ad6aaed10a 17
joelvonrotz 0:11ad6aaed10a 18 #define ADDRESS_DEFAULT (0x29)
joelvonrotz 0:11ad6aaed10a 19
joelvonrotz 0:11ad6aaed10a 20 /**
joelvonrotz 0:11ad6aaed10a 21 * @brief Class for Proximity Sensor VL53L0X
joelvonrotz 0:11ad6aaed10a 22 *
joelvonrotz 0:11ad6aaed10a 23 * The VL53L0X is a laser based proximity sensor which can measure up to 2m.
joelvonrotz 0:11ad6aaed10a 24 * This library is a wrapper for the API from STMicrocontrollers and the goal of this
joelvonrotz 0:11ad6aaed10a 25 * library is the easier access to this sensor.
joelvonrotz 0:11ad6aaed10a 26 *
joelvonrotz 0:11ad6aaed10a 27 * Something really cool about these sensors is the ability to change the I2C-address.
joelvonrotz 0:11ad6aaed10a 28 * So you can hook multiple, identical sensors on the same I2C-line.
joelvonrotz 0:11ad6aaed10a 29 *
joelvonrotz 1:ccc67c76fecb 30 * <h2>Examples</h2>
joelvonrotz 0:11ad6aaed10a 31 *
joelvonrotz 0:11ad6aaed10a 32 * <h3>One Sensor</h3>
joelvonrotz 0:11ad6aaed10a 33 * Using one sensor is pretty simple, connect the I2C-pins to the sensor (Shutdown should be pulled high
joelvonrotz 0:11ad6aaed10a 34 * using a pull-up resistor).
joelvonrotz 0:11ad6aaed10a 35 *
joelvonrotz 1:ccc67c76fecb 36 * @code
joelvonrotz 0:11ad6aaed10a 37 * #include "mbed.h"
joelvonrotz 0:11ad6aaed10a 38 * #include "VL53L0X.h"
joelvonrotz 0:11ad6aaed10a 39 *
joelvonrotz 0:11ad6aaed10a 40 * I2C i2c(p9, p10);
joelvonrotz 0:11ad6aaed10a 41 * VL53L0X vl_sensor(&i2c);
joelvonrotz 0:11ad6aaed10a 42 * DigitalOut vl_shutdown(p11);
joelvonrotz 0:11ad6aaed10a 43 * Serial usb(USBTX, USBRX, 115200);
joelvonrotz 0:11ad6aaed10a 44 *
joelvonrotz 0:11ad6aaed10a 45 * int main(void)
joelvonrotz 0:11ad6aaed10a 46 * {
joelvonrotz 0:11ad6aaed10a 47 * usb.printf("Single VL53L0X\n\n\r");
joelvonrotz 0:11ad6aaed10a 48 *
joelvonrotz 0:11ad6aaed10a 49 * vl_shutdown = 1; //turn VL53L0X on
joelvonrotz 0:11ad6aaed10a 50 * vl_sensor.init();
joelvonrotz 0:11ad6aaed10a 51 * vl_sensor.setModeContinuous();
joelvonrotz 0:11ad6aaed10a 52 * vl_sensor.startContinuous();
joelvonrotz 0:11ad6aaed10a 53 * while(1)
joelvonrotz 0:11ad6aaed10a 54 * {
joelvonrotz 0:11ad6aaed10a 55 * usb.printf("%4imm\n\r", vl_sensor.getRangeMillimeters());
joelvonrotz 0:11ad6aaed10a 56 * }
joelvonrotz 0:11ad6aaed10a 57 * }
joelvonrotz 1:ccc67c76fecb 58 * @endcode
joelvonrotz 0:11ad6aaed10a 59 *
joelvonrotz 0:11ad6aaed10a 60 * <h3>Multiple Sensors</h3>
joelvonrotz 1:ccc67c76fecb 61 * To use multiple sensors, at the start of the programm every sensor needs to be
joelvonrotz 1:ccc67c76fecb 62 * turned off by setting their shutdown pin to low. Now one sensor is turned on,
joelvonrotz 1:ccc67c76fecb 63 * and configured with the new address. After that's done, the next sensor can be
joelvonrotz 1:ccc67c76fecb 64 * configured.
joelvonrotz 0:11ad6aaed10a 65 *
joelvonrotz 1:ccc67c76fecb 66 * @code
joelvonrotz 0:11ad6aaed10a 67 * #include "mbed.h"
joelvonrotz 0:11ad6aaed10a 68 * #include "VL53L0X.h"
joelvonrotz 0:11ad6aaed10a 69 *
joelvonrotz 0:11ad6aaed10a 70 * I2C i2c(p9, p10);
joelvonrotz 0:11ad6aaed10a 71 * VL53L0X vl_sensors[6] = {(&i2c),(&i2c),(&i2c),(&i2c),(&i2c),(&i2c)};
joelvonrotz 0:11ad6aaed10a 72 * BusOut vl_shutdown(p11,p12,p13,p14,p15,p16);
joelvonrotz 0:11ad6aaed10a 73 * Serial usb(USBTX, USBRX, 115200);
joelvonrotz 0:11ad6aaed10a 74 *
joelvonrotz 0:11ad6aaed10a 75 * int main(void)
joelvonrotz 0:11ad6aaed10a 76 * {
joelvonrotz 0:11ad6aaed10a 77 * usb.printf("Multiple VL53L0X\n\n\r");
joelvonrotz 0:11ad6aaed10a 78 *
joelvonrotz 0:11ad6aaed10a 79 * uint8_t expander_shutdown_mask = 1;
joelvonrotz 0:11ad6aaed10a 80 * for(uint8_t i = 0; i < 6 ; i++)
joelvonrotz 0:11ad6aaed10a 81 * {
joelvonrotz 0:11ad6aaed10a 82 * vl_shutdown = expander_shutdown_mask;
joelvonrotz 0:11ad6aaed10a 83 * expander_shutdown_mask = (expander_shutdown_mask << 1) + 1;
joelvonrotz 0:11ad6aaed10a 84 * vl_sensors[i].init();
joelvonrotz 0:11ad6aaed10a 85 * vl_sensors[i].setDeviceAddress(0x40 + i);
joelvonrotz 0:11ad6aaed10a 86 * vl_sensors[i].setModeContinuous();
joelvonrotz 0:11ad6aaed10a 87 * vl_sensors[i].startContinuous();
joelvonrotz 0:11ad6aaed10a 88 * }
joelvonrotz 0:11ad6aaed10a 89 * uint16_t results[6];
joelvonrotz 0:11ad6aaed10a 90 * while(1)
joelvonrotz 0:11ad6aaed10a 91 * {
joelvonrotz 0:11ad6aaed10a 92 * for(uint8_t i = 0; i < 6 ; i++)
joelvonrotz 0:11ad6aaed10a 93 * {
joelvonrotz 0:11ad6aaed10a 94 * results[i] = vl_sensors[i].getRangeMillimeters();
joelvonrotz 0:11ad6aaed10a 95 * }
joelvonrotz 0:11ad6aaed10a 96 * usb.printf("1: %4imm 2: %4imm 3: %4imm) 4: %4imm 5: %4imm 6: %4imm)\n\r", results[0], results[1], results[2], results[3], results[4], results[5]);
joelvonrotz 0:11ad6aaed10a 97 * }
joelvonrotz 0:11ad6aaed10a 98 * }
joelvonrotz 1:ccc67c76fecb 99 * @endcode
joelvonrotz 0:11ad6aaed10a 100 *
joelvonrotz 0:11ad6aaed10a 101 * <strong>NOTE</strong> - The library is gigantic, so it is recommended to use this library
joelvonrotz 0:11ad6aaed10a 102 * on devices with enough storage.
joelvonrotz 0:11ad6aaed10a 103 *
joelvonrotz 0:11ad6aaed10a 104 */
joelvonrotz 0:11ad6aaed10a 105 class VL53L0X
joelvonrotz 0:11ad6aaed10a 106 {
joelvonrotz 0:11ad6aaed10a 107 public:
joelvonrotz 0:11ad6aaed10a 108 VL53L0X(I2C* p_i2c_device);
joelvonrotz 0:11ad6aaed10a 109
joelvonrotz 0:11ad6aaed10a 110 bool setDeviceAddress(uint8_t address = ADDRESS_DEFAULT);
joelvonrotz 0:11ad6aaed10a 111
joelvonrotz 0:11ad6aaed10a 112 bool init();
joelvonrotz 0:11ad6aaed10a 113
joelvonrotz 0:11ad6aaed10a 114 bool setModeContinuous();
joelvonrotz 0:11ad6aaed10a 115 bool startContinuous();
joelvonrotz 0:11ad6aaed10a 116 uint16_t getRangeMillimeters();
joelvonrotz 0:11ad6aaed10a 117 private:
joelvonrotz 0:11ad6aaed10a 118 VL53L0X_Dev_t m_vl_dev;
joelvonrotz 0:11ad6aaed10a 119 VL53L0X_RangingMeasurementData_t m_vl_results,m_old_results;
joelvonrotz 0:11ad6aaed10a 120
joelvonrotz 0:11ad6aaed10a 121 VL53L0X_Version_t m_vl_version;
joelvonrotz 0:11ad6aaed10a 122 VL53L0X_DeviceInfo_t m_vl_deviceinfo;
joelvonrotz 0:11ad6aaed10a 123
joelvonrotz 0:11ad6aaed10a 124 };
joelvonrotz 0:11ad6aaed10a 125
joelvonrotz 0:11ad6aaed10a 126 #endif /* */