RobotArm_ Biorobotics project.

Dependencies:   PID QEI RemoteIR Servo mbed

Fork of Biorobotics_Motor_Control by Bram S

Revision:
2:684d5cf2f683
Parent:
0:6c0f87177797
Child:
3:98ea6afa0cf2
--- a/main.cpp	Mon Oct 16 13:52:31 2017 +0000
+++ b/main.cpp	Mon Oct 23 10:57:11 2017 +0000
@@ -1,51 +1,248 @@
 #include "mbed.h"
 #include "QEI.h"
-AnalogIn PotMeter(A0);
+#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);
 
-QEI Encoder(D12,D13,NC,32);
+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);
 
-void ButtonPress(){
-    MotorDirection1 = !MotorDirection1;
+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);
-    float speed = 0.0f;
-    int pos = 0;
-    int pos_ref = 0;
-    int temp_ref = 0;
-    int pos_prev = 0;
     pc.printf("startup");
-    Button.rise(&ButtonPress);
+    
+    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();
+    
     
-    while(true){
-        //pc.printf("PWM: %f, POS: %i, REF: %i\r\n",speed,pos,pos_ref);
-        pos = Encoder.getPulses();
-        temp_ref =(int) 10000*PotMeter.read();
-        if(fabsf(temp_ref-pos_ref)>50){
-            pos_ref = temp_ref;
+    ControlTicker.attach(&ControlLoop, Interval);
+    //GetRefTicker.attach(&DeterminePosRef, 0.1f);
+    
+
+    
+    while(1)
+    { 
+        if (ir_rx.getState() == ReceiverIR::Received)
+        {
+
+            pc.printf("received");
+            RemoteController();
+            wait(0.01);
         }
-        speed = ((float)(pos-pos_ref))/10000.0f;
-        if (speed<0.0f){
-            MotorDirection1=1;
-            speed = -speed;
-        }
-        else{
-            MotorDirection1=0;
-        }
-        if(speed<0.01f){
-            speed=0;
-        }
-        MotorThrottle1.write(speed);
-        pos_prev=pos;
-    }
+    }       
+    
+    
+    while(1){}
+
+
 }