Library for interfacing the SRF08 ultrasonic range sensor. Most functions of the SRF08 are covered, including interrupt-based waiting for the ranging process to finish

Dependents:   Project6

Fork of SRF08 by Brent Dekker

Committer:
brentdekker
Date:
Tue Jul 10 08:48:02 2012 +0000
Revision:
1:76fb116fa28d
Parent:
0:4e0a8193b92e
Child:
2:ca82f89f415d
Extra functions added for more optimal processor-time use

Who changed what in which revision?

UserRevisionLine numberNew contents of line
brentdekker 0:4e0a8193b92e 1
brentdekker 0:4e0a8193b92e 2 /*
brentdekker 0:4e0a8193b92e 3 Copyright (c) 2010 Chris Styles ( chris dot styles at mbed dot org )
brentdekker 0:4e0a8193b92e 4
brentdekker 0:4e0a8193b92e 5 Permission is hereby granted, free of charge, to any person obtaining a copy
brentdekker 0:4e0a8193b92e 6 of this software and associated documentation files (the "Software"), to deal
brentdekker 0:4e0a8193b92e 7 in the Software without restriction, including without limitation the rights
brentdekker 0:4e0a8193b92e 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
brentdekker 0:4e0a8193b92e 9 copies of the Software, and to permit persons to whom the Software is
brentdekker 0:4e0a8193b92e 10 furnished to do so, subject to the following conditions:
brentdekker 0:4e0a8193b92e 11
brentdekker 0:4e0a8193b92e 12 The above copyright notice and this permission notice shall be included in
brentdekker 0:4e0a8193b92e 13 all copies or substantial portions of the Software.
brentdekker 0:4e0a8193b92e 14
brentdekker 0:4e0a8193b92e 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
brentdekker 0:4e0a8193b92e 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
brentdekker 0:4e0a8193b92e 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
brentdekker 0:4e0a8193b92e 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
brentdekker 0:4e0a8193b92e 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
brentdekker 0:4e0a8193b92e 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
brentdekker 0:4e0a8193b92e 21 THE SOFTWARE.
brentdekker 0:4e0a8193b92e 22 */
brentdekker 0:4e0a8193b92e 23
brentdekker 0:4e0a8193b92e 24 #include "SRF08.h"
brentdekker 0:4e0a8193b92e 25
brentdekker 0:4e0a8193b92e 26 /*
brentdekker 0:4e0a8193b92e 27 * Constructor: SRF08
brentdekker 0:4e0a8193b92e 28 * Args: PinName sda: Data pin of I2C bus to which module is connected
brentdekker 0:4e0a8193b92e 29 * PinName scl: Clock pin of I2C bus to which module is connected
brentdekker 0:4e0a8193b92e 30 * int addr: address of module on the I2C bus
brentdekker 0:4e0a8193b92e 31 * Returns: void
brentdekker 0:4e0a8193b92e 32 * Description: Creates an instance of the SRF08 to communicate with a sRF08 module
brentdekker 0:4e0a8193b92e 33 */
brentdekker 1:76fb116fa28d 34 SRF08::SRF08(PinName sda, PinName scl, int addr) :
brentdekker 1:76fb116fa28d 35 m_i2c(sda, scl), m_addr(addr), rangeBuf(), rangeBufIndex(0) {
brentdekker 0:4e0a8193b92e 36 char cmd[2];
brentdekker 0:4e0a8193b92e 37 // Set up SRF08 max range and receiver sensitivity over I2C bus
brentdekker 0:4e0a8193b92e 38 cmd[0] = 0x02; // Range register
brentdekker 0:4e0a8193b92e 39 cmd[1] = 0xFF;
brentdekker 0:4e0a8193b92e 40 m_i2c.write(m_addr, cmd, 2);
brentdekker 0:4e0a8193b92e 41 cmd[0] = 0x01; // Receiver gain register
brentdekker 0:4e0a8193b92e 42 cmd[1] = 0x1F; // Set max receiver gain
brentdekker 0:4e0a8193b92e 43 m_i2c.write(m_addr, cmd, 2);
brentdekker 0:4e0a8193b92e 44 }
brentdekker 0:4e0a8193b92e 45
brentdekker 0:4e0a8193b92e 46 /*
brentdekker 0:4e0a8193b92e 47 * Destructor: ~SRF08
brentdekker 0:4e0a8193b92e 48 * Args: void
brentdekker 0:4e0a8193b92e 49 * Returns: void
brentdekker 0:4e0a8193b92e 50 * Description: Destroys instance of SRF08 class
brentdekker 0:4e0a8193b92e 51 */
brentdekker 0:4e0a8193b92e 52 SRF08::~SRF08() {
brentdekker 0:4e0a8193b92e 53
brentdekker 0:4e0a8193b92e 54 }
brentdekker 0:4e0a8193b92e 55
brentdekker 0:4e0a8193b92e 56 /*
brentdekker 1:76fb116fa28d 57 * Function: startRanging
brentdekker 1:76fb116fa28d 58 * Args: void
brentdekker 1:76fb116fa28d 59 * Returns: void
brentdekker 1:76fb116fa28d 60 * Description: Sends command to module to start ranging.
brentdekker 1:76fb116fa28d 61 */
brentdekker 1:76fb116fa28d 62 void startRanging() {
brentdekker 1:76fb116fa28d 63 // Send Tx burst command over I2C bus
brentdekker 1:76fb116fa28d 64 cmd[0] = 0x00; // Command register
brentdekker 1:76fb116fa28d 65 cmd[1] = 0x51; // Ranging results in cm
brentdekker 1:76fb116fa28d 66 m_i2c.write(m_addr, cmd, 2); // Send ranging burst
brentdekker 1:76fb116fa28d 67 }
brentdekker 1:76fb116fa28d 68
brentdekker 1:76fb116fa28d 69 /*
brentdekker 1:76fb116fa28d 70 * Function: rangingFinished
brentdekker 1:76fb116fa28d 71 * Args: void
brentdekker 1:76fb116fa28d 72 * Returns: Bool: whether ranging is finished
brentdekker 1:76fb116fa28d 73 * Description: Checks if the ranging process on the module is finished
brentdekker 1:76fb116fa28d 74 */
brentdekker 1:76fb116fa28d 75 bool rangingFinished() {
brentdekker 1:76fb116fa28d 76 char cmd = 0x00; //Software revision register
brentdekker 1:76fb116fa28d 77 char echo;
brentdekker 1:76fb116fa28d 78 m_i2c.write(m_addr, cmd, 1, 1); //Send address of software rev register
brentdekker 1:76fb116fa28d 79 m_i2c.read(m_addr, echo, 1); //Read 1 byte echo result
brentdekker 1:76fb116fa28d 80 if (echo == 0xFF) return false;
brentdekker 1:76fb116fa28d 81 return true;
brentdekker 1:76fb116fa28d 82 }
brentdekker 1:76fb116fa28d 83
brentdekker 1:76fb116fa28d 84 /*
brentdekker 1:76fb116fa28d 85 * Function: getRange
brentdekker 1:76fb116fa28d 86 * Args: void
brentdekker 1:76fb116fa28d 87 * Returns: int range
brentdekker 1:76fb116fa28d 88 * Description: Range in cm. This function should only be called when ranging is finished, otherwise previous value is returned
brentdekker 1:76fb116fa28d 89 */
brentdekker 1:76fb116fa28d 90 void getRange() {
brentdekker 1:76fb116fa28d 91 char cmd[2];
brentdekker 1:76fb116fa28d 92 char echo[2];
brentdekker 1:76fb116fa28d 93 // Read range over I2C bus
brentdekker 1:76fb116fa28d 94 cmd[0] = 0x02; // Address of first echo
brentdekker 1:76fb116fa28d 95 m_i2c.write(m_addr, cmd, 1, 1); // Send address of first echo
brentdekker 1:76fb116fa28d 96 m_i2c.read(m_addr, echo, 2); // Read two-byte echo result
brentdekker 1:76fb116fa28d 97 // Generate PWM mark/space ratio from range data
brentdekker 1:76fb116fa28d 98 int range = (echo[0]<<8)+echo[1];
brentdekker 1:76fb116fa28d 99 return range;
brentdekker 1:76fb116fa28d 100 }
brentdekker 1:76fb116fa28d 101
brentdekker 1:76fb116fa28d 102 /*
brentdekker 0:4e0a8193b92e 103 * Function: readRange
brentdekker 0:4e0a8193b92e 104 * Args: void
brentdekker 0:4e0a8193b92e 105 * Returns: int range
brentdekker 0:4e0a8193b92e 106 * Description: Reads the range register and converts it to a usable value
brentdekker 0:4e0a8193b92e 107 */
brentdekker 1:76fb116fa28d 108 int SRF08::readRange() {
brentdekker 0:4e0a8193b92e 109 char cmd[2];
brentdekker 0:4e0a8193b92e 110 char echo[2];
brentdekker 0:4e0a8193b92e 111
brentdekker 0:4e0a8193b92e 112 // Get range data from SRF08
brentdekker 0:4e0a8193b92e 113 // Send Tx burst command over I2C bus
brentdekker 0:4e0a8193b92e 114 cmd[0] = 0x00; // Command register
brentdekker 0:4e0a8193b92e 115 cmd[1] = 0x51; // Ranging results in cm
brentdekker 0:4e0a8193b92e 116 m_i2c.write(m_addr, cmd, 2); // Send ranging burst
brentdekker 0:4e0a8193b92e 117
brentdekker 0:4e0a8193b92e 118 wait(0.07); // Wait for return echo
brentdekker 0:4e0a8193b92e 119
brentdekker 0:4e0a8193b92e 120 // Read back range over I2C bus
brentdekker 0:4e0a8193b92e 121 cmd[0] = 0x02; // Address of first echo
brentdekker 0:4e0a8193b92e 122 m_i2c.write(m_addr, cmd, 1, 1); // Send address of first echo
brentdekker 0:4e0a8193b92e 123 m_i2c.read(m_addr, echo, 2); // Read two-byte echo result
brentdekker 0:4e0a8193b92e 124
brentdekker 0:4e0a8193b92e 125 // Generate PWM mark/space ratio from range data
brentdekker 0:4e0a8193b92e 126 int range = (echo[0]<<8)+echo[1];
brentdekker 0:4e0a8193b92e 127
brentdekker 0:4e0a8193b92e 128 return range;
brentdekker 0:4e0a8193b92e 129 }
brentdekker 0:4e0a8193b92e 130
brentdekker 0:4e0a8193b92e 131 /*
brentdekker 1:76fb116fa28d 132 * Function: readBufRange
brentdekker 1:76fb116fa28d 133 * Args: void
brentdekker 1:76fb116fa28d 134 * Returns: int range
brentdekker 1:76fb116fa28d 135 * Description: Reads the range register, adds it to an array and converts it to a filtered value
brentdekker 1:76fb116fa28d 136 */
brentdekker 1:76fb116fa28d 137 //int SRF08::readBufRange() {
brentdekker 1:76fb116fa28d 138
brentdekker 1:76fb116fa28d 139 //}
brentdekker 1:76fb116fa28d 140
brentdekker 1:76fb116fa28d 141 int SRF08::getAverageBufRange() {
brentdekker 1:76fb116fa28d 142 int total = 0;
brentdekker 1:76fb116fa28d 143 for (int i = 0; i < RANGEBUFSIZE; i++) {
brentdekker 1:76fb116fa28d 144 total += rangeBuf[i];
brentdekker 1:76fb116fa28d 145 }
brentdekker 1:76fb116fa28d 146 return (int)total/RANGEBUFSIZE;
brentdekker 1:76fb116fa28d 147 }
brentdekker 1:76fb116fa28d 148
brentdekker 1:76fb116fa28d 149 /*
brentdekker 0:4e0a8193b92e 150 * Function: setRangeRegister
brentdekker 0:4e0a8193b92e 151 * Args: rangeVal
brentdekker 0:4e0a8193b92e 152 * Returns: void
brentdekker 0:4e0a8193b92e 153 * Description: Sets the maximum range for which the module waits for an echo
brentdekker 0:4e0a8193b92e 154 * The range is ((rangeVal x 43mm) + 43mm)
brentdekker 0:4e0a8193b92e 155 * The max range is about six meters
brentdekker 0:4e0a8193b92e 156 */
brentdekker 0:4e0a8193b92e 157 void SRF08::setRangeRegister(char rangeVal) {
brentdekker 0:4e0a8193b92e 158 char cmd[2];
brentdekker 0:4e0a8193b92e 159 cmd[0] = 0x02; //Range register
brentdekker 0:4e0a8193b92e 160 cmd[1] = rangeVal; //Range value
brentdekker 0:4e0a8193b92e 161 m_i2c.write(m_addr, cmd, 2);
brentdekker 0:4e0a8193b92e 162 }
brentdekker 0:4e0a8193b92e 163
brentdekker 0:4e0a8193b92e 164 /*
brentdekker 0:4e0a8193b92e 165 * Function: setAddress
brentdekker 0:4e0a8193b92e 166 * Args: address
brentdekker 0:4e0a8193b92e 167 * Returns: void
brentdekker 0:4e0a8193b92e 168 * Description: Sets the address of the module on the I2C bus. The factory default address is 0x0E (224)
brentdekker 0:4e0a8193b92e 169 * The address can have the following values:
brentdekker 0:4e0a8193b92e 170 * E0 | E2 | E4 | E6 ... FC | FE
brentdekker 0:4e0a8193b92e 171 */
brentdekker 0:4e0a8193b92e 172 void SRF08::setAddress(char address) {
brentdekker 0:4e0a8193b92e 173 char cmd[2];
brentdekker 0:4e0a8193b92e 174 cmd[0] = 0x00;
brentdekker 0:4e0a8193b92e 175 cmd[1] = 0xA0;
brentdekker 0:4e0a8193b92e 176 m_i2c.write(m_addr, cmd, 2);
brentdekker 0:4e0a8193b92e 177 cmd[1] = 0xAA;
brentdekker 0:4e0a8193b92e 178 m_i2c.write(m_addr, cmd, 2);
brentdekker 0:4e0a8193b92e 179 cmd[1] = 0xA5;
brentdekker 0:4e0a8193b92e 180 m_i2c.write(m_addr, cmd, 2);
brentdekker 0:4e0a8193b92e 181 cmd[1] = address;
brentdekker 0:4e0a8193b92e 182 m_i2c.write(m_addr, cmd, 2);
brentdekker 0:4e0a8193b92e 183 m_addr = address;
brentdekker 0:4e0a8193b92e 184 }
brentdekker 0:4e0a8193b92e 185
brentdekker 0:4e0a8193b92e 186 /*
brentdekker 0:4e0a8193b92e 187 * Function: readLightIntensity
brentdekker 0:4e0a8193b92e 188 * Args: void
brentdekker 0:4e0a8193b92e 189 * Returns: int lightIntensity
brentdekker 0:4e0a8193b92e 190 * Description: Reads the lightIntensity from the module
brentdekker 0:4e0a8193b92e 191 * The light intensity is updated if a range command is sent, so don't use
brentdekker 0:4e0a8193b92e 192 * this function only
brentdekker 0:4e0a8193b92e 193 */
brentdekker 0:4e0a8193b92e 194 int SRF08::readLightIntensity() {
brentdekker 0:4e0a8193b92e 195 char cmd[1];
brentdekker 0:4e0a8193b92e 196 char echo[1];
brentdekker 0:4e0a8193b92e 197
brentdekker 0:4e0a8193b92e 198 cmd[0] = 0x01; // Address of light intensity value
brentdekker 0:4e0a8193b92e 199 m_i2c.write(m_addr, cmd, 1, 1); // Send address of first echo
brentdekker 0:4e0a8193b92e 200 m_i2c.read(m_addr, echo, 2); // Read two-byte echo result
brentdekker 0:4e0a8193b92e 201
brentdekker 0:4e0a8193b92e 202 int lightIntensity = echo[0];
brentdekker 0:4e0a8193b92e 203
brentdekker 0:4e0a8193b92e 204 return lightIntensity;
brentdekker 0:4e0a8193b92e 205 }