Ironcup Mar 2020

Dependencies:   mbed mbed-rtos MotionSensor EthernetInterface

Files at this revision

API Documentation at this revision

Comitter:
drelliak
Date:
Sun Apr 17 00:58:06 2016 +0000
Parent:
3:e213c44a9f6c
Child:
10:6735a8309f62
Commit message:
BRAKE TEST

Changed in this revision

MotionSensor.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/MotionSensor.lib	Mon Apr 11 21:24:52 2016 +0000
+++ b/MotionSensor.lib	Sun Apr 17 00:58:06 2016 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/teams/components/code/MotionSensor/#226520fc09bf
+http://mbed.org/teams/components/code/MotionSensor/#4d6e28d4a18a
--- a/main.cpp	Mon Apr 11 21:24:52 2016 +0000
+++ b/main.cpp	Sun Apr 17 00:58:06 2016 +0000
@@ -7,15 +7,18 @@
 
 #define PI 3.141592653589793238462
 #define Ts 0.02                         // Seconds
+#define PWM_PERIOD 13.5 // ms
 #define INITIAL_P 0.452531214933414
 #define INITIAL_I 5.45748932024049
 #define INITIAL_D 0.000233453623255507
 #define INITIAL_N 51.0605584484153
-#define BRAKE_CONSTANT 30
+#define BRAKE_CONSTANT 40
+#define BRAKE_WAIT 0.3
 #define GYRO_OFFSET 0.0152
 #define END_THRESH 4
 #define START_THRESH 10
 #define MINIMUM_VELOCITY 15
+
 Serial ser(USBTX, USBRX);    // Initialize Serial port
 PwmOut motor(PTD1);         // Motor connected to pin PTD1
 PwmOut servo(PTD3);         // Servo connected to pin PTD3
@@ -45,39 +48,66 @@
 void magCal();
 
 // State variables
-float sensor, velocity;
+float feedback, velocity = 0;
 void readProtocol();
 void brakeMotor();
+void reverseMotor(int speed);
+void setVelocity(int new_velocity);
+
 // Test functions
 void debug();
 
 int main(){
-    // Initializing serial communication
-    ser.baud(9600);
-    ser.format(8, SerialBase::None, 1);
-    // Initializing controller
-    printf("Initializing controller....\r\n\r\n");
-    initializeController();
-    printf("Controller Initialized. \r\n");
-    // Calibrating magnetometer and setting the initial position
-    magCal();
-    gyro_angle = processMagAngle();
-    // Start moving the robot and integrating the gyroscope
-    velocity = MINIMUM_VELOCITY;
-    setMotorPWM(velocity,motor);
-    startGyro();
-    // main loop
-        while (true){
-        processGyroAngle();
-        controlAnglePID(P,I,D,N);
-        //debug();
-        if(t.read_us() < Ts*1000000)
-            wait_us(Ts*1000000 - t.read_us());
-        if(ser.readable())
-            readProtocol();
-        }
+    int teste = 0;
+    setVelocity(0);
+    switch(teste){
+    case 0: // vai para tras duas vezes
+        brakeMotor();
+        wait(1);
+        setVelocity(-1);
+        setVelocity(0);
+        setVelocity(-30);
+        wait(2);
+        brakeMotor();
+        wait(2);
+        setVelocity(-1);
+        setVelocity(0);
+        setVelocity(-30);
+        break;
+    case 1: // vai para a frente e depois para tras
+        brakeMotor();
+        wait(1);
+        setVelocity(20);
+        wait(2);
+        brakeMotor();
+        wait(2);
+        setVelocity(-1);
+        setVelocity(0);
+        setVelocity(-30);
+        break;
+    case 2: // vai para tras e depois para frente
+        brakeMotor();
+        wait(1);
+        setVelocity(-1);
+        setVelocity(0);
+        setVelocity(-30);
+        wait(2);
+        brakeMotor();
+        wait(2);
+        setVelocity(20);
+        break;
+    case 3: // vai para frente duas vezes
+        brakeMotor();
+        wait(1);
+        setVelocity(20);
+        wait(2);
+        brakeMotor();
+        wait(2);
+        setVelocity(20);
+        break;
+    }
+    while(1);
 }
-
 void readProtocol(){
     char msg = ser.getc();
     switch(msg)
@@ -146,18 +176,18 @@
     gyro_angle = gyro_angle + (gyro_data[2] + GYRO_OFFSET)*(double)(t.read_us())/1000000;
     t.reset();
     t.start();
-    sensor = gyro_angle;
-    if(sensor > 180)
-        sensor = sensor - 360;
-    if(sensor < -180)
-        sensor = sensor + 360;
+    feedback = gyro_angle;
+    if(feedback > 180)
+        feedback = feedback - 360;
+    if(feedback < -180)
+        feedback = feedback + 360;
 }
 
 /* PID controller for angular position */
 void controlAnglePID(float P, float I, float D, float N){ 
     /* Getting error */
     e[1] = e[0];
-    e[0] = reference - (sensor*PI/180);
+    e[0] = reference - (feedback*PI/180);
     if(e[0] > PI)
       e[0]= e[0] - 2*PI;
     if(e[0] < -PI)
@@ -182,19 +212,52 @@
 }
 /* Brake function, braking while the gyroscope is still integrating will cause considerably error in the measurement. */
 void brakeMotor(){
-    if(velocity > 0)
+    if(velocity >= 0){
         setMotorPWM(-BRAKE_CONSTANT, motor);
-    else if(velocity < 0)
-        setMotorPWM(BRAKE_CONSTANT, motor);
-    wait(0.5);
-    setMotorPWM(0,motor);
+        wait(BRAKE_WAIT);
+        velocity = 0;
+        setMotorPWM(velocity,motor);
+    }
+    else {
+        setVelocity(0);
+    }
+}
+void reverseMotor(int speed){
+    for(int i=0 ; i >= -speed; i--){
+        setMotorPWM((float)i,motor);
+        wait_ms(13.5);    
+    }
+    for(int i=-speed ; i <= 0; i++){
+        setMotorPWM((float)i,motor);
+        wait_ms(13.5);    
+    }
+    for(int i=0 ; i >= -speed; i--){
+        setMotorPWM((float)i,motor);
+        wait_ms(13.5);    
+    }
+}
+void setVelocity(int new_velocity){
+    if( velocity > new_velocity){
+        for(; velocity >= new_velocity; velocity--){
+            setMotorPWM(velocity,motor);
+            wait_ms(PWM_PERIOD);
+            }
+        velocity++;
+    }
+    else if(velocity < new_velocity){
+        for(; velocity <= new_velocity; velocity++){
+            setMotorPWM(velocity,motor);
+            wait_ms(PWM_PERIOD);
+            }
+        velocity--;
+        }
 }
 /* Debug functions that prints the sensor and control inputs values. Since it's time consuming it should not be used    */
 /* in the main loop or the controller performance may be affected.                                                      */
 void debug(){
     //printf("ERROR: %f Up: %f Ui: %f Ud: %f U: %f \r\n", e[0]*180/3.1415, up[0]*100/(3.1415/8), ui[0]*100/(3.1415/8), ud[0]*100/(3.1415/8),u*100/(3.1415/8));
     //printf("Erro: %f  Sensor: %f Magnetometer: %f \r\n",e[0]*180/PI,sensor,processMagAngle(0)*180/PI);
-    printf(" %f \r\n",sensor);
+    printf(" %f \r\n",feedback);
 }
 
 /* Function to normalize the magnetometer reading */