
Werkt
Dependencies: Encoder HIDScope MODSERIAL QEI mbed
Fork of Inverse_kinematics_PIDController by
main.cpp
- Committer:
- CasperK
- Date:
- 2018-10-21
- Revision:
- 5:14a68d0ee71a
- Parent:
- 4:f36406c9e42f
- Child:
- 6:0162a633768d
File content as of revision 5:14a68d0ee71a:
#include "mbed.h" #include "math.h" #include "MODSERIAL.h" DigitalIn button(SW2); DigitalOut directionpin1(D7); DigitalOut directionpin2(D8); MODSERIAL pc(USBTX, USBRX); Ticker ticker; volatile bool emg0Bool = false; volatile bool emg1Bool = false; volatile bool emg2Bool = false; volatile bool y_direction = true; volatile bool a; volatile float x_position = 0.0; volatile float y_position = 0.0; volatile float old_y; volatile float old_x; volatile float motor1_angle = 0.0; volatile float motor2_angle = 0.0; volatile float direction; volatile char c; const float length = 0.300; //length in m (placeholder) const float C1 = 3; //motor 1 gear ratio (placeholder) const float C2 = 3; //motor 2 gear ratio void xDirection() { //direction of the motion if (emg0Bool && !emg1Bool) { //if a is pressed and not d, move to the left directionpin1 = true; directionpin2 = true; direction = -1; } else if (!emg0Bool && emg1Bool) { //if d is pressed and not a, move to the right directionpin1 = false; directionpin2 = false; direction = 1; } if (emg0Bool || emg1Bool){ //calculating the motion old_x = x_position; x_position = old_x + direction; motor1_angle = asin( x_position / length); //x = L*sin(theta) -> theta = arcsin(x/L) old_y = y_position; y_position = old_y + direction; motor2_angle = acos( x_position / length ); //theta = arccos(x/L) } //reset the booleans emg0Bool = false; emg1Bool = false; } void yDirection () { if (emg2Bool) { //if w is pressed, move up/down //direction of the motion if (y_direction) { directionpin2 = true; direction = 1; } else if (!y_direction) { directionpin2 = false; direction = -1; } //calculating the motion old_y = y_position; y_position = old_y + direction; motor2_angle = C2 * y_position; //reset the boolean emg2Bool = false; } } int main() { pc.baud(115200); 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(); if (a) { c = pc.getc(); switch (c){ case 'a': //move to the left emg0Bool = true; break; case 'd': //move to the right emg1Bool = true; break; case 'w': //move up/down emg2Bool = true; break; } } 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); wait(0.5f); //can also be done with ticker, to be sure that it happens exactly every 0.5 seconds } }