Quadcopter working with accelerômeter and accelerometer, and bluetooth radio for communication

Dependencies:   mbed

Revision:
0:56b8c86181b1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue May 21 14:12:13 2013 +0000
@@ -0,0 +1,315 @@
+#include "stddef.h"
+   
+const float dt = 0.005;
+
+Gyroscope gyroscope(new L3G4200D(p5, p6, p7, p8), 0.0175, dt);;
+Accelerometer accelerometer(new ADXL345(p5, p6, p7, p11), 256);;
+ComplementaryFilter ComplementaryFilterX(dt, 0.9995, 0.0005);;
+ComplementaryFilter ComplementaryFilterY(dt, 0.9995, 0.0005);;
+PID pidX(0.0007f, 0.008f, 0.0004f, dt);
+PID pidY(0.0007f, 0.008f, 0.0004f, dt);
+
+bool compute_pid        = false;
+bool motors_armed       = false;
+bool start_update_loop  = false;
+
+float accX          = 0.0;
+float accY          = 0.0;
+float gyroX         = 0.0;
+float gyroY         = 0.0;
+float setPoint_x    = 0.0;
+float setPoint_y    = 0.0;
+float control_x     = 0.0;
+float control_y     = 0.0;
+
+float ComplementarAngle_x = 0.0;
+float ComplementarAngle_y = 0.0;
+
+float heading = 0.0;
+float altura = 0.0;
+
+int state = 0;
+//float motorCoefA[5] = {1.4071, -2.7620, 1.9864, 0.3664, 0.0150};
+//float motorCoefB[5] = {1.4433, -2.8580, 2.0790, 0.3207, 0.0111};
+//float motorCoefC[5] = {1.4736, -2.8773, 2.1176, 0.2639, 0.0131};
+//float motorCoefD[5] = {1.5427, -2.9893, 2.1539, 0.2750, 0.0119};
+
+//Motor motorA(p26, 42, motorCoefA, 15, 60);
+//Motor motorC(p24, 42, motorCoefC, 15, 60);
+//Motor motorB(p25, 42, motorCoefB, 15, 60);
+//Motor motorD(p23, 42, motorCoefD, 15, 60);
+Motor motorA(p26, 42);
+Motor motorC(p24, 42);
+Motor motorB(p25, 42);
+Motor motorD(p23, 42);
+
+//Dummy
+DigitalOut dummy(p21);
+
+DigitalOut powerLed(LED1);
+DigitalOut initLed(LED2);
+DigitalOut statusLed1(LED3);
+DigitalOut statusLed2(LED4);
+
+Ticker updater;
+
+volatile unsigned int sysCount;
+volatile unsigned int pwmCount;
+volatile unsigned int mainCount;
+volatile unsigned int loop_time;
+
+//SerialBuffered pc(USBTX, USBRX);
+SerialBuffered pc(p28, p27);
+char buffer[64];
+char cmd = CMD_WAITING;
+/*
+ * Sets the Motors
+ */
+void motors_setPower()
+{
+
+    motorB.setPowerLin( FLIGHT_THRESHOLD - (control_x*100) + heading + altura );
+    motorD.setPowerLin( FLIGHT_THRESHOLD + (control_x*100) + heading + altura );
+    
+    motorA.setPowerLin( FLIGHT_THRESHOLD - (control_y*100) - heading + altura );
+    motorC.setPowerLin( FLIGHT_THRESHOLD + (control_y*100) - heading + altura );
+
+}
+
+/*
+ * Update Loop
+ * Periodically Occurs every 5 milliseconds
+ */
+void update_lood()
+{
+    gyroscope.update();
+    accelerometer.update();
+
+    accX  =        accelerometer.getDegreesAngleX();
+    accY  =        accelerometer.getDegreesAngleY();
+    gyroX = (-1) * gyroscope.getDegreesX();
+    gyroY =        gyroscope.getDegreesY();
+    
+    //gyroAngle = gyroscope->getAngleY();
+    
+    ComplementarAngle_x = ComplementaryFilterX.update(accY, gyroX);
+    ComplementarAngle_y = ComplementaryFilterY.update(accX, gyroY);
+
+
+    if(compute_pid) 
+    {
+        control_x = pidX.compute(setPoint_x, ComplementarAngle_x);
+        control_y = pidY.compute(setPoint_y, ComplementarAngle_y);
+    }
+
+    motors_setPower();
+}
+
+/*
+ * PWM Loop
+ * Periodically Occurs every 1 millisecond
+ */
+void pwm_lood()
+{
+    if(pwmCount == 2 && !motors_armed) 
+    {
+        dummy = 0;
+    } 
+    else if(pwmCount == 4 && motors_armed) 
+    {
+        dummy = 0;
+    } 
+    else if(pwmCount == 40 )//tempo igual a '20' e '0' (termina os 20 mili e inicia os próximos 20 mili) 
+    { 
+        dummy = 1;
+        pwmCount = 0;
+    }
+}
+
+/*
+ * Main Loop
+ * Handle the update loop and the pwm loop
+ */
+void update()
+{
+    sysCount+=1;
+    pwmCount+=1;
+    if(sysCount >= 10 && start_update_loop) 
+    {
+        update_lood();
+        sysCount = 0;
+    }
+
+    pwm_lood();
+}
+
+bool setPointAdjustment(int currentLoopTime)
+{   
+    bool reset = false;
+    /* 2 graus por segundo
+       2 - 1
+    taxa - 0.010 -> loop_time     */
+    
+    float taxa = 0.04; 
+    
+    switch(state) /* Máquina de estados */
+    {   
+        case 0:         
+        case 6:
+        case 7: 
+        case 8:
+        case 14: 
+        case 15:  
+            if(setPoint_x < 0)
+                setPoint_x += taxa;
+            else if(setPoint_x > 0)
+                setPoint_x -= taxa; 
+                 
+            if(setPoint_y < 0)
+                setPoint_y += taxa;
+            else if(setPoint_y > 0)
+                setPoint_y -= taxa; 
+        break;
+        case 1:
+        case 2:
+            if(setPoint_x < 20)
+                setPoint_x += taxa;
+            else if(setPoint_x > 20)
+                setPoint_x -= taxa;            
+        break;
+        case 3:
+        case 4:
+        case 5:
+            if(setPoint_x < -20)
+                setPoint_x += taxa;
+            else if(setPoint_x > -20)
+                setPoint_x -= taxa;
+        break;
+        case 9:
+        case 10:
+            if(setPoint_y < 20)
+                setPoint_y += taxa;
+            else if(setPoint_y > 20)
+                setPoint_y -= taxa;            
+        break;
+        case 11:
+        case 12:
+        case 13:
+            if(setPoint_y < -20)
+                setPoint_y += taxa;
+            else if(setPoint_y > -20)
+                setPoint_y -= taxa;    
+        break;
+        
+    }
+    
+    
+    if(currentLoopTime >= 5000)
+    {
+        state++;
+        if(state > 15) 
+            state = 0;
+        reset = true;
+    }
+    return reset;
+}
+
+/*
+ * Main
+ */
+int main()
+{
+    pc.baud(PC_BAUD_RATE);
+    
+    //Leds de controle
+    powerLed = 0;
+    initLed  = 0;
+    statusLed1 = 0;
+    statusLed2 = 0;
+    
+    //Contadores
+    sysCount = 0;
+    pwmCount = 0;
+    mainCount = 0;
+    
+    //Variáveis lógicas
+    start_update_loop = false;
+    motors_armed = false;
+    /*
+    gyroscope = new Gyroscope(new L3G4200D(p5, p6, p7, p8), 0.0175, dt);
+    accelerometer = new Accelerometer(new ADXL345(p5, p6, p7, p11), 256);
+    ComplementaryFilterX = new ComplementaryFilter(dt, 0.9995, 0.0005);
+    ComplementaryFilterY = new ComplementaryFilter(dt, 0.9995, 0.0005);
+    */
+    powerLed = 1;
+
+    wait(10);
+    accelerometer.updateZeroRates();
+    gyroscope.updateZeroRates();
+
+    initLed  = 1;
+
+    motors_setPower();
+    updater.attach(&update, 0.0005);
+    wait(2);
+    motors_armed = true;
+    wait(7);
+
+    //msg_update = true;
+    compute_pid = true;
+    start_update_loop = true;
+    loop_time = 10;
+    int i = 0;
+    int j = 0;
+    while (true) 
+    {
+        wait_ms(loop_time);
+        j += loop_time;
+        if(setPointAdjustment(j))
+            j = 0;
+        
+        /*
+        if (pc.readable())
+            cmd = pc.getc();
+
+        switch (cmd) 
+        {
+            case CMD_UP:
+            heading+= 0.5;
+            sprintf((char*)buffer, "heading %f\r\n", heading);    
+            pc.writeText(buffer);
+            break;
+            
+            case CMD_DOWN:
+            heading-= 0.5;
+            sprintf((char*)buffer, "heading %f\r\n", heading);    
+            pc.writeText(buffer);
+            break;
+            
+            case CMD_UP2:
+            altura += 0.5;
+            sprintf((char*)buffer, "altura %f\r\n", altura);    
+            pc.writeText(buffer);
+            break;
+            
+            case CMD_DOWN2:
+            altura -= 0.5;
+            sprintf((char*)buffer, "altura %f\r\n", altura);    
+            pc.writeText(buffer);
+            break; 
+            
+        }
+        
+        cmd = CMD_WAITING;
+        */
+        sprintf((char*)buffer, "%f %f %f %f \n", ComplementarAngle_x, setPoint_x, ComplementarAngle_y, setPoint_y);    
+        pc.writeText(buffer);
+        
+        i += loop_time;
+        if(i >= 200)
+        {   statusLed2 = statusLed1;
+            statusLed1 = !statusLed1;
+            i = 0;
+        }
+    }
+}
\ No newline at end of file