DIY Arduino Robot Arm with Smartphone Control

In this tutorial we will learn how to make an Arduino Robot Arm which can be wirelessly controlled and programmed using a custom-build Android application. I will show you the entire process of building it, starting from designing and 3D printing the robot parts, connecting the electronic components and programming the Arduino, to developing our own Android application for controlling the Robot Arm.

Overview


Using the sliders in the app we can manually control the movement of each servo or axis of the robot arm. Also using the “Save” button we can record each position or step and then the robot arm can automatically run and repeat these steps. With the same button we can pause the automatic operation as well as reset or delete all steps so that we can record new ones.

Arduino Robot Arm 3D Model

To begin with, I designed the Robot Arm using Solidworks 3D modeling software. The arm has 5 degrees of freedom.

Arduino Robot Arm 3D Model

For the first 3 axis, the waist, the shoulder and the elbow, I used the MG996R servos, and for the other 2 axis, the wrist roll and wrist pitch, as well as the gripper I used the smaller SG90 micro servos.

You can download and the 3D model below.

Solidworks:

STEP file:

STL files for 3D Printing:

Icon

Arduino Robot Arm STL Files 372.99 KB 78937 downloads

...

3D Printing the Robot Arm

Using my new 3D Printer, Creality CR-10, I 3D printed all of the parts for the Arduino robot arm.

Here I would like to give a shout-out to Banggood.com for providing me this awesome 3D printer. The Creality CR-10 printing quality is amazing for its price point and what’s also great about it is that it comes almost 90% pre-assembled.

In order to complete the assembly we just have to connect the upper and lower parts frames using some bolts and brackets, and then connect the electronic components with the control box using the provided cables.

Assembling Creality CR-10 3D Printer

Before trying it, it is recommended check whether the roller wheels are tight enough, and if they are not, you can simply use the eccentric nuts to tight them up. And that’s it, after leveling your 3D printing bed, you are ready to transform your 3D creations into reality.

I had all of the parts for the Arduino Robot Arm ready in just several hours.

Assembling the Robot Arm

Ok, so at this point we are ready to assemble the robot arm. I started with the base on which I attached the first servo motor using the screws included in its package. Then on the output shaft of the servo I secured a round horn a bolt.

And on top of it I placed the upper part and secured it using two screws.

Arduino Robot Arm Base Assembly

Here again first goes servo, then the round horn onto the next part, and then they are secured to each other using the bolt on the output shaft.

We can notice here that at the shoulder axis it is good idea to include some kind of spring or in my case I used a rubber band to give some help to the servo because this servo carries the whole weight of the rest of the arm as well as the payload.

In similar way I continued to assemble the rest of the robot arm. As for the gripper mechanism I used some 4 millimeters bolts and nuts to assembly it.

3D Printer Robot Arm

Finally I attached the gripper mechanism onto the last servo and the Arduino robot arm was completed.

Arduino Robotic Arm - 3D Printed

Arduino Robot Arm Circuit Diagram

The next stage is connecting the electronics. The circuit diagram of this project is actually quite simple. We just need an Arduino board and a HC-05 Bluetooth module for communication with the smartphone. The control pins of the six servo motors are connected to six digital pins of the Arduino board.

Arduino Robot Arm Schematic Circuit Diagram

 

For powering the servos we need 5V, but this must come from an external power source because the Arduino is not able to handle the amount of current that all of them can draw. The power source must be able to handle at least 2A of current. So once we have connected everything together we can move on to programing the Arduino and make the Android app.

You can get the components needed for this example from the links below:

  • MG996R Servo Motor……………………….…. Amazon / Banggood
  • SG90 Micro Servo Motor ……..…….….……. Amazon / Banggood
  • HC-05 Bluetooth Module ………………….… Amazon / Banggood
  • Arduino Board ……………………………………. Amazon / Banggood
  • 5V 2A DC Power Supply ………………….….. Amazon / Banggood

*Please note: These are affiliate links. I may make a commission if you buy the components through these links. I would appreciate your support in this way!

Arduino Robot Arm Code

As the code is a bit longer, for better understanding, I will post the source code of the program in sections with description for each section. And at the end of this article I will post the complete source code.

So first we need to include the SoftwareSerial library for the serial communication of the Bluetooth module as well as the servo library. Both of these libraries are included with the Arduino IDE so you don’t have to install them externally. Then we need to define the six servos, the HC-05 Bluetooth module and some variables for storing the current and previous position of the servos, as well as arrays for storing the positions or the steps for the automatic mode.

#include <SoftwareSerial.h>
#include <Servo.h>

Servo servo01;
Servo servo02;
Servo servo03;
Servo servo04;
Servo servo05;
Servo servo06;

SoftwareSerial Bluetooth(3, 4); // Arduino(RX, TX) - HC-05 Bluetooth (TX, RX)

int servo1Pos, servo2Pos, servo3Pos, servo4Pos, servo5Pos, servo6Pos; // current position
int servo1PPos, servo2PPos, servo3PPos, servo4PPos, servo5PPos, servo6PPos; // previous position
int servo01SP[50], servo02SP[50], servo03SP[50], servo04SP[50], servo05SP[50], servo06SP[50]; // for storing positions/steps
int speedDelay = 20;
int index = 0;
String dataIn = "";

In the setup section we need to initialize the servos and the Bluetooth module and move the robot arm to its initial position. We do that using the write() function which simply moves the servo to any position from 0 to 180 degrees.

void setup() {
  servo01.attach(5);
  servo02.attach(6);
  servo03.attach(7);
  servo04.attach(8);
  servo05.attach(9);
  servo06.attach(10);
  Bluetooth.begin(38400); // Default baud rate of the Bluetooth module
  Bluetooth.setTimeout(1);
  delay(20);
  // Robot arm initial position
  servo1PPos = 90;
  servo01.write(servo1PPos);
  servo2PPos = 150;
  servo02.write(servo2PPos);
  servo3PPos = 35;
  servo03.write(servo3PPos);
  servo4PPos = 140;
  servo04.write(servo4PPos);
  servo5PPos = 85;
  servo05.write(servo5PPos);
  servo6PPos = 80;
  servo06.write(servo6PPos);
}

Next, in the loop section, using the Bluetooth.available() function , we constantly check whether there is any incoming data from the Smartphone. If true, using the readString() function we read the data as string an store it into the dataIn variable. Depending on the arrived data we will tell robot arm what to do.

// Check for incoming data
  if (Bluetooth.available() > 0) {
    dataIn = Bluetooth.readString();  // Read the data as string

Arduino Robot Arm Control Android App

Let’s take a look at the Android app now and see what kind of data it is actually sending to the Arduino.

Arduino Robot Arm Control Android App

I made the app using the MIT App Inventor online application and here’s how it works. At the top we have two buttons for connecting the smartphone to the HC-05 Bluetooth module. Then on the left side we have an image of the robot arm, and on the right side we have the six slider for controlling the servos and one slider for the speed control.

Android-App-development-with-MIT-App-Inventor

Each slider have different initial, minimum and maximum value that suits the robot arm joints. At the bottom of the app, we have three button, SAVE, RUN and RESET through which we can program the robot arm to run automatically. There is also a label below which shows the number of steps we have saved. Nevertheless, for more details how to build apps like this using the MIT App Inventor you can check my other detailed tutorial for it.

Ok, now let’s see the program or the blocks behind the application. First, on the left side we have the blocks for connecting the smartphone to the Bluetooth module.

Then we have the sliders blocks for the servo position control and the buttons blocks for programing the robot arm. So if we change the position of the slider, using the Bluetooth function .SendText, we send a text to the Arduino. This text consist of a prefix which indicates which slider has been changed as well as the current value of the slider.

Here’s a download file of the above MIT App Inventor project, as well as the Android App ready to be installed on your smartphone:

Icon

Arduino Robot Arm Control Android App 2.57 MB 109518 downloads

...

So therefore, at the Arduino, using the startsWith() function we check the prefix of each incoming data and so we know what do to next. For example, if the prefix is “s1” we know that we need to move the servo number one. Using the substring() function we get the remaining text, or that’s the position value, we convert it into integer and use the value to move the servo to that position.

// If "Waist" slider has changed value - Move Servo 1 to position
    if (dataIn.startsWith("s1")) {
      String dataInS = dataIn.substring(2, dataIn.length()); // Extract only the number. E.g. from "s1120" to "120"
      servo1Pos = dataInS.toInt();  // Convert the string into integer

Here we can simply call the write() function and the servo will go to that position, but in that way the servo would run at its maximum speed which is too much for the robot arm. Instead we need to control the speed of the servos so I used some FOR loops in order to gradually move the servo from the previous to the current position by implementing a delay time between each iteration. By changing the delay time you can change the speed of the servo.

// We use for loops so we can control the speed of the servo
      // If previous position is bigger then current position
      if (servo1PPos > servo1Pos) {
        for ( int j = servo1PPos; j >= servo1Pos; j--) {   // Run servo down
          servo01.write(j);
          delay(20);    // defines the speed at which the servo rotates
        }
      }
      // If previous position is smaller then current position
      if (servo1PPos < servo1Pos) {
        for ( int j = servo1PPos; j <= servo1Pos; j++) {   // Run servo up
          servo01.write(j);
          delay(20);
        }
      }
      servo1PPos = servo1Pos;   // set current position as previous position
    }

The same method is used for driving each axis of the robot arm.

Below them is the SAVE button. If we press the SAVE button, the position of each servo motor is stored in an array. With each pressing the index increases so the array is filled step by step.

// If button "SAVE" is pressed
    if (dataIn.startsWith("SAVE")) {
      servo01SP[index] = servo1PPos;  // save position into the array
      servo02SP[index] = servo2PPos;
      servo03SP[index] = servo3PPos;
      servo04SP[index] = servo4PPos;
      servo05SP[index] = servo5PPos;
      servo06SP[index] = servo6PPos;
      index++;                        // Increase the array index
    }

Then if we press the RUN button we call the runservo() custom function which runs stored steps. Let’s take a look at this function. So here we run the stored steps over and over again until we press the RESET button. Using the FOR loop we run through all positions stored in the arrays and at the same time we check whether we have any incoming data from the smartphone. This data can be the RUN/PAUSE button, which pauses the robot, and if clicked again continues with the automatic movements. Also if we change the speed slider position, we will use that value to change the delay time between each iteration in the FOR loops below, which controls the speed of the servo motors.

// Automatic mode custom function - run the saved steps
void runservo() {
  while (dataIn != "RESET") {   // Run the steps over and over again until "RESET" button is pressed
    for (int i = 0; i <= index - 2; i++) {  // Run through all steps(index)
      if (Bluetooth.available() > 0) {      // Check for incomding data
        dataIn = Bluetooth.readString();
        if ( dataIn == "PAUSE") {           // If button "PAUSE" is pressed
          while (dataIn != "RUN") {         // Wait until "RUN" is pressed again
            if (Bluetooth.available() > 0) {
              dataIn = Bluetooth.readString();
              if ( dataIn == "RESET") {     
                break;
              }
            }
          }
        }
        // If SPEED slider is changed
        if (dataIn.startsWith("ss")) {
          String dataInS = dataIn.substring(2, dataIn.length());
          speedDelay = dataInS.toInt(); // Change servo speed (delay time)
        }
      }
      // Servo 1
      if (servo01SP[i] == servo01SP[i + 1]) {
      }
      if (servo01SP[i] > servo01SP[i + 1]) {
        for ( int j = servo01SP[i]; j >= servo01SP[i + 1]; j--) {
          servo01.write(j);
          delay(speedDelay);
        }
      }
      if (servo01SP[i] < servo01SP[i + 1]) {
        for ( int j = servo01SP[i]; j <= servo01SP[i + 1]; j++) {
          servo01.write(j);
          delay(speedDelay);
        }
      }

In similar way as explained earlier with these IF statements and FOR loops we move the servos to their next position. Finally if we press the RESET button we will clear all the data from the arrays to zero and also reset the index to zero so we can reprogram the robot arm with new movements.

// If button "RESET" is pressed
    if ( dataIn == "RESET") {
      memset(servo01SP, 0, sizeof(servo01SP)); // Clear the array data to 0
      memset(servo02SP, 0, sizeof(servo02SP));
      memset(servo03SP, 0, sizeof(servo03SP));
      memset(servo04SP, 0, sizeof(servo04SP));
      memset(servo05SP, 0, sizeof(servo05SP));
      memset(servo06SP, 0, sizeof(servo06SP));
      index = 0;  // Index to 0
    }

And that’s it, now we can enjoy and have some fun with the robot arm.

Here’s the complete code of the Arduino Robot Arm:

/*        
       DIY Arduino Robot Arm Smartphone Control  
        by Dejan, www.HowToMechatronics.com  
*/

#include <SoftwareSerial.h>
#include <Servo.h>

Servo servo01;
Servo servo02;
Servo servo03;
Servo servo04;
Servo servo05;
Servo servo06;

SoftwareSerial Bluetooth(3, 4); // Arduino(RX, TX) - HC-05 Bluetooth (TX, RX)

int servo1Pos, servo2Pos, servo3Pos, servo4Pos, servo5Pos, servo6Pos; // current position
int servo1PPos, servo2PPos, servo3PPos, servo4PPos, servo5PPos, servo6PPos; // previous position
int servo01SP[50], servo02SP[50], servo03SP[50], servo04SP[50], servo05SP[50], servo06SP[50]; // for storing positions/steps
int speedDelay = 20;
int index = 0;
String dataIn = "";

void setup() {
  servo01.attach(5);
  servo02.attach(6);
  servo03.attach(7);
  servo04.attach(8);
  servo05.attach(9);
  servo06.attach(10);
  Bluetooth.begin(38400); // Default baud rate of the Bluetooth module
  Bluetooth.setTimeout(1);
  delay(20);
  // Robot arm initial position
  servo1PPos = 90;
  servo01.write(servo1PPos);
  servo2PPos = 150;
  servo02.write(servo2PPos);
  servo3PPos = 35;
  servo03.write(servo3PPos);
  servo4PPos = 140;
  servo04.write(servo4PPos);
  servo5PPos = 85;
  servo05.write(servo5PPos);
  servo6PPos = 80;
  servo06.write(servo6PPos);
}

void loop() {
  // Check for incoming data
  if (Bluetooth.available() > 0) {
    dataIn = Bluetooth.readString();  // Read the data as string
    
    // If "Waist" slider has changed value - Move Servo 1 to position
    if (dataIn.startsWith("s1")) {
      String dataInS = dataIn.substring(2, dataIn.length()); // Extract only the number. E.g. from "s1120" to "120"
      servo1Pos = dataInS.toInt();  // Convert the string into integer
      // We use for loops so we can control the speed of the servo
      // If previous position is bigger then current position
      if (servo1PPos > servo1Pos) {
        for ( int j = servo1PPos; j >= servo1Pos; j--) {   // Run servo down
          servo01.write(j);
          delay(20);    // defines the speed at which the servo rotates
        }
      }
      // If previous position is smaller then current position
      if (servo1PPos < servo1Pos) {
        for ( int j = servo1PPos; j <= servo1Pos; j++) {   // Run servo up
          servo01.write(j);
          delay(20);
        }
      }
      servo1PPos = servo1Pos;   // set current position as previous position
    }
    
    // Move Servo 2
    if (dataIn.startsWith("s2")) {
      String dataInS = dataIn.substring(2, dataIn.length());
      servo2Pos = dataInS.toInt();

      if (servo2PPos > servo2Pos) {
        for ( int j = servo2PPos; j >= servo2Pos; j--) {
          servo02.write(j);
          delay(50);
        }
      }
      if (servo2PPos < servo2Pos) {
        for ( int j = servo2PPos; j <= servo2Pos; j++) {
          servo02.write(j);
          delay(50);
        }
      }
      servo2PPos = servo2Pos;
    }
    // Move Servo 3
    if (dataIn.startsWith("s3")) {
      String dataInS = dataIn.substring(2, dataIn.length());
      servo3Pos = dataInS.toInt();
      if (servo3PPos > servo3Pos) {
        for ( int j = servo3PPos; j >= servo3Pos; j--) {
          servo03.write(j);
          delay(30);
        }
      }
      if (servo3PPos < servo3Pos) {
        for ( int j = servo3PPos; j <= servo3Pos; j++) {
          servo03.write(j);
          delay(30);
        }
      }
      servo3PPos = servo3Pos;
    }
    // Move Servo 4
    if (dataIn.startsWith("s4")) {
      String dataInS = dataIn.substring(2, dataIn.length());
      servo4Pos = dataInS.toInt();
      if (servo4PPos > servo4Pos) {
        for ( int j = servo4PPos; j >= servo4Pos; j--) {
          servo04.write(j);
          delay(30);
        }
      }
      if (servo4PPos < servo4Pos) {
        for ( int j = servo4PPos; j <= servo4Pos; j++) {
          servo04.write(j);
          delay(30);
        }
      }
      servo4PPos = servo4Pos;
    }
    // Move Servo 5
    if (dataIn.startsWith("s5")) {
      String dataInS = dataIn.substring(2, dataIn.length());
      servo5Pos = dataInS.toInt();
      if (servo5PPos > servo5Pos) {
        for ( int j = servo5PPos; j >= servo5Pos; j--) {
          servo05.write(j);
          delay(30);
        }
      }
      if (servo5PPos < servo5Pos) {
        for ( int j = servo5PPos; j <= servo5Pos; j++) {
          servo05.write(j);
          delay(30);
        }
      }
      servo5PPos = servo5Pos;
    }
    // Move Servo 6
    if (dataIn.startsWith("s6")) {
      String dataInS = dataIn.substring(2, dataIn.length());
      servo6Pos = dataInS.toInt();
      if (servo6PPos > servo6Pos) {
        for ( int j = servo6PPos; j >= servo6Pos; j--) {
          servo06.write(j);
          delay(30);
        }
      }
      if (servo6PPos < servo6Pos) {
        for ( int j = servo6PPos; j <= servo6Pos; j++) {
          servo06.write(j);
          delay(30);
        }
      }
      servo6PPos = servo6Pos; 
    }
    // If button "SAVE" is pressed
    if (dataIn.startsWith("SAVE")) {
      servo01SP[index] = servo1PPos;  // save position into the array
      servo02SP[index] = servo2PPos;
      servo03SP[index] = servo3PPos;
      servo04SP[index] = servo4PPos;
      servo05SP[index] = servo5PPos;
      servo06SP[index] = servo6PPos;
      index++;                        // Increase the array index
    }
    // If button "RUN" is pressed
    if (dataIn.startsWith("RUN")) {
      runservo();  // Automatic mode - run the saved steps 
    }
    // If button "RESET" is pressed
    if ( dataIn == "RESET") {
      memset(servo01SP, 0, sizeof(servo01SP)); // Clear the array data to 0
      memset(servo02SP, 0, sizeof(servo02SP));
      memset(servo03SP, 0, sizeof(servo03SP));
      memset(servo04SP, 0, sizeof(servo04SP));
      memset(servo05SP, 0, sizeof(servo05SP));
      memset(servo06SP, 0, sizeof(servo06SP));
      index = 0;  // Index to 0
    }
  }
}

// Automatic mode custom function - run the saved steps
void runservo() {
  while (dataIn != "RESET") {   // Run the steps over and over again until "RESET" button is pressed
    for (int i = 0; i <= index - 2; i++) {  // Run through all steps(index)
      if (Bluetooth.available() > 0) {      // Check for incomding data
        dataIn = Bluetooth.readString();
        if ( dataIn == "PAUSE") {           // If button "PAUSE" is pressed
          while (dataIn != "RUN") {         // Wait until "RUN" is pressed again
            if (Bluetooth.available() > 0) {
              dataIn = Bluetooth.readString();
              if ( dataIn == "RESET") {     
                break;
              }
            }
          }
        }
        // If speed slider is changed
        if (dataIn.startsWith("ss")) {
          String dataInS = dataIn.substring(2, dataIn.length());
          speedDelay = dataInS.toInt(); // Change servo speed (delay time)
        }
      }
      // Servo 1
      if (servo01SP[i] == servo01SP[i + 1]) {
      }
      if (servo01SP[i] > servo01SP[i + 1]) {
        for ( int j = servo01SP[i]; j >= servo01SP[i + 1]; j--) {
          servo01.write(j);
          delay(speedDelay);
        }
      }
      if (servo01SP[i] < servo01SP[i + 1]) {
        for ( int j = servo01SP[i]; j <= servo01SP[i + 1]; j++) {
          servo01.write(j);
          delay(speedDelay);
        }
      }

      // Servo 2
      if (servo02SP[i] == servo02SP[i + 1]) {
      }
      if (servo02SP[i] > servo02SP[i + 1]) {
        for ( int j = servo02SP[i]; j >= servo02SP[i + 1]; j--) {
          servo02.write(j);
          delay(speedDelay);
        }
      }
      if (servo02SP[i] < servo02SP[i + 1]) {
        for ( int j = servo02SP[i]; j <= servo02SP[i + 1]; j++) {
          servo02.write(j);
          delay(speedDelay);
        }
      }

      // Servo 3
      if (servo03SP[i] == servo03SP[i + 1]) {
      }
      if (servo03SP[i] > servo03SP[i + 1]) {
        for ( int j = servo03SP[i]; j >= servo03SP[i + 1]; j--) {
          servo03.write(j);
          delay(speedDelay);
        }
      }
      if (servo03SP[i] < servo03SP[i + 1]) {
        for ( int j = servo03SP[i]; j <= servo03SP[i + 1]; j++) {
          servo03.write(j);
          delay(speedDelay);
        }
      }

      // Servo 4
      if (servo04SP[i] == servo04SP[i + 1]) {
      }
      if (servo04SP[i] > servo04SP[i + 1]) {
        for ( int j = servo04SP[i]; j >= servo04SP[i + 1]; j--) {
          servo04.write(j);
          delay(speedDelay);
        }
      }
      if (servo04SP[i] < servo04SP[i + 1]) {
        for ( int j = servo04SP[i]; j <= servo04SP[i + 1]; j++) {
          servo04.write(j);
          delay(speedDelay);
        }
      }

      // Servo 5
      if (servo05SP[i] == servo05SP[i + 1]) {
      }
      if (servo05SP[i] > servo05SP[i + 1]) {
        for ( int j = servo05SP[i]; j >= servo05SP[i + 1]; j--) {
          servo05.write(j);
          delay(speedDelay);
        }
      }
      if (servo05SP[i] < servo05SP[i + 1]) {
        for ( int j = servo05SP[i]; j <= servo05SP[i + 1]; j++) {
          servo05.write(j);
          delay(speedDelay);
        }
      }

      // Servo 6
      if (servo06SP[i] == servo06SP[i + 1]) {
      }
      if (servo06SP[i] > servo06SP[i + 1]) {
        for ( int j = servo06SP[i]; j >= servo06SP[i + 1]; j--) {
          servo06.write(j);
          delay(speedDelay);
        }
      }
      if (servo06SP[i] < servo06SP[i + 1]) {
        for ( int j = servo06SP[i]; j <= servo06SP[i + 1]; j++) {
          servo06.write(j);
          delay(speedDelay);
        }
      }
    }
  }
}

I hope you liked this video and learned something new. Feel free to ask any question in the comments section below and check my Arduino Projects Collection.

90 Responses

    • Shinan

      Hello, I would like to ask u how does it know what should be pick up? And I wanna to do a arm controlled by voice. When I say a order , it will move by itself and pick something up . Is it possible successful base on ur project?

      Reply
      • Dejan

        Hey, well the robot doesn’t have any object recognizing sensor, but you have position and record the positions manually. After you do that, you could also add a voice command coming from the smartphone and to execute the previously saved steps.

    • George Migliarini

      Hello good day, my name is George and I am preparing the STL files on my 3D printer and I have problems with the Arm 02 v3 file since it does not print correctly. My printer is a Comgrow Creality Ender 3 3D Printer Aluminum.

      Thank you

      George

      Reply
      • Dejan

        Hi there. Well what’s the problem exactly? This part should be printed in a vertical position, so you should rotate it 90 degrees on the X axis.

  1. Armughan Sarwar

    Those “round horns” are they included with servo motors? Or did you buy them seperately?

    Reply
  2. Alex

    What an excellent project, working on it together with my son.
    Did you use support for printing the “Arm 02 v3”? Or else, what position did you print this, standing up?

    Reply
    • Dejan

      Thanks! I didn’t use support for that part, I used printed standing up. This can be noticed at the video, there is a time lapse of it at 2:28.

      Reply
  3. Mauricio

    Hello, I liked very much of this project!
    Could you save as Inventor, CAD, or Fusion File, please?!
    I don’t have Solid Works and I would like to understand how you make the design.
    Thank you very much!

    Reply
  4. Juan Pablo

    Great project! I’m tried to do it, but the arm when I turn on it, it just start shaking and don’t follow DE commands. I think maybe is for the Bluetooth serial connection. I will really appreciate your collaboration. Thanks!

    Reply
    • Dejan

      Well the problem might be the power of the servos. In my case, my MG996R were on their limit when moving the joints, I also did get some shaking. The shoulder joint is the most stressed, so for this you definitely need some kind of support, like a spring or a rubber bend just like I used.
      Also of the commands coming from the Bluetooth might be unstable. Try not to slider the sliders but to click them to the desired value, so that the servo get only one new value and moves until it reach it. Also try to use the Serial Monitor to see if your are getting proper values from the Bluetooth module, just the Serial.println function and print the values on the Serial Monitor.

      Reply
      • Alexandre Kendi Makuda

        Hi, Im try to print values on Serial monitor but its not working.
        Can you tell me where to insert the Serial.println?? thank you

      • Dejan

        You can insert it probably anywhere, just make sure you include the Serial.begin(9600); line in the setup section.

  5. Ali

    Hello. Well done. Congratulations. I want to learn something. Can 7 servos be connected to Arduino uno? Servos only need to be connected to PWM outputs, right? Thank you.

    Reply
    • Dejan

      Hey, thanks! You can connect up to 12 servo to Arduino Uno. The servo library use different method for controlling them, they don’t have to be PWM outputs.

      Reply
  6. Dominik

    I have problem to. When i change position in one part all of the servos just make some small move and than back to the position, i try using two power sources one for servos the second for arduino and BT (of course with connected GND) but still have this problem. Anyone have similar situation?

    Reply
    • Dejan

      In thing case you might have problem with the values you are getting from the Bluetooth. Try use the Serial.prinln function to check whether you get the correct values for the variables.

      Reply
      • Davide

        hello, first of all I congratulate you for this project really well done, I have a question, I bought by mistake the HC-06 bluetooth module instead of HC-05, in fact it doesn’t respond well to the commands, you can tell me if I can adapt the wrong module somehow? or am I obliged to use the HC-05? Thanks for all.

      • Dejan

        Hey, thanks! Well it should work the same with the HC-06 module. If you can connect and transfer data than it’s fine.

    • Antonio F. - Italy

      I’ve got the same problem, I’ve changed the follow line into Arduino sketch :
      Bluetooth.setTimeout(1);
      with the follow with an higher timeout value i.e.
      Bluetooth.setTimeout(5);
      and now it works

      Reply
    • Marcelo

      Hello Dominik. I had the same problem, have you already solved that? Thank you.

      Reply
  7. Ali

    Thank you for your answer. I use the robot with the program. But somehow I can’t fine-tune it. It will be nice if you set the program to move with the buttons (+) (-). I think it would be more sensitive. I don’t know programming.

    Reply
  8. phạm văn huy

    Dear Sir,

    Currently, I am working this project but I faced some problems.
    The first, I used HC 06 module. Because I see that, Bluetooth Module as the slaver, right?
    Anyway, I confused about circuit, especially RXD to GND.
    I hope you feedback soon.

    Reply
    • Dejan

      Well yes, you can use the HC-06 module. If you have problem making the connection check my detailed tutorial for making communication between Arduino and the Bluetooth module. Check the comments there as well.

      Reply
      • Leson

        Hello sir,
        I and Huy are making this project.
        Thanks for your suggestion, but when I connected circuit, upload code and used external power supply (6V 2A). Every servo, all of them just shook, cant’t move. What’s wrong ?
        Could you explain for me, please?
        Regards

      • Dejan

        Hey, well that’s normal for servo motors, when they are initially connected to a power supply they make quick small movement. Then you need to give the commands, so I guess you have a problem with sending the commands/ values to the robot.

  9. Brian Madsen

    Hallo Dejan….

    I have build your awesome robot project, and thanks for sharing 🙂
    But i`m facing some problems, with the bluetooth connection.

    I bought the Arduino Mega 2560 you where linking to from Banggood. Following your diagram and using 1 and 2 kOhm resisters as pr. diagram, you are using pin 3 and 4, but on my mega board, 3 and 4 is pwm. But 1 and 0 is Tx / RX. Should i use these instead ? I cant get the robot arm to move 🙁 I have downloadet your app, and connected to the Hc-05 module just fine, but nothing happen when sliding on the sliders !

    I have tried to change this line :
    SoftwareSerial Bluetooth(3, 4); // Arduino(RX, TX) – HC-05 Bluetooth (TX, RX) to “0” and “1” instead, but it dosn`t help

    Reply
    • Dejan

      Hey, thanks for the support! Well in case you use 0 and 1 you don’t need the SoftwareSerial object, those are the default RX and TX pins for serial communication. However, I reckon that you problem with be the baud rate, try to set it to 9600 instead of 38400.

      Reply
      • Brian Madsen

        I have tried to set the module to both 9600 and 38400 without any difference.
        So if i use 0 and 1, Do i the need to remove the “softwareserial” line in the code, or ?? Thanks

      • Dejan

        Yes, you don’t need that line. But note that if you use 0 and 1, you need to disconnect them when uploading the code, because the Arduino uses that serial port for uploading the sketch.

  10. aam

    Hello
    Thanks. I learned a lot from this.
    I think there is a bug to attend to. When any slider is changed gradually, a sequence of numbers is sent to the string in Arduino, but arduino only gets the first one and acts upon it no the last position where slider stops therefore the movements are not correct. I used the serial monitor with some code and the following is an example:

    Elbow=45
    s345.6s344s342.4s344s352s364.8s380.8s3100s3101.6s3104.8s3108s3111.2s3112.8s3117.6s3119.2

    Elbow will move to 45 instead of 119 where slider stops.

    moreover the number of characters sent by application and received by arduino differs for each position once the slider moves full, like below from 5 chars to 2

    Speed=163
    s1163.8s1153s1109.8s197.2s175.6s166.6s157.6s148.6s141.4s134.2s125.2s119.8s114.4s17.2s11.8s10

    Thanks again

    Reply
  11. Amit maji

    Well I’m getting an error .
    Error 516:Unable to write:broken pipe
    What does it mean ?
    How can I solve it ?
    Please help

    Reply
  12. Lawrence

    Hi Dejan, about the gripper link diameter, it is 3.5mm. But you did say you used 4mm bolts and nuts to fit it in, is it possible?

    Besides that, if I want to use the gripper to hold a ginger plant, is the gripping force of the SG90 servo enough to make it happen, just the gripping part while I am using MG996R for the pulling part..

    Thank you.

    Reply
    • Dejan

      Hey, that’s true, I wanted the use M3 bolts but I didn’t have at that moment, so I used a 4mm drill bit to expand the holes and used the M4 bolts. Sorry about not mentioning that.
      And considering the that ginger plant have a bit uneven surface, the gripper might be able to hold it. However, keep in mind the weight, because the MG996R servos are already on their limit. The critical joints are the shoulder and the elbow, so you might use some stronger springs for help the servos.

      Reply
      • Lawrence

        Thank you Dejan! You’re my savior! Keep the good work up 🙂

  13. Alex

    Hi Dejan, we’re a big fan of your projects, keep up the good work!
    We assembled the robot arm but like some others also wrote, the communication between using the app and bluetooth is not very reliable resulting in the robot making unpredictable movements. I added the SerialPrint and see that values received differ sometimes from what has been entered in the app.
    I temporarily attached the servo’s to potentiometers just to make sure the servo’s are working correctly and than I have a smooth working Robot arm. But off course I prefer using the app.
    I haven’t used the MIT App Inventor yet but will check it to see if this can be improved. Any suggestions are welcome 🙂

    Reply
  14. compTech

    Hi. This is a really good project.
    But I’m having the same problem about comminucation bluetooth and servos. How can we solve this problem? I have to control servos with the app for my project.
    Can you help us Dejan?

    Reply
    • Dejan

      Hey, thanks! What kind of problem do you have? Check my other tutorials for making Bluetooth communication with Arduino and the HC-05 Bluetooth module, you can find more details there.

      Reply
  15. Kenneth

    How to power 6 servo motor with 2.5A stall current each? Won’t the jump wire/ breadboard burnt with 15A (6×2.5A) current? I tried to power a mg996r with 700mA, the servo didn’t rotate at all.😭 wanna try out the project🙏

    Reply
    • Dejan

      Yeah, it’s true, 2.5A for a jump wire is too much. Why doesn’t the MG996R rotate at all? Is it shaky or not moving at all?

      Reply
      • Kenneth

        The motor not moving at all, but only with some noise. The try both pwm code & servo motor library code. It seem 700 mA is too low for a motor😭 how can I solve it. There are so much current needed.

    • Mark

      Hi!

      Indeed, jumper wires are not suited for such currents. You’ll need to use thicker cables. You’ll also need a component that will convert your input voltage/current to your desired/need voltage/current. This can be achieved with a step-up/step-down converter. In my case I used a Polulu 5V Step-Down converter. This component converts my 12V lipo battery input to a constant 5V with an available current of 5 – 32A (20A constant, 32A peak). Another advantage of this converter is that it will divide your required current by 2, lowering the required power supply/battery.

      Example:
      Current needed = 10A
      Current actually being drawn from battery/power source = 5A

      I used a 12V 2200mah lipo battery, which can deliver 44A of current at peak. But it will run out of charge very quickly. So a converter will also safe battery life and/or make it possible to use less powerful power supplies.

      I’m running all servo’s using this lipo battery, the converter and a handmade ‘mounting rail’. Here you can see a picture of the rail I’ve made:
      https://imgur.com/a/EatfJMm

      Don’t look at the red, black and yellow cables, I’m also connecting sensors and motors to this project. The long pcb-type rail is what I’ve used, I soldered 2 lines (VCC and GND) to 6 pin headers. You can plug-in the servo cables to those pin headers. For the sensor(PWM) cables I soldered a direct line from the far left header pin directly to some blue wires. These blue wires are each connected to one PWN port on the Arduino.

      I hope this helps with getting your own robot arm to work! Make sure to read up on converters on the internet and not just buy one. The Chinese ones are not as powerful as they often advertise.

      Greetings

      Reply
  16. Mark

    Hey Dejan! First of all, great project!

    I wanted to tell you something. I’ve been building this project but I’ve been having problems with controlling the servo’s via the Android Application. I connected everything correctly etc, but the servo’s just didn’t want to move correctly. They either all moved, stuttered or not moved at all.

    I found out that what’s causing this is the SoftwareSerial-library. It’s actually a very inefficient library for communication. All my problems where INSTANTLY solved by using an Arduino Mega, connecting the BT Module directly to a hardware serial port (Serial3 in my case) and not using SoftSerial at all.

    So it might be worth mentioning here for people who are facing the same problem(s) 😉

    Reply
    • Matt

      Hello Mark,

      can you explain how you did this in detail. I just built this Project too and I have the same problems.

      Which pins on the Arduino Mega did you use and which code lines have to be changend?

      Reply
  17. Federico

    Hello, I loved this project! I have one question. What kind of screws did you use? I want to know every type please, I have to buy all of them. Thanks!!!

    Reply
    • Dejan

      Hey, the screws are the one included with the servo as accessories, they are like 2.5 or 3mm self-tapping screws. And as for the gripper, I used M4x20 bolts and nuts, although the holes for it in the design are 3mm (I expanded the holes to 4mm using a drill). So you can use M3 bolts for the gripper as well.

      Reply
  18. Andrei Alexandru Dinu

    Hi Dejan!

    I am trying to make this project but I think I have a problem with my MG996R motors because the one that I bought are continuous motors. I want to ask you if the MG996R motors that you use are the same.

    Reply
  19. Bilal

    Hello,
    Great Project. Do you know the approximate weight of the entire arm? I am trying to calculate the cost of printing this at my school.

    Reply
    • Dejan

      Hey, thanks! Well according to Cura, it weights around 230g, with around 18h printing time for all parts.

      Reply
  20. Jessie

    Thank you so much for posting this project!
    I was thinking of doing this for a 1.5 months long project—I’m quite a beginner, so do you think that’s enough time for me to finish this (or more than enough time) or would it be a bit challenging?

    Reply
    • Dejan

      Hey, I’m not quite sure about that. 🙂 It might be challenging because I’ve noticed many people have trouble getting smooth movements. I guess that’s because the servos are at their limit of lifting the weights of the arm. There’s also another thing people often find hard, to get the Bluetooth communication right. I mean, everything is already explained well, if not here, on some of my other tutorials for sure, but still is up to you decide whether you can do this project. 🙂

      Reply
      • Jessie

        Okay, I’ll still give it a try thought because the project seems really cool.
        My laptop is just a normal Macbook air and since I don’t have much space on my laptop, I don’t have many apps downloaded and I can’t seem to open the
        Arduino Robot Arm 3D Model Solidworks Files, Arduino Robot Arm 3D Model STEP File, Arduino Robot Arm STL Files
        you have. I had wanted to open them on my laptop so I might be able to edit them a bit on my Fusion 360 etc, though—are there other files you could provide me?
        Thank you so much!

      • Jessie

        Hello Mr Dejan,
        I was wondering if it was kind of rude of me to ask you for CAD files rather than the STL/STEP files you have made available for us? However, our teacher has made it clear that he needs a bit more original work (meaning I can’t just do everything you say here) so I was thinking of requesting you for the CAD files. If that is too much of a bother, though, please let me know. 🙂 Thank you!

      • Dejan

        Hey, the CAD files are already provided. There are Solidworks files as well as STEP file which can be opened with Fusion 360. You can open these files and modify them if you need that.

    • Dejan

      You only need resistors for the Bluetooth receive pin. It supports only 3.3V, so therefore you need two resistors, 1k and 2k, or 10k and 20k, to make a voltage divider that drops the 5V from the Arduino to 3.3V for the Bluetooth RX pin.

      Reply
      • Ahmad Khattak

        Sir, I did not use any resistors for voltage dividing and still can get the correct command when I check through the Arduino serial monitor. The only thing I change is the Bluetooth default speed from 38400 to 9600, however, the Arm is not responsive to these commands. What could be the problem? I am not using any external voltage, could that be the problem? And one more thing, the arm just moves back and forth when I connect one motor at a time, I guess 90 degrees. Every motor does the same thing when I connect them one at a time.

        Almost forgot to thank you for such a marvelous project, I mean it is so modular and well-written that it can be molded to any application. BUT only condition to the above problem 😉 Thanks

      • Dejan

        You must use external 5V power supply for powering this project. The MG996R servos are power hunger, the Arduino itself cannot supply enough current to them.

  21. Jessie

    Okay, I’ll still give it a try though because the project seems really cool.
    My laptop is just a normal Macbook air and since I don’t have much space on my laptop, I don’t have many apps downloaded and I can’t seem to open the
    Arduino Robot Arm 3D Model Solidworks Files, Arduino Robot Arm 3D Model STEP File, Arduino Robot Arm STL Files
    you have. I had wanted to open them on my laptop so I might be able to edit them a bit on my Fusion 360 etc, though—are there other files you could provide me?
    Thank you so much!

    Reply
  22. Ali Yıldız

    Hello there. the project was very nice. I hope the 5v 3a adapter won’t be a nuisance to use. thank you.

    Reply
  23. Sergey

    Hi. I really liked your project . But I can not understand only one why if the correct Assembly of electrical diagrams and download the code the servos twitch a little and if the motion of one servo the rest twitch also ?

    Reply
    • Dejan

      The problem is that these cheap servos are not good enough or they are at their limit of moving the “heavy” parts. Also when using the app, try to click the sliders to the desired position, instead of sliding the slider.

      Reply
  24. Jessie

    Hello Mr Dejan,

    I’m still working on this project, and I was wondering which specific bolts and or screws (i.e. what sizes) I should use for each part…

    Thank you,
    Jessie

    Reply
  25. ranging

    Hi~ i used a 6V 2A power supply, everything seems working fine, but everytime adjust the sliders in the app, all servos just shaken for like 1/20 of a second or less. wonder why..PLZ

    Reply
    • Dejan

      Hey, check whether you are getting correct data from the phone by simply printing them on the serial monitor. Also when moving the sliders try to click on them instead of sliding them.

      Reply
  26. Dom

    When will you update the Arduino code and the new app for this project?

    Reply
      • Dejan

        Hey, sorry I’m a bit busy this period and I still haven’t updated the article with the new app and Arduino code. I will do that soon!

  27. Adam

    Are the servos accurate enough to try applying inverse kinematics?

    Reply
  28. Kevin

    Hi Dejan,

    First of all, thank you very much for all your tutorials and projects! very inspirational!

    I’m currently doing this robot arm and am getting this Error 516:Unable to write:broken pipe as well. All connections are done based on the wiring diagram. I’ve read about using the serial monitor. Do you have a tutorial for that? I have very limited knowledge on programming now. Am still learning.

    But would like to check with you if the 5v power. Should i connect straight into the arduino uno socket? and have another 5v external to the servos.

    Thank you very much!

    Reply
    • Dejan

      Hey, you problem is that the Bluetooth communication for sure. You should find a what’s causing the problem. Try to make the examples from some of my other Arduino Bluetooth tutorials.

      Reply
  29. Dom

    Dejan,
    Where did you get the circular servo horns that you used? The horns that came with the servos you linked do not fit the robot…

    Reply
  30. Dom

    Dejan,
    I am having trouble with moving the servos. I have everything connected as shown in diagram and I tried changing the baud rate to 9600 but still no luck with moving the servos. I am using the arduino mega 2560 and the HC-05 bluetooth module. Any idea what the issue could be?

    Reply
  31. Nima

    Hi,thanks for all your help and good job man.I have a question.I live in Iran.looks like in here we got 3 version of mg996r. 90,180 and 360 degree.which of those I should buy for these project?

    Thanks and best of regards to you.

    Reply

Leave a Reply

Your email address will not be published.