Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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 | } |
