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:
Tue May 22 19:43:09 2018 +0000
Branch:
DistanceRegulation
Revision:
41:5fe200d20022
Parent:
40:0aa1cefe80ab
final updates

Who changed what in which revision?

UserRevisionLine numberNew contents of line
edy05 0:5cefadfd5898 1 #include "mbed.h"
edy05 2:d172c9963f87 2 #include "rtos.h"
edy05 2:d172c9963f87 3 #include "hardware.h"
edy05 2:d172c9963f87 4 #include "Server.h"
edy05 1:3a5a074b39e0 5 #include "PpmRegen.h"
edy05 2:d172c9963f87 6 #include "distanceRegulation.h"
edy05 2:d172c9963f87 7 #include "hcsr04.h"
edy05 41:5fe200d20022 8 #include "front_back_sensors.h"
edy05 2:d172c9963f87 9 #include "PID.h"
edy05 8:b5128641d4cf 10 #include "ConfigFile.h"
edy05 0:5cefadfd5898 11
edy05 8:b5128641d4cf 12 //TEMP
edy05 11:002927b2675d 13
edy05 0:5cefadfd5898 14
edy05 2:d172c9963f87 15 //VARIABLES
edy05 2:d172c9963f87 16 uint16_t ppmInChannelsValue[CHANNELS];
edy05 41:5fe200d20022 17
edy05 0:5cefadfd5898 18
edy05 0:5cefadfd5898 19 //FUNCTIONS
edy05 0:5cefadfd5898 20 void print_ppmIn(void);
edy05 0:5cefadfd5898 21
edy05 26:11539036f0fb 22
edy05 0:5cefadfd5898 23 int main(){
edy05 25:69190c222dbf 24 pc.baud(115200);
edy05 25:69190c222dbf 25
edy05 41:5fe200d20022 26 osThreadId mainID;
edy05 41:5fe200d20022 27 mainID = Thread::gettid();
edy05 41:5fe200d20022 28 pc.printf("main gettid 0x%08X \n\r", mainID);
edy05 41:5fe200d20022 29
edy05 3:6c9f80f5e865 30 // INITIALIZE CLASSES
edy05 41:5fe200d20022 31 _ppmRegen = new PpmRegen(_interruptPin);
edy05 36:ed8b7b7b6cfa 32 float rate = (1.0 / FLIGHT_CONTROLLER_FREQUENCY);
edy05 36:ed8b7b7b6cfa 33 _groundDistance = new PID(0, 0, 0, rate);
edy05 1:3a5a074b39e0 34
edy05 31:5f1737e480f3 35 //setup PID
edy05 31:5f1737e480f3 36 loadConfigFile();
edy05 32:c729e6da7f9a 37 _newP = _P;
edy05 32:c729e6da7f9a 38 _newI = _I;
edy05 32:c729e6da7f9a 39 _newD = _D;
edy05 39:93d8aa47f4ce 40 _newGroundSetPoint = _groundSetPoint;
edy05 31:5f1737e480f3 41 // to show values in web browser after first load
edy05 31:5f1737e480f3 42 _groundDistance->setInputLimits(0, 300);
edy05 31:5f1737e480f3 43 _groundDistance->setMode(AUTO_MODE);
edy05 31:5f1737e480f3 44 _groundDistance->setTunings(_P, _I, _D);
edy05 31:5f1737e480f3 45 _groundDistance->setOutputLimits(_groundPidMinOutput, _groundPidMaxOutput);
edy05 31:5f1737e480f3 46 _groundDistance->setBias(_bias);
edy05 31:5f1737e480f3 47
edy05 3:6c9f80f5e865 48 // STARTING THREADS
edy05 33:a2f9fea05cb9 49 pc.printf("starting distance thread \n\r");
edy05 27:5956d5e3ff63 50 _distanceThread = new Thread(distanceRegulationThread);
edy05 41:5fe200d20022 51 osThreadId distanceID;
edy05 41:5fe200d20022 52 pc.printf("distance gettid 0x%08X \n\r", distanceID);
edy05 27:5956d5e3ff63 53 _distanceThread->set_priority(osPriorityRealtime);
edy05 34:5dca557e982f 54
edy05 34:5dca557e982f 55 //_sonic = new HCSR04(p7, p8, p5, p6);
edy05 40:0aa1cefe80ab 56 _sonic = new HCSR04(p5, p6);
edy05 40:0aa1cefe80ab 57
edy05 40:0aa1cefe80ab 58 //_frontSensorThread.start(front_sensor);
edy05 40:0aa1cefe80ab 59 //_frontSensorThread.set_priority(osPriorityHigh);
edy05 40:0aa1cefe80ab 60
edy05 40:0aa1cefe80ab 61 //_leftSensorThread.start(left_sensor);
edy05 40:0aa1cefe80ab 62 //_leftSensorThread.set_priority(osPriorityHigh);
edy05 34:5dca557e982f 63
edy05 41:5fe200d20022 64 pc.printf("Starting sonic threads \n\r");
edy05 40:0aa1cefe80ab 65 _frontSensorThread.start(callback(semaphore_thread, (void *)"frontSensor"));
edy05 40:0aa1cefe80ab 66 _backSensorThread.start(callback(semaphore_thread, (void *)"backSensor"));
edy05 40:0aa1cefe80ab 67 _frontSensorThread.set_priority(osPriorityHigh);
edy05 40:0aa1cefe80ab 68 _backSensorThread.set_priority(osPriorityHigh);
edy05 40:0aa1cefe80ab 69
edy05 40:0aa1cefe80ab 70
edy05 34:5dca557e982f 71
edy05 34:5dca557e982f 72
edy05 34:5dca557e982f 73 pc.printf("starting server thread \n\r");
edy05 41:5fe200d20022 74 osThreadId serverID;
edy05 41:5fe200d20022 75 pc.printf("server gettid 0x%08X \n\r", serverID);
edy05 34:5dca557e982f 76 _serverThread.start(serverRun);
edy05 34:5dca557e982f 77 _serverThread.set_priority(osPriorityHigh);
edy05 34:5dca557e982f 78
edy05 26:11539036f0fb 79 //distanceRegulation.start(2);
edy05 27:5956d5e3ff63 80 //_distanceThread.start(distanceRegulationTask);
edy05 2:d172c9963f87 81
edy05 26:11539036f0fb 82 //wait(1);
edy05 3:6c9f80f5e865 83
edy05 41:5fe200d20022 84
edy05 0:5cefadfd5898 85 while(1){
edy05 3:6c9f80f5e865 86 Thread::wait(osWaitForever);
edy05 0:5cefadfd5898 87 }
edy05 0:5cefadfd5898 88
edy05 0:5cefadfd5898 89 }
edy05 0:5cefadfd5898 90
edy05 2:d172c9963f87 91
edy05 0:5cefadfd5898 92 void print_ppmIn(){
edy05 2:d172c9963f87 93 _ppmRegen->getAllChannels(ppmInChannelsValue);
edy05 2:d172c9963f87 94 for(uint8_t channel= 0; channel < CHANNELS; channel++){
edy05 0:5cefadfd5898 95 pc.printf("PPM In Channel %d: %d \n\r", channel, ppmInChannelsValue[channel]);
edy05 0:5cefadfd5898 96 }
edy05 0:5cefadfd5898 97 pc.printf("\n\r");
edy05 0:5cefadfd5898 98 }