Simple library for reading distance from SRF02 Ultrasonic Sensor in I2C mode.

Fork of SRF02 by Craig Evans

Committer:
el14tt
Date:
Wed May 04 10:39:39 2016 +0000
Revision:
2:548b60c4cc15
Parent:
0:b729d2ce03bd
SRF02 library for ELEC2645 project

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el14tt 2:548b60c4cc15 1
el14tt 2:548b60c4cc15 2
eencae 0:b729d2ce03bd 3 /**
eencae 0:b729d2ce03bd 4 @file SRF02.cpp
eencae 0:b729d2ce03bd 5
eencae 0:b729d2ce03bd 6 @brief Member functions implementations
eencae 0:b729d2ce03bd 7
eencae 0:b729d2ce03bd 8 */
eencae 0:b729d2ce03bd 9 #include "mbed.h"
eencae 0:b729d2ce03bd 10 #include "SRF02.h"
eencae 0:b729d2ce03bd 11
el14tt 2:548b60c4cc15 12 #define SOUND_S (float)340.29
el14tt 2:548b60c4cc15 13 #define SOUND_US (double)340.29/1000000
el14tt 2:548b60c4cc15 14
eencae 0:b729d2ce03bd 15 SRF02::SRF02(PinName sdaPin, PinName sclPin)
eencae 0:b729d2ce03bd 16 {
eencae 0:b729d2ce03bd 17 i2c = new I2C(sdaPin,sclPin); // create new I2C instance and initialise
eencae 0:b729d2ce03bd 18 i2c->frequency(400000); // I2C Fast Mode - 400kHz
eencae 0:b729d2ce03bd 19 leds = new BusOut(LED4,LED3,LED2,LED1);
eencae 0:b729d2ce03bd 20
eencae 0:b729d2ce03bd 21 }
eencae 0:b729d2ce03bd 22
eencae 0:b729d2ce03bd 23 int SRF02::getDistanceCm()
eencae 0:b729d2ce03bd 24 {
eencae 0:b729d2ce03bd 25 char data[2];
eencae 0:b729d2ce03bd 26
eencae 0:b729d2ce03bd 27 // need to send CM command to command register
eencae 0:b729d2ce03bd 28 data[0] = CMD_REG;
eencae 0:b729d2ce03bd 29 data[1] = CM_CMD;
eencae 0:b729d2ce03bd 30 int ack = i2c->write(SRF02_W_ADD,data,2);
eencae 0:b729d2ce03bd 31 if (ack)
eencae 0:b729d2ce03bd 32 error(); // if we don't receive acknowledgement, flash error message
eencae 0:b729d2ce03bd 33
eencae 0:b729d2ce03bd 34 // this will start the sensor ranging, the datasheet suggests a delay of at least 65 ms before reading the result
eencae 0:b729d2ce03bd 35 wait_ms(70);
eencae 0:b729d2ce03bd 36
eencae 0:b729d2ce03bd 37 // we can now read the result - tell the sensor we want the high byte
eencae 0:b729d2ce03bd 38 char reg = RANGE_H_REG;
eencae 0:b729d2ce03bd 39 ack = i2c->write(SRF02_W_ADD,&reg,1);
eencae 0:b729d2ce03bd 40 if (ack)
eencae 0:b729d2ce03bd 41 error(); // if we don't receive acknowledgement, flash error message
eencae 0:b729d2ce03bd 42
eencae 0:b729d2ce03bd 43 // if we read two bytes, the register is automatically incremented (H and L)
eencae 0:b729d2ce03bd 44 ack = i2c->read(SRF02_R_ADD,data,2);
eencae 0:b729d2ce03bd 45 if (ack)
eencae 0:b729d2ce03bd 46 error(); // if we don't receive acknowledgement, flash error message
eencae 0:b729d2ce03bd 47
eencae 0:b729d2ce03bd 48 // high byte is first, then low byte, so combine into 16-bit value
eencae 0:b729d2ce03bd 49 return (data[0] << 8) | data[1];
eencae 0:b729d2ce03bd 50 }
eencae 0:b729d2ce03bd 51
el14tt 2:548b60c4cc15 52
el14tt 2:548b60c4cc15 53
el14tt 2:548b60c4cc15 54
eencae 0:b729d2ce03bd 55 void SRF02::error()
eencae 0:b729d2ce03bd 56 {
eencae 0:b729d2ce03bd 57 while(1) {
eencae 0:b729d2ce03bd 58 leds->write(15);
eencae 0:b729d2ce03bd 59 wait(0.1);
eencae 0:b729d2ce03bd 60 leds->write(0);
eencae 0:b729d2ce03bd 61 wait(0.1);
eencae 0:b729d2ce03bd 62 }
eencae 0:b729d2ce03bd 63 }