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 Fabio Durigon

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?

UserRevisionLine numberNew 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