![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Regenerating PPM signal based on distances from ultrasonic sensors, ESP8266 for connectin via wifi. Autonomous quadcopter behaviour, autonomou height holding. Flying direction based on front and back ultrasonic sensors.
Dependencies: ConfigFile HCSR04 PID PPM2 mbed-rtos mbed
SRFO2/SRFO2.cpp@2:d172c9963f87, 2017-10-26 (annotated)
- Committer:
- edy05
- Date:
- Thu Oct 26 15:54:47 2017 +0000
- Revision:
- 2:d172c9963f87
stable release with distanceRegulation thread
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
edy05 | 2:d172c9963f87 | 1 | #include "srf02.h" |
edy05 | 2:d172c9963f87 | 2 | |
edy05 | 2:d172c9963f87 | 3 | SRF02::SRF02(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr) |
edy05 | 2:d172c9963f87 | 4 | { |
edy05 | 2:d172c9963f87 | 5 | } |
edy05 | 2:d172c9963f87 | 6 | |
edy05 | 2:d172c9963f87 | 7 | SRF02::~SRF02() |
edy05 | 2:d172c9963f87 | 8 | { |
edy05 | 2:d172c9963f87 | 9 | } |
edy05 | 2:d172c9963f87 | 10 | |
edy05 | 2:d172c9963f87 | 11 | //Get the data in centimeters |
edy05 | 2:d172c9963f87 | 12 | int SRF02::readcm() |
edy05 | 2:d172c9963f87 | 13 | { |
edy05 | 2:d172c9963f87 | 14 | char cmd[2]; |
edy05 | 2:d172c9963f87 | 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; |
edy05 | 2:d172c9963f87 | 16 | |
edy05 | 2:d172c9963f87 | 17 | |
edy05 | 2:d172c9963f87 | 18 | // Get range data from SRF02 in centimeters |
edy05 | 2:d172c9963f87 | 19 | cmd[0] = 0x00; |
edy05 | 2:d172c9963f87 | 20 | cmd[1] = 0x51; |
edy05 | 2:d172c9963f87 | 21 | m_i2c.write(m_addr, cmd, 2); |
edy05 | 2:d172c9963f87 | 22 | |
edy05 | 2:d172c9963f87 | 23 | wait_ranging(); |
edy05 | 2:d172c9963f87 | 24 | |
edy05 | 2:d172c9963f87 | 25 | |
edy05 | 2:d172c9963f87 | 26 | cmd[0] = 0x02; |
edy05 | 2:d172c9963f87 | 27 | m_i2c.write(m_addr, cmd, 1, 1); |
edy05 | 2:d172c9963f87 | 28 | m_i2c.read(m_addr, eco_high, 1); |
edy05 | 2:d172c9963f87 | 29 | |
edy05 | 2:d172c9963f87 | 30 | cmd[0] = 0x03; |
edy05 | 2:d172c9963f87 | 31 | m_i2c.write(m_addr,cmd,1,1); |
edy05 | 2:d172c9963f87 | 32 | m_i2c.read(m_addr,eco_low,1); |
edy05 | 2:d172c9963f87 | 33 | |
edy05 | 2:d172c9963f87 | 34 | int range = (eco_high[0]<<8)|eco_low[0]; |
edy05 | 2:d172c9963f87 | 35 | |
edy05 | 2:d172c9963f87 | 36 | return range; |
edy05 | 2:d172c9963f87 | 37 | } |
edy05 | 2:d172c9963f87 | 38 | |
edy05 | 2:d172c9963f87 | 39 | //Get the data in inches |
edy05 | 2:d172c9963f87 | 40 | int SRF02::readinch() |
edy05 | 2:d172c9963f87 | 41 | { |
edy05 | 2:d172c9963f87 | 42 | char cmd[2]; |
edy05 | 2:d172c9963f87 | 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; |
edy05 | 2:d172c9963f87 | 44 | |
edy05 | 2:d172c9963f87 | 45 | cmd[0] = 0x00; |
edy05 | 2:d172c9963f87 | 46 | cmd[1] = 0x50; |
edy05 | 2:d172c9963f87 | 47 | m_i2c.write(m_addr, cmd, 2); |
edy05 | 2:d172c9963f87 | 48 | |
edy05 | 2:d172c9963f87 | 49 | wait_ranging(); |
edy05 | 2:d172c9963f87 | 50 | |
edy05 | 2:d172c9963f87 | 51 | cmd[0] = 0x02; |
edy05 | 2:d172c9963f87 | 52 | m_i2c.write(m_addr, cmd, 1, 1); |
edy05 | 2:d172c9963f87 | 53 | m_i2c.read(m_addr, eco_high, 1); |
edy05 | 2:d172c9963f87 | 54 | |
edy05 | 2:d172c9963f87 | 55 | cmd[0] = 0x03; |
edy05 | 2:d172c9963f87 | 56 | m_i2c.write(m_addr,cmd,1,1); |
edy05 | 2:d172c9963f87 | 57 | m_i2c.read(m_addr,eco_low,1); |
edy05 | 2:d172c9963f87 | 58 | |
edy05 | 2:d172c9963f87 | 59 | int range = (eco_high[0]<<8)|eco_low[0]; |
edy05 | 2:d172c9963f87 | 60 | |
edy05 | 2:d172c9963f87 | 61 | return range; |
edy05 | 2:d172c9963f87 | 62 | } |
edy05 | 2:d172c9963f87 | 63 | |
edy05 | 2:d172c9963f87 | 64 | //Change adress of the device. Remember to have only one sensor conected to execute this method. |
edy05 | 2:d172c9963f87 | 65 | void SRF02::change_addr(char new_addr) |
edy05 | 2:d172c9963f87 | 66 | { |
edy05 | 2:d172c9963f87 | 67 | char cmd[2]; |
edy05 | 2:d172c9963f87 | 68 | |
edy05 | 2:d172c9963f87 | 69 | cmd[0]=0x00; |
edy05 | 2:d172c9963f87 | 70 | cmd[1]=0xA0; |
edy05 | 2:d172c9963f87 | 71 | m_i2c.write(m_addr,cmd,2); |
edy05 | 2:d172c9963f87 | 72 | cmd[0]=0x00; |
edy05 | 2:d172c9963f87 | 73 | cmd[1]=0xAA; |
edy05 | 2:d172c9963f87 | 74 | m_i2c.write(m_addr,cmd,2); |
edy05 | 2:d172c9963f87 | 75 | cmd[0]=0x00; |
edy05 | 2:d172c9963f87 | 76 | cmd[1]=0xA5; |
edy05 | 2:d172c9963f87 | 77 | m_i2c.write(m_addr,cmd,2); |
edy05 | 2:d172c9963f87 | 78 | cmd[0]=0x00; |
edy05 | 2:d172c9963f87 | 79 | cmd[1]=new_addr; |
edy05 | 2:d172c9963f87 | 80 | m_i2c.write(m_addr,cmd,2); |
edy05 | 2:d172c9963f87 | 81 | |
edy05 | 2:d172c9963f87 | 82 | } |
edy05 | 2:d172c9963f87 | 83 | |
edy05 | 2:d172c9963f87 | 84 | void SRF02::wait_ranging(void) |
edy05 | 2:d172c9963f87 | 85 | { |
edy05 | 2:d172c9963f87 | 86 | char eco; |
edy05 | 2:d172c9963f87 | 87 | |
edy05 | 2:d172c9963f87 | 88 | do { |
edy05 | 2:d172c9963f87 | 89 | eco=m_i2c.read(1); |
edy05 | 2:d172c9963f87 | 90 | }while(eco == 0xff); |
edy05 | 2:d172c9963f87 | 91 | } |