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:
el13tjoc
Date:
Sun May 10 01:55:56 2015 +0000
Revision:
5:abd72648aa5d
Parent:
4:a11bd4ea3c18
SRF08 Library;

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 4:a11bd4ea3c18 35 rangingBusy(false) {
brentdekker 0:4e0a8193b92e 36
brentdekker 0:4e0a8193b92e 37 }
brentdekker 0:4e0a8193b92e 38
brentdekker 0:4e0a8193b92e 39 /*
brentdekker 1:76fb116fa28d 40 * Function: startRanging
brentdekker 1:76fb116fa28d 41 * Args: void
brentdekker 1:76fb116fa28d 42 * Returns: void
brentdekker 1:76fb116fa28d 43 * Description: Sends command to module to start ranging.
brentdekker 1:76fb116fa28d 44 */
el13tjoc 5:abd72648aa5d 45 void SRF08::startRanging(char rangingType) {
brentdekker 2:ca82f89f415d 46 //Create a two byte command. The first first byte is the register address
brentdekker 2:ca82f89f415d 47 // on the SRF08 to write to. The second byte is the command which is written
brentdekker 2:ca82f89f415d 48 // to that address ("Start ranging in cm" in this case).
el13tjoc 5:abd72648aa5d 49 char command[] = {0x00, rangingType};
brentdekker 2:ca82f89f415d 50 i2cMod.write(i2cAddress, command, 2);
brentdekker 2:ca82f89f415d 51 this->rangingBusy = true;
brentdekker 2:ca82f89f415d 52 rangeTimeout.attach(this, &SRF08::setRangingFinished, 0.07);
brentdekker 1:76fb116fa28d 53 }
brentdekker 1:76fb116fa28d 54
brentdekker 1:76fb116fa28d 55 /*
brentdekker 1:76fb116fa28d 56 * Function: rangingFinished
brentdekker 1:76fb116fa28d 57 * Args: void
brentdekker 1:76fb116fa28d 58 * Returns: Bool: whether ranging is finished
brentdekker 1:76fb116fa28d 59 * Description: Checks if the ranging process on the module is finished
brentdekker 1:76fb116fa28d 60 */
brentdekker 2:ca82f89f415d 61 bool SRF08::rangingFinished() {
brentdekker 2:ca82f89f415d 62 if(this->rangingBusy) return false;
brentdekker 1:76fb116fa28d 63 return true;
brentdekker 1:76fb116fa28d 64 }
brentdekker 1:76fb116fa28d 65
brentdekker 1:76fb116fa28d 66 /*
brentdekker 1:76fb116fa28d 67 * Function: getRange
brentdekker 1:76fb116fa28d 68 * Args: void
brentdekker 1:76fb116fa28d 69 * Returns: int range
brentdekker 1:76fb116fa28d 70 * Description: Range in cm. This function should only be called when ranging is finished, otherwise previous value is returned
brentdekker 1:76fb116fa28d 71 */
brentdekker 2:ca82f89f415d 72 int SRF08::getRange() {
el13tjoc 5:abd72648aa5d 73 while (!rangingFinished() ) wait(0.01); //Wait until ranging is finished
brentdekker 2:ca82f89f415d 74 const char command[] = {0x02}; //Address of range register
brentdekker 2:ca82f89f415d 75 char response[] = {0x00, 0x00};
brentdekker 2:ca82f89f415d 76 i2cMod.write(i2cAddress, command, 1, 1); //Send command
brentdekker 2:ca82f89f415d 77 i2cMod.read(i2cAddress, response, 2); //Read 16bits result
brentdekker 2:ca82f89f415d 78 int range = (response[0]<<8)+response[1]; //Shift two bytes into int
brentdekker 2:ca82f89f415d 79 return range; //Return int range
brentdekker 1:76fb116fa28d 80 }
brentdekker 1:76fb116fa28d 81
brentdekker 1:76fb116fa28d 82 /*
brentdekker 2:ca82f89f415d 83 * Function: readLightIntensity
brentdekker 0:4e0a8193b92e 84 * Args: void
brentdekker 2:ca82f89f415d 85 * Returns: int lightIntensity
brentdekker 2:ca82f89f415d 86 * Description: Reads the lightIntensity from the module
brentdekker 2:ca82f89f415d 87 * The light intensity is updated if a range command is sent, so don't use
brentdekker 2:ca82f89f415d 88 * this function only
brentdekker 0:4e0a8193b92e 89 */
brentdekker 2:ca82f89f415d 90 int SRF08::getLightIntensity() {
brentdekker 2:ca82f89f415d 91 const char command[] = {0x01}; //Light intensity register
brentdekker 2:ca82f89f415d 92 char response[] = {0x00};
brentdekker 2:ca82f89f415d 93 i2cMod.write(i2cAddress, command, 1, 1); //Send command
brentdekker 2:ca82f89f415d 94 i2cMod.read(i2cAddress, response, 1); //Read response
brentdekker 2:ca82f89f415d 95 int lightIntensity = response[0];
brentdekker 2:ca82f89f415d 96 return lightIntensity;
brentdekker 1:76fb116fa28d 97 }
brentdekker 1:76fb116fa28d 98
brentdekker 1:76fb116fa28d 99 /*
brentdekker 0:4e0a8193b92e 100 * Function: setRangeRegister
brentdekker 0:4e0a8193b92e 101 * Args: rangeVal
brentdekker 0:4e0a8193b92e 102 * Returns: void
brentdekker 0:4e0a8193b92e 103 * Description: Sets the maximum range for which the module waits for an echo
brentdekker 0:4e0a8193b92e 104 * The range is ((rangeVal x 43mm) + 43mm)
brentdekker 0:4e0a8193b92e 105 * The max range is about six meters
brentdekker 0:4e0a8193b92e 106 */
brentdekker 2:ca82f89f415d 107 void SRF08::setRangeRegister(unsigned char rangeVal) {
brentdekker 2:ca82f89f415d 108 while (!rangingFinished() ) wait(0.01); //Wait until ranging is finished
brentdekker 2:ca82f89f415d 109 char command[] = {0x02, rangeVal}; //Range register
brentdekker 2:ca82f89f415d 110 i2cMod.write(i2cAddress, command, 2); //Send command
brentdekker 2:ca82f89f415d 111 }
brentdekker 2:ca82f89f415d 112
brentdekker 2:ca82f89f415d 113
brentdekker 2:ca82f89f415d 114 //Function setMaxGainRegister
brentdekker 2:ca82f89f415d 115 void SRF08::setMaxGainRegister(unsigned char gainVal) {
brentdekker 2:ca82f89f415d 116 while (!rangingFinished() ) wait(0.01); //Wait until ranging is finished
brentdekker 2:ca82f89f415d 117 char command[] = {0x01, gainVal}; //Max gain register
brentdekker 2:ca82f89f415d 118 i2cMod.write(i2cAddress, command, 2); //Send command
brentdekker 0:4e0a8193b92e 119 }
brentdekker 0:4e0a8193b92e 120
brentdekker 0:4e0a8193b92e 121 /*
brentdekker 0:4e0a8193b92e 122 * Function: setAddress
brentdekker 0:4e0a8193b92e 123 * Args: address
brentdekker 0:4e0a8193b92e 124 * Returns: void
brentdekker 0:4e0a8193b92e 125 * Description: Sets the address of the module on the I2C bus. The factory default address is 0x0E (224)
brentdekker 0:4e0a8193b92e 126 * The address can have the following values:
brentdekker 0:4e0a8193b92e 127 * E0 | E2 | E4 | E6 ... FC | FE
brentdekker 0:4e0a8193b92e 128 */
brentdekker 2:ca82f89f415d 129 void SRF08::setAddress(int address) {
brentdekker 2:ca82f89f415d 130 //Send address change sequence
brentdekker 2:ca82f89f415d 131 char command[] = {0x00, 0xA0};
brentdekker 2:ca82f89f415d 132 i2cMod.write(i2cAddress, command, 2);
brentdekker 2:ca82f89f415d 133 command[1] = 0xAA;
brentdekker 2:ca82f89f415d 134 i2cMod.write(i2cAddress, command, 2);
brentdekker 2:ca82f89f415d 135 command[1] = 0xA5;
brentdekker 2:ca82f89f415d 136 i2cMod.write(i2cAddress, command, 2);
brentdekker 2:ca82f89f415d 137 command[1] = address;
brentdekker 2:ca82f89f415d 138 i2cMod.write(i2cAddress, command, 2);
brentdekker 2:ca82f89f415d 139 //Save the updated address
brentdekker 2:ca82f89f415d 140 i2cAddress = address;
brentdekker 0:4e0a8193b92e 141 }
brentdekker 0:4e0a8193b92e 142
brentdekker 3:c43cd24ec7e7 143 //Small helper function for Timeout object
brentdekker 2:ca82f89f415d 144 void SRF08::setRangingFinished() {
brentdekker 2:ca82f89f415d 145 this->rangingBusy = false;
brentdekker 2:ca82f89f415d 146 }