The motor angles/kinematics and inverse kinematics

Dependencies:   MODSERIAL mbed

Revision:
10:8b0d8d4016a1
Parent:
6:0162a633768d
--- a/main.cpp	Mon Oct 22 09:18:30 2018 +0000
+++ b/main.cpp	Thu Oct 25 14:44:32 2018 +0000
@@ -1,8 +1,9 @@
 #include "mbed.h"
 #include "math.h"
 #include "MODSERIAL.h"
+#define PI 3.141592f //65358979323846  // pi 
 
-DigitalIn button(SW2);
+DigitalIn button(SW3);
 DigitalOut directionpin1(D7);
 DigitalOut directionpin2(D8);
 MODSERIAL pc(USBTX, USBRX);
@@ -12,46 +13,49 @@
 volatile bool emg0Bool = false;
 volatile bool emg1Bool = false;
 volatile bool emg2Bool = false;
-volatile bool y_direction = true;
+volatile bool x_direction = true;
 volatile bool a;
 
-volatile float x_position = 0.0;
+const float C1 = 3.0; //motor 1 gear ratio
+const float C2 = 0.013; //motor 2 gear ratio/radius of the circular gear in m
+const float length = 0.300; //length in m (placeholder)
+
+volatile float x_position = length;
 volatile float y_position = 0.0;
-volatile float y_position2 = 0.0;
-volatile float old_y;
-volatile float old_y2;
-volatile float old_x;
-volatile float motor1_angle = 0.0; //circular gear motor
-volatile float motor2_angle = 0.0; //sawtooth gear motor
+volatile float old_y_position;
+volatile float old_x_position;
+volatile float old_motor1_angle;
+volatile float old_motor2_angle;
+volatile float motor1_angle = 0.0; //sawtooth gear motor
+volatile float motor2_angle = 0.0; //rotational gear motor
 volatile float direction;
 volatile char c;
-
-const float length = 0.300; //length in m (placeholder)
-const float C1 = 3; //motor 1 gear ratio
-const float C2 = 3; //motor 2 gear ratio/radius of the circular gear (placeholder)
       
-void xDirection() {
+void yDirection() {
     //direction of the motion
     if (emg0Bool && !emg1Bool) { //if a is pressed and not d, move to the left
         directionpin1 = true;
         directionpin2 = true;
-        direction = -1;
+        direction = -1.0;
     }
     else if (!emg0Bool && emg1Bool) { //if d is pressed and not a, move to the right
         directionpin1 = false;
         directionpin2 = false;
-        direction = 1;
+        direction = 1.0;
     }
 
     if (emg0Bool || emg1Bool){
         //calculating the motion
-        old_x = x_position;
-        x_position = old_x + (0.1f * direction);
-        motor1_angle = asin( x_position / (length * C1 ));     //rotational motor angle in rad
+        old_y_position = y_position;
+        y_position = old_y_position + (0.1f * direction);
+        old_motor2_angle = motor2_angle;
+        motor2_angle = asin( y_position / length );     //saw tooth motor angle in rad
         
-        old_y2 = y_position2;
-        y_position2 = old_y2 + (0.1f * direction);
-        motor2_angle = ( y_position / C2) + acos( x_position / length );     //sawtooth-gear motor angle in rad
+        //correction from motor 1 to keep x position the same
+        old_x_position = x_position;
+        x_position = old_x_position + cos( motor2_angle ) - cos( old_motor2_angle );
+        old_motor1_angle = motor1_angle;
+        motor1_angle = old_motor1_angle + ( x_position - old_x_position) / C1;     //rotational-gear motor angle in rad
     }
     
     //reset the booleans
@@ -59,24 +63,31 @@
     emg1Bool = false;
 }
 
-void yDirection () {      
+void xDirection () { 
+    //if the button is pressed, reverse the y direction
+    if (!button) {
+        x_direction = !x_direction;
+        wait(0.5f);
+        }     
+        
     if (emg2Bool) { //if w is pressed, move up/down
         //direction of the motion
-        if (y_direction) { 
+        if (x_direction) { 
             directionpin2 = true;
-            direction = 1;
+            direction = 1.0;
         }
-        else if (!y_direction) {
+        else if (!x_direction) {
             directionpin2 = false;
-            direction = -1;
+            direction = -1.0;
         }
         
         //calculating the motion
-        old_y = y_position;
-        y_position = old_y + (0.1f * direction);
-        motor2_angle = y_position / C2; // sawtooth-gear motor angle in rad
+        old_x_position = x_position;
+        x_position = old_x_position + (0.1f * direction);
+        old_motor1_angle = motor1_angle;
+        motor1_angle = old_motor1_angle + ( x_position - length ) / C2; // sawtooth-gear motor angle in degrees
         
-        //reset the boolean
+        //reset the boolean, for demo purposes
         emg2Bool = false; 
     }
 }
@@ -86,11 +97,6 @@
     pc.printf(" ** program reset **\n\r");
     
     while (true) {
-        //if the button is pressed, reverse the y direction
-        if (!button) {
-            y_direction = !y_direction;
-            wait(0.5);
-        }
         
         //testing the code from keyboard imputs: a-d: left to right, w: forward/backwards
         a = pc.readable();
@@ -108,13 +114,13 @@
                     break;
             }
         }
+        yDirection(); //call the function to move in the y direction
         xDirection(); //call the function to move in the x direction
-        yDirection(); //call the function to move in the y direction
         
         // print the motor angles and coordinates
         pc.printf("position: (%f, %f)\n\r", x_position, y_position);
-        pc.printf("motor1 angle: %f\n\r", motor1_angle);
-        pc.printf("motor2 angle: %f\n\r\n", motor2_angle);
+        pc.printf("motor1 angle: %f degrees\n\r", motor1_angle *180.0f /PI);
+        pc.printf("motor2 angle: %f degrees\n\r\n", motor2_angle *180.0f /PI);
 
         wait(0.5f); //can also be done with ticker, to be sure that it happens exactly every 0.5 seconds
     }