commands for SRF02 sensor

Fork of SRF02 by Craig Evans

Committer:
sjaffal3
Date:
Fri May 08 15:41:19 2015 +0000
Revision:
3:d571cee468e9
Parent:
2:284c0564fc75
before beep

Who changed what in which revision?

UserRevisionLine numberNew 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,&reg,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
eencae 0:b729d2ce03bd 47 void SRF02::error()
eencae 0:b729d2ce03bd 48 {
eencae 0:b729d2ce03bd 49 while(1) {
eencae 0:b729d2ce03bd 50 leds->write(15);
eencae 0:b729d2ce03bd 51 wait(0.1);
eencae 0:b729d2ce03bd 52 leds->write(0);
eencae 0:b729d2ce03bd 53 wait(0.1);
eencae 0:b729d2ce03bd 54 }
sjaffal3 2:284c0564fc75 55 }
sjaffal3 3:d571cee468e9 56
sjaffal3 3:d571cee468e9 57 int SRF02::getDistanceIn()
sjaffal3 2:284c0564fc75 58 {
sjaffal3 2:284c0564fc75 59 char data[2];
sjaffal3 2:284c0564fc75 60
sjaffal3 2:284c0564fc75 61 // need to send CM command to command register
sjaffal3 2:284c0564fc75 62 data[0] = CMD_REG;
sjaffal3 2:284c0564fc75 63 data[1] = INCH_CMD;
sjaffal3 2:284c0564fc75 64 int ack = i2c->write(SRF02_W_ADD,data,2);
sjaffal3 2:284c0564fc75 65 if (ack)
sjaffal3 2:284c0564fc75 66 error(); // if we don't receive acknowledgement, flash error message
sjaffal3 2:284c0564fc75 67
sjaffal3 2:284c0564fc75 68 // this will start the sensor ranging, the datasheet suggests a delay of at least 65 ms before reading the result
sjaffal3 2:284c0564fc75 69 wait_ms(70);
sjaffal3 2:284c0564fc75 70
sjaffal3 2:284c0564fc75 71 // we can now read the result - tell the sensor we want the high byte
sjaffal3 2:284c0564fc75 72 char reg = RANGE_H_REG;
sjaffal3 2:284c0564fc75 73 ack = i2c->write(SRF02_W_ADD,&reg,1);
sjaffal3 2:284c0564fc75 74 if (ack)
sjaffal3 2:284c0564fc75 75 error(); // if we don't receive acknowledgement, flash error message
sjaffal3 2:284c0564fc75 76
sjaffal3 2:284c0564fc75 77 // if we read two bytes, the register is automatically incremented (H and L)
sjaffal3 2:284c0564fc75 78 ack = i2c->read(SRF02_R_ADD,data,2);
sjaffal3 2:284c0564fc75 79 if (ack)
sjaffal3 2:284c0564fc75 80 error(); // if we don't receive acknowledgement, flash error message
sjaffal3 2:284c0564fc75 81
sjaffal3 2:284c0564fc75 82 // high byte is first, then low byte, so combine into 16-bit value
sjaffal3 2:284c0564fc75 83 return (data[0] << 8) | data[1];
sjaffal3 3:d571cee468e9 84 }
sjaffal3 2:284c0564fc75 85
sjaffal3 3:d571cee468e9 86 int SRF02::getDistanceUs()
sjaffal3 3:d571cee468e9 87 {
sjaffal3 3:d571cee468e9 88 char data[2];
sjaffal3 3:d571cee468e9 89
sjaffal3 3:d571cee468e9 90 // need to send CM command to command register
sjaffal3 3:d571cee468e9 91 data[0] = CMD_REG;
sjaffal3 3:d571cee468e9 92 data[1] = US_CMD;
sjaffal3 3:d571cee468e9 93 int ack = i2c->write(SRF02_W_ADD,data,2);
sjaffal3 3:d571cee468e9 94 if (ack)
sjaffal3 3:d571cee468e9 95 error(); // if we don't receive acknowledgement, flash error message
sjaffal3 3:d571cee468e9 96
sjaffal3 3:d571cee468e9 97 // this will start the sensor ranging, the datasheet suggests a delay of at least 65 ms before reading the result
sjaffal3 3:d571cee468e9 98 wait_ms(70);
sjaffal3 3:d571cee468e9 99
sjaffal3 3:d571cee468e9 100 // we can now read the result - tell the sensor we want the high byte
sjaffal3 3:d571cee468e9 101 char reg = RANGE_H_REG;
sjaffal3 3:d571cee468e9 102 ack = i2c->write(SRF02_W_ADD,&reg,1);
sjaffal3 3:d571cee468e9 103 if (ack)
sjaffal3 3:d571cee468e9 104 error(); // if we don't receive acknowledgement, flash error message
sjaffal3 3:d571cee468e9 105
sjaffal3 3:d571cee468e9 106 // if we read two bytes, the register is automatically incremented (H and L)
sjaffal3 3:d571cee468e9 107 ack = i2c->read(SRF02_R_ADD,data,2);
sjaffal3 3:d571cee468e9 108 if (ack)
sjaffal3 3:d571cee468e9 109 error(); // if we don't receive acknowledgement, flash error message
sjaffal3 2:284c0564fc75 110
sjaffal3 3:d571cee468e9 111 // high byte is first, then low byte, so combine into 16-bit value
sjaffal3 3:d571cee468e9 112 return (data[0] << 8) | data[1];
sjaffal3 3:d571cee468e9 113 }
sjaffal3 3:d571cee468e9 114