diff --git a/3D Robot Arm/3D Models/Arm Base.stl b/3D Robot Arm/3D Models/Arm Base.stl new file mode 100644 index 0000000..f731ffc Binary files /dev/null and b/3D Robot Arm/3D Models/Arm Base.stl differ diff --git a/3D Robot Arm/3D Models/Arm Hub.stl b/3D Robot Arm/3D Models/Arm Hub.stl new file mode 100644 index 0000000..0e7dd0f Binary files /dev/null and b/3D Robot Arm/3D Models/Arm Hub.stl differ diff --git a/3D Robot Arm/3D Models/Arm_1.stl b/3D Robot Arm/3D Models/Arm_1.stl new file mode 100644 index 0000000..666c562 Binary files /dev/null and b/3D Robot Arm/3D Models/Arm_1.stl differ diff --git a/3D Robot Arm/3D Models/Arm_2.stl b/3D Robot Arm/3D Models/Arm_2.stl new file mode 100644 index 0000000..ba820b0 Binary files /dev/null and b/3D Robot Arm/3D Models/Arm_2.stl differ diff --git a/3D Robot Arm/3D Models/Base Part_1.stl b/3D Robot Arm/3D Models/Base Part_1.stl new file mode 100644 index 0000000..79ef146 Binary files /dev/null and b/3D Robot Arm/3D Models/Base Part_1.stl differ diff --git a/3D Robot Arm/3D Models/Base Part_2.stl b/3D Robot Arm/3D Models/Base Part_2.stl new file mode 100644 index 0000000..a8871be Binary files /dev/null and b/3D Robot Arm/3D Models/Base Part_2.stl differ diff --git a/3D Robot Arm/3D Models/Clamp.stl b/3D Robot Arm/3D Models/Clamp.stl new file mode 100644 index 0000000..fd8b359 Binary files /dev/null and b/3D Robot Arm/3D Models/Clamp.stl differ diff --git a/3D Robot Arm/3D Models/Gear X3.stl b/3D Robot Arm/3D Models/Gear X3.stl new file mode 100644 index 0000000..9c51197 Binary files /dev/null and b/3D Robot Arm/3D Models/Gear X3.stl differ diff --git a/3D Robot Arm/3D Models/Main Axel.stl b/3D Robot Arm/3D Models/Main Axel.stl new file mode 100644 index 0000000..96235a1 Binary files /dev/null and b/3D Robot Arm/3D Models/Main Axel.stl differ diff --git a/3D Robot Arm/3D Models/Middle Gear.stl b/3D Robot Arm/3D Models/Middle Gear.stl new file mode 100644 index 0000000..6f9348b Binary files /dev/null and b/3D Robot Arm/3D Models/Middle Gear.stl differ diff --git a/3D Robot Arm/3D Models/Robot Arm.stl b/3D Robot Arm/3D Models/Robot Arm.stl new file mode 100644 index 0000000..f95087b Binary files /dev/null and b/3D Robot Arm/3D Models/Robot Arm.stl differ diff --git a/3D Robot Arm/Circuit Diagram.png b/3D Robot Arm/Circuit Diagram.png new file mode 100644 index 0000000..e787954 Binary files /dev/null and b/3D Robot Arm/Circuit Diagram.png differ diff --git a/3D Robot Arm/Codes/Robot_Arm_3D_Box_Easing/Robot_Arm_3D_Box_Easing.ino b/3D Robot Arm/Codes/Robot_Arm_3D_Box_Easing/Robot_Arm_3D_Box_Easing.ino new file mode 100644 index 0000000..fda5d7f --- /dev/null +++ b/3D Robot Arm/Codes/Robot_Arm_3D_Box_Easing/Robot_Arm_3D_Box_Easing.ino @@ -0,0 +1,155 @@ + +#include +#include "ServoEasing.hpp" + +ServoEasing servo_x_axis; +ServoEasing servo_y_left_axis; +ServoEasing servo_y_right_axis; +ServoEasing servo_z_axis; +ServoEasing servo_r_axis; + +Servo clamp; + +int x_axis_degree = 90; +int y_axis_degree = 120; +int z_axis_degree = 40; +int r_axis_degree = 110; + +int clamp_open_degree = 120; +int clamp_half_open_degree = 60; +int clamp_closed_degree = 35; + +int general_speed = 38; +int low_speed = 20; + +void setup() { + Serial.begin(9600); + + servo_y_left_axis.setReverseOperation(true); + + servo_x_axis.attach(3, x_axis_degree); + servo_y_left_axis.attach(5, y_axis_degree); + servo_y_right_axis.attach(6, y_axis_degree); + servo_z_axis.attach(9, z_axis_degree); + servo_r_axis.attach(10, r_axis_degree); + + clamp.attach(11); + clamp.write(clamp_closed_degree); + + //setSpeedForAllServos(general_speed); + //setEasingTypeForAllServos(EASE_CUBIC_IN_OUT); + //setEasingTypeForAllServos(EASE_QUADRATIC_IN_OUT); + //setEasingTypeForAllServos(EASE_SINE_IN_OUT); + setEasingTypeForAllServos(EASE_SINE_IN_OUT); + + delay(1000); // Wait for servo to reach start position. +} + +String commands[] = { + "X=50", + "C=2", + + "Y=40,Z=75,R=150", + "C=1", + "Y=120,Z=40,R=110", + "X=90", + "Y=23,Z=85,R=160", + "C=2", + "Y=120,Z=40,R=110", + "X=50", + + "Y=35,Z=75,R=150", + "C=1", + "Y=120,Z=40,R=110", + "X=90", + "Y=40,Z=78,R=150", + "C=2", + "Y=120,Z=40,R=110", + "X=50", + + "Y=35,Z=75,R=150", + "C=1", + "Y=120,Z=40,R=110", + "X=90", + "Y=52,Z=75,R=140", + "C=2", + "Y=120,Z=40,R=110", + "X=50", + + "Y=35,Z=75,R=150", + "C=1", + "Y=120,Z=40,R=110", + "X=90", + "Y=59,Z=80,R=130", + "C=2", + "Y=120,Z=40,R=110", + "X=50", + + + "Y=22,Z=83,R=160", + "C=1", + "Y=120,Z=40,R=110", + "X=90", + "Y=65,Z=90,R=110", + "C=2", + "Y=120,Z=40,R=110", +}; + +void loop() { + delay(3000); + + for (int i = 0; i < 41; i++) { + String command = commands[i]; + Serial.println(command); + + int index = 0; + while ((index = command.indexOf(',')) > 0) { + String subcommand = command.substring(0, index); + command = command.substring(index + 1); + subcommand.trim(); + parse_command(subcommand); + } + parse_command(command); + + synchronizeAllServosStartAndWaitForAllServosToStop(); + Serial.print("Command "); + Serial.print(i + 1); + Serial.println(" completed."); + + delay(1000); + } + + Serial.print("Press enter to contine."); + while (Serial.available() == 0) delay(10); +} + +void parse_command(String command) { + String axis = command.substring(0, 1); + int value = command.substring(2).toInt(); + + if (axis == "X" || axis == "x") { + int speed = (abs(value - x_axis_degree) <= 20) ? low_speed : general_speed; + + servo_x_axis.setEaseTo(value, general_speed); + x_axis_degree = value; + } else if (axis == "Y" || axis == "y") { + int speed = (abs(value - y_axis_degree) <= 20) ? low_speed : general_speed; + + servo_y_left_axis.setEaseTo(value - 10, speed); // Use x.y with trailing f (to specify a floating point constant) to avoid compiler errors. + servo_y_right_axis.setEaseTo(value - 10, speed); + + y_axis_degree = value; + } else if (axis == "Z" || axis == "z") { + int speed = (abs(value - z_axis_degree) <= 20) ? low_speed : general_speed; + + servo_z_axis.setEaseTo(value, speed); + z_axis_degree = value; + } else if (axis == "R" || axis == "r") { + int speed = (abs(value - r_axis_degree) <= 20) ? low_speed : general_speed; + + servo_r_axis.setEaseTo(value, speed); + r_axis_degree = value; + } else if (axis == "C" || axis == "c") { + clamp.write(value == 2 ? clamp_open_degree : (value == 1 ? clamp_half_open_degree : clamp_closed_degree)); + } +} diff --git a/3D Robot Arm/Codes/Robot_Arm_3D_Easing/Robot_Arm_3D_Easing.ino b/3D Robot Arm/Codes/Robot_Arm_3D_Easing/Robot_Arm_3D_Easing.ino new file mode 100644 index 0000000..6b81247 --- /dev/null +++ b/3D Robot Arm/Codes/Robot_Arm_3D_Easing/Robot_Arm_3D_Easing.ino @@ -0,0 +1,96 @@ + +#include +#include "ServoEasing.hpp" + +ServoEasing servo_x_axis; +ServoEasing servo_y_left_axis; +ServoEasing servo_y_right_axis; +ServoEasing servo_z_axis; +ServoEasing servo_r_axis; + +Servo clamp; + +int x_axis_degree = 90; +int y_axis_degree = 120; +int z_axis_degree = 40; +int r_axis_degree = 110; + +int clamp_open_degree = 120; +int clamp_half_open_degree = 60; +int clamp_closed_degree = 35; + +int general_speed = 38; +int low_speed = 20; + +void setup() { + Serial.begin(9600); + + servo_y_left_axis.setReverseOperation(true); + + servo_x_axis.attach(3, x_axis_degree); + servo_y_left_axis.attach(5, y_axis_degree); + servo_y_right_axis.attach(6, y_axis_degree); + servo_z_axis.attach(9, z_axis_degree); + servo_r_axis.attach(10, r_axis_degree); + + clamp.attach(11); + clamp.write(clamp_closed_degree); + + //setSpeedForAllServos(general_speed); + //setEasingTypeForAllServos(EASE_CUBIC_IN_OUT); + //setEasingTypeForAllServos(EASE_QUADRATIC_IN_OUT); + //setEasingTypeForAllServos(EASE_SINE_IN_OUT); + setEasingTypeForAllServos(EASE_SINE_IN_OUT); + + delay(1000); // Wait for servo to reach start position. +} + +void loop() { + Serial.print("Enter command : "); + while (Serial.available() == 0) delay(10); + + String command = Serial.readString(); + Serial.println(command); + + int index = 0; + while ((index = command.indexOf(',')) > 0) { + String subcommand = command.substring(0, index); + command = command.substring(index + 1); + subcommand.trim(); + parse_command(subcommand); + } + parse_command(command); + + synchronizeAllServosStartAndWaitForAllServosToStop(); +} + +void parse_command(String command) { + String axis = command.substring(0, 1); + int value = command.substring(2).toInt(); + + if (axis == "X" || axis == "x") { + int speed = (abs(value - x_axis_degree) <= 20) ? low_speed : general_speed; + + servo_x_axis.setEaseTo(value, general_speed); + x_axis_degree = value; + } else if (axis == "Y" || axis == "y") { + int speed = (abs(value - y_axis_degree) <= 20) ? low_speed : general_speed; + + servo_y_left_axis.setEaseTo(value - 10, speed); + servo_y_right_axis.setEaseTo(value - 10, speed); + + y_axis_degree = value; + } else if (axis == "Z" || axis == "z") { + int speed = (abs(value - z_axis_degree) <= 20) ? low_speed : general_speed; + + servo_z_axis.setEaseTo(value, speed); + z_axis_degree = value; + } else if (axis == "R" || axis == "r") { + int speed = (abs(value - r_axis_degree) <= 20) ? low_speed : general_speed; + + servo_r_axis.setEaseTo(value, speed); + r_axis_degree = value; + } else if (axis == "C" || axis == "c") { + clamp.write(value == 2 ? clamp_open_degree : (value == 1 ? clamp_half_open_degree : clamp_closed_degree)); + } +} diff --git a/3D Robot Arm/Youtube Video.txt b/3D Robot Arm/Youtube Video.txt index e69de29..29ea137 100644 --- a/3D Robot Arm/Youtube Video.txt +++ b/3D Robot Arm/Youtube Video.txt @@ -0,0 +1 @@ +https://youtu.be/YqrbWCVa3xA \ No newline at end of file