on Motor

Dependencies:   encoderKRAI mbed Motor_new

main.cpp

Committer:
garin
Date:
2019-05-12
Revision:
1:7533e025de71
Parent:
0:ac8956bbab28
Child:
2:710b092cfcc0

File content as of revision 1:7533e025de71:

//

//
#include <stdio.h>
#include <Motor.h>
#include <encoderKRAI.h>
#include <mbed.h>
// declare
Motor main_motor(PB_13, PB_14, PB_15 ); // input pin
DigitalOut pneu(PC_5);// input pin
DigitalIn infrared(PC_5); // input pin
encoderKRAI encoder(PB_1,PB_2,538,encoderKRAI::X4_ENCODING);// input pin

int count, count_ball ;
double pulse, total_pulse,total_pulse_in_degree,theta,pwm;
double kp,ki,kd;
bool not_stop ;
double error, integral, derivative;
double last_error ;

void BacaEncoder(){// read encoder
    pulse = (double)encoder.getPulses();
    encoder.reset();
    total_pulse +=pulse;
    total_pulse_in_degree = total_pulse*360/538;
}

void PID(theta){
        //pid
        error = theta - total_pulse_in_degree;
        derivative = error - last_error;

        pwm =  (kp*error) + (kd*derivative);

        //limit the power of motor, the max power can be changed
        if (pwm > 1) pwm = 1;
        else if (pwm < -1) pwm = -1;


}
void MoveMotor(theta){
    not_stop = 1;
    last_error = 0;
    total_pulse =0;

    // move motor
    last_error = theta;
    while ((not_stop) && theta != 0){
        BacaEncoder();
        PID(theta);
        // set speed motor
        if (pwm != 0) main_motor.speed(pwm); 
        else {
            main_motor.speed(0);
            main_motor.brake(1);
            not_stop = 0;
        }
        last_error = error;
    }
}

int main(){
    count_ball = 0;
    int state = 1;  // posisi awal

    while (count_ball<6){
        if (state && !infrared) {
            state = 0 ;
            pneu = 1;                   // menembakkan bola
            count_ball++;
            t1 = milis();

            // menggerakkan motor
            if (count_ball = 2) moveMotor(60);
            else if (count_ball = 4) moveMotor(90);

        } else {
            pneu = 0;
            if (milis()-t1 >1000 ) state = 1;   // tunggu pneumatik kembali
        }
    }
}