Used command byte to return distance in inches.
Dependents: 2ndYearProject-DistanceSensor
Fork of SRF02 by
SRF02.cpp@2:45d62ec49ee9, 2016-03-27 (annotated)
- Committer:
- ll13j7b
- Date:
- Sun Mar 27 22:48:51 2016 +0000
- Revision:
- 2:45d62ec49ee9
- Parent:
- 0:b729d2ce03bd
version 1.1
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 | |
eencae | 0:b729d2ce03bd | 18 | int SRF02::getDistanceCm() |
eencae | 0:b729d2ce03bd | 19 | { |
eencae | 0:b729d2ce03bd | 20 | char data[2]; |
eencae | 0:b729d2ce03bd | 21 | |
eencae | 0:b729d2ce03bd | 22 | // need to send CM command to command register |
eencae | 0:b729d2ce03bd | 23 | data[0] = CMD_REG; |
eencae | 0:b729d2ce03bd | 24 | data[1] = CM_CMD; |
eencae | 0:b729d2ce03bd | 25 | int ack = i2c->write(SRF02_W_ADD,data,2); |
eencae | 0:b729d2ce03bd | 26 | if (ack) |
eencae | 0:b729d2ce03bd | 27 | error(); // if we don't receive acknowledgement, flash error message |
eencae | 0:b729d2ce03bd | 28 | |
eencae | 0:b729d2ce03bd | 29 | // this will start the sensor ranging, the datasheet suggests a delay of at least 65 ms before reading the result |
eencae | 0:b729d2ce03bd | 30 | wait_ms(70); |
eencae | 0:b729d2ce03bd | 31 | |
eencae | 0:b729d2ce03bd | 32 | // we can now read the result - tell the sensor we want the high byte |
eencae | 0:b729d2ce03bd | 33 | char reg = RANGE_H_REG; |
eencae | 0:b729d2ce03bd | 34 | ack = i2c->write(SRF02_W_ADD,®,1); |
eencae | 0:b729d2ce03bd | 35 | if (ack) |
eencae | 0:b729d2ce03bd | 36 | error(); // if we don't receive acknowledgement, flash error message |
eencae | 0:b729d2ce03bd | 37 | |
eencae | 0:b729d2ce03bd | 38 | // if we read two bytes, the register is automatically incremented (H and L) |
eencae | 0:b729d2ce03bd | 39 | ack = i2c->read(SRF02_R_ADD,data,2); |
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 | // high byte is first, then low byte, so combine into 16-bit value |
eencae | 0:b729d2ce03bd | 44 | return (data[0] << 8) | data[1]; |
eencae | 0:b729d2ce03bd | 45 | } |
eencae | 0:b729d2ce03bd | 46 | |
ll13j7b | 2:45d62ec49ee9 | 47 | int SRF02::getDistanceInch() |
ll13j7b | 2:45d62ec49ee9 | 48 | { |
ll13j7b | 2:45d62ec49ee9 | 49 | char data[2]; |
ll13j7b | 2:45d62ec49ee9 | 50 | |
ll13j7b | 2:45d62ec49ee9 | 51 | // need to send CM command to command register |
ll13j7b | 2:45d62ec49ee9 | 52 | data[0] = CMD_REG; |
ll13j7b | 2:45d62ec49ee9 | 53 | data[1] = INCH_CMD; // setting the new command byte to inches |
ll13j7b | 2:45d62ec49ee9 | 54 | int ack = i2c->write(SRF02_W_ADD,data,2); |
ll13j7b | 2:45d62ec49ee9 | 55 | if (ack) |
ll13j7b | 2:45d62ec49ee9 | 56 | error(); // if we don't receive acknowledgement, flash error message |
ll13j7b | 2:45d62ec49ee9 | 57 | |
ll13j7b | 2:45d62ec49ee9 | 58 | // this will start the sensor ranging, the datasheet suggests a delay of at least 65 ms before reading the result |
ll13j7b | 2:45d62ec49ee9 | 59 | wait_ms(70); |
ll13j7b | 2:45d62ec49ee9 | 60 | |
ll13j7b | 2:45d62ec49ee9 | 61 | // we can now read the result - tell the sensor we want the high byte |
ll13j7b | 2:45d62ec49ee9 | 62 | char reg = RANGE_H_REG; |
ll13j7b | 2:45d62ec49ee9 | 63 | ack = i2c->write(SRF02_W_ADD,®,1); |
ll13j7b | 2:45d62ec49ee9 | 64 | if (ack) |
ll13j7b | 2:45d62ec49ee9 | 65 | error(); // if we don't receive acknowledgement, flash error message |
ll13j7b | 2:45d62ec49ee9 | 66 | |
ll13j7b | 2:45d62ec49ee9 | 67 | // if we read two bytes, the register is automatically incremented (H and L) |
ll13j7b | 2:45d62ec49ee9 | 68 | ack = i2c->read(SRF02_R_ADD,data,2); |
ll13j7b | 2:45d62ec49ee9 | 69 | if (ack) |
ll13j7b | 2:45d62ec49ee9 | 70 | error(); // if we don't receive acknowledgement, flash error message |
ll13j7b | 2:45d62ec49ee9 | 71 | |
ll13j7b | 2:45d62ec49ee9 | 72 | // high byte is first, then low byte, so combine into 16-bit value |
ll13j7b | 2:45d62ec49ee9 | 73 | return (data[0] << 8) | data[1]; |
ll13j7b | 2:45d62ec49ee9 | 74 | } |
ll13j7b | 2:45d62ec49ee9 | 75 | |
ll13j7b | 2:45d62ec49ee9 | 76 | void SRF02::error() // error message ( flashing LED ) |
eencae | 0:b729d2ce03bd | 77 | { |
eencae | 0:b729d2ce03bd | 78 | while(1) { |
eencae | 0:b729d2ce03bd | 79 | leds->write(15); |
eencae | 0:b729d2ce03bd | 80 | wait(0.1); |
eencae | 0:b729d2ce03bd | 81 | leds->write(0); |
eencae | 0:b729d2ce03bd | 82 | wait(0.1); |
eencae | 0:b729d2ce03bd | 83 | } |
eencae | 0:b729d2ce03bd | 84 | } |