NOT FINISHED YET!!! My first try to get a self built fully working Quadrocopter based on an mbed, a self built frame and some other more or less cheap parts.

Dependencies:   mbed MODI2C

Committer:
maetugr
Date:
Thu Apr 04 14:25:21 2013 +0000
Revision:
33:fd98776b6cc7
Parent:
29:8b7362a2ee14
Child:
34:3aa1cbcde59d
New version developed in eastern holidays, ported Madgwick Filter, added support for chaning PID values while flying over bluetooth, still not flying stable or even controllable

Who changed what in which revision?

UserRevisionLine numberNew contents of line
maetugr 7:9d4313510646 1 #include "RC_Channel.h"
maetugr 7:9d4313510646 2 #include "mbed.h"
maetugr 7:9d4313510646 3
maetugr 27:9e546fa47c33 4 RC_Channel::RC_Channel(PinName mypin, int index) : myinterrupt(mypin)
maetugr 7:9d4313510646 5 {
maetugr 27:9e546fa47c33 6 RC_Channel::index = index;
maetugr 28:ba6ca9f4def4 7 time = -100; // start value to see if there was any value yet
maetugr 27:9e546fa47c33 8
maetugr 27:9e546fa47c33 9 loadCalibrationValue(&scale, "SCALE");
maetugr 29:8b7362a2ee14 10 loadCalibrationValue(&offset, "OFFSE");
maetugr 27:9e546fa47c33 11
maetugr 7:9d4313510646 12 myinterrupt.rise(this, &RC_Channel::rise);
maetugr 7:9d4313510646 13 myinterrupt.fall(this, &RC_Channel::fall);
maetugr 15:753c5d6a63b3 14 timeoutchecker.attach(this, &RC_Channel::timeoutcheck, 1);
maetugr 7:9d4313510646 15 }
maetugr 7:9d4313510646 16
maetugr 7:9d4313510646 17 int RC_Channel::read()
maetugr 7:9d4313510646 18 {
maetugr 29:8b7362a2ee14 19 if(time == -100)
maetugr 29:8b7362a2ee14 20 return time;
maetugr 27:9e546fa47c33 21 return scale * (float)(time) + offset; // calibration of the readings
maetugr 7:9d4313510646 22 }
maetugr 7:9d4313510646 23
maetugr 7:9d4313510646 24 void RC_Channel::rise()
maetugr 7:9d4313510646 25 {
maetugr 7:9d4313510646 26 timer.start();
maetugr 7:9d4313510646 27 }
maetugr 7:9d4313510646 28
maetugr 7:9d4313510646 29 void RC_Channel::fall()
maetugr 7:9d4313510646 30 {
maetugr 7:9d4313510646 31 timer.stop();
maetugr 12:67a06c9b69d5 32 int tester = timer.read_us();
maetugr 12:67a06c9b69d5 33 if(tester >= 1000 && tester <=2000)
maetugr 27:9e546fa47c33 34 time = tester-1000; // we want only the signal from 1000 on
maetugr 7:9d4313510646 35 timer.reset();
maetugr 10:953afcbcebfc 36 timer.start();
maetugr 10:953afcbcebfc 37 }
maetugr 10:953afcbcebfc 38
maetugr 10:953afcbcebfc 39 void RC_Channel::timeoutcheck()
maetugr 10:953afcbcebfc 40 {
maetugr 10:953afcbcebfc 41 if (timer.read() > 0.3)
maetugr 21:c2a2e7cbabdd 42 time = -100;
maetugr 27:9e546fa47c33 43 }
maetugr 27:9e546fa47c33 44
maetugr 27:9e546fa47c33 45 void RC_Channel::saveCalibrationValue(float * value, char * fileextension)
maetugr 27:9e546fa47c33 46 {
maetugr 27:9e546fa47c33 47 char path[40];
maetugr 27:9e546fa47c33 48 sprintf(path, "/local/FlyBed/RC_%d_%s", index, fileextension);
maetugr 27:9e546fa47c33 49 FILE *fp = fopen(path, "w");
maetugr 27:9e546fa47c33 50 if (fp != NULL) {
maetugr 27:9e546fa47c33 51 fprintf(fp, "%f", value);
maetugr 27:9e546fa47c33 52 fclose(fp);
maetugr 27:9e546fa47c33 53 } else
maetugr 27:9e546fa47c33 54 value = 0;
maetugr 27:9e546fa47c33 55 }
maetugr 27:9e546fa47c33 56
maetugr 27:9e546fa47c33 57 void RC_Channel::loadCalibrationValue(float * value, char * fileextension)
maetugr 27:9e546fa47c33 58 {
maetugr 27:9e546fa47c33 59 char path[40];
maetugr 29:8b7362a2ee14 60 sprintf(path, "/local/RC%d%s", index, fileextension);
maetugr 27:9e546fa47c33 61 FILE *fp = fopen(path, "r");
maetugr 27:9e546fa47c33 62 if (fp != NULL) {
maetugr 27:9e546fa47c33 63 fscanf(fp, "%f", value);
maetugr 27:9e546fa47c33 64 fclose(fp);
maetugr 27:9e546fa47c33 65 } else
maetugr 27:9e546fa47c33 66 value = 0;
maetugr 7:9d4313510646 67 }