Dependencies:   PID mbed

Fork of EndeligKildekode by E2016-S1-Team5

Revision:
4:62a6681510d6
Child:
5:cf033e9d4468
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/odometry.h	Wed Nov 23 21:40:26 2016 +0000
@@ -0,0 +1,256 @@
+#ifndef ODOMETRY_H
+#define ODOMETRY_H
+
+#include "mbed.h"
+#include "hack_motor.h"
+#include "math.h"
+
+//  ODOMETRY VALUES
+#define N 20 // ticks on wheel
+#define R 32.5 // radius = 32.5 mm
+#define L 133 // 133 mm distance between wheels
+#define PI 3.141592
+int tickL = 0; // tick on left wheel
+int tickR = 0; // tick on right wheel
+
+//  PID VALUES
+#define P_TERM 1.0
+#define I_TERM 0.1
+#define D_TERM 0
+#define MAX 1.0 
+#define MIN 0
+
+//  GLOBAL DEFINITIONS
+double right,left;
+double speed=0.5;
+
+//  ANALOG POWER
+AnalogIn   ain(PC_4);
+DigitalOut dout(PB_13);
+DigitalOut greenout(PB_12);
+int stop=0;         //DigitalOut DEFINITION OF RED LED!!
+
+//  COORDINATES TO REACH
+const double xPosition [] =
+{
+    [0] = 0,
+    [1] = 1000,
+    [2] = 2000,
+    [3] = 3000,
+    [4] = 4000,
+    [5] = 5000,
+    [6] = 4000,
+    [7] = 3000,
+    [8] = 2000,
+    [9] = 1000,
+    [10] = 2000,
+    [11] = 3000,
+    [12] = 4000,
+    [13] = 5000,
+    [14] = 1000
+};
+const double yPosition [] = 
+{
+    [0] = 0,
+    [1] = 2000,
+    [2] = 3000,
+    [3] = 4000,
+    [4] = 5000,
+    [5] = 2000,
+    [6] = 4000,
+    [7] = 3000,
+    [8] = 2000,
+    [9] = 1000,
+    [10] = 3000,
+    [11] = 2000,
+    [12] = 1000,
+    [13] = 2000,
+    [14] = 3000
+};
+const double THETA [] =
+{
+    [0] = 0.785,
+    [1] = 1.047,
+    [2] = 0.698,
+    [3] = 0.524,
+    [4] = 1.047,
+    [5] = 0.698,
+    [6] = 0.785,
+    [7] = 0.873,
+    [8] = 0.349,
+    [9] = 0.349,
+    [10] = 0.611,
+    [11] = 0.611,
+    [12] = 0.436,
+    [13] = 0.96
+}; //INCLUDE ANGLE TO HEAD BACK TO ORIGIN POSITION!!!!!
+
+const double DISTANCES [] = 
+{
+    [0] = sqrt(pow((xPosition[1] - xPosition[0]), 2) + pow((yPosition[1] - yPosition[0]), 2)),
+    [1] = sqrt(pow((xPosition[2] - xPosition[1]), 2) + pow((yPosition[2] - yPosition[1]), 2)),
+    [2] = sqrt(pow((xPosition[3] - xPosition[2]), 2) + pow((yPosition[3] - yPosition[2]), 2)),
+    [3] = sqrt(pow((xPosition[4] - xPosition[3]), 2) + pow((yPosition[4] - yPosition[3]), 2)),
+    [4] = sqrt(pow((xPosition[5] - xPosition[4]), 2) + pow((yPosition[5] - yPosition[4]), 2)),
+    [5] = sqrt(pow((xPosition[6] - xPosition[5]), 2) + pow((yPosition[6] - yPosition[5]), 2)),
+    [6] = sqrt(pow((xPosition[7] - xPosition[6]), 2) + pow((yPosition[7] - yPosition[6]), 2)),
+    [7] = sqrt(pow((xPosition[8] - xPosition[7]), 2) + pow((yPosition[8] - yPosition[7]), 2)),
+    [8] = sqrt(pow((xPosition[9] - xPosition[8]), 2) + pow((yPosition[9] - yPosition[8]), 2)),
+    [9] = sqrt(pow((xPosition[10] - xPosition[9]), 2) + pow((yPosition[10] - yPosition[9]), 2)),
+    [10] = sqrt(pow((xPosition[11] - xPosition[10]), 2) + pow((yPosition[11] - yPosition[10]), 2)),
+    [11] = sqrt(pow((xPosition[12] - xPosition[11]), 2) + pow((yPosition[12] - yPosition[11]), 2)),
+    [12] = sqrt(pow((xPosition[13] - xPosition[12]), 2) + pow((yPosition[13] - yPosition[12]), 2)),
+    [13] = sqrt(pow((xPosition[14] - xPosition[13]), 2) + pow((yPosition[14] - yPosition[13]), 2))
+};  //REMEMBER TO INCLUDE DISTANCE FOR TRAVELLING BACK AGAIN
+
+/*
+=============================================================================
+TIMER, TACHO'S AND ATTACHED PINS TO H-BRIDGE
+=============================================================================*/
+Timer t; // DEFINE A TIMER T
+Serial pc(USBTX, USBRX); // not used here because we only have one serial
+// connection
+InterruptIn tacho_left(PC_3); // Set PC_2 to be interupt in for tacho left - Ledningsfarve: Hvid
+InterruptIn tacho_right(PC_2);// Set PC_3 to be interupt in for tacho right - Ledningsfarve: Grå
+
+Wheel robot(PB_2, PB_1, PB_15, PB_14);  //PB_15: grøn PB_14: blå PB_2: orange PB_1: gul
+// create an object of robot H-bridge. ---(M1A, M1B, M2A, M2B)---
+
+/*      USED FUNCTIONS IN ROBOT.CPP*/
+
+void read_analog() // comes here every second in this case
+// could be flagged with global variables like "stop"
+{
+    if(ain > 0.6f) { // 60% power, time for recharge
+        dout = 1;
+        stop=0;
+    } else {
+        dout = not dout;
+        stop=1; // flash red led
+    }
+
+    if (ain==1.0f) greenout = 1; // full power
+    else greenout = 0;
+}
+
+//  INIT YOUR PARAMETERS
+void init()
+{
+    tickL=0;
+    tickR=0;
+}
+
+//  SENSOR INFO FROM TACO SENSORS
+void tickLeft() // UPDATE LEFT TICK ON INTERRUPT
+{
+    tickL++;
+}
+void tickRight() // UPDATE RIGHT TICK ON INTERRUPT
+{
+    tickR++;
+}
+float Dleft() // DISTANCE FOR LEFT WHEEL
+{
+    return 2*PI*R*tickL/N;
+}
+
+float Dright() // DISTANCE FOR RIGHT WHEEL
+{
+    return 2*PI*R*tickR/N;
+}
+
+float Dcenter() // DISTANCE FOR CENTER
+{
+    return (Dleft()+Dright())/2;
+}
+
+float DeltaTHETA()  //UPDATE ON ANGLE
+{
+    return (Dright()-Dleft())/2*L;
+}
+
+    //  X POSITIONS
+float DeltaX_1()    //  1. X POSITION
+{
+    return Dcenter()*cos(THETA[0]+DeltaTHETA()/2);
+}
+
+    //  Y POSITIONS
+float DeltaY_1()    //1. Y POSITION
+{
+    return Dcenter()*sin(THETA[0]+DeltaTHETA()/2);
+}
+    //  DISTANCES TRAVELLED 
+float Dtravel_1()   //  1. DISTANCE
+{
+    return sqrt(pow(DeltaX_1(), 2) + pow(DeltaY_1(), 2));
+}
+
+    //  PID REGULATOR
+void get_to_goal ( ) // FUNCTION TO REACH GOAL WITH ERROR CONSIDERATION
+{   
+    double e = 0; // angle error
+    double THETA_D1 = atan((yPosition[1]-yPosition[0])/(xPosition[1]-xPosition[0]));    //  THETA DESIRED CALCULATED
+    double output = 0;
+    double derivative = 0;
+    double proportional = 0;
+    double integral = 0;
+    double e_old = 0;   
+
+    while (Dtravel_1() <= DISTANCES[0])    //  INDSTIL TIL RIGTIGE PUNKTER!!! SKER I ET PARALLELT TIDSFORLØB MED KØRSEL AF ROBOT TIL PUNKTER
+    {
+        if(THETA_D1 < -PI)    //  EVALUATES IF THE ANGLE IS LESS THAN -3.14
+        {
+            THETA_D1 = -PI;
+        }
+    
+        else if(THETA_D1 > PI)  //  EVALUATES IF THE ANGLE IS MORE THAN 3.14
+        {
+            THETA_D1 = PI;   
+        }
+        
+        e = THETA_D1 - THETA[0];    //  ERROR VALUE
+
+        // Compute the proportional
+        proportional = e; // get the error
+
+        // Compute the integral
+        integral += proportional;
+
+        // Compute the derivative
+        derivative = e - e_old;
+
+        // Remember the last error.
+        e_old = e;
+
+        // Compute the output
+        output = (proportional * (P_TERM)) + (integral * (I_TERM))
+                + (derivative * (D_TERM));
+
+        // Compute new speeds of both wheels
+        right = speed - output;//if power is 0, no error and same speed on wheels
+        left = speed + output;
+
+        // limit checks
+        if (right < MIN)
+            right = MIN;
+        else if (right > MAX)
+            right = MAX;
+
+        if (left < MIN)
+            left = MIN;
+        else if (left > MAX)
+            left = MAX;
+
+        robot.FW(right,left); // set new positions
+        printf("\n\r Dcenter = %3.2f tickL= %4d  tickR = %4d left %3.2f right %3.2f",
+               Dcenter(),tickL,tickR,left,right);
+               
+        printf("\n\r Error: %.2lf", e); //  HUSK DETTE!
+
+        wait_ms(20); // should be adjusted to your context. Give the motor time
+        // to do something before you react
+    }
+    t.stop(); // stop timer
+}
+#endif
\ No newline at end of file