Based on Robinson Lopez Monzon library: This library contains all the functions necesary to perform an application using the SRF02 sensor. Modified by Dury: replaced wait() functions that are not usefull for program performance. Esta librería contiene los métodos necesarios para poder configurar todos los parámetros del sensor SRF02.
Fork of SRF02 by
SRF02.cpp@1:d624771f0bd3, 2013-02-09 (annotated)
- Committer:
- dury
- Date:
- Sat Feb 09 22:26:47 2013 +0000
- Revision:
- 1:d624771f0bd3
- Parent:
- 0:559a18121e83
This library contains all the functions necesary to perform an application using the SRF02 sensor.; Modified: replaced wait() functions that are not usefull for program performance.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nydus | 0:559a18121e83 | 1 | #include "SRF02.h" |
nydus | 0:559a18121e83 | 2 | |
dury | 1:d624771f0bd3 | 3 | SRF02::SRF02(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr) |
dury | 1:d624771f0bd3 | 4 | { |
dury | 1:d624771f0bd3 | 5 | } |
nydus | 0:559a18121e83 | 6 | |
dury | 1:d624771f0bd3 | 7 | SRF02::~SRF02() |
dury | 1:d624771f0bd3 | 8 | { |
nydus | 0:559a18121e83 | 9 | } |
nydus | 0:559a18121e83 | 10 | |
nydus | 0:559a18121e83 | 11 | //Get the data in centimeters |
dury | 1:d624771f0bd3 | 12 | int SRF02::readcm() |
dury | 1:d624771f0bd3 | 13 | { |
dury | 1:d624771f0bd3 | 14 | char cmd[2]; |
dury | 1:d624771f0bd3 | 15 | char eco_high[1],eco_low[1]; //this is because the sensor, sends the data in tow bytes, and you have tu read from two different registers 0x02 and 0x03; |
nydus | 0:559a18121e83 | 16 | |
nydus | 0:559a18121e83 | 17 | |
dury | 1:d624771f0bd3 | 18 | // Get range data from SRF02 in centimeters |
nydus | 0:559a18121e83 | 19 | cmd[0] = 0x00; |
nydus | 0:559a18121e83 | 20 | cmd[1] = 0x51; |
nydus | 0:559a18121e83 | 21 | m_i2c.write(m_addr, cmd, 2); |
nydus | 0:559a18121e83 | 22 | |
dury | 1:d624771f0bd3 | 23 | wait_ranging(); |
nydus | 0:559a18121e83 | 24 | |
nydus | 0:559a18121e83 | 25 | |
nydus | 0:559a18121e83 | 26 | cmd[0] = 0x02; |
nydus | 0:559a18121e83 | 27 | m_i2c.write(m_addr, cmd, 1, 1); |
nydus | 0:559a18121e83 | 28 | m_i2c.read(m_addr, eco_high, 1); |
nydus | 0:559a18121e83 | 29 | |
nydus | 0:559a18121e83 | 30 | cmd[0] = 0x03; |
nydus | 0:559a18121e83 | 31 | m_i2c.write(m_addr,cmd,1,1); |
nydus | 0:559a18121e83 | 32 | m_i2c.read(m_addr,eco_low,1); |
nydus | 0:559a18121e83 | 33 | |
nydus | 0:559a18121e83 | 34 | int range = (eco_high[0]<<8)|eco_low[0]; |
nydus | 0:559a18121e83 | 35 | |
nydus | 0:559a18121e83 | 36 | return range; |
nydus | 0:559a18121e83 | 37 | } |
nydus | 0:559a18121e83 | 38 | |
nydus | 0:559a18121e83 | 39 | //Get the data in inches |
dury | 1:d624771f0bd3 | 40 | int SRF02::readinch() |
dury | 1:d624771f0bd3 | 41 | { |
dury | 1:d624771f0bd3 | 42 | char cmd[2]; |
dury | 1:d624771f0bd3 | 43 | char eco_high[1],eco_low[1]; //this is because the sensor, sends the data in tow bytes, and you have tu read from two different registers 0x02 and 0x03; |
nydus | 0:559a18121e83 | 44 | |
nydus | 0:559a18121e83 | 45 | cmd[0] = 0x00; |
nydus | 0:559a18121e83 | 46 | cmd[1] = 0x50; |
nydus | 0:559a18121e83 | 47 | m_i2c.write(m_addr, cmd, 2); |
nydus | 0:559a18121e83 | 48 | |
dury | 1:d624771f0bd3 | 49 | wait_ranging(); |
dury | 1:d624771f0bd3 | 50 | |
nydus | 0:559a18121e83 | 51 | cmd[0] = 0x02; |
nydus | 0:559a18121e83 | 52 | m_i2c.write(m_addr, cmd, 1, 1); |
nydus | 0:559a18121e83 | 53 | m_i2c.read(m_addr, eco_high, 1); |
nydus | 0:559a18121e83 | 54 | |
nydus | 0:559a18121e83 | 55 | cmd[0] = 0x03; |
nydus | 0:559a18121e83 | 56 | m_i2c.write(m_addr,cmd,1,1); |
nydus | 0:559a18121e83 | 57 | m_i2c.read(m_addr,eco_low,1); |
nydus | 0:559a18121e83 | 58 | |
nydus | 0:559a18121e83 | 59 | int range = (eco_high[0]<<8)|eco_low[0]; |
nydus | 0:559a18121e83 | 60 | |
nydus | 0:559a18121e83 | 61 | return range; |
nydus | 0:559a18121e83 | 62 | } |
nydus | 0:559a18121e83 | 63 | |
nydus | 0:559a18121e83 | 64 | //Change adress of the device. Remember to have only one sensor conected to execute this method. |
dury | 1:d624771f0bd3 | 65 | void SRF02::change_addr(char new_addr) |
dury | 1:d624771f0bd3 | 66 | { |
dury | 1:d624771f0bd3 | 67 | char cmd[2]; |
nydus | 0:559a18121e83 | 68 | |
nydus | 0:559a18121e83 | 69 | cmd[0]=0x00; |
nydus | 0:559a18121e83 | 70 | cmd[1]=0xA0; |
nydus | 0:559a18121e83 | 71 | m_i2c.write(m_addr,cmd,2); |
nydus | 0:559a18121e83 | 72 | cmd[0]=0x00; |
nydus | 0:559a18121e83 | 73 | cmd[1]=0xAA; |
nydus | 0:559a18121e83 | 74 | m_i2c.write(m_addr,cmd,2); |
nydus | 0:559a18121e83 | 75 | cmd[0]=0x00; |
nydus | 0:559a18121e83 | 76 | cmd[1]=0xA5; |
nydus | 0:559a18121e83 | 77 | m_i2c.write(m_addr,cmd,2); |
nydus | 0:559a18121e83 | 78 | cmd[0]=0x00; |
nydus | 0:559a18121e83 | 79 | cmd[1]=new_addr; |
nydus | 0:559a18121e83 | 80 | m_i2c.write(m_addr,cmd,2); |
nydus | 0:559a18121e83 | 81 | |
nydus | 0:559a18121e83 | 82 | } |
dury | 1:d624771f0bd3 | 83 | |
dury | 1:d624771f0bd3 | 84 | void SRF02::wait_ranging(void) |
dury | 1:d624771f0bd3 | 85 | { |
dury | 1:d624771f0bd3 | 86 | char eco; |
dury | 1:d624771f0bd3 | 87 | |
dury | 1:d624771f0bd3 | 88 | do { |
dury | 1:d624771f0bd3 | 89 | eco=m_i2c.read(1); |
dury | 1:d624771f0bd3 | 90 | }while(eco == 0xff); |
dury | 1:d624771f0bd3 | 91 | } |
nydus | 0:559a18121e83 | 92 |