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 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:

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:

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.

37 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.

  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
  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.

      • Brian Madsen

        So both line 6 and line 16 from your complete code ??

  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

Leave a Reply

Your email address will not be published.