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:   DISCO-F746NG_LCDTS_demo Srf08Test

/media/uploads/brentdekker/ultrasonic-range-finder-srf08.jpg

SRF08

Warning

Don't forget to add the pullup resistors from 5v to SDA and SCL!

Information on the SRF08 can be found here: http://www.robot-electronics.co.uk/htm/srf08tech.shtml

Example program

#include "mbed.h"
#include "SRF08.h"

Serial PC(USBTX, USBRX);       //Debug port to PC
SRF08 rangeMod1(p28, p27, 0xE4); //SRF08 ranging module 1
SRF08 rangeMod2(p28, p27, 0xE2); //SRF08 ranging module 2

int main() {
    PC.printf("Start ranging test \n");
    rangeMod1.setAddress(0xE4); //Factory default is 0xE0
    while(1) {
        rangeMod1.startRanging();
        while (!rangeMod1.rangingFinished() ) wait(0.01);
        int range1 = rangeMod1.getRange();
        int light1 = rangeMod1.getLightIntensity();
        rangeMod2.startRanging();
        while (!rangeMod2.rangingFinished() ) wait(0.01);
        int range2 = rangeMod2.getRange();
        PC.printf(" Range_1: %i", range1);
        PC.printf(" Range_2: %i", range2);
        PC.printf(" Light_1: %i", light1);
        PC.printf("\n");
    }
}

Library

Import library

Public Member Functions

SRF08 (PinName SDA, PinName SCL, int i2cAddress)
Create a SRF08 object connected to the specified I2C pins and address.
void startRanging ()
Send the "Start ranging in cm" command via I2C.
bool rangingFinished ()
Checks if the module has finished ranging.
int getRange ()
Gets the measured range from the module.
int getLightIntensity ()
Gets the measured light intensity from the module.
void setRangeRegister (unsigned char rangeVal)
Sets the range register of the SRF08 for faster ranging.
void setMaxGainRegister (unsigned char gainVal)
Sets the max gain register of the SRF08 .
void setAddress (int i2cAddress)
Changes the I2C address of the SRF08 .
Committer:
brentdekker
Date:
Wed Jul 11 08:11:34 2012 +0000
Revision:
4:a11bd4ea3c18
Parent:
3:c43cd24ec7e7
Removed debug code

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 */
brentdekker 2:ca82f89f415d 45 void SRF08::startRanging() {
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).
brentdekker 2:ca82f89f415d 49 const char command[] = {0x00, 0x51};
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() {
brentdekker 2:ca82f89f415d 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 }