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
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
.
|
Diff: SRF08.cpp
- Revision:
- 0:4e0a8193b92e
- Child:
- 1:76fb116fa28d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SRF08.cpp Thu Jul 05 09:53:18 2012 +0000 @@ -0,0 +1,140 @@ + +/* +Copyright (c) 2010 Chris Styles ( chris dot styles at mbed dot org ) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +#include "SRF08.h" + +/* + * Constructor: SRF08 + * Args: PinName sda: Data pin of I2C bus to which module is connected + * PinName scl: Clock pin of I2C bus to which module is connected + * int addr: address of module on the I2C bus + * Returns: void + * Description: Creates an instance of the SRF08 to communicate with a sRF08 module + */ +SRF08::SRF08(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr) { + char cmd[2]; + // Set up SRF08 max range and receiver sensitivity over I2C bus + cmd[0] = 0x02; // Range register + cmd[1] = 0xFF; + m_i2c.write(m_addr, cmd, 2); + cmd[0] = 0x01; // Receiver gain register + cmd[1] = 0x1F; // Set max receiver gain + m_i2c.write(m_addr, cmd, 2); +} + +/* + * Destructor: ~SRF08 + * Args: void + * Returns: void + * Description: Destroys instance of SRF08 class + */ +SRF08::~SRF08() { + +} + +/* + * Function: readRange + * Args: void + * Returns: int range + * Description: Reads the range register and converts it to a usable value + */ +int SRF08::read() { + char cmd[2]; + char echo[2]; + + // Get range data from SRF08 + // Send Tx burst command over I2C bus + cmd[0] = 0x00; // Command register + cmd[1] = 0x51; // Ranging results in cm + m_i2c.write(m_addr, cmd, 2); // Send ranging burst + + wait(0.07); // Wait for return echo + + // Read back range over I2C bus + cmd[0] = 0x02; // Address of first echo + m_i2c.write(m_addr, cmd, 1, 1); // Send address of first echo + m_i2c.read(m_addr, echo, 2); // Read two-byte echo result + + // Generate PWM mark/space ratio from range data + int range = (echo[0]<<8)+echo[1]; + + return range; +} + +/* + * Function: setRangeRegister + * Args: rangeVal + * Returns: void + * Description: Sets the maximum range for which the module waits for an echo + * The range is ((rangeVal x 43mm) + 43mm) + * The max range is about six meters + */ +void SRF08::setRangeRegister(char rangeVal) { + char cmd[2]; + cmd[0] = 0x02; //Range register + cmd[1] = rangeVal; //Range value + m_i2c.write(m_addr, cmd, 2); +} + +/* + * Function: setAddress + * Args: address + * Returns: void + * Description: Sets the address of the module on the I2C bus. The factory default address is 0x0E (224) + * The address can have the following values: + * E0 | E2 | E4 | E6 ... FC | FE + */ +void SRF08::setAddress(char address) { + char cmd[2]; + cmd[0] = 0x00; + cmd[1] = 0xA0; + m_i2c.write(m_addr, cmd, 2); + cmd[1] = 0xAA; + m_i2c.write(m_addr, cmd, 2); + cmd[1] = 0xA5; + m_i2c.write(m_addr, cmd, 2); + cmd[1] = address; + m_i2c.write(m_addr, cmd, 2); + m_addr = address; +} + +/* + * Function: readLightIntensity + * Args: void + * Returns: int lightIntensity + * Description: Reads the lightIntensity from the module + * The light intensity is updated if a range command is sent, so don't use + * this function only + */ +int SRF08::readLightIntensity() { + char cmd[1]; + char echo[1]; + + cmd[0] = 0x01; // Address of light intensity value + m_i2c.write(m_addr, cmd, 1, 1); // Send address of first echo + m_i2c.read(m_addr, echo, 2); // Read two-byte echo result + + int lightIntensity = echo[0]; + + return lightIntensity; +}