Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed FastIO FastPWM USBDevice
VL6180X/VL6180X.h@87:8d35c74403af, 2017-05-09 (annotated)
- Committer:
- mjr
- Date:
- Tue May 09 05:48:37 2017 +0000
- Revision:
- 87:8d35c74403af
- Parent:
- 85:3c28aee81cde
- Child:
- 90:aa4e571da8e8
AEDR-8300, VL6180X, TLC59116; new plunger firing detection
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| mjr | 82:4f6209cb5c33 | 1 | // VL6180X Time of Flight sensor interface |
| mjr | 82:4f6209cb5c33 | 2 | |
| mjr | 82:4f6209cb5c33 | 3 | #ifndef _VL6180X_H_ |
| mjr | 82:4f6209cb5c33 | 4 | #define _VL6180X_H_ |
| mjr | 82:4f6209cb5c33 | 5 | |
| mjr | 82:4f6209cb5c33 | 6 | #include "mbed.h" |
| mjr | 82:4f6209cb5c33 | 7 | #include "BitBangI2C.h" |
| mjr | 82:4f6209cb5c33 | 8 | |
| mjr | 82:4f6209cb5c33 | 9 | |
| mjr | 82:4f6209cb5c33 | 10 | #define VL6180X_IDENTIFICATION_MODEL_ID 0x0000 |
| mjr | 82:4f6209cb5c33 | 11 | #define VL6180X_IDENTIFICATION_MODEL_REV_MAJOR 0x0001 |
| mjr | 82:4f6209cb5c33 | 12 | #define VL6180X_IDENTIFICATION_MODEL_REV_MINOR 0x0002 |
| mjr | 82:4f6209cb5c33 | 13 | #define VL6180X_IDENTIFICATION_MODULE_REV_MAJOR 0x0003 |
| mjr | 82:4f6209cb5c33 | 14 | #define VL6180X_IDENTIFICATION_MODULE_REV_MINOR 0x0004 |
| mjr | 82:4f6209cb5c33 | 15 | #define VL6180X_IDENTIFICATION_DATE 0x0006 // NB - 16-bit value |
| mjr | 82:4f6209cb5c33 | 16 | #define VL6180X_IDENTIFICATION_TIME 0x0008 // NB - 16-bit value |
| mjr | 82:4f6209cb5c33 | 17 | |
| mjr | 82:4f6209cb5c33 | 18 | #define VL6180X_SYSTEM_MODE_GPIO0 0x0010 |
| mjr | 82:4f6209cb5c33 | 19 | #define VL6180X_SYSTEM_MODE_GPIO1 0x0011 |
| mjr | 82:4f6209cb5c33 | 20 | #define VL6180X_SYSTEM_HISTORY_CTRL 0x0012 |
| mjr | 82:4f6209cb5c33 | 21 | #define VL6180X_SYSTEM_INTERRUPT_CONFIG_GPIO 0x0014 |
| mjr | 82:4f6209cb5c33 | 22 | #define VL6180X_SYSTEM_INTERRUPT_CLEAR 0x0015 |
| mjr | 82:4f6209cb5c33 | 23 | #define VL6180X_SYSTEM_FRESH_OUT_OF_RESET 0x0016 |
| mjr | 82:4f6209cb5c33 | 24 | #define VL6180X_SYSTEM_GROUPED_PARAMETER_HOLD 0x0017 |
| mjr | 82:4f6209cb5c33 | 25 | |
| mjr | 82:4f6209cb5c33 | 26 | #define VL6180X_SYSRANGE_START 0x0018 |
| mjr | 82:4f6209cb5c33 | 27 | #define VL6180X_SYSRANGE_THRESH_HIGH 0x0019 |
| mjr | 82:4f6209cb5c33 | 28 | #define VL6180X_SYSRANGE_THRESH_LOW 0x001A |
| mjr | 82:4f6209cb5c33 | 29 | #define VL6180X_SYSRANGE_INTERMEASUREMENT_PERIOD 0x001B |
| mjr | 82:4f6209cb5c33 | 30 | #define VL6180X_SYSRANGE_MAX_CONVERGENCE_TIME 0x001C |
| mjr | 82:4f6209cb5c33 | 31 | #define VL6180X_SYSRANGE_CROSSTALK_COMPENSATION_RATE 0x001E |
| mjr | 82:4f6209cb5c33 | 32 | #define VL6180X_SYSRANGE_CROSSTALK_VALID_HEIGHT 0x0021 |
| mjr | 82:4f6209cb5c33 | 33 | #define VL6180X_SYSRANGE_EARLY_CONVERGENCE_ESTIMATE 0x0022 |
| mjr | 82:4f6209cb5c33 | 34 | #define VL6180X_SYSRANGE_PART_TO_PART_RANGE_OFFSET 0x0024 |
| mjr | 82:4f6209cb5c33 | 35 | #define VL6180X_SYSRANGE_RANGE_IGNORE_VALID_HEIGHT 0x0025 |
| mjr | 82:4f6209cb5c33 | 36 | #define VL6180X_SYSRANGE_RANGE_IGNORE_THRESHOLD 0x0026 |
| mjr | 82:4f6209cb5c33 | 37 | #define VL6180X_SYSRANGE_MAX_AMBIENT_LEVEL_MULT 0x002C |
| mjr | 82:4f6209cb5c33 | 38 | #define VL6180X_SYSRANGE_RANGE_CHECK_ENABLES 0x002D |
| mjr | 82:4f6209cb5c33 | 39 | #define VL6180X_SYSRANGE_VHV_RECALIBRATE 0x002E |
| mjr | 82:4f6209cb5c33 | 40 | #define VL6180X_SYSRANGE_VHV_REPEAT_RATE 0x0031 |
| mjr | 82:4f6209cb5c33 | 41 | |
| mjr | 82:4f6209cb5c33 | 42 | #define VL6180X_SYSALS_START 0x0038 |
| mjr | 82:4f6209cb5c33 | 43 | #define VL6180X_SYSALS_THRESH_HIGH 0x003A |
| mjr | 82:4f6209cb5c33 | 44 | #define VL6180X_SYSALS_THRESH_LOW 0x003C |
| mjr | 82:4f6209cb5c33 | 45 | #define VL6180X_SYSALS_INTERMEASUREMENT_PERIOD 0x003E |
| mjr | 82:4f6209cb5c33 | 46 | #define VL6180X_SYSALS_ANALOGUE_GAIN 0x003F |
| mjr | 82:4f6209cb5c33 | 47 | #define VL6180X_SYSALS_INTEGRATION_PERIOD 0x0040 |
| mjr | 82:4f6209cb5c33 | 48 | |
| mjr | 82:4f6209cb5c33 | 49 | #define VL6180X_RESULT_RANGE_STATUS 0x004D |
| mjr | 82:4f6209cb5c33 | 50 | #define VL6180X_RESULT_ALS_STATUS 0x004E |
| mjr | 82:4f6209cb5c33 | 51 | #define VL6180X_RESULT_INTERRUPT_STATUS_GPIO 0x004F |
| mjr | 82:4f6209cb5c33 | 52 | #define VL6180X_RESULT_ALS_VAL 0x0050 |
| mjr | 82:4f6209cb5c33 | 53 | #define VL6180X_RESULT_HISTORY_BUFFER 0x0052 |
| mjr | 82:4f6209cb5c33 | 54 | #define VL6180X_RESULT_RANGE_VAL 0x0062 |
| mjr | 82:4f6209cb5c33 | 55 | #define VL6180X_RESULT_RANGE_RAW 0x0064 |
| mjr | 82:4f6209cb5c33 | 56 | #define VL6180X_RESULT_RANGE_RETURN_RATE 0x0066 |
| mjr | 82:4f6209cb5c33 | 57 | #define VL6180X_RESULT_RANGE_REFERENCE_RATE 0x0068 |
| mjr | 82:4f6209cb5c33 | 58 | #define VL6180X_RESULT_RANGE_RETURN_SIGNAL_COUNT 0x006C |
| mjr | 82:4f6209cb5c33 | 59 | #define VL6180X_RESULT_RANGE_REFERENCE_SIGNAL_COUNT 0x0070 |
| mjr | 82:4f6209cb5c33 | 60 | #define VL6180X_RESULT_RANGE_RETURN_AMB_COUNT 0x0074 |
| mjr | 82:4f6209cb5c33 | 61 | #define VL6180X_RESULT_RANGE_REFERENCE_AMB_COUNT 0x0078 |
| mjr | 82:4f6209cb5c33 | 62 | #define VL6180X_RESULT_RANGE_RETURN_CONV_TIME 0x007C |
| mjr | 82:4f6209cb5c33 | 63 | #define VL6180X_RESULT_RANGE_REFERENCE_CONV_TIME 0x0080 |
| mjr | 82:4f6209cb5c33 | 64 | |
| mjr | 82:4f6209cb5c33 | 65 | #define VL6180X_READOUT_AVERAGING_SAMPLE_PERIOD 0x010A |
| mjr | 82:4f6209cb5c33 | 66 | #define VL6180X_FIRMWARE_BOOTUP 0x0119 |
| mjr | 82:4f6209cb5c33 | 67 | #define VL6180X_FIRMWARE_RESULT_SCALER 0x0120 |
| mjr | 82:4f6209cb5c33 | 68 | #define VL6180X_I2C_SLAVE_DEVICE_ADDRESS 0x0212 |
| mjr | 82:4f6209cb5c33 | 69 | #define VL6180X_INTERLEAVED_MODE_ENABLE 0x02A3 |
| mjr | 82:4f6209cb5c33 | 70 | |
| mjr | 82:4f6209cb5c33 | 71 | // gain settings |
| mjr | 82:4f6209cb5c33 | 72 | enum VL6180X_ALS_Gain |
| mjr | 82:4f6209cb5c33 | 73 | { |
| mjr | 82:4f6209cb5c33 | 74 | GAIN_20 = 0, // 20 |
| mjr | 82:4f6209cb5c33 | 75 | GAIN_10, // 10.32 |
| mjr | 82:4f6209cb5c33 | 76 | GAIN_5, // 5.21 |
| mjr | 82:4f6209cb5c33 | 77 | GAIN_2_5, // 2.60 |
| mjr | 82:4f6209cb5c33 | 78 | GAIN_1_67, // 1.72 |
| mjr | 82:4f6209cb5c33 | 79 | GAIN_1_25, // 1.28 |
| mjr | 82:4f6209cb5c33 | 80 | GAIN_1, // 1.01 |
| mjr | 82:4f6209cb5c33 | 81 | GAIN_40, // 40 |
| mjr | 82:4f6209cb5c33 | 82 | }; |
| mjr | 82:4f6209cb5c33 | 83 | |
| mjr | 82:4f6209cb5c33 | 84 | // identification |
| mjr | 82:4f6209cb5c33 | 85 | struct VL6180X_ID |
| mjr | 82:4f6209cb5c33 | 86 | { |
| mjr | 82:4f6209cb5c33 | 87 | uint8_t model; // model number |
| mjr | 82:4f6209cb5c33 | 88 | uint8_t modelRevMajor; // model revision number major... |
| mjr | 82:4f6209cb5c33 | 89 | uint8_t modelRevMinor; // ...and minor |
| mjr | 82:4f6209cb5c33 | 90 | uint8_t moduleRevMajor; // module revision number major... |
| mjr | 82:4f6209cb5c33 | 91 | uint8_t moduleRevMinor; // ... and minior |
| mjr | 82:4f6209cb5c33 | 92 | struct |
| mjr | 82:4f6209cb5c33 | 93 | { |
| mjr | 82:4f6209cb5c33 | 94 | uint8_t month; // month 1..12 |
| mjr | 82:4f6209cb5c33 | 95 | uint8_t day; // day of month 1..31 |
| mjr | 82:4f6209cb5c33 | 96 | uint16_t year; // calendar year, 4-digit (e.g., 2016) |
| mjr | 82:4f6209cb5c33 | 97 | uint8_t phase; // manufacturing phase, 0..7 |
| mjr | 82:4f6209cb5c33 | 98 | uint8_t hh; // hour, 0..23 |
| mjr | 82:4f6209cb5c33 | 99 | uint8_t mm; // minute, 0..59 |
| mjr | 82:4f6209cb5c33 | 100 | uint8_t ss; // second, 0..59 |
| mjr | 82:4f6209cb5c33 | 101 | } manufDate; // manufacturing date and time |
| mjr | 82:4f6209cb5c33 | 102 | }; |
| mjr | 82:4f6209cb5c33 | 103 | |
| mjr | 82:4f6209cb5c33 | 104 | // range statistics |
| mjr | 82:4f6209cb5c33 | 105 | struct VL6180X_RangeStats |
| mjr | 82:4f6209cb5c33 | 106 | { |
| mjr | 82:4f6209cb5c33 | 107 | uint16_t returnRate; // return signal rate |
| mjr | 82:4f6209cb5c33 | 108 | uint16_t refReturnRate; // reference return rate |
| mjr | 82:4f6209cb5c33 | 109 | uint32_t returnCnt; // return signal count |
| mjr | 82:4f6209cb5c33 | 110 | uint32_t refReturnCnt; // reference return count |
| mjr | 82:4f6209cb5c33 | 111 | uint32_t ambCnt; // ambient count |
| mjr | 82:4f6209cb5c33 | 112 | uint32_t refAmbCnt; // reference ambient count |
| mjr | 82:4f6209cb5c33 | 113 | uint32_t convTime; // convergence time |
| mjr | 82:4f6209cb5c33 | 114 | uint32_t refConvTime; // reference convergence time |
| mjr | 82:4f6209cb5c33 | 115 | }; |
| mjr | 82:4f6209cb5c33 | 116 | |
| mjr | 82:4f6209cb5c33 | 117 | class VL6180X |
| mjr | 82:4f6209cb5c33 | 118 | { |
| mjr | 82:4f6209cb5c33 | 119 | public: |
| mjr | 82:4f6209cb5c33 | 120 | // Set up the interface with the given I2C pins, I2C address, and |
| mjr | 87:8d35c74403af | 121 | // the GPIO0 pin (for resetting the sensor at startup). |
| mjr | 87:8d35c74403af | 122 | // |
| mjr | 87:8d35c74403af | 123 | // If 'internalPullups' is true, we'll set the I2C SDA/SCL pins to |
| mjr | 87:8d35c74403af | 124 | // enable the internal pullup resistors. Set this to false if you're |
| mjr | 87:8d35c74403af | 125 | // using your own external pullup resistors on the lines. External |
| mjr | 87:8d35c74403af | 126 | // pullups are better if you're attaching more than one device to the |
| mjr | 87:8d35c74403af | 127 | // same I2C bus; the internal pullups are fine for a single device. |
| mjr | 82:4f6209cb5c33 | 128 | // |
| mjr | 82:4f6209cb5c33 | 129 | // Note that the power-on default I2C address is always 0x29. The |
| mjr | 82:4f6209cb5c33 | 130 | // address can be changed during a session, but it's not saved |
| mjr | 82:4f6209cb5c33 | 131 | // persistently; it always resets to 0x29 on the next power cycle. |
| mjr | 87:8d35c74403af | 132 | VL6180X(PinName sda, PinName scl, uint8_t addr, PinName gpio0, |
| mjr | 87:8d35c74403af | 133 | bool internalPullups); |
| mjr | 82:4f6209cb5c33 | 134 | |
| mjr | 82:4f6209cb5c33 | 135 | // destruction |
| mjr | 82:4f6209cb5c33 | 136 | ~VL6180X(); |
| mjr | 82:4f6209cb5c33 | 137 | |
| mjr | 82:4f6209cb5c33 | 138 | // Send the required initialization sequence. Returns true on |
| mjr | 82:4f6209cb5c33 | 139 | // success, false on failure. |
| mjr | 82:4f6209cb5c33 | 140 | bool init(); |
| mjr | 82:4f6209cb5c33 | 141 | |
| mjr | 82:4f6209cb5c33 | 142 | // set up default settings |
| mjr | 82:4f6209cb5c33 | 143 | void setDefaults(); |
| mjr | 82:4f6209cb5c33 | 144 | |
| mjr | 82:4f6209cb5c33 | 145 | // Start a distance reading, returning immediately without waiting |
| mjr | 82:4f6209cb5c33 | 146 | // for the reading to finish. The caller can poll for the finished |
| mjr | 82:4f6209cb5c33 | 147 | // reading via distanceReady(). |
| mjr | 82:4f6209cb5c33 | 148 | void startRangeReading(); |
| mjr | 82:4f6209cb5c33 | 149 | |
| mjr | 82:4f6209cb5c33 | 150 | // Get TOF range distance in mm. Returns 0 on success, a device |
| mjr | 82:4f6209cb5c33 | 151 | // "range error code" (>0) on failure, or -1 on timeout. |
| mjr | 87:8d35c74403af | 152 | // |
| mjr | 87:8d35c74403af | 153 | // 'tMid' is the timestamp in microseconds of the midpoint of the |
| mjr | 87:8d35c74403af | 154 | // sample, relative to an arbitrary zero point. This can be used |
| mjr | 87:8d35c74403af | 155 | // to construct a timeline of successive readings, such as for |
| mjr | 87:8d35c74403af | 156 | // velocity calculations. 'dt' is the time the sensor took to |
| mjr | 87:8d35c74403af | 157 | // collect the sample. |
| mjr | 87:8d35c74403af | 158 | int getRange( |
| mjr | 87:8d35c74403af | 159 | uint8_t &distance, uint32_t &tMid, uint32_t &dt, |
| mjr | 87:8d35c74403af | 160 | uint32_t timeout_us); |
| mjr | 82:4f6209cb5c33 | 161 | |
| mjr | 82:4f6209cb5c33 | 162 | // get range statistics |
| mjr | 82:4f6209cb5c33 | 163 | void getRangeStats(VL6180X_RangeStats &stats); |
| mjr | 82:4f6209cb5c33 | 164 | |
| mjr | 82:4f6209cb5c33 | 165 | // set continuous distance mode |
| mjr | 82:4f6209cb5c33 | 166 | void continuousDistanceMode(bool on); |
| mjr | 82:4f6209cb5c33 | 167 | |
| mjr | 82:4f6209cb5c33 | 168 | // is a sample ready? |
| mjr | 82:4f6209cb5c33 | 169 | bool rangeReady(); |
| mjr | 82:4f6209cb5c33 | 170 | |
| mjr | 82:4f6209cb5c33 | 171 | // get identification data |
| mjr | 82:4f6209cb5c33 | 172 | void getID(VL6180X_ID &id); |
| mjr | 82:4f6209cb5c33 | 173 | |
| mjr | 87:8d35c74403af | 174 | protected: |
| mjr | 87:8d35c74403af | 175 | // READOUT_AVERAGING_SAMPLE_PERIOD setting. Each unit represents |
| mjr | 87:8d35c74403af | 176 | // 64.5us of added time beyond the 1.3ms fixed base period. The |
| mjr | 87:8d35c74403af | 177 | // default is 48 units. |
| mjr | 87:8d35c74403af | 178 | static const int averagingSamplePeriod = 48; |
| mjr | 82:4f6209cb5c33 | 179 | |
| mjr | 82:4f6209cb5c33 | 180 | // I2C interface to device |
| mjr | 82:4f6209cb5c33 | 181 | BitBangI2C i2c; |
| mjr | 82:4f6209cb5c33 | 182 | |
| mjr | 82:4f6209cb5c33 | 183 | // GPIO0 pin for hard reset |
| mjr | 85:3c28aee81cde | 184 | DigitalInOut gpio0Pin; |
| mjr | 82:4f6209cb5c33 | 185 | |
| mjr | 82:4f6209cb5c33 | 186 | // device address |
| mjr | 82:4f6209cb5c33 | 187 | uint8_t addr; |
| mjr | 82:4f6209cb5c33 | 188 | |
| mjr | 82:4f6209cb5c33 | 189 | // current distance mode: 0=single shot, 1=continuous |
| mjr | 82:4f6209cb5c33 | 190 | bool distMode; |
| mjr | 87:8d35c74403af | 191 | |
| mjr | 87:8d35c74403af | 192 | // range reading is in progress |
| mjr | 87:8d35c74403af | 193 | bool rangeStarted; |
| mjr | 87:8d35c74403af | 194 | |
| mjr | 87:8d35c74403af | 195 | // sample timer |
| mjr | 87:8d35c74403af | 196 | Timer sampleTimer; |
| mjr | 87:8d35c74403af | 197 | |
| mjr | 87:8d35c74403af | 198 | // time (from Timer t) of start of last range sample |
| mjr | 87:8d35c74403af | 199 | uint32_t tSampleStart; |
| mjr | 82:4f6209cb5c33 | 200 | |
| mjr | 82:4f6209cb5c33 | 201 | // read registers |
| mjr | 82:4f6209cb5c33 | 202 | uint8_t readReg8(uint16_t regAddr); |
| mjr | 82:4f6209cb5c33 | 203 | uint16_t readReg16(uint16_t regAddr); |
| mjr | 82:4f6209cb5c33 | 204 | uint32_t readReg32(uint16_t regAddr); |
| mjr | 82:4f6209cb5c33 | 205 | |
| mjr | 82:4f6209cb5c33 | 206 | // write registers |
| mjr | 82:4f6209cb5c33 | 207 | void writeReg8(uint16_t regAddr, uint8_t data); |
| mjr | 82:4f6209cb5c33 | 208 | void writeReg16(uint16_t regAddr, uint16_t data); |
| mjr | 82:4f6209cb5c33 | 209 | }; |
| mjr | 82:4f6209cb5c33 | 210 | |
| mjr | 82:4f6209cb5c33 | 211 | #endif |