Interface library for the Devantech SRF02/SRF08 ultrasonic i2c rangers. Depends on I2cRtosDriver lib!
Srf0208IF.h@3:70c946ba29cc, 2013-06-01 (annotated)
- Committer:
- humlet
- Date:
- Sat Jun 01 07:40:00 2013 +0000
- Revision:
- 3:70c946ba29cc
- Parent:
- 2:dfc8b09b4e3b
commitNpublish
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
humlet | 2:dfc8b09b4e3b | 1 | #ifndef SRF0208IF_H |
humlet | 2:dfc8b09b4e3b | 2 | #define SRF0208IF_H |
humlet | 2:dfc8b09b4e3b | 3 | #include "stdint.h" |
humlet | 2:dfc8b09b4e3b | 4 | |
humlet | 2:dfc8b09b4e3b | 5 | namespace mbed |
humlet | 2:dfc8b09b4e3b | 6 | { |
humlet | 2:dfc8b09b4e3b | 7 | |
humlet | 2:dfc8b09b4e3b | 8 | class I2CMasterRtos; |
humlet | 0:2686e857daf6 | 9 | |
humlet | 2:dfc8b09b4e3b | 10 | /// common base interface class for SRF02 and SRF08 utrasonic rangers |
humlet | 2:dfc8b09b4e3b | 11 | class Srf0208IF |
humlet | 2:dfc8b09b4e3b | 12 | { |
humlet | 2:dfc8b09b4e3b | 13 | protected: |
humlet | 2:dfc8b09b4e3b | 14 | int m_adr; |
humlet | 2:dfc8b09b4e3b | 15 | I2CMasterRtos& m_i2c; |
humlet | 2:dfc8b09b4e3b | 16 | |
humlet | 2:dfc8b09b4e3b | 17 | public: |
humlet | 2:dfc8b09b4e3b | 18 | |
humlet | 2:dfc8b09b4e3b | 19 | /// little helper that translates two raw bytes into a word |
humlet | 2:dfc8b09b4e3b | 20 | static int twoByte2int(const char* data){ |
humlet | 3:70c946ba29cc | 21 | return ((static_cast<int>(*(data)))<<8) | static_cast<int>(*(data+1)); |
humlet | 2:dfc8b09b4e3b | 22 | } |
humlet | 2:dfc8b09b4e3b | 23 | /// little helper that translates the us transit time into a distance in mm |
humlet | 2:dfc8b09b4e3b | 24 | static int time2dist_us2mm(int us){ |
humlet | 3:70c946ba29cc | 25 | return us!=-1 ? (us*sonicSpeed)>>11 : -1; |
humlet | 2:dfc8b09b4e3b | 26 | } |
humlet | 2:dfc8b09b4e3b | 27 | |
humlet | 2:dfc8b09b4e3b | 28 | |
humlet | 3:70c946ba29cc | 29 | /// sonic speed in m/s @ 21C ... c=(331.5+0.6*T/C)m/s |
humlet | 3:70c946ba29cc | 30 | /// To calculate the distance in mm: Multiply the us measurement with this constant and divide by 2 |
humlet | 2:dfc8b09b4e3b | 31 | static const int sonicSpeed = 344; |
humlet | 2:dfc8b09b4e3b | 32 | |
humlet | 2:dfc8b09b4e3b | 33 | /// The constructor |
humlet | 2:dfc8b09b4e3b | 34 | Srf0208IF(int adr, I2CMasterRtos& i2c): m_adr(adr), m_i2c(i2c){}; |
humlet | 2:dfc8b09b4e3b | 35 | |
humlet | 3:70c946ba29cc | 36 | /// Trigger ranging. Result can be read back after 66ms via triggerEchoMeasurement(). |
humlet | 2:dfc8b09b4e3b | 37 | /// @return true on success |
humlet | 2:dfc8b09b4e3b | 38 | bool triggerRanging(); |
humlet | 2:dfc8b09b4e3b | 39 | |
humlet | 3:70c946ba29cc | 40 | /// Read back measured transit time in us of the last triggerRanging() or triggerEchoMeasurement() request. |
humlet | 2:dfc8b09b4e3b | 41 | /// Depending on the distance the Measurement takes up to 66ms. |
humlet | 2:dfc8b09b4e3b | 42 | /// @return -1 on error |
humlet | 2:dfc8b09b4e3b | 43 | int readTransitTime_us(); |
humlet | 0:2686e857daf6 | 44 | |
humlet | 2:dfc8b09b4e3b | 45 | /// Read back measured distance in mm of the triggerRanging() or triggerEchoMeasurement() request. |
humlet | 2:dfc8b09b4e3b | 46 | /// Depending on the distance the Measurement takes up to 66ms. |
humlet | 2:dfc8b09b4e3b | 47 | /// @return -1 on error |
humlet | 2:dfc8b09b4e3b | 48 | int readDistance_mm() { |
humlet | 2:dfc8b09b4e3b | 49 | return time2dist_us2mm(readTransitTime_us()); |
humlet | 2:dfc8b09b4e3b | 50 | }; |
humlet | 2:dfc8b09b4e3b | 51 | |
humlet | 3:70c946ba29cc | 52 | /// Assign a new adress to the SRF ranger device. Available 8bit addresses: E0, E2, E4 ... FE. |
humlet | 2:dfc8b09b4e3b | 53 | /// Ensure that only one SRF device is connected to the bus |
humlet | 2:dfc8b09b4e3b | 54 | void resetI2CAdress(int newAddress); |
humlet | 2:dfc8b09b4e3b | 55 | |
humlet | 3:70c946ba29cc | 56 | /// Reads the SRF's SW revision. |
humlet | 2:dfc8b09b4e3b | 57 | /// @return -1 on error |
humlet | 2:dfc8b09b4e3b | 58 | int readSWRevision(); |
humlet | 2:dfc8b09b4e3b | 59 | |
humlet | 3:70c946ba29cc | 60 | /// Returns true if ranging is done. |
humlet | 2:dfc8b09b4e3b | 61 | bool rangingCompleted(){ |
humlet | 2:dfc8b09b4e3b | 62 | return readSWRevision()!=-1; |
humlet | 2:dfc8b09b4e3b | 63 | } |
humlet | 2:dfc8b09b4e3b | 64 | }; |
humlet | 2:dfc8b09b4e3b | 65 | |
humlet | 3:70c946ba29cc | 66 | /// Provides an interface to special features of the SRF02 |
humlet | 2:dfc8b09b4e3b | 67 | class Srf02IF : public Srf0208IF |
humlet | 0:2686e857daf6 | 68 | { |
humlet | 2:dfc8b09b4e3b | 69 | public: |
humlet | 2:dfc8b09b4e3b | 70 | |
humlet | 2:dfc8b09b4e3b | 71 | /// The constructor |
humlet | 2:dfc8b09b4e3b | 72 | Srf02IF(int adr, I2CMasterRtos& i2c):Srf0208IF(adr,i2c){}; |
humlet | 2:dfc8b09b4e3b | 73 | |
humlet | 3:70c946ba29cc | 74 | /// Just send a ping. |
humlet | 2:dfc8b09b4e3b | 75 | /// @return true on success |
humlet | 2:dfc8b09b4e3b | 76 | bool triggerPing(); |
humlet | 2:dfc8b09b4e3b | 77 | |
humlet | 3:70c946ba29cc | 78 | /// Just wait for an echo and measure the time. |
humlet | 3:70c946ba29cc | 79 | /// Result can be read back after 66ms via triggerEchoMeasurement(). |
humlet | 2:dfc8b09b4e3b | 80 | /// @return true on success |
humlet | 2:dfc8b09b4e3b | 81 | bool triggerEchoMeasurement(); |
humlet | 2:dfc8b09b4e3b | 82 | |
humlet | 3:70c946ba29cc | 83 | /// Read current minimum range from srf02. |
humlet | 2:dfc8b09b4e3b | 84 | int readMinimalTransitTime_us(); |
humlet | 2:dfc8b09b4e3b | 85 | |
humlet | 3:70c946ba29cc | 86 | /// Read current minimum range from srf02. |
humlet | 2:dfc8b09b4e3b | 87 | int readMinimalDistance_mm(){ |
humlet | 2:dfc8b09b4e3b | 88 | return time2dist_us2mm(readMinimalTransitTime_us()); |
humlet | 2:dfc8b09b4e3b | 89 | } |
humlet | 2:dfc8b09b4e3b | 90 | |
humlet | 2:dfc8b09b4e3b | 91 | }; |
humlet | 2:dfc8b09b4e3b | 92 | |
humlet | 2:dfc8b09b4e3b | 93 | /// Provides special features of the SRF08 |
humlet | 2:dfc8b09b4e3b | 94 | class Srf08IF : public Srf0208IF |
humlet | 2:dfc8b09b4e3b | 95 | { |
humlet | 2:dfc8b09b4e3b | 96 | char m_rawBuffer[36]; |
humlet | 0:2686e857daf6 | 97 | |
humlet | 0:2686e857daf6 | 98 | public: |
humlet | 0:2686e857daf6 | 99 | |
humlet | 2:dfc8b09b4e3b | 100 | /// The constructor |
humlet | 2:dfc8b09b4e3b | 101 | Srf08IF(int adr, I2CMasterRtos& i2c):Srf0208IF(adr,i2c){}; |
humlet | 2:dfc8b09b4e3b | 102 | |
humlet | 3:70c946ba29cc | 103 | /// read light sensor measurement. |
humlet | 2:dfc8b09b4e3b | 104 | /// @return -1 on error |
humlet | 2:dfc8b09b4e3b | 105 | int readBrightness(); |
humlet | 2:dfc8b09b4e3b | 106 | |
humlet | 2:dfc8b09b4e3b | 107 | /// trigger ANN mode ranging |
humlet | 2:dfc8b09b4e3b | 108 | /// @return true on success |
humlet | 2:dfc8b09b4e3b | 109 | bool triggerANNRanging(); |
humlet | 0:2686e857daf6 | 110 | |
humlet | 2:dfc8b09b4e3b | 111 | /// Set maximum distance. Use to reduce measurement time. |
humlet | 3:70c946ba29cc | 112 | /// @param maxDst maximum distance 0..0xff (1+maxDst)*43mm => 43mm..11m / 3ms..64ms. |
humlet | 2:dfc8b09b4e3b | 113 | /// @return true on success |
humlet | 2:dfc8b09b4e3b | 114 | bool writeMaxDist(int maxDst); |
humlet | 2:dfc8b09b4e3b | 115 | |
humlet | 2:dfc8b09b4e3b | 116 | /// Set/Limit maximum gain. Use to suppress roving echos from previous measurements. |
humlet | 2:dfc8b09b4e3b | 117 | /// Necessary at mesurement rates higher than 1/66ms=15Hz. |
humlet | 3:70c946ba29cc | 118 | /// During measurement the analog signal amplification is increased every 70us until |
humlet | 2:dfc8b09b4e3b | 119 | /// the maximum gain is reached after 31 steps at ~390mm. |
humlet | 2:dfc8b09b4e3b | 120 | /// @param maxGain 0..31 / 0x0..0x1f =>magic non linear function=> 94..1025 (see SRF08 docu) |
humlet | 2:dfc8b09b4e3b | 121 | /// @return true on success |
humlet | 2:dfc8b09b4e3b | 122 | bool writeMaxGain(int maxGain); |
humlet | 0:2686e857daf6 | 123 | |
humlet | 3:70c946ba29cc | 124 | /// Get transit time (us) of n'th echo from internal buffer. |
humlet | 2:dfc8b09b4e3b | 125 | /// Call burstRead() before! |
humlet | 2:dfc8b09b4e3b | 126 | /// @param echoIdx 0..16 |
humlet | 2:dfc8b09b4e3b | 127 | int getTransitTimeFromRawBuffer_us(int echoIdx) const { |
humlet | 2:dfc8b09b4e3b | 128 | return twoByte2int(&(m_rawBuffer[(++echoIdx)<<1])); // (1+idx)*2 |
humlet | 2:dfc8b09b4e3b | 129 | } |
humlet | 2:dfc8b09b4e3b | 130 | |
humlet | 2:dfc8b09b4e3b | 131 | /// Get distanc (mm) of n'th echo from internal buffer. |
humlet | 2:dfc8b09b4e3b | 132 | /// Call burstRead() before! |
humlet | 2:dfc8b09b4e3b | 133 | /// @param echoIdx 0..16 |
humlet | 2:dfc8b09b4e3b | 134 | int getDistanceFromRawBuffer_mm(int echoIdx) const { |
humlet | 2:dfc8b09b4e3b | 135 | return time2dist_us2mm(getTransitTimeFromRawBuffer_us(echoIdx)); |
humlet | 2:dfc8b09b4e3b | 136 | } |
humlet | 2:dfc8b09b4e3b | 137 | |
humlet | 2:dfc8b09b4e3b | 138 | /// Get light sensor data from internal buffer. |
humlet | 2:dfc8b09b4e3b | 139 | /// Call burstRead() before! |
humlet | 2:dfc8b09b4e3b | 140 | int getBrightnessFromRawBuffer() const { |
humlet | 2:dfc8b09b4e3b | 141 | return static_cast<int>(m_rawBuffer[1]); |
humlet | 2:dfc8b09b4e3b | 142 | } |
humlet | 2:dfc8b09b4e3b | 143 | /// Get ANN data from internal buffer |
humlet | 2:dfc8b09b4e3b | 144 | /// Call burstRead() before! |
humlet | 3:70c946ba29cc | 145 | /// Each slot is 2048us/353mm wide. |
humlet | 2:dfc8b09b4e3b | 146 | /// @param slotIdx slot 0..31 |
humlet | 2:dfc8b09b4e3b | 147 | int getANNSlotDataFromRawBuffer(int slotIdx) const { |
humlet | 2:dfc8b09b4e3b | 148 | return (static_cast<int>(m_rawBuffer[slotIdx+4])); |
humlet | 2:dfc8b09b4e3b | 149 | } |
humlet | 3:70c946ba29cc | 150 | /// Reads all data from start to stop register in one go and stores it in a class internal buffer. See getXXXXXFromRawBuffer_us() functions. |
humlet | 2:dfc8b09b4e3b | 151 | /// - reg 0x00: SW Revision |
humlet | 2:dfc8b09b4e3b | 152 | /// - reg 0x01: light sensor (SRF08 only) |
humlet | 2:dfc8b09b4e3b | 153 | /// - reg 0x02+0x03: range high+low byte |
humlet | 2:dfc8b09b4e3b | 154 | /// - reg 0x03+0x04: srf02: min range high+low byte srf08: 2nd echo |
humlet | 2:dfc8b09b4e3b | 155 | /// - reg 0x04+0x05 .. 34+35: 3rd..17th echo high+low byte |
humlet | 2:dfc8b09b4e3b | 156 | /// @return true on success |
humlet | 2:dfc8b09b4e3b | 157 | bool burstRead(int startReg=1, int stopReg=35); |
humlet | 2:dfc8b09b4e3b | 158 | }; |
humlet | 0:2686e857daf6 | 159 | |
humlet | 2:dfc8b09b4e3b | 160 | } |
humlet | 2:dfc8b09b4e3b | 161 | #endif |
humlet | 2:dfc8b09b4e3b | 162 |