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:
Wed Jul 11 07:53:50 2012 +0000
Revision:
2:ca82f89f415d
Parent:
1:76fb116fa28d
Child:
3:c43cd24ec7e7
Added timeout

Who changed what in which revision?

UserRevisionLine numberNew contents of line
brentdekker 0:4e0a8193b92e 1 /*
brentdekker 2:ca82f89f415d 2 Copyright (c) 2012 Brent Dekker
brentdekker 0:4e0a8193b92e 3
brentdekker 0:4e0a8193b92e 4 Permission is hereby granted, free of charge, to any person obtaining a copy
brentdekker 0:4e0a8193b92e 5 of this software and associated documentation files (the "Software"), to deal
brentdekker 0:4e0a8193b92e 6 in the Software without restriction, including without limitation the rights
brentdekker 0:4e0a8193b92e 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
brentdekker 0:4e0a8193b92e 8 copies of the Software, and to permit persons to whom the Software is
brentdekker 0:4e0a8193b92e 9 furnished to do so, subject to the following conditions:
brentdekker 0:4e0a8193b92e 10
brentdekker 0:4e0a8193b92e 11 The above copyright notice and this permission notice shall be included in
brentdekker 0:4e0a8193b92e 12 all copies or substantial portions of the Software.
brentdekker 0:4e0a8193b92e 13
brentdekker 0:4e0a8193b92e 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
brentdekker 0:4e0a8193b92e 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
brentdekker 0:4e0a8193b92e 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
brentdekker 0:4e0a8193b92e 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
brentdekker 0:4e0a8193b92e 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
brentdekker 0:4e0a8193b92e 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
brentdekker 0:4e0a8193b92e 20 THE SOFTWARE.
brentdekker 0:4e0a8193b92e 21 */
brentdekker 0:4e0a8193b92e 22
brentdekker 0:4e0a8193b92e 23 #include "SRF08.h"
brentdekker 0:4e0a8193b92e 24
brentdekker 0:4e0a8193b92e 25 /*
brentdekker 0:4e0a8193b92e 26 * Constructor: SRF08
brentdekker 2:ca82f89f415d 27 * Args:
brentdekker 0:4e0a8193b92e 28 * Returns: void
brentdekker 0:4e0a8193b92e 29 * Description: Creates an instance of the SRF08 to communicate with a sRF08 module
brentdekker 0:4e0a8193b92e 30 */
brentdekker 2:ca82f89f415d 31 SRF08::SRF08(PinName SDA, PinName SCL, int i2cAddress) :
brentdekker 2:ca82f89f415d 32 i2cMod(SDA, SCL),
brentdekker 2:ca82f89f415d 33 i2cAddress(i2cAddress),
brentdekker 2:ca82f89f415d 34 rangeTimeout(),
brentdekker 2:ca82f89f415d 35 rangingBusy(false),
brentdekker 2:ca82f89f415d 36 debugPC(USBTX, USBRX) {
brentdekker 0:4e0a8193b92e 37
brentdekker 0:4e0a8193b92e 38 }
brentdekker 0:4e0a8193b92e 39
brentdekker 0:4e0a8193b92e 40 /*
brentdekker 1:76fb116fa28d 41 * Function: startRanging
brentdekker 1:76fb116fa28d 42 * Args: void
brentdekker 1:76fb116fa28d 43 * Returns: void
brentdekker 1:76fb116fa28d 44 * Description: Sends command to module to start ranging.
brentdekker 1:76fb116fa28d 45 */
brentdekker 2:ca82f89f415d 46 void SRF08::startRanging() {
brentdekker 2:ca82f89f415d 47 //Create a two byte command. The first first byte is the register address
brentdekker 2:ca82f89f415d 48 // on the SRF08 to write to. The second byte is the command which is written
brentdekker 2:ca82f89f415d 49 // to that address ("Start ranging in cm" in this case).
brentdekker 2:ca82f89f415d 50 const char command[] = {0x00, 0x51};
brentdekker 2:ca82f89f415d 51 i2cMod.write(i2cAddress, command, 2);
brentdekker 2:ca82f89f415d 52 this->rangingBusy = true;
brentdekker 2:ca82f89f415d 53 rangeTimeout.attach(this, &SRF08::setRangingFinished, 0.07);
brentdekker 1:76fb116fa28d 54 }
brentdekker 1:76fb116fa28d 55
brentdekker 1:76fb116fa28d 56 /*
brentdekker 1:76fb116fa28d 57 * Function: rangingFinished
brentdekker 1:76fb116fa28d 58 * Args: void
brentdekker 1:76fb116fa28d 59 * Returns: Bool: whether ranging is finished
brentdekker 1:76fb116fa28d 60 * Description: Checks if the ranging process on the module is finished
brentdekker 1:76fb116fa28d 61 */
brentdekker 2:ca82f89f415d 62 bool SRF08::rangingFinished() {
brentdekker 2:ca82f89f415d 63 if(this->rangingBusy) return false;
brentdekker 1:76fb116fa28d 64 return true;
brentdekker 1:76fb116fa28d 65 }
brentdekker 1:76fb116fa28d 66
brentdekker 1:76fb116fa28d 67 /*
brentdekker 1:76fb116fa28d 68 * Function: getRange
brentdekker 1:76fb116fa28d 69 * Args: void
brentdekker 1:76fb116fa28d 70 * Returns: int range
brentdekker 1:76fb116fa28d 71 * Description: Range in cm. This function should only be called when ranging is finished, otherwise previous value is returned
brentdekker 1:76fb116fa28d 72 */
brentdekker 2:ca82f89f415d 73 int SRF08::getRange() {
brentdekker 2:ca82f89f415d 74 //while (!rangingFinished() ) wait(0.01); //Wait until ranging is finished
brentdekker 2:ca82f89f415d 75 const char command[] = {0x02}; //Address of range register
brentdekker 2:ca82f89f415d 76 char response[] = {0x00, 0x00};
brentdekker 2:ca82f89f415d 77 i2cMod.write(i2cAddress, command, 1, 1); //Send command
brentdekker 2:ca82f89f415d 78 i2cMod.read(i2cAddress, response, 2); //Read 16bits result
brentdekker 2:ca82f89f415d 79 int range = (response[0]<<8)+response[1]; //Shift two bytes into int
brentdekker 2:ca82f89f415d 80 return range; //Return int range
brentdekker 1:76fb116fa28d 81 }
brentdekker 1:76fb116fa28d 82
brentdekker 1:76fb116fa28d 83 /*
brentdekker 2:ca82f89f415d 84 * Function: readLightIntensity
brentdekker 0:4e0a8193b92e 85 * Args: void
brentdekker 2:ca82f89f415d 86 * Returns: int lightIntensity
brentdekker 2:ca82f89f415d 87 * Description: Reads the lightIntensity from the module
brentdekker 2:ca82f89f415d 88 * The light intensity is updated if a range command is sent, so don't use
brentdekker 2:ca82f89f415d 89 * this function only
brentdekker 0:4e0a8193b92e 90 */
brentdekker 2:ca82f89f415d 91 int SRF08::getLightIntensity() {
brentdekker 2:ca82f89f415d 92 const char command[] = {0x01}; //Light intensity register
brentdekker 2:ca82f89f415d 93 char response[] = {0x00};
brentdekker 2:ca82f89f415d 94 i2cMod.write(i2cAddress, command, 1, 1); //Send command
brentdekker 2:ca82f89f415d 95 i2cMod.read(i2cAddress, response, 1); //Read response
brentdekker 2:ca82f89f415d 96 int lightIntensity = response[0];
brentdekker 2:ca82f89f415d 97 return lightIntensity;
brentdekker 1:76fb116fa28d 98 }
brentdekker 1:76fb116fa28d 99
brentdekker 1:76fb116fa28d 100 /*
brentdekker 0:4e0a8193b92e 101 * Function: setRangeRegister
brentdekker 0:4e0a8193b92e 102 * Args: rangeVal
brentdekker 0:4e0a8193b92e 103 * Returns: void
brentdekker 0:4e0a8193b92e 104 * Description: Sets the maximum range for which the module waits for an echo
brentdekker 0:4e0a8193b92e 105 * The range is ((rangeVal x 43mm) + 43mm)
brentdekker 0:4e0a8193b92e 106 * The max range is about six meters
brentdekker 0:4e0a8193b92e 107 */
brentdekker 2:ca82f89f415d 108 void SRF08::setRangeRegister(unsigned char rangeVal) {
brentdekker 2:ca82f89f415d 109 while (!rangingFinished() ) wait(0.01); //Wait until ranging is finished
brentdekker 2:ca82f89f415d 110 char command[] = {0x02, rangeVal}; //Range register
brentdekker 2:ca82f89f415d 111 i2cMod.write(i2cAddress, command, 2); //Send command
brentdekker 2:ca82f89f415d 112 }
brentdekker 2:ca82f89f415d 113
brentdekker 2:ca82f89f415d 114
brentdekker 2:ca82f89f415d 115 //Function setMaxGainRegister
brentdekker 2:ca82f89f415d 116 void SRF08::setMaxGainRegister(unsigned char gainVal) {
brentdekker 2:ca82f89f415d 117 while (!rangingFinished() ) wait(0.01); //Wait until ranging is finished
brentdekker 2:ca82f89f415d 118 char command[] = {0x01, gainVal}; //Max gain register
brentdekker 2:ca82f89f415d 119 i2cMod.write(i2cAddress, command, 2); //Send command
brentdekker 0:4e0a8193b92e 120 }
brentdekker 0:4e0a8193b92e 121
brentdekker 0:4e0a8193b92e 122 /*
brentdekker 0:4e0a8193b92e 123 * Function: setAddress
brentdekker 0:4e0a8193b92e 124 * Args: address
brentdekker 0:4e0a8193b92e 125 * Returns: void
brentdekker 0:4e0a8193b92e 126 * Description: Sets the address of the module on the I2C bus. The factory default address is 0x0E (224)
brentdekker 0:4e0a8193b92e 127 * The address can have the following values:
brentdekker 0:4e0a8193b92e 128 * E0 | E2 | E4 | E6 ... FC | FE
brentdekker 0:4e0a8193b92e 129 */
brentdekker 2:ca82f89f415d 130 void SRF08::setAddress(int address) {
brentdekker 2:ca82f89f415d 131 //Send address change sequence
brentdekker 2:ca82f89f415d 132 char command[] = {0x00, 0xA0};
brentdekker 2:ca82f89f415d 133 i2cMod.write(i2cAddress, command, 2);
brentdekker 2:ca82f89f415d 134 command[1] = 0xAA;
brentdekker 2:ca82f89f415d 135 i2cMod.write(i2cAddress, command, 2);
brentdekker 2:ca82f89f415d 136 command[1] = 0xA5;
brentdekker 2:ca82f89f415d 137 i2cMod.write(i2cAddress, command, 2);
brentdekker 2:ca82f89f415d 138 command[1] = address;
brentdekker 2:ca82f89f415d 139 i2cMod.write(i2cAddress, command, 2);
brentdekker 2:ca82f89f415d 140 //Save the updated address
brentdekker 2:ca82f89f415d 141 i2cAddress = address;
brentdekker 0:4e0a8193b92e 142 }
brentdekker 0:4e0a8193b92e 143
brentdekker 2:ca82f89f415d 144 //Small helper function
brentdekker 2:ca82f89f415d 145 void SRF08::setRangingFinished() {
brentdekker 2:ca82f89f415d 146 this->rangingBusy = false;
brentdekker 2:ca82f89f415d 147 }