drum_axis

Dependencies:   invisdrum kalman mbed

main.cpp

Committer:
fxanhkhoa
Date:
2016-10-26
Revision:
0:d75dd19f5e59
Child:
1:4a15cf53ca28

File content as of revision 0:d75dd19f5e59:

#include "mbed.h"
#include "kalman.c"
#include "MPU6050.h"
#include <math.h>

#define PI             3.1415926535897932384626433832795
#define Rad2Dree       57.295779513082320876798154814105

#define dir 20
#define ratio 2

Serial pc(USBTX, USBRX);
 
void get(); 
void rafius(int, int, int, int);
 
Timer GlobalTime;
Timer ProgramTimer;
InterruptIn mybutton(USER_BUTTON);
 
float R;
double angle[3];
unsigned long timer;
long loopStartTime;

MPU6050 ark(PB_9,PB_8);
kalman filter_pitch; 
kalman filter_roll;
kalman filter_yaw;

volatile float central[3] = {0,0,0},drum[3] = {0,0,0}, delta[3] = {0,0,0};
volatile float delta_1_x[2] ;
volatile float delta_1_y[2] = {23,24}, delta_2_y[2] = {17,18}, delta_3_y[2] = {16,17}, delta_4_y[2] = {16,17}, delta_5_y[2] = {23,24};
volatile float delta_1_z[2];
volatile int drum_stt = 0, drum_1_stt = 0, drum_2_stt = 0, drum_3_stt = 0, drum_4_stt = 0, drum_5_stt = 0;

int main()
{
    mybutton.fall(get);
    //int count = 0;
    GlobalTime.start();
    
    float Acc[3]= {0, 0, 0};
    ark.getAccelero(Acc);
    
    float Gyro[3]= {0,0,0};
    ark.getGyro(Gyro);
    
    
    // Parameters ( R_angle, Q_gyro, Q_angle ) 
    kalman_init(&filter_pitch, R_matrix, Q_Gyro_matrix, Q_Accel_matrix); 
    kalman_init(&filter_roll, R_matrix, Q_Gyro_matrix, Q_Accel_matrix); 
    kalman_init(&filter_yaw, R_matrix, Q_Gyro_matrix, Q_Accel_matrix);
    
    ProgramTimer.start();
    loopStartTime = ProgramTimer.read_us();
    timer = loopStartTime;
    int i;
    for (i = 0; i< 1000; i++)
    {
        //Aquire new values for the Gyro and Acc
        ark.getAccelero(Acc);
        ark.getGyro(Gyro);
        
        //Calcuate the resulting vector R from the 3 acc axes
        R = sqrt(std::pow(Acc[0] , 2) + std::pow(Acc[1] , 2) + std::pow(Acc[2] , 2));
   
        kalman_predict(&filter_pitch, Gyro[0],  (ProgramTimer.read_us() - timer)); 
        kalman_update(&filter_pitch, acos(Acc[0]/R));
        kalman_predict(&filter_roll, Gyro[1],  (ProgramTimer.read_us() - timer)); 
        kalman_update(&filter_roll, acos(Acc[1]/R));
        kalman_predict(&filter_yaw, Gyro[2],    (ProgramTimer.read_us() - timer));
        kalman_update(&filter_yaw, acos(Acc[2]/R));
        
        angle[0] = kalman_get_angle(&filter_pitch);
        angle[1] = kalman_get_angle(&filter_roll);
        angle[2] = kalman_get_angle(&filter_yaw);
        
        timer = ProgramTimer.read_us();
        
        //count++;
        //if(count == 10000){pc.printf("Program time: %i\n\r", ProgramTimer.read_us() - loopStartTime);loopStartTime = ProgramTimer.read_us(); count = 0;}
        //pc.printf("Pitch Angle X: %.6f   Pitch Angle Y: %.6f \n\r", Rad2Dree * angle[1], Rad2Dree * angle[0]);
        central[0] = Rad2Dree * angle[1];
        central[1] = Rad2Dree * angle[0];
        }
        pc.printf("central %f %f\r\n",central[0],central[1]);
    while(1) {
        //Aquire new values for the Gyro and Acc
        ark.getAccelero(Acc);
        ark.getGyro(Gyro);
        
        //Calcuate the resulting vector R from the 3 acc axes
        R = sqrt(std::pow(Acc[0] , 2) + std::pow(Acc[1] , 2) + std::pow(Acc[2] , 2));
   
        kalman_predict(&filter_pitch, Gyro[0],  (ProgramTimer.read_us() - timer)); 
        kalman_update(&filter_pitch, acos(Acc[0]/R));
        kalman_predict(&filter_roll, Gyro[1],  (ProgramTimer.read_us() - timer)); 
        kalman_update(&filter_roll, acos(Acc[1]/R));
        kalman_predict(&filter_yaw, Gyro[2],    (ProgramTimer.read_us() - timer));
        kalman_update(&filter_yaw, acos(Acc[2]/R));
        
        angle[0] = kalman_get_angle(&filter_pitch);
        angle[1] = kalman_get_angle(&filter_roll);
        angle[2] = kalman_get_angle(&filter_yaw);
        
        timer = ProgramTimer.read_us();
        angle[2] = (sqrt(Acc[0]*Acc[0] + (Acc[1] * Acc[1])) / Acc[2]);
        //count++;
        //if(count == 10000){pc.printf("Program time: %i\n\r", ProgramTimer.read_us() - loopStartTime);loopStartTime = ProgramTimer.read_us(); count = 0;}
        pc.printf("Pitch Angle X: %.6f   Pitch Angle Y: %.6f\r\n Z: %.6f \n\r",Rad2Dree * angle[1],Rad2Dree * angle[0],Rad2Dree * angle[2]);
        delta[0] = Rad2Dree * angle[1];
        delta[1] = Rad2Dree * angle[0];
        delta[2] = Rad2Dree * angle[2];
        //float x,y,z;
        //y = cos(Rad2Dree * angle[1]) * dir;
        //x = cos(90-(Rad2Dree * angle[1])) * dir;
        //z = cos(Rad2Dree * angle[0]) * dir;
        //pc.printf("x: %f\n , y: %f\n , z: %f\n",x,y,z);
        //wait_ms(100);
        switch (drum_stt)
        {
            case 0:
                 if ((delta[0] > delta_1_x[0]) && (delta[0] < delta_1_x[1]) && (delta[1] > delta_1_y[0]) && (delta[1] < delta_1_y[1])&& (delta[2] > delta_1_z[0]) && (delta[2] < delta_1_z[1])) drum_stt = 1;
                 if ((delta[0] >= 20)) drum_stt = 4; 
                break;
            case 1:
                if ((delta[0] > delta_1_x[0]) && (delta[0] < delta_1_x[1]) && (delta[1] > delta_1_y[0]) && (delta[1] < delta_1_y[1])&& (delta[2] > delta_1_z[0]) && (delta[2] < delta_1_z[1]) && (drum_1_stt == 0)) 
                    {
                        pc.printf("drum 1_1");
                        drum_1_stt = 1;
                    }
                else if ((delta[0] > delta_1_x[1]))
                    {
                        drum_stt = 0 ;
                        drum_1_stt = 0;
                    }
                break;
            case 2:
                if ((delta[0] > -30) && (delta[0] < -25) && (delta[1] < 18) && (delta[1] > 17) && (drum_2_stt == 0))
                    {
                        pc.printf("drum 2_2");
                        drum_2_stt = 1;
                    }
                else if ((delta[0] > -25)) 
                    {
                        drum_stt = 0;
                        drum_2_stt = 0;
                    }
                else if ((delta[0] <= -30)) drum_stt = 1;
                break; 
            case 3:
                if ((delta[0] > -25) && (delta[0] < -20) && (delta[1] < 17) && (delta[1] > 16) && (drum_3_stt == 0)) 
                    {
                        pc.printf("drum 3_3");
                        drum_3_stt = 1;
                    }
                else if ((delta[0] > -20)) 
                    {
                        drum_stt = 0;
                        drum_3_stt = 0;
                    }
                else if ((delta[0] <= -25)) drum_stt = 2;
                break;
            case 4:
                if ((delta[0] > 20) && (delta[0] < 25) && (delta[1] > 16) && (delta[1] < 17) && (drum_4_stt == 0))
                    {
                        pc.printf("drum 4_4");
                        drum_4_stt = 1;
                    } 
                else if ((delta[0] < 20)) 
                    {
                        drum_stt = 0;
                        drum_4_stt = 0;
                    }
                else if ((delta[0] >=25)) drum_stt = 5;
                break;
            case 5:
                if ((delta[0] >= 25) && (delta[1] > 23) && (delta[1] < 24) && (drum_5_stt == 0))
                    {
                        pc.printf("drum 5_5");
                        drum_5_stt = 1;
                    }
                else if (delta[0] < 25) 
                    {
                        drum_stt = 0;
                        drum_5_stt = 0;
                    }
                break;
        }
        
    }
}

void get()
{
    drum[0] = Rad2Dree * angle[1];
    drum[1] = Rad2Dree * angle[0];
    drum[2] = Rad2Dree * angle[2];
    pc.printf("drum %f %f\r\n",drum[0],drum[1]);
    pc.printf("deltaX: %f , deltaY: %f\r\n",delta[0],delta[1]);
    radius(drum[0],drum[1],drum[2],1);
}

void radius(float x,float y,float z, int ind)
{
    delta_1_x[0] = x - ratio;
    delta_1_x[1] = x + ratio;
    delta_1_y[0] = y - ratio;
    delta_1_y[1] = y + ratio;
    delta_1_z[0] = z - ratio;
    delta_1_z[1] = z + ratio;
}