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

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?

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