first publish

Dependencies:   MPU9150_DMP MotorControl QuaternionMath SimpleIOMacros mbed

Fork of cool_step by Siner Gokhan Yilmaz

main.cpp

Committer:
heuristics
Date:
2015-06-01
Revision:
23:b79faf58d4a1
Parent:
22:5cad60d669e6
Child:
24:fa52fd530d6e

File content as of revision 23:b79faf58d4a1:

#include "mbed.h"
#include "MPU9150.h"
#include "Quaternion.h"
#include "Motor.h"


void initCaptures(void);

//led pins
DigitalOut led1(P2_6);
DigitalOut led2(P2_7);
DigitalOut led3(P2_8);
AnalogIn hallSensor(P0_26);
float P=0,I=0,D=0;
int pulsesMotor2=0,pulsesMotor1=0;
int int_time=0,bint_time=0;
//InterruptIn hall1_(P0_5), hall2_(P0_4);


Serial RN42(P0_10, P0_11);
Serial debug(P0_2, P0_3);

Ticker infoTicker,commandTicker,swaveTicker;

Timer timer;
Timer timer2;


MPU9150 imu(P0_28, P0_27, P2_13);

//Hallsensor hall2(P0_4, P0_5);
Motor motor2(P2_2, P2_3, pulsesMotor2);

//Hallsensor hall1(P1_26, P1_27);

Motor motor1(P2_0, P2_1, pulsesMotor1);
char buffer[200];
void infoTask(void)
{
    led1=!led1;
}
int str2int(char* str)
{
    int num = 0, i = 0;
    while(str[i] != '\n') {
        num = num * 10 + str[i] - '0';
        i++;
    }
    return num;
}

bool squarewave=0;
void swaveTask(void)
{
    if(squarewave) {
        motor2.setAngle(0);
    } else {
        motor2.setAngle(60);
    }
    squarewave=!squarewave;
}
float pidStep=1000.0f;
void getCommand(void)
{
    if(debug.readable()) {
        char buffer[128];
        debug.gets(buffer, 20);
        if(buffer[0]=='m') {
            float speed = (float)(str2int(buffer+3));
            debug.printf("FLOAT %f FLOAT ",speed);
            if(buffer[1]=='1') {
                motor1.setAngle(speed);
            }

            if(buffer[1]=='2') {

                motor2.setAngle(speed);
            }
        } else if(buffer[0]=='p') {
            if(buffer[1]=='+') {
                P+=1/pidStep;
            }

            if(buffer[1]=='-') {
                P-=1/pidStep;
            }
            motor2.setPID(P,I,D);
        } else if(buffer[0]=='i') {
            if(buffer[1]=='+') {
                I+=1/pidStep;
            }
            if(buffer[1]=='-') {
                I-=1/pidStep;
            }
            motor2.setPID(P,I,D);
        } else if(buffer[0]=='d') {
            if(buffer[1]=='+') {
                D+=1/pidStep;
            }

            if(buffer[1]=='-') {
                D-=1/pidStep;
            }
            motor2.setPID(P,I,D);
        } else if(buffer[0]=='s') {
            pidStep = (float)(str2int(buffer+2));
        }
    }
}
int main()
{

    RN42.baud(9600);
    debug.baud(115200);
    //InitTimer0();
    //initialize_connection();
    infoTicker.attach(infoTask,0.2f);
   // commandTicker.attach(getCommand,0.2f);
    swaveTicker.attach(swaveTask,1.0f);
    if(imu.isReady()) {
        debug.printf("MPU9150 is ready\r\n");
    } else {
        debug.printf("MPU9150 initialisation failure\r\n");
    }

    imu.initialiseDMP();

    timer.start();
    timer2.start();

    //motor2.setVelocity(0.7);
    imu.setFifoReset(true);
    imu.setDMPEnabled(true);

    Quaternion q1;
    wait_ms(500);
    motor1.setAngle(0);

    motor2.setAngle(0);
    initCaptures();


    while(1) {
        if(imu.getFifoCount() >= 48) {
            imu.getFifoBuffer(buffer,  48);
            led2 = !led2;
        }

        if(timer.read_ms() > 50) {
            timer.reset();

            //This is the format of the data in the fifo,
            /* ================================================================================================ *
              | Default MotionApps v4.1 48-byte FIFO packet structure:                                           |
              |                                                                                                  |
              | [QUAT W][      ][QUAT X][      ][QUAT Y][      ][QUAT Z][      ][GYRO X][      ][GYRO Y][      ] |
              |   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  |
              |                                                                                                  |
              | [GYRO Z][      ][MAG X ][MAG Y ][MAG Z ][ACC X ][      ][ACC Y ][      ][ACC Z ][      ][      ] |
              |  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  |
              * ================================================================================================ */


            /*  debug.printf("%d, %d, %d\r\n",  (int32_t)(((int32_t)buffer[34] << 24) + ((int32_t)buffer[35] << 16) + ((int32_t)buffer[36] << 8) + (int32_t)buffer[37]),
                                              (int32_t)(((int32_t)buffer[38] << 24) + ((int32_t)buffer[39] << 16) + ((int32_t)buffer[40] << 8) + (int32_t)buffer[41]),
                                              (int32_t)(((int32_t)buffer[42] << 24) + ((int32_t)buffer[43] << 16) + ((int32_t)buffer[44] << 8) + (int32_t)buffer[45]));

              debug.printf("%d, %d, %d\r\n",  (int32_t)(((int32_t)buffer[16] << 24) + ((int32_t)buffer[17] << 16) + ((int32_t)buffer[18] << 8) + (int32_t)buffer[19]),
                                              (int32_t)(((int32_t)buffer[20] << 24) + ((int32_t)buffer[21] << 16) + ((int32_t)buffer[22] << 8) + (int32_t)buffer[23]),
                                              (int32_t)(((int32_t)buffer[24] << 24) + ((int32_t)buffer[25] << 16) + ((int32_t)buffer[26] << 8) + (int32_t)buffer[27]));

              debug.printf("%d, %d, %d\r\n",  (int16_t)(buffer[29] << 8) + buffer[28],
                                              (int16_t)(buffer[31] << 8) + buffer[30],
                                              (int16_t)(buffer[33] << 8) + buffer[32]);

              debug.printf("%f, %f, %f, %f\r\n",
                  (float)((((int32_t)buffer[0] << 24) + ((int32_t)buffer[1] << 16) + ((int32_t)buffer[2] << 8) + buffer[3]))* (1.0 / (1<<30)),
                  (float)((((int32_t)buffer[4] << 24) + ((int32_t)buffer[5] << 16) + ((int32_t)buffer[6] << 8) + buffer[7]))* (1.0 / (1<<30)),
                  (float)((((int32_t)buffer[8] << 24) + ((int32_t)buffer[9] << 16) + ((int32_t)buffer[10] << 8) + buffer[11]))* (1.0 / (1<<30)),
                  (float)((((int32_t)buffer[12] << 24) + ((int32_t)buffer[13] << 16) + ((int32_t)buffer[14] << 8) + buffer[15]))* (1.0 / (1<<30)));
            */
            q1.decode(buffer);

            debug.printf("%f, ",hallSensor.read());
            debug.printf("%f, %f, %f, %f ", q1.w, q1.v.x, q1.v.y, q1.v.z);

            Vector3 vector_x(1,0,0),vector_y(0,1,0),vector_z(0,0,1);
            Vector3 pry=q1.getEulerAngles();
            debug.printf("p: %f r: %f y: %f ",pry.x/PI*180,pry.y/PI*180,pry.z/PI*180);
            debug.printf("m1: %.2f m2: %.2f ",motor1.getAngle(),motor2.getAngle());
            debug.printf("dt1: %f dt2: %f ",motor1.get_dt(),motor2.get_dt());
            debug.printf("P: %f I: %f I: %f  \r\n ",P,I,D);
            getCommand();
            /*  if(!motor1.isRunning()) {
                  if(motor1.getAngle()>30) {
                      motor1.setAngle(0);
                  }
                  if(motor1.getAngle()<30) {
                      motor1.setAngle(60);
                  }
              }
              if(!motor2.isRunning()) {
                  if(motor2.getAngle()>30) {
                      motor2.setAngle(0);
                  }
                  if(motor2.getAngle()<30) {
                      motor2.setAngle(60);
                  }
              }*/
        }
    }

}




void TIMER2_IRQHandler(void)
{
    //   timer2.reset();
    int bitB = (LPC_GPIO0->FIOPIN>>5) & 0x1;
    if(bitB) {
        pulsesMotor2--;
        int_time=0;
    } else {
        pulsesMotor2++;
        int_time=1;
    }

    LPC_TIM2->IR |= 0x10;
    //bint_time=timer2.read_us();
}

void TIMER0_IRQHandler(void)
{
    int bitB = (LPC_GPIO1->FIOPIN>>27) & 0x1;
    if(bitB) {
        pulsesMotor1--;
    } else {
        pulsesMotor1++;
    }

    LPC_TIM0->IR |= 0x10;
}

void initCaptures(void)
{
    NVIC_SetPriority (TIMER3_IRQn, 6);
    LPC_PINCON->PINSEL0  |= 0x00000300; // set P0.4 to CAP2.0
    LPC_SC->PCONP |= (1 << 22);         // Timer2 power on
    // init Timer 2 (cap2.0)
    LPC_TIM2->IR = 0x10;          // clear interrupt register
    NVIC_SetVector(TIMER2_IRQn, uint32_t(TIMER2_IRQHandler));
    LPC_TIM2->TC = 0;                   // clear timer counter
    LPC_TIM2->PC = 0;                   // clear prescale counter
    LPC_TIM2->PR = 0;                   // clear prescale register
    LPC_TIM2->CCR |= 0x5;       // enable cap2.0 rising capture; interrupt on cap2.0
    NVIC_SetPriority (TIMER2_IRQn, 5);
    LPC_TIM2->TCR = (1 << 0);          // start Timer2
    NVIC_EnableIRQ(TIMER2_IRQn);

    LPC_PINCON->PINSEL3  |= 0x00300000; // set P1.26 to CAP0.0
    LPC_SC->PCONP |= (1 << 1);         // Timer0 power on
    // init Timer 0 (cap0.0)
    LPC_TIM0->IR = 0x10;          // clear interrupt register
    NVIC_SetVector(TIMER0_IRQn, uint32_t(TIMER0_IRQHandler));
    LPC_TIM0->TC = 0;                   // clear timer counter
    LPC_TIM0->PC = 0;                   // clear prescale counter
    LPC_TIM0->PR = 0;                   // clear prescale register
    LPC_TIM0->CCR |= 0x5;       // enable cap0.0 rising capture; interrupt on cap0.0
    NVIC_SetPriority (TIMER0_IRQn, 5);
    LPC_TIM0->TCR = (1 << 0);          // start Timer0
    NVIC_EnableIRQ(TIMER0_IRQn);

}