Simple library for reading distance from SRF02 Ultrasonic Sensor in I2C mode.
Fork of SRF02 by
SRF02.cpp@2:548b60c4cc15, 2016-05-04 (annotated)
- 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?
User | Revision | Line number | New 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,®,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 | } |