Simple library for reading distance from SRF02 Ultrasonic Sensor in I2C mode. With the use of imperial readings too
Fork of SRF02 by
SRF02.cpp@3:78c8202f8929, 2016-04-15 (annotated)
- Committer:
- el15pjt
- Date:
- Fri Apr 15 13:24:10 2016 +0000
- Revision:
- 3:78c8202f8929
- Parent:
- 0:b729d2ce03bd
Menus added. Bug in buzzer still!
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
eencae | 0:b729d2ce03bd | 1 | /** |
eencae | 0:b729d2ce03bd | 2 | @file SRF02.cpp |
eencae | 0:b729d2ce03bd | 3 | |
eencae | 0:b729d2ce03bd | 4 | @brief Member functions implementations |
eencae | 0:b729d2ce03bd | 5 | |
eencae | 0:b729d2ce03bd | 6 | */ |
eencae | 0:b729d2ce03bd | 7 | #include "mbed.h" |
eencae | 0:b729d2ce03bd | 8 | #include "SRF02.h" |
eencae | 0:b729d2ce03bd | 9 | |
eencae | 0:b729d2ce03bd | 10 | SRF02::SRF02(PinName sdaPin, PinName sclPin) |
eencae | 0:b729d2ce03bd | 11 | { |
eencae | 0:b729d2ce03bd | 12 | i2c = new I2C(sdaPin,sclPin); // create new I2C instance and initialise |
eencae | 0:b729d2ce03bd | 13 | i2c->frequency(400000); // I2C Fast Mode - 400kHz |
eencae | 0:b729d2ce03bd | 14 | leds = new BusOut(LED4,LED3,LED2,LED1); |
eencae | 0:b729d2ce03bd | 15 | |
eencae | 0:b729d2ce03bd | 16 | } |
eencae | 0:b729d2ce03bd | 17 | |
el15pjt | 3:78c8202f8929 | 18 | int SRF02::getDistannceInch() |
el15pjt | 3:78c8202f8929 | 19 | { |
el15pjt | 3:78c8202f8929 | 20 | char data[2]; |
el15pjt | 3:78c8202f8929 | 21 | |
el15pjt | 3:78c8202f8929 | 22 | // need to send CM command to command register |
el15pjt | 3:78c8202f8929 | 23 | data[0] = CMD_REG; |
el15pjt | 3:78c8202f8929 | 24 | data[1] = INCH_CMD; |
el15pjt | 3:78c8202f8929 | 25 | int ack = i2c->write(SRF02_W_ADD,data,2); |
el15pjt | 3:78c8202f8929 | 26 | if (ack) |
el15pjt | 3:78c8202f8929 | 27 | error(); // if we don't receive acknowledgement, flash error message |
el15pjt | 3:78c8202f8929 | 28 | |
el15pjt | 3:78c8202f8929 | 29 | // this will start the sensor ranging, the datasheet suggests a delay of at least 65 ms before reading the result |
el15pjt | 3:78c8202f8929 | 30 | wait_ms(70); |
el15pjt | 3:78c8202f8929 | 31 | |
el15pjt | 3:78c8202f8929 | 32 | // we can now read the result - tell the sensor we want the high byte |
el15pjt | 3:78c8202f8929 | 33 | char reg = RANGE_H_REG; |
el15pjt | 3:78c8202f8929 | 34 | ack = i2c->write(SRF02_W_ADD,®,1); |
el15pjt | 3:78c8202f8929 | 35 | if (ack) |
el15pjt | 3:78c8202f8929 | 36 | error(); // if we don't receive acknowledgement, flash error message |
el15pjt | 3:78c8202f8929 | 37 | |
el15pjt | 3:78c8202f8929 | 38 | // if we read two bytes, the register is automatically incremented (H and L) |
el15pjt | 3:78c8202f8929 | 39 | ack = i2c->read(SRF02_R_ADD,data,2); |
el15pjt | 3:78c8202f8929 | 40 | if (ack) |
el15pjt | 3:78c8202f8929 | 41 | error(); // if we don't receive acknowledgement, flash error message |
el15pjt | 3:78c8202f8929 | 42 | |
el15pjt | 3:78c8202f8929 | 43 | // high byte is first, then low byte, so combine into 16-bit value |
el15pjt | 3:78c8202f8929 | 44 | return (data[0] << 8) | data[1]; |
el15pjt | 3:78c8202f8929 | 45 | } |
eencae | 0:b729d2ce03bd | 46 | int SRF02::getDistanceCm() |
eencae | 0:b729d2ce03bd | 47 | { |
eencae | 0:b729d2ce03bd | 48 | char data[2]; |
eencae | 0:b729d2ce03bd | 49 | |
eencae | 0:b729d2ce03bd | 50 | // need to send CM command to command register |
eencae | 0:b729d2ce03bd | 51 | data[0] = CMD_REG; |
eencae | 0:b729d2ce03bd | 52 | data[1] = CM_CMD; |
eencae | 0:b729d2ce03bd | 53 | int ack = i2c->write(SRF02_W_ADD,data,2); |
eencae | 0:b729d2ce03bd | 54 | if (ack) |
eencae | 0:b729d2ce03bd | 55 | error(); // if we don't receive acknowledgement, flash error message |
eencae | 0:b729d2ce03bd | 56 | |
eencae | 0:b729d2ce03bd | 57 | // this will start the sensor ranging, the datasheet suggests a delay of at least 65 ms before reading the result |
eencae | 0:b729d2ce03bd | 58 | wait_ms(70); |
eencae | 0:b729d2ce03bd | 59 | |
eencae | 0:b729d2ce03bd | 60 | // we can now read the result - tell the sensor we want the high byte |
eencae | 0:b729d2ce03bd | 61 | char reg = RANGE_H_REG; |
eencae | 0:b729d2ce03bd | 62 | ack = i2c->write(SRF02_W_ADD,®,1); |
eencae | 0:b729d2ce03bd | 63 | if (ack) |
eencae | 0:b729d2ce03bd | 64 | error(); // if we don't receive acknowledgement, flash error message |
eencae | 0:b729d2ce03bd | 65 | |
eencae | 0:b729d2ce03bd | 66 | // if we read two bytes, the register is automatically incremented (H and L) |
eencae | 0:b729d2ce03bd | 67 | ack = i2c->read(SRF02_R_ADD,data,2); |
eencae | 0:b729d2ce03bd | 68 | if (ack) |
eencae | 0:b729d2ce03bd | 69 | error(); // if we don't receive acknowledgement, flash error message |
eencae | 0:b729d2ce03bd | 70 | |
eencae | 0:b729d2ce03bd | 71 | // high byte is first, then low byte, so combine into 16-bit value |
eencae | 0:b729d2ce03bd | 72 | return (data[0] << 8) | data[1]; |
eencae | 0:b729d2ce03bd | 73 | } |
eencae | 0:b729d2ce03bd | 74 | |
eencae | 0:b729d2ce03bd | 75 | void SRF02::error() |
eencae | 0:b729d2ce03bd | 76 | { |
eencae | 0:b729d2ce03bd | 77 | while(1) { |
eencae | 0:b729d2ce03bd | 78 | leds->write(15); |
eencae | 0:b729d2ce03bd | 79 | wait(0.1); |
eencae | 0:b729d2ce03bd | 80 | leds->write(0); |
eencae | 0:b729d2ce03bd | 81 | wait(0.1); |
eencae | 0:b729d2ce03bd | 82 | } |
eencae | 0:b729d2ce03bd | 83 | } |