Interface library for the Devantech SRF02/SRF08 ultrasonic i2c rangers. Depends on I2cRtosDriver lib!

Committer:
humlet
Date:
Sun May 26 20:52:27 2013 +0000
Revision:
2:dfc8b09b4e3b
Parent:
SRF02_IF.h@1:32c4dd194228
Child:
3:70c946ba29cc
initial

Who changed what in which revision?

UserRevisionLine numberNew 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 2:dfc8b09b4e3b 21 return ((static_cast<uint16_t>(*(data)))<<8) | static_cast<uint16_t>(*(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 2:dfc8b09b4e3b 25 return us!=-1 ? (us*sonicSpeed)>>1 : us;
humlet 2:dfc8b09b4e3b 26 }
humlet 2:dfc8b09b4e3b 27
humlet 2:dfc8b09b4e3b 28
humlet 2:dfc8b09b4e3b 29 /// sonic speed in m/s @ 21°C ... c=(331.5+0.6*T/°C)m/s
humlet 2:dfc8b09b4e3b 30 /// To calculate the distance in mm: Multiply the µs 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 2:dfc8b09b4e3b 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 2:dfc8b09b4e3b 40 /// Read back measured transit time in µs 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 2:dfc8b09b4e3b 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 2:dfc8b09b4e3b 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 2:dfc8b09b4e3b 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 2:dfc8b09b4e3b 66 /// Provides 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 2:dfc8b09b4e3b 74 /// Just send a ping
humlet 2:dfc8b09b4e3b 75 /// @return true on success
humlet 2:dfc8b09b4e3b 76 bool triggerPing();
humlet 2:dfc8b09b4e3b 77
humlet 2:dfc8b09b4e3b 78 /// Just wait for an echo and measure the time
humlet 2:dfc8b09b4e3b 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 2:dfc8b09b4e3b 83 /// Read current minimum range from srf02
humlet 2:dfc8b09b4e3b 84 int readMinimalTransitTime_us();
humlet 2:dfc8b09b4e3b 85
humlet 2:dfc8b09b4e3b 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 2:dfc8b09b4e3b 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 2:dfc8b09b4e3b 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 2:dfc8b09b4e3b 118 /// During measurement the analog signal amplification is increased every 70µs 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 2:dfc8b09b4e3b 124 /// Get transit time (µs) 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 2:dfc8b09b4e3b 145 /// Each slot is 2048µs/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 2:dfc8b09b4e3b 150 /// Reads all data from start to stop register in one go and store it in class internal buffer.
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