Project Overview
DIY Arduino Robot Arm with Smartphone Control: Build a 5-DOF robot arm with a gripper — 3D-printed frame, six servos, an HC-05 Bluetooth module, and an Android app with a slider for every joint plus a Save/Run system that records movements and replays them automatically.
- Time: A weekend (printing + assembly + wiring)
- Skill level: Intermediate
- What you will build: A smartphone-controlled robotic arm that can memorize a sequence of positions and loop them like a tiny industrial robot.
Parts List
From ShillehTek
- MG995 Metal Gear Servo (12kg High Torque) — you need 3 of this class (MG996R-equivalent) for the waist, shoulder, and elbow
- HC-05 6-Pin Bluetooth Module
- Arduino Uno R3
- LM2596 Adjustable Step-Down Converter — turn a 12V adapter into the beefy 5V rail the servos need
- Dupont Jumper Wires
- Prefer a no-printing shortcut? The 3DOF DIY Robot Arm Kit with 3x MG995 Servos gives you a ready-made arm platform to run the same code and app on.
External
- 3 × SG90/MG90S micro servos (wrist roll, wrist pitch, gripper)
- 3D-printed arm parts (STLs from the original guide) or an arm frame of your own
- 5V ≥ 2A supply for the servos (the LM2596 fed from a 12V adapter works great)
- An Android phone for the control app
Note: Never power six servos from the Arduino's 5V pin — stalled MG996Rs can pull well over an amp each. Give the servos their own 5V rail and tie the grounds together.
Step-by-Step Guide
Step 1 — Understand the Arm
Goal: Know what the six servos do.
What to do: The arm has five degrees of freedom plus a gripper. The three big joints — waist rotation, shoulder, and elbow — carry real load, so they use metal-gear MG996R-class servos. The wrist roll, wrist pitch, and gripper barely lift anything, so light SG90 micro servos handle those. The frame was modeled in CAD and 3D-printed; the STLs are freely available in the original guide.
Expected result: You know which servo goes where and why.
Step 2 — Print and Assemble the Frame
Goal: Build the mechanical arm.
What to do: Print the parts (PLA at standard settings is fine), then assemble joint by joint from the base up: bolt the waist servo into the base, attach the rotating platform to its horn, then work up through shoulder, elbow, and wrist, seating each servo before closing its joint. Center every servo (90°) before screwing horns down, or the arm's range will be lopsided. A rubber band looped across the shoulder joint helps the shoulder servo fight gravity on the longest lever.
Expected result: A finished arm that moves freely by hand at every joint.
Step 3 — Wire the Electronics
Goal: Connect six servos, the HC-05, and power.
What to do: Servo signal wires go to Arduino pins D5–D10 (waist through gripper). The HC-05 wires VCC→5V, GND→GND, TX→D3, and RX→D4 through a simple 1k/2k voltage divider (the module's RX pin is 3.3V logic). Set your LM2596 to 5.0V and feed every servo's power lead from it — not from the Arduino — then tie the converter's ground to the Arduino's GND so signals share a reference.
Expected result: Electronics complete, with a servo power rail that won't brown out the Arduino.
Step 4 — Load the Code
Goal: Let the phone command every joint.
What to do: The sketch keeps a Servo object per joint and parses slider messages arriving over Bluetooth. The condensed control loop looks like this — the complete sketch (including smooth-speed moves and the record/replay logic) is on the original guide:
#include <SoftwareSerial.h>
#include <Servo.h>
Servo servo01, servo02, servo03, servo04, servo05, servo06;
SoftwareSerial Bluetooth(3, 4); // HC-05 TX -> D3, RX -> D4 (via divider)
int servo1Pos = 90, servo2Pos = 150, servo3Pos = 35,
servo4Pos = 140, servo5Pos = 85, servo6Pos = 80;
String dataIn = "";
void setup() {
servo01.attach(5); // waist
servo02.attach(6); // shoulder
servo03.attach(7); // elbow
servo04.attach(8); // wrist roll
servo05.attach(9); // wrist pitch
servo06.attach(10); // gripper
Bluetooth.begin(38400);
Bluetooth.setTimeout(1);
delay(20);
}
void loop() {
if (Bluetooth.available() > 0) {
dataIn = Bluetooth.readString(); // e.g. "s1120" = waist to 120 deg
if (dataIn.startsWith("s1")) {
servo1Pos = dataIn.substring(2).toInt();
servo01.write(servo1Pos);
}
// ...same pattern for s2..s6, plus speed,
// SAVE (record step) and RUN (replay saved steps)
}
}
Expected result: The arm twitches to its home pose on boot and responds to Bluetooth commands.
Step 5 — Drive It from the App
Goal: Control — then automate — the arm.
What to do: Pair your phone with the HC-05 (PIN 1234), open the control app from the original guide (built with MIT App Inventor, source included), and connect. Each slider drives one joint live, and the speed slider scales how fast moves execute. The magic is the Save button: pose the arm, tap Save, pose it again, tap Save — then hit Run and the arm replays the whole recorded sequence in a loop, like a miniature pick-and-place machine. Reset clears the memory for a new routine.
Expected result: A robot arm that does what your thumbs tell it — and then repeats it on its own.
Conclusion
This build packs a remarkable amount of real robotics into hobby parts: multi-joint kinematics, proper servo power design, wireless control, and motion recording with automatic replay. Once it's running, the same pattern — sliders in, positions stored, sequences replayed — scales to any servo machine you can dream up.
Want the exact parts used in this build? Grab them from ShillehTek.com. If you want help customizing this project, check out our IoT consulting services.
Credits
All photos and images in this tutorial are credited to the original guide by Dejan of HowToMechatronics, which served as the reference for this ShillehTek version (adapted via the Hackster.io repost by Webotricks). We thank them for their excellent work in the maker community.


