RobotArm_ Biorobotics project.

Dependencies:   PID QEI RemoteIR Servo mbed

Fork of Biorobotics_Motor_Control by Bram S

main.cpp

Committer:
jordymorsinkhof
Date:
2017-10-23
Revision:
2:684d5cf2f683
Parent:
0:6c0f87177797
Child:
3:98ea6afa0cf2

File content as of revision 2:684d5cf2f683:

#include "mbed.h"
#include "QEI.h"
#include "PID.h"
#include "ReceiverIR.h"
#include "Servo.h"

ReceiverIR ir_rx(D2);

AnalogIn PotMeter1(A0);
AnalogIn PotMeter2(A1);
InterruptIn Button(PTA4);
 
PwmOut MotorThrottle1(D5);
PwmOut MotorThrottle2(D6);
DigitalOut MotorDirection1(D4);
DigitalOut MotorDirection2(D7);
DigitalOut servo(D3);

DigitalIn EndSwitch1(D9);
DigitalIn EndSwitch2(D8);

//DigitalOut Magneet(D7);


QEI EncoderMotor1(D12,D13,NC,4200);
QEI EncoderMotor2(D10,D11,NC,4200);

Ticker ControlTicker;
Ticker GetRefTicker;

float Interval=0.02f;
float pi=3.14159268;
PID controller1(20.0f,0.0f,0.001f, Interval);
PID controller2(20.0f,0.0f,0.002f, Interval);

RemoteIR::Format format;
uint8_t buf[4];

Serial pc(PTB17,PTB16);

float PosRef1=1.0f;
float PosRef2=1.0f;




void HomingLoop(){

    EndSwitch1.mode(PullUp);
    EndSwitch2.mode(PullUp);
    
    MotorThrottle1=0.1f;
    MotorThrottle2=0.2f;
    
    MotorDirection1=1;
    MotorDirection2=1;
    
    bool dummy1=0;
    bool dummy2=0;
    
    while(EndSwitch1.read()|EndSwitch2.read()){
        if((EndSwitch1.read()==0)&&(dummy1==0)){
            MotorThrottle1=0.0f;
            dummy1=1;
        }
        if((EndSwitch2.read()==0)&&(dummy2==0)){
            MotorThrottle2=0.0f;
            dummy2=1;
        }
    }
    MotorThrottle1=0.0f;
    MotorThrottle2=0.0f;
    EncoderMotor1.reset();
    EncoderMotor2.reset();
}

void ControlLoop(){
    
    float Pos1 = EncoderMotor1.getPulses()/4200.0f*2.0f*pi; //Motorpos. in radians
    float Pos2 = EncoderMotor2.getPulses()/4200.0f*2.0f*pi; //Motorpos. in radians
    float error1 = PosRef1 - Pos1;
    float error2 = PosRef2 - Pos2;
    
    // PID input
    controller1.setSetPoint(PosRef1);
    controller2.setSetPoint(PosRef2);
    
    controller1.setProcessValue(Pos1);
    controller2.setProcessValue(Pos2);
    
    // PID output
    float OutPut1=controller1.compute();
    float OutPut2=controller2.compute();

    // Direction handling
    float Direction1=0;
    float Direction2=0;
    
    if(OutPut1<0){
        Direction1=1;
    }
    if(OutPut2<0){
        Direction2=1;
    }
    
    OutPut1=fabs(OutPut1);
    OutPut2=fabs(OutPut2);
    
    // Output schrijven
    MotorThrottle1.write(OutPut1);
    MotorThrottle2.write(OutPut2);
    MotorDirection1=Direction1;
    MotorDirection2=Direction2;
}


void PickUp(){

}
    
void LayDown(){
    
    
    }


void RemoteController(){
    
   int bitcount;


   bitcount = ir_rx.getData(&format, buf, sizeof(buf) * 8);
    int state = buf[2];
    switch(state)
    {
        case 22: //1
            printf("1\n\r");
        break;
        case 25: //1
            printf("2\n\r");
            break;
        case 13: //1                
            printf("3\n\r");
            break;
        case 12: //1
            printf("4\n\r");
            break;
        case 24: //1
            printf("5\n\r");
            ControlTicker.detach();
            MotorThrottle1=0.0f;
            MotorThrottle2=0.0f;
            PickUp();
            ControlTicker.attach(&ControlLoop, Interval);
            break;
        case 94: //1
            printf("6\n\r");
            break;
        case 8: //1
            printf("7\n\r");
            break;
        case 28: //1
            printf("8\n\r");
            ControlTicker.detach();
            MotorThrottle1=0.0f;
            MotorThrottle2=0.0f;
            LayDown();
            ControlTicker.attach(&ControlLoop, Interval);
            break;
        case 90: //1
            printf("9\n\r");
            break;
        case 70: //1
            pc.printf("Boven\n\r");
            PosRef2=PosRef2-0.1f;
            pc.printf("%f\n\r", PosRef2);
            break;
        case 21: //1
            pc.printf("Onder\n\r");
            PosRef2=PosRef2+0.1f;  
            pc.printf("%f\n\r", PosRef2);
            break;
        case 68: //1
            pc.printf("Links\n\r");
            PosRef1=PosRef1+0.1f;
            pc.printf("%f\n\r", PosRef1);
            break;
        case 67: //1
            pc.printf("Rechts\n\r");
            PosRef1=PosRef1-0.1f;
            pc.printf("%f\n\r", PosRef1);
            break;
        case 64: //1
            pc.printf("OK\n\r");
            ControlTicker.detach();
            MotorThrottle1=0.0f;
            MotorThrottle2=0.0f;
            HomingLoop();
            ControlTicker.attach(&ControlLoop, Interval);
            
            break;
        default:
            break;
    }
}




void DeterminePosRef(){
    PosRef1=2*pi*PotMeter1.read(); // Reference in Rad
    PosRef2=2*pi*PotMeter2.read(); // Reference in Rad
}

int main() {
    pc.baud(115200);
    pc.printf("startup");
    
    controller1.setInputLimits(0.5f,2.0f*pi);
    controller2.setInputLimits(0.5f,2.0f*pi);
    controller1.setOutputLimits(-0.15f,0.15f);
    controller2.setOutputLimits(-0.5f,0.5f);  
    
    
    HomingLoop();
    
    
    ControlTicker.attach(&ControlLoop, Interval);
    //GetRefTicker.attach(&DeterminePosRef, 0.1f);
    

    
    while(1)
    { 
        if (ir_rx.getState() == ReceiverIR::Received)
        {

            pc.printf("received");
            RemoteController();
            wait(0.01);
        }
    }       
    
    
    while(1){}


}