A robotic arm is a type of mechanical arm, usually programmable, that is designed to move materials, parts, tools, or specialized devices through various types of programmed motions for the purpose of manufacturing, assembly, testing, inspection, and other tasks. Robotic arms are widely used in a variety of industries, including automotive, aerospace, electronics, food processing, and pharmaceuticals.
One of the main advantages of using a robotic arm is its ability to perform tasks with a high degree of accuracy and repeatability. This makes them well-suited for tasks that require precise movements, such as welding, painting, and packaging. In addition, robotic arms can work continuously for long periods of time without getting tired or making mistakes, which makes them an ideal choice for tasks that are too hazardous or tedious for humans to perform.
There are several different types of robotic arms, each with its own unique set of features and capabilities. The most common type is the articulated arm, which is made up of a series of interconnected joints that allow the arm to move in a wide range of directions. Other types of robotic arms include parallel arms, which are designed for high-speed movement, and cylindrical arms, which are best suited for tasks that require precise rotational movements.
So in this tutorial we are going to make and assemble the first type of robotic arm which we can control with the help of joystick and take make it move in various directions. Let’s build our robotic arm!
Components required
- Robotic Arm Kit
- Arduino Board (UNO)
- USB –A to micro-USB cable
- Servo motor
- Dual Axis XY Joystick Module
- Connecting wires
Software Required
- Arduino IDE
Assembling of Robotic Arm
Step 1: Box structure assembly
Part number included: 3,4,5,6,7,8
Fix the servo motor with the help of M2.5 type screws and nuts. To fix all the parts mentioned above, we have used M3 type 10mm screws and nuts respectively.
TOP VIEW
SIDE VIEW
Step 2: Bridge and clips assembly
Part number included: 9,10,11,12,13,14,15,16,17Screw all the parts as shown in the figure. Here you have to use M3 type 10 mm screws. Don’t over-tighten the screws. If needed you can also include spacers and M3 type 10 mm screws for extra space for nuts.
Step 3: Clipper assembly
Part number included: 19,20,21,22,23,24,25,26For clipper assembly all the screws of M3 type 10mm are used.
Step 4: Base mount assembly
Part number included: 1,2Fix the servo motor with the help of M2.5 type screws and nuts. To fix part number 1 and 2, we have used M3 type 25mm screws and nuts respectively.
Step 5: Body Attachment
Part number included: 18,27To attach the part number 18 and 27, we have to use M3 type 12mm screws and nuts respectively.
Step 6: Clipper and Base mount Attachment to the body
Clipper and Base mount are screwed together with the help of M3 type 10mm screws and nuts.
Final assembly looks like:
Circuit Diagram
Follow this table in order to make your connections.
Joystick 1 |
Arduino Pins |
5V |
5V |
GND |
GND |
VRX |
A0 |
VRY |
A1 |
Joystick 2 |
Arduino Pins |
5V |
5V |
GND |
GND |
VRX |
A2 |
VRY |
A3 |
Servo pins |
Color code |
Arduino Pins |
5V |
Red |
5V |
GND |
Black |
GND |
Servo 1 |
Orange |
6 |
Servo 2 |
Orange |
9 |
Servo 3 |
Orange |
10 |
Servo 4 |
Orange |
11 |
Arduino Source Code
//Quartz Mini Robotic ARM - Testing code
//Joystick 1 and 2 is connected to A0,A1, A2 and A3
//SERVO CONNECTIONS
//Neck sero - D10 - pos is saved at EEPROM 3
//Front and Back - D11 - pos is saved at EEPROM 2
//UP and Down - D9 - pos is saved at EEPROM 1
//Gripper - D6 - pos is saved at EEPROM 0
//created by: Aswinth Raj
//created for: quartzcomponents.com
#include <Servo.h>
#include <EEPROM.h>
//All the gripper positions will be saved and read from eeprom to resume same positon
int gripper_pos = EEPROM.read(0);
int updown_pos = EEPROM.read(1);
int frontback_pos = EEPROM.read(2);
int neck_pos = EEPROM.read(3);
// Create a servo object - one each for 4 servos
Servo Gripper_servo;
Servo UpDown_servo;
Servo FrontBack_servo;
Servo Neck_servo;
//Function the control the servo based on joystick position
void control_servo (Servo ¤t_servo, int current_pos, int EEPROM_addr)
{
//positon should alwasy be between 0 to 180
if (current_pos>=180)
current_pos=175; //jitter at maximum limit
if (current_pos<=0)
current_pos=10; //jitter at minimum limit
current_servo.write(current_pos); //update servo postion
EEPROM.write(EEPROM_addr, current_pos); //save position in EEPROM
Serial.print(EEPROM_addr); Serial.print(" = "); Serial.println(current_pos); //for debugging on serial monitor
}
void setup() {
Serial.begin (9600);
Gripper_servo.attach(6);
Gripper_servo.write(gripper_pos);
UpDown_servo.attach(9);
UpDown_servo.write(gripper_pos);
FrontBack_servo.attach(11);
FrontBack_servo.write(gripper_pos);
Neck_servo.attach(10);
Neck_servo.write(gripper_pos);
}
void loop() {
/*//USE FOR DEBUGGING
Serial.println ("Gripper, UpDown, FrontBack, Neck");
Serial.print(gripper_pos);Serial.print(",");
Serial.print(updown_pos);Serial.print(",");
Serial.print(frontback_pos);Serial.print(",");
Serial.print(neck_pos);Serial.println(".");*/
delay(50); //predefined delay to make the servo move slower
//A0 to control Gripper Servo
int Joy_value_X1 = analogRead (A0);
if (Joy_value_X1 > 700){
gripper_pos = gripper_pos + 1;
control_servo (Gripper_servo, gripper_pos, 0);
}
if (Joy_value_X1 < 300){
gripper_pos = gripper_pos - 1;
control_servo (Gripper_servo, gripper_pos, 0);
}
//A1 to control UpDown Servo
int Joy_value_Y1 = analogRead (A1);
if (Joy_value_Y1 > 700){
updown_pos = updown_pos + 1;
control_servo (UpDown_servo, updown_pos, 1);
}
if (Joy_value_Y1 < 300){
updown_pos = updown_pos - 1;
control_servo (UpDown_servo, updown_pos, 1);
}
//A2 to control FrontBack Servo
int Joy_value_X2 = analogRead (A2);
if (Joy_value_X2 > 700){
frontback_pos = frontback_pos + 1;
control_servo (FrontBack_servo, frontback_pos, 2);
}
if (Joy_value_X2 < 300){
frontback_pos = frontback_pos - 1;
control_servo (FrontBack_servo, frontback_pos, 2);
}
//A3 to control Neck Servo
int Joy_value_Y2 = analogRead (A3);
if (Joy_value_Y2 > 700){
neck_pos = neck_pos + 1;
control_servo (Neck_servo, neck_pos, 3);
}
if (Joy_value_Y2 < 300){
neck_pos = neck_pos - 1;
control_servo (Neck_servo, neck_pos, 3);
}
}
Code Explanation
#include <Servo.h>
#include <EEPROM.h>
Here we have included servo and EEPROM library. All the position will be saved in EEPROM and will resume from the last position.
int gripper_pos = EEPROM.read(0);
int updown_pos = EEPROM.read(1);
int frontback_pos = EEPROM.read(2);
int neck_pos = EEPROM.read(3);
We have allotted the pin number to the respective joysticks to operate different arms of the robot.
Servo Gripper_servo;
Servo UpDown_servo;
Servo FrontBack_servo;
Servo Neck_servo;
Created a servo object for all the four servos.
In the void control_servo section, servos are controlled with the help of joysticks. The Current position of all the servo motors gets stored in the EEPROM.
void setup()
In this section, we have defined the pins of servos respectively.
void loop()
In this section, as the joysticks are operated, the value gets increases by 1 and the maximum and minimum values are allotted as 700 and 300. With the increment function, the value will reach till 700 and the servo will operate according to the value fed by the joystick.
Troubleshooting
Servo motor is not working?
Cross-check your connections with the Arduino. The Servo motor must be supplied with the 5v supply. If you feel that the servo is not getting proper supply from the Arduino, then try to power the servo from the separate 5V power supply.
Robotic arm is not having smooth motion?
For this, you have to loosen the screw a little bit such that the joints ensure a free motion exactly as same as human joints like elbow and knees.
Facing a loose joints issue?
Try to add the spacers provided with the kit. These spaces will provide a smooth motion and will eliminate the spaces between the joints. Use them as per your requirements.