Library containing Crazyflie 2.0 sensors drivers: - LPS25H (barometer) - MPU9250 (IMU) - PMW3901 (optical flow) - VL53L0X (range)

Dependents:   Drones-Controlador controladoatitude_cteste Drone_Controlador_Atitude optical_test

Committer:
fbob
Date:
Wed Oct 17 13:26:29 2018 +0000
Revision:
15:e07de535b86f
Parent:
12:2bbe233d25fb
Changed range and optical flow parameters names

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fbob 11:b3a7164c4e12 1 #ifndef VL53L0X_h
fbob 11:b3a7164c4e12 2 #define VL53L0X_h
fbob 12:2bbe233d25fb 3 #include "mbed.h"
fbob 12:2bbe233d25fb 4 //#include "millis.h"
fbob 11:b3a7164c4e12 5
fbob 12:2bbe233d25fb 6 /** LPS25H (barometer sensor) class
fbob 11:b3a7164c4e12 7 *
fbob 11:b3a7164c4e12 8 * Example code (print pressure and altitude data on serial port every 0.2 second):
fbob 11:b3a7164c4e12 9 * @code
fbob 11:b3a7164c4e12 10 * #include "mbed.h"
fbob 11:b3a7164c4e12 11 * #include "USBSerial.h"
fbob 11:b3a7164c4e12 12 * #include "VL53L0X.h"
fbob 11:b3a7164c4e12 13 *
fbob 11:b3a7164c4e12 14 * USBSerial pc;
fbob 12:2bbe233d25fb 15 * VL53L0X range(PB_7,PB_6);
fbob 11:b3a7164c4e12 16 *
fbob 11:b3a7164c4e12 17 * int main()
fbob 11:b3a7164c4e12 18 * {
fbob 12:2bbe233d25fb 19 * range.init();
fbob 11:b3a7164c4e12 20 * while(1)
fbob 11:b3a7164c4e12 21 * {
fbob 12:2bbe233d25fb 22 * range.read();
fbob 12:2bbe233d25fb 23 * pc.printf("Range [m]: %6.2f \n\n", range.z);
fbob 11:b3a7164c4e12 24 * wait(0.2);
fbob 11:b3a7164c4e12 25 * }
fbob 11:b3a7164c4e12 26 * }
fbob 11:b3a7164c4e12 27 * @endcode
fbob 11:b3a7164c4e12 28 * (Need to target to NUCLEO-F401RE board platform)
fbob 11:b3a7164c4e12 29 */
fbob 11:b3a7164c4e12 30 class VL53L0X
fbob 11:b3a7164c4e12 31 {
fbob 12:2bbe233d25fb 32 public:
fbob 12:2bbe233d25fb 33 // register addresses from API vl53l0x_device.h (ordered as listed there)
fbob 12:2bbe233d25fb 34 enum regAddr
fbob 12:2bbe233d25fb 35 {
fbob 12:2bbe233d25fb 36 SYSRANGE_START = 0x00,
fbob 12:2bbe233d25fb 37
fbob 12:2bbe233d25fb 38 SYSTEM_THRESH_HIGH = 0x0C,
fbob 12:2bbe233d25fb 39 SYSTEM_THRESH_LOW = 0x0E,
fbob 12:2bbe233d25fb 40
fbob 12:2bbe233d25fb 41 SYSTEM_SEQUENCE_CONFIG = 0x01,
fbob 12:2bbe233d25fb 42 SYSTEM_RANGE_CONFIG = 0x09,
fbob 12:2bbe233d25fb 43 SYSTEM_INTERMEASUREMENT_PERIOD = 0x04,
fbob 12:2bbe233d25fb 44
fbob 12:2bbe233d25fb 45 SYSTEM_INTERRUPT_CONFIG_GPIO = 0x0A,
fbob 12:2bbe233d25fb 46
fbob 12:2bbe233d25fb 47 GPIO_HV_MUX_ACTIVE_HIGH = 0x84,
fbob 12:2bbe233d25fb 48
fbob 12:2bbe233d25fb 49 SYSTEM_INTERRUPT_CLEAR = 0x0B,
fbob 12:2bbe233d25fb 50
fbob 12:2bbe233d25fb 51 RESULT_INTERRUPT_STATUS = 0x13,
fbob 12:2bbe233d25fb 52 RESULT_RANGE_STATUS = 0x14,
fbob 12:2bbe233d25fb 53
fbob 12:2bbe233d25fb 54 RESULT_CORE_AMBIENT_WINDOW_EVENTS_RTN = 0xBC,
fbob 12:2bbe233d25fb 55 RESULT_CORE_RANGING_TOTAL_EVENTS_RTN = 0xC0,
fbob 12:2bbe233d25fb 56 RESULT_CORE_AMBIENT_WINDOW_EVENTS_REF = 0xD0,
fbob 12:2bbe233d25fb 57 RESULT_CORE_RANGING_TOTAL_EVENTS_REF = 0xD4,
fbob 12:2bbe233d25fb 58 RESULT_PEAK_SIGNAL_RATE_REF = 0xB6,
fbob 12:2bbe233d25fb 59
fbob 12:2bbe233d25fb 60 ALGO_PART_TO_PART_RANGE_OFFSET_MM = 0x28,
fbob 12:2bbe233d25fb 61
fbob 12:2bbe233d25fb 62 I2C_SLAVE_DEVICE_ADDRESS = 0x8A,
fbob 12:2bbe233d25fb 63
fbob 12:2bbe233d25fb 64 MSRC_CONFIG_CONTROL = 0x60,
fbob 12:2bbe233d25fb 65
fbob 12:2bbe233d25fb 66 PRE_RANGE_CONFIG_MIN_SNR = 0x27,
fbob 12:2bbe233d25fb 67 PRE_RANGE_CONFIG_VALID_PHASE_LOW = 0x56,
fbob 12:2bbe233d25fb 68 PRE_RANGE_CONFIG_VALID_PHASE_HIGH = 0x57,
fbob 12:2bbe233d25fb 69 PRE_RANGE_MIN_COUNT_RATE_RTN_LIMIT = 0x64,
fbob 12:2bbe233d25fb 70
fbob 12:2bbe233d25fb 71 FINAL_RANGE_CONFIG_MIN_SNR = 0x67,
fbob 12:2bbe233d25fb 72 FINAL_RANGE_CONFIG_VALID_PHASE_LOW = 0x47,
fbob 12:2bbe233d25fb 73 FINAL_RANGE_CONFIG_VALID_PHASE_HIGH = 0x48,
fbob 12:2bbe233d25fb 74 FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT = 0x44,
fbob 12:2bbe233d25fb 75
fbob 12:2bbe233d25fb 76 PRE_RANGE_CONFIG_SIGMA_THRESH_HI = 0x61,
fbob 12:2bbe233d25fb 77 PRE_RANGE_CONFIG_SIGMA_THRESH_LO = 0x62,
fbob 12:2bbe233d25fb 78
fbob 12:2bbe233d25fb 79 PRE_RANGE_CONFIG_VCSEL_PERIOD = 0x50,
fbob 12:2bbe233d25fb 80 PRE_RANGE_CONFIG_TIMEOUT_MACROP_HI = 0x51,
fbob 12:2bbe233d25fb 81 PRE_RANGE_CONFIG_TIMEOUT_MACROP_LO = 0x52,
fbob 12:2bbe233d25fb 82
fbob 12:2bbe233d25fb 83 SYSTEM_HISTOGRAM_BIN = 0x81,
fbob 12:2bbe233d25fb 84 HISTOGRAM_CONFIG_INITIAL_PHASE_SELECT = 0x33,
fbob 12:2bbe233d25fb 85 HISTOGRAM_CONFIG_READOUT_CTRL = 0x55,
fbob 12:2bbe233d25fb 86
fbob 12:2bbe233d25fb 87 FINAL_RANGE_CONFIG_VCSEL_PERIOD = 0x70,
fbob 12:2bbe233d25fb 88 FINAL_RANGE_CONFIG_TIMEOUT_MACROP_HI = 0x71,
fbob 12:2bbe233d25fb 89 FINAL_RANGE_CONFIG_TIMEOUT_MACROP_LO = 0x72,
fbob 12:2bbe233d25fb 90 CROSSTALK_COMPENSATION_PEAK_RATE_MCPS = 0x20,
fbob 12:2bbe233d25fb 91
fbob 12:2bbe233d25fb 92 MSRC_CONFIG_TIMEOUT_MACROP = 0x46,
fbob 12:2bbe233d25fb 93
fbob 12:2bbe233d25fb 94 SOFT_RESET_GO2_SOFT_RESET_N = 0xBF,
fbob 12:2bbe233d25fb 95 IDENTIFICATION_MODEL_ID = 0xC0,
fbob 12:2bbe233d25fb 96 IDENTIFICATION_REVISION_ID = 0xC2,
fbob 12:2bbe233d25fb 97
fbob 12:2bbe233d25fb 98 OSC_CALIBRATE_VAL = 0xF8,
fbob 12:2bbe233d25fb 99
fbob 12:2bbe233d25fb 100 GLOBAL_CONFIG_VCSEL_WIDTH = 0x32,
fbob 12:2bbe233d25fb 101 GLOBAL_CONFIG_SPAD_ENABLES_REF_0 = 0xB0,
fbob 12:2bbe233d25fb 102 GLOBAL_CONFIG_SPAD_ENABLES_REF_1 = 0xB1,
fbob 12:2bbe233d25fb 103 GLOBAL_CONFIG_SPAD_ENABLES_REF_2 = 0xB2,
fbob 12:2bbe233d25fb 104 GLOBAL_CONFIG_SPAD_ENABLES_REF_3 = 0xB3,
fbob 12:2bbe233d25fb 105 GLOBAL_CONFIG_SPAD_ENABLES_REF_4 = 0xB4,
fbob 12:2bbe233d25fb 106 GLOBAL_CONFIG_SPAD_ENABLES_REF_5 = 0xB5,
fbob 12:2bbe233d25fb 107
fbob 12:2bbe233d25fb 108 GLOBAL_CONFIG_REF_EN_START_SELECT = 0xB6,
fbob 12:2bbe233d25fb 109 DYNAMIC_SPAD_NUM_REQUESTED_REF_SPAD = 0x4E,
fbob 12:2bbe233d25fb 110 DYNAMIC_SPAD_REF_EN_START_OFFSET = 0x4F,
fbob 12:2bbe233d25fb 111 POWER_MANAGEMENT_GO1_POWER_FORCE = 0x80,
fbob 12:2bbe233d25fb 112
fbob 12:2bbe233d25fb 113 VHV_CONFIG_PAD_SCL_SDA__EXTSUP_HV = 0x89,
fbob 12:2bbe233d25fb 114
fbob 12:2bbe233d25fb 115 ALGO_PHASECAL_LIM = 0x30,
fbob 12:2bbe233d25fb 116 ALGO_PHASECAL_CONFIG_TIMEOUT = 0x30,
fbob 12:2bbe233d25fb 117 };
fbob 12:2bbe233d25fb 118
fbob 12:2bbe233d25fb 119 enum vcselPeriodType { VcselPeriodPreRange, VcselPeriodFinalRange };
fbob 12:2bbe233d25fb 120
fbob 12:2bbe233d25fb 121 uint8_t last_status; // status of last I2C transmission
fbob 12:2bbe233d25fb 122
fbob 12:2bbe233d25fb 123 VL53L0X(PinName sda_pin, PinName scl_pin);
fbob 12:2bbe233d25fb 124
fbob 12:2bbe233d25fb 125 void setAddress(uint8_t new_addr);
fbob 12:2bbe233d25fb 126 inline uint8_t getAddress(void) { return address; }
fbob 12:2bbe233d25fb 127
fbob 12:2bbe233d25fb 128 bool init_original(bool io_2v8 = true);
fbob 12:2bbe233d25fb 129
fbob 12:2bbe233d25fb 130
fbob 12:2bbe233d25fb 131
fbob 12:2bbe233d25fb 132 bool setSignalRateLimit(float limit_Mcps);
fbob 12:2bbe233d25fb 133 float getSignalRateLimit(void);
fbob 12:2bbe233d25fb 134
fbob 12:2bbe233d25fb 135 bool setMeasurementTimingBudget(uint32_t budget_us);
fbob 12:2bbe233d25fb 136 uint32_t getMeasurementTimingBudget(void);
fbob 12:2bbe233d25fb 137
fbob 12:2bbe233d25fb 138 bool setVcselPulsePeriod(vcselPeriodType type, uint8_t period_pclks);
fbob 12:2bbe233d25fb 139 uint8_t getVcselPulsePeriod(vcselPeriodType type);
fbob 12:2bbe233d25fb 140
fbob 12:2bbe233d25fb 141 void startContinuous(uint32_t period_ms = 0);
fbob 12:2bbe233d25fb 142 void stopContinuous(void);
fbob 12:2bbe233d25fb 143 uint16_t readRangeContinuousMillimeters(void);
fbob 12:2bbe233d25fb 144 uint16_t readRangeSingleMillimeters(void);
fbob 12:2bbe233d25fb 145
fbob 12:2bbe233d25fb 146 inline void setTimeout(uint16_t timeout) { io_timeout = timeout; }
fbob 12:2bbe233d25fb 147 inline uint16_t getTimeout(void) { return io_timeout; }
fbob 12:2bbe233d25fb 148 bool timeoutOccurred(void);
fbob 12:2bbe233d25fb 149
fbob 12:2bbe233d25fb 150 /** Initialize sensor */
fbob 12:2bbe233d25fb 151 bool init();
fbob 12:2bbe233d25fb 152 /** Read sensor data */
fbob 12:2bbe233d25fb 153 void read();
fbob 12:2bbe233d25fb 154
fbob 12:2bbe233d25fb 155 /** Range data [m] */
fbob 15:e07de535b86f 156 float d;
fbob 12:2bbe233d25fb 157
fbob 12:2bbe233d25fb 158 private:
fbob 12:2bbe233d25fb 159 // TCC: Target CentreCheck
fbob 12:2bbe233d25fb 160 // MSRC: Minimum Signal Rate Check
fbob 12:2bbe233d25fb 161 // DSS: Dynamic Spad Selection
fbob 12:2bbe233d25fb 162 I2C m_i2c;
fbob 12:2bbe233d25fb 163 int m_addr;
fbob 12:2bbe233d25fb 164
fbob 12:2bbe233d25fb 165 void writeReg(uint8_t reg, uint8_t value);
fbob 12:2bbe233d25fb 166 void writeReg16Bit(uint8_t reg, uint16_t value);
fbob 12:2bbe233d25fb 167 void writeReg32Bit(uint8_t reg, uint32_t value);
fbob 12:2bbe233d25fb 168 uint8_t readReg(uint8_t reg);
fbob 12:2bbe233d25fb 169 uint16_t readReg16Bit(uint8_t reg);
fbob 12:2bbe233d25fb 170 uint32_t readReg32Bit(uint8_t reg);
fbob 12:2bbe233d25fb 171
fbob 12:2bbe233d25fb 172 void writeMulti(uint8_t reg, char src[], uint8_t count);
fbob 12:2bbe233d25fb 173 void readMulti(uint8_t reg, char dst[], uint8_t count);
fbob 12:2bbe233d25fb 174
fbob 12:2bbe233d25fb 175 struct SequenceStepEnables
fbob 12:2bbe233d25fb 176 {
fbob 12:2bbe233d25fb 177 bool tcc, msrc, dss, pre_range, final_range;
fbob 12:2bbe233d25fb 178 };
fbob 12:2bbe233d25fb 179
fbob 12:2bbe233d25fb 180 struct SequenceStepTimeouts
fbob 12:2bbe233d25fb 181 {
fbob 12:2bbe233d25fb 182 uint16_t pre_range_vcsel_period_pclks, final_range_vcsel_period_pclks;
fbob 12:2bbe233d25fb 183
fbob 12:2bbe233d25fb 184 uint16_t msrc_dss_tcc_mclks, pre_range_mclks, final_range_mclks;
fbob 12:2bbe233d25fb 185 uint32_t msrc_dss_tcc_us, pre_range_us, final_range_us;
fbob 12:2bbe233d25fb 186 };
fbob 12:2bbe233d25fb 187
fbob 12:2bbe233d25fb 188 uint8_t address;
fbob 12:2bbe233d25fb 189 uint16_t io_timeout;
fbob 12:2bbe233d25fb 190 bool did_timeout;
fbob 12:2bbe233d25fb 191 uint16_t timeout_start_ms;
fbob 12:2bbe233d25fb 192
fbob 12:2bbe233d25fb 193 uint8_t stop_variable; // read by init and used when starting measurement; is StopVariable field of VL53L0X_DevData_t structure in API
fbob 12:2bbe233d25fb 194 uint32_t measurement_timing_budget_us;
fbob 12:2bbe233d25fb 195
fbob 12:2bbe233d25fb 196 bool getSpadInfo(uint8_t * count, bool * type_is_aperture);
fbob 12:2bbe233d25fb 197
fbob 12:2bbe233d25fb 198 void getSequenceStepEnables(SequenceStepEnables * enables);
fbob 12:2bbe233d25fb 199 void getSequenceStepTimeouts(SequenceStepEnables const * enables, SequenceStepTimeouts * timeouts);
fbob 12:2bbe233d25fb 200
fbob 12:2bbe233d25fb 201 bool performSingleRefCalibration(uint8_t vhv_init_byte);
fbob 12:2bbe233d25fb 202
fbob 12:2bbe233d25fb 203 static uint16_t decodeTimeout(uint16_t value);
fbob 12:2bbe233d25fb 204 static uint16_t encodeTimeout(uint16_t timeout_mclks);
fbob 12:2bbe233d25fb 205 static uint32_t timeoutMclksToMicroseconds(uint16_t timeout_period_mclks, uint8_t vcsel_period_pclks);
fbob 12:2bbe233d25fb 206 static uint32_t timeoutMicrosecondsToMclks(uint32_t timeout_period_us, uint8_t vcsel_period_pclks);
fbob 11:b3a7164c4e12 207 };
fbob 11:b3a7164c4e12 208
fbob 12:2bbe233d25fb 209 #endif