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

Revision:
12:67a06c9b69d5
Parent:
11:9bf69bc6df45
Child:
13:4737ee9ebfee
--- a/main.cpp	Thu Oct 18 20:04:16 2012 +0000
+++ b/main.cpp	Sat Oct 20 17:28:28 2012 +0000
@@ -13,6 +13,8 @@
 #define Rad2Deg         57.295779513082320876798154814105
 #define RATE            0.02 // speed of Ticker/PID
 
+//#define COMPASSCALIBRATE
+
 Timer GlobalTimer; // global time to calculate processing speed
 Ticker Datagetter; // timecontrolled interrupt to get data form IMU and RC
 PID controller(1.0, 0.0, 0.0, RATE); // test PID controller for throttle
@@ -29,10 +31,11 @@
 Servo       Motor[] = {(p15), (p16), (p17), (p18)};
 
 // variables for loop
-unsigned long   dt = 0;
-unsigned long   time_loop = 0;
+unsigned long   dt_get_data = 0;
+unsigned long   time_get_data = 0;
+unsigned long   dt_read_sensors = 0;
+unsigned long   time_read_sensors = 0;
 float           angle[3] = {0,0,0}; // angle 0: x,roll / 1: y,pitch / 2: z,yaw
-float           Comp_angle = 0;
 float           tempangle = 0;
 int             Motorvalue[3];
 
@@ -40,74 +43,92 @@
 
 void get_Data()
 {
+    time_read_sensors = GlobalTimer.read_us();
+    
     // read data from sensors
     Gyro.read();
     Acc.read();
     Comp.read();
-    Alt.Update();
-
-    //calculate angle for yaw from compass
-    //Comp_angle = Comp.getAngle(Comp.Mag[0], Comp.Mag[1]);
+    //Alt.Update();
+    
+    dt_read_sensors = GlobalTimer.read_us() - time_read_sensors;
     
     // meassure dt
-    dt = GlobalTimer.read_us() - time_loop; // time in us since last loop
-    time_loop = GlobalTimer.read_us();      // set new time for next measurement
+    dt_get_data = GlobalTimer.read_us() - time_get_data; // time in us since last loop
+    time_get_data = GlobalTimer.read_us();      // set new time for next measurement
     
     // calculate angles for roll, pitch an yaw
-    angle[0] += (Acc.angle[0] - angle[0])/50 + Gyro.data[0] *dt/15000000.0;
-    angle[1] += (Acc.angle[1]+3 - angle[1])/50 + Gyro.data[1] *dt/15000000.0;// TODO Offset accelerometer einstellen
-    tempangle += (Comp_angle - tempangle)/50 - Gyro.data[2] *dt/15000000.0;
-    angle[2] += Gyro.data[2] *dt/15000000.0; // gyro only here
+    angle[0] += (Acc.angle[0] - angle[0])/50 + Gyro.data[0] *dt_get_data/15000000.0;
+    angle[1] += (Acc.angle[1]+3 - angle[1])/50 + Gyro.data[1] *dt_get_data/15000000.0;// TODO Offset accelerometer einstellen
+    tempangle += (Comp.get_angle() - tempangle)/50 + Gyro.data[2] *dt_get_data/15000000.0;
+    angle[2] += Gyro.data[2] *dt_get_data/15000000.0; // gyro only here
+    
+    // TODO Read RC data
     
-    // Read RC data
-    controller.setProcessValue(RC[3 -1].read());
-    for (int j = 0; j < 4; j++)
-        Motorvalue[j] = controller.compute(); // throttle
-    
-    for (int j = 0; j < 4; j++)
-        Motor[j] = 1000 + 5*abs(angle[1]);//Motorvalue[j]; // set new motorspeeds
-    pid.setProcessValue(angle[0]);
-    pidtester = pid.compute();
+    // calculate new motorspeeds
+    /*
+    Motor[0] = 1000 + (100 + (angle[0] * 500/90)) * (RC[1].read() - 1000) / 1000;
+    Motor[1] = 1000 + (100 + (angle[1] * 500/90)) * (RC[1].read() - 1000) / 1000;
+    Motor[2] = 1000 + (100 - (angle[0] * 500/90)) * (RC[1].read() - 1000) / 1000;
+    Motor[3] = 1000 + (100 - (angle[1] * 500/90)) * (RC[1].read() - 1000) / 1000;
+    */
 }
 
 
 int main() {
+    //NVIC_SetPriority(TIMER3_IRQn, 2); // set priorty of tickers below hardware interrupts
+    
+    #ifdef COMPASSCALIBRATE
+        pc.locate(10,5);
+        pc.printf("CALIBRATING");
+        Comp.calibrate(60);
+    #endif
+    
     // init screen
     pc.locate(10,5);
     pc.printf("Flybed v0.2");
     LEDs.roll(2);
     
-    controller.setInputLimits(1000.0, 2000.0);
-    controller.setOutputLimits(1000.0, 2000.0);
-    controller.setMode(AUTO_MODE);
-    
-    pid.setInputLimits(-90.0, 90.0);
-    pid.setOutputLimits(-90.0, 90.0);
-    pid.setMode(AUTO_MODE);
-    pid.setSetPoint(0.0);
-    
     // Start!
     GlobalTimer.start();
-    Datagetter.attach(&get_Data, RATE);     // start to get data all 10ms
-    while(1) {
+    Datagetter.attach(&get_Data, RATE);     // start to get data all RATEms
+    
+    while(1) { 
         pc.locate(10,5); // PC output
-        pc.printf("dt:%dms  %6.1fm   ", dt/1000, Alt.CalcAltitude(Alt.Pressure));
+        pc.printf("dt:%dms   dt_sensors:%dus    Altitude:%6.1fm   ", dt_get_data/1000, dt_read_sensors, Alt.CalcAltitude(Alt.Pressure));
         pc.locate(10,8);
         pc.printf("Roll:%6.1f Pitch:%6.1f Yaw:%6.1f    ", angle[0], angle[1], angle[2]);
         pc.locate(10,9);
         pc.printf("ACC: Roll:%6.1f Pitch:%6.1f Yaw:%6.1f    ", Acc.angle[0], Acc.angle[1], Acc.angle[2]);
         pc.locate(10,10);
-        pc.printf("Debug_Yaw:  Comp:%6.1f tempangle:%6.1f  ", Comp_angle, tempangle);
+        pc.printf("Debug_Yaw:  Comp:%6.1f tempangle:%6.1f  ", Comp.get_angle(), tempangle);
         pc.locate(10,12);
-        pc.printf("Comp_data: %6.1f %6.1f %6.1f |||| %6.1f ", Comp.data[0], Comp.data[1], Comp.data[2], Comp.heading);
+        pc.printf("Comp_data: %6.1f %6.1f %6.1f |||| %6.1f ", Comp.data[0], Comp.data[1], Comp.data[2], Comp.get_angle());
         pc.locate(10,13);
         pc.printf("Comp_scale: %6.4f %6.4f %6.4f   ", Comp.scale[0], Comp.scale[1], Comp.scale[2]);
         pc.locate(10,15);
         pc.printf("pidtester: %6.1f   RC: %d %d %d %d     ", pidtester, RC[0].read(), RC[1].read(), RC[2].read(), RC[3].read());
-        pc.locate(10,18);
-        pc.printf("Max: %d %d %d     ", Comp.Max[0], Comp.Max[1], Comp.Max[2]);
+        
         pc.locate(10,19);
-        pc.printf("Min: %d %d %d     ", Comp.Min[0], Comp.Min[1], Comp.Min[2]);
+        pc.printf("RC0: %d :[", RC[0].read());
+        for (int i = 0; i < (RC[0].read() - 1000)/17; i++)
+            pc.printf("=");
+        pc.printf("                                                       ");
+        pc.locate(10,20);
+        pc.printf("RC1: %d :[", RC[1].read());
+        for (int i = 0; i < (RC[1].read() - 1000)/17; i++)
+            pc.printf("=");
+        pc.printf("                                                       ");
+        pc.locate(10,21);
+        pc.printf("RC2: %d :[", RC[2].read());
+        for (int i = 0; i < (RC[2].read() - 1000)/17; i++)
+            pc.printf("=");
+        pc.printf("                                                       ");
+        pc.locate(10,22);
+        pc.printf("RC3: %d :[", RC[3].read());
+        for (int i = 0; i < (RC[3].read() - 1000)/17; i++)
+            pc.printf("=");
+        pc.printf("                                                       ");
         LEDs.rollnext();
     }
 }