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@0:559a18121e83, 2011-02-25 (annotated)
- Committer:
- nydus
- Date:
- Fri Feb 25 17:23:42 2011 +0000
- Revision:
- 0:559a18121e83
- Child:
- 1:d624771f0bd3
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 | |
nydus | 0:559a18121e83 | 3 | |
nydus | 0:559a18121e83 | 4 | SRF02::SRF02(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr) { |
nydus | 0:559a18121e83 | 5 | } |
nydus | 0:559a18121e83 | 6 | |
nydus | 0:559a18121e83 | 7 | SRF02::~SRF02() { |
nydus | 0:559a18121e83 | 8 | |
nydus | 0:559a18121e83 | 9 | } |
nydus | 0:559a18121e83 | 10 | |
nydus | 0:559a18121e83 | 11 | //Get the data in centimeters |
nydus | 0:559a18121e83 | 12 | |
nydus | 0:559a18121e83 | 13 | int SRF02::readcm() { |
nydus | 0:559a18121e83 | 14 | |
nydus | 0:559a18121e83 | 15 | char cmd[2]; |
nydus | 0:559a18121e83 | 16 | 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 | 17 | |
nydus | 0:559a18121e83 | 18 | |
nydus | 0:559a18121e83 | 19 | // Get range data from SRF02 in centimeters |
nydus | 0:559a18121e83 | 20 | cmd[0] = 0x00; |
nydus | 0:559a18121e83 | 21 | cmd[1] = 0x51; |
nydus | 0:559a18121e83 | 22 | m_i2c.write(m_addr, cmd, 2); |
nydus | 0:559a18121e83 | 23 | |
nydus | 0:559a18121e83 | 24 | wait(0.07); |
nydus | 0:559a18121e83 | 25 | |
nydus | 0:559a18121e83 | 26 | |
nydus | 0:559a18121e83 | 27 | cmd[0] = 0x02; |
nydus | 0:559a18121e83 | 28 | m_i2c.write(m_addr, cmd, 1, 1); |
nydus | 0:559a18121e83 | 29 | m_i2c.read(m_addr, eco_high, 1); |
nydus | 0:559a18121e83 | 30 | |
nydus | 0:559a18121e83 | 31 | cmd[0] = 0x03; |
nydus | 0:559a18121e83 | 32 | m_i2c.write(m_addr,cmd,1,1); |
nydus | 0:559a18121e83 | 33 | m_i2c.read(m_addr,eco_low,1); |
nydus | 0:559a18121e83 | 34 | |
nydus | 0:559a18121e83 | 35 | int range = (eco_high[0]<<8)|eco_low[0]; |
nydus | 0:559a18121e83 | 36 | |
nydus | 0:559a18121e83 | 37 | return range; |
nydus | 0:559a18121e83 | 38 | } |
nydus | 0:559a18121e83 | 39 | |
nydus | 0:559a18121e83 | 40 | //Get the data in inches |
nydus | 0:559a18121e83 | 41 | |
nydus | 0:559a18121e83 | 42 | int SRF02::readinch() { |
nydus | 0:559a18121e83 | 43 | |
nydus | 0:559a18121e83 | 44 | char cmd[2]; |
nydus | 0:559a18121e83 | 45 | 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 | 46 | |
nydus | 0:559a18121e83 | 47 | |
nydus | 0:559a18121e83 | 48 | // Get range data from SRF02 in inches |
nydus | 0:559a18121e83 | 49 | cmd[0] = 0x00; |
nydus | 0:559a18121e83 | 50 | cmd[1] = 0x50; |
nydus | 0:559a18121e83 | 51 | m_i2c.write(m_addr, cmd, 2); |
nydus | 0:559a18121e83 | 52 | |
nydus | 0:559a18121e83 | 53 | wait(0.07); |
nydus | 0:559a18121e83 | 54 | |
nydus | 0:559a18121e83 | 55 | |
nydus | 0:559a18121e83 | 56 | cmd[0] = 0x02; |
nydus | 0:559a18121e83 | 57 | m_i2c.write(m_addr, cmd, 1, 1); |
nydus | 0:559a18121e83 | 58 | m_i2c.read(m_addr, eco_high, 1); |
nydus | 0:559a18121e83 | 59 | |
nydus | 0:559a18121e83 | 60 | cmd[0] = 0x03; |
nydus | 0:559a18121e83 | 61 | m_i2c.write(m_addr,cmd,1,1); |
nydus | 0:559a18121e83 | 62 | m_i2c.read(m_addr,eco_low,1); |
nydus | 0:559a18121e83 | 63 | |
nydus | 0:559a18121e83 | 64 | int range = (eco_high[0]<<8)|eco_low[0]; |
nydus | 0:559a18121e83 | 65 | |
nydus | 0:559a18121e83 | 66 | return range; |
nydus | 0:559a18121e83 | 67 | } |
nydus | 0:559a18121e83 | 68 | |
nydus | 0:559a18121e83 | 69 | void SRF02::change_addr(char new_addr){ |
nydus | 0:559a18121e83 | 70 | |
nydus | 0:559a18121e83 | 71 | //Change adress of the device. Remember to have only one sensor conected to execute this method. |
nydus | 0:559a18121e83 | 72 | |
nydus | 0:559a18121e83 | 73 | char cmd[2]; |
nydus | 0:559a18121e83 | 74 | |
nydus | 0:559a18121e83 | 75 | cmd[0]=0x00; |
nydus | 0:559a18121e83 | 76 | cmd[1]=0xA0; |
nydus | 0:559a18121e83 | 77 | m_i2c.write(m_addr,cmd,2); |
nydus | 0:559a18121e83 | 78 | cmd[0]=0x00; |
nydus | 0:559a18121e83 | 79 | cmd[1]=0xAA; |
nydus | 0:559a18121e83 | 80 | m_i2c.write(m_addr,cmd,2); |
nydus | 0:559a18121e83 | 81 | cmd[0]=0x00; |
nydus | 0:559a18121e83 | 82 | cmd[1]=0xA5; |
nydus | 0:559a18121e83 | 83 | m_i2c.write(m_addr,cmd,2); |
nydus | 0:559a18121e83 | 84 | cmd[0]=0x00; |
nydus | 0:559a18121e83 | 85 | cmd[1]=new_addr; |
nydus | 0:559a18121e83 | 86 | m_i2c.write(m_addr,cmd,2); |
nydus | 0:559a18121e83 | 87 | |
nydus | 0:559a18121e83 | 88 | } |
nydus | 0:559a18121e83 | 89 |