Dự án thực hành

Làm cánh tay robot mini bằng servo SG90 - lắp ráp và lập trình gắp vật

8 phút đọc05/07/2026HocLapTrinhRobot
Làm cánh tay robot mini bằng servo SG90 - lắp ráp và lập trình gắp vật

Tự làm cánh tay robot 4 servo SG90 giá 250k - lắp khung, đấu nguồn đúng cách, code điều khiển bằng biến trở và web, chuyển động mượt bằng nội suy. Trong bài viết này, chúng ta sẽ cùng tìm hiểu chi tiết và ứng dụng thực tế trong robot.

Dự án cánh tay - vì sao đáng làm sau xe robot?

Xe robot dạy chuyển động và cảm biến; cánh tay robot dạy nhóm kỹ năng khác hẳn: điều khiển vị trí chính xác, phối hợp nhiều khớp, và bài học nhớ đời về nguồn điện. Nó cũng là cỗ máy trình diễn ấn tượng — gắp viên kẹo đặt vào cốc luôn thắng mọi màn demo xe chạy vòng tròn trong mắt phụ huynh.

Cấu hình bài này: cánh tay 4 bậc tự do (đế xoay, vai, khuỷu, kẹp) dùng 4 servo SG90, khung mica cắt sẵn — mức khởi đầu chuẩn trước khi lên MG996R kim loại.

Linh kiện (~250.000 đ ngoài bo ESP32)

MónSố lượngGiá tham khảoGhi chú
Bộ khung cánh tay mica 4 DOF190.000-130.000 đBán sẵn kèm ốc, tìm "khung cánh tay robot 4 dof sg90"
Servo SG904100.000 đMua 5 con — SG90 giá rẻ tỉ lệ lỗi ~10%
Nguồn 5V riêng cho servo130.000 đMạch buck 5V 3A từ pin, HOẶC hộp pin AA x4
Biến trở 10kΩ412.000 đCho chế độ điều khiển tay
Tụ hóa 470-1000 µF13.000 đĐệm nguồn servo — đừng bỏ qua

Cảnh báo quan trọng nhất toàn bài: 4 servo KHÔNG BAO GIỜ ăn nguồn từ chân 5V/3V3 của ESP32. Một SG90 kẹt tải hút 650 mA — bốn con cùng nhúc nhích vượt 1.5 A tức thời, ESP32 sụt nguồn reset liên tục ("cánh tay giật giật rồi bo khởi động lại" = 99% lỗi này). Nguồn servo riêng 5V ≥ 2A, chung GND với ESP32, tụ 470 µF cắm sát đầu vào nguồn servo.

Bước 1 - Lắp khung: quy tắc vàng "canh giữa trước khi bắt vít"

Sai lầm phổ biến nhất khi lắp cánh tay: bắt chặt tay servo (horn) lúc servo đang ở góc bất kỳ → khớp chỉ quay được một phía, ép quá hành trình là cháy servo. Quy trình đúng cho TỪNG servo:

  1. Nối servo vào ESP32, nạp lệnh đưa về đúng 90 độ (code góc giữa bên dưới)
  2. GIỮ nguyên điện, lắp tay servo vào khớp khung ở tư thế trung tính (cánh tay duỗi thẳng đứng, kẹp mở một nửa)
  3. Bắt vít tay servo, rồi mới lắp sang servo tiếp theo
cpp
#include <ESP32Servo.h>
Servo s;
void setup() {
  s.attach(13);
  s.write(90);   // giữ giữa hành trình để lắp khung
}
void loop() {}

Thứ tự lắp: đế xoay → vai → khuỷu → kẹp. Vặn ốc vừa chặt — mica nứt khi siết quá tay.

Bước 2 - Đấu dây

ServoDây tín hiệu (cam/vàng)Nguồn (đỏ)GND (nâu)
Đế xoayGPIO 13Bus 5V riêngBus GND chung
VaiGPIO 4Bus 5V riêngBus GND chung
KhuỷuGPIO 16Bus 5V riêngBus GND chung
KẹpGPIO 17Bus 5V riêngBus GND chung
4 biến trở (chân giữa)GPIO 32, 33, 34, 353V3GND

Bus nguồn servo: hàng breadboard riêng hoặc domino, nhận 5V từ buck/hộp pin, tụ 470 µF cắm ngay đó, và một dây GND kéo về GND ESP32.

Bước 3 - Chế độ 1: điều khiển bằng 4 biến trở

Mỗi biến trở một khớp — trực quan như cần cẩu đồ chơi, và là bài đọc analog + map hoàn hảo:

cpp
#include <ESP32Servo.h>

Servo joints[4];
const int SERVO_PIN[4] = {13, 4, 16, 17};
const int POT_PIN[4]   = {32, 33, 34, 35};
// giới hạn góc AN TOÀN từng khớp - đo thực tế trên khung của bạn
const int MIN_A[4] = {10, 30, 20, 40};   // kẹp: 40 = mở hết
const int MAX_A[4] = {170, 150, 160, 95}; // kẹp: 95 = kẹp vừa đủ

float smoothAngle[4];

void setup() {
  for (int i = 0; i < 4; i++) {
    joints[i].attach(SERVO_PIN[i]);
    smoothAngle[i] = 90;
  }
}

void loop() {
  for (int i = 0; i < 4; i++) {
    int raw = analogRead(POT_PIN[i]);                    // 0-4095
    int target = map(raw, 0, 4095, MIN_A[i], MAX_A[i]);
    // lọc trượt: mỗi vòng tiến 10% về đích - hết giật
    smoothAngle[i] += (target - smoothAngle[i]) * 0.1;
    joints[i].write((int)smoothAngle[i]);
  }
  delay(15);
}

Hai chi tiết chuyên nghiệp trong code: giới hạn góc riêng từng khớp (khung mica có điểm va chạm vật lý — servo cố quay qua đó sẽ gầm lên và nóng, đo giới hạn thật bằng tay trước khi cấp điện) và lọc trượt biến chuyển động giật cục thành mượt như thủy lực.

Riêng khớp kẹp - đừng kẹp hết lực

MAX_A của kẹp đặt ở mức "vừa giữ chặt vật" chứ không phải góc tối đa: kẹp vật cứng bằng full góc là servo bị khóa trục (stall) liên tục — nóng, hao nguồn và chết sớm. Nghe tiếng servo rít khi đang kẹp = đang stall, nới giới hạn ra.

Bước 4 - Chế độ 2: điều khiển qua web + dạy động tác

Thay biến trở bằng 4 thanh trượt trên trang web (nền tảng bài WiFi web server điều khiển robot ở mục Kiến thức — đổi nút bấm thành <input type="range">). Nâng cấp ăn điểm nhất: nút GHI / PHÁT — bấm GHI lưu bộ 4 góc hiện tại vào mảng, PHÁT chạy lại tuần tự các tư thế đã lưu với nội suy mượt giữa các điểm. Cánh tay "học" động tác gắp-nhấc-thả-về và tự lặp lại — chính là nguyên lý teach pendant của tay máy công nghiệp, gói trong 30 dòng code.

Xử lý sự cố đặc trưng của cánh tay

Triệu chứngNguyên nhânCách sửa
ESP32 reset khi cánh tay cử độngServo ăn chung nguồn boNguồn 5V riêng + tụ, chung GND
Servo rung bần bật khi đứng yênNhiễu analog biến trở; nguồn gợnLọc trượt (có trong code), tụ nguồn
Một khớp gầm và nóngÉp quá giới hạn cơ khí, hoặc kẹp stallĐo lại MIN/MAX góc thật
Vai không nâng nổi cánh taySG90 đuối với tải xa trụcRút ngắn cần, đối trọng, hoặc lên MG996R cho khớp vai
Cử động đúng nhưng thứ tự khớp lộnCắm nhầm chân tín hiệuĐối chiếu lại bảng đấu dây

Nâng cấp tiếp theo

  • MG996R cho vai + đế (khớp chịu tải nhất): lực gấp 5 lần, nhớ nguồn 5-6V ≥ 3A
  • Điều khiển bằng game controller qua Bluetooth — ghép bài Làm app điều khiển robot
  • Gắp theo màu: thêm cảm biến màu TCS34725 dưới kẹp, phân loại vật đỏ/xanh vào hai khay — đề tài trình diễn ngày hội STEM kinh điển
  • Động học ngược (inverse kinematics): nhập tọa độ (x, y) thay vì góc từng khớp — toán lượng giác lớp 10 ứng dụng thật, hợp học sinh chuyên

Câu hỏi thường gặp

Khung in 3D hay mica tốt hơn?

Mica cắt sẵn: rẻ, mua là lắp, đủ cứng cho SG90. In 3D: tùy biến thoải mái, đẹp hơn, nhưng cần máy in và 6-10 giờ in. Bắt đầu bằng mica; in 3D khi muốn thiết kế riêng — file mẫu cộng đồng (EEZYbotARM là dòng nổi tiếng nhất) rất nhiều.

Cánh tay nâng được vật nặng bao nhiêu?

Bộ 4 SG90 khung mica: thực tế 20-40 g ở tầm với ngắn (viên kẹo, cục tẩy, khối gỗ nhỏ) — đủ cho mọi mục đích học tập. Nâng 100-200 g cần MG996R toàn bộ + khung nhôm, chi phí gấp 3-4 lần.

Có cần driver PCA9685 không?

Với 4 servo: không — ESP32 thừa kênh LEDC, ESP32Servo lo hết. PCA9685 (I2C, 16 kênh) đáng dùng từ ~6 servo trở lên hoặc khi muốn rảnh chân GPIO: hexapod, robot nhện, cánh tay 6 DOF.

Servo quay ngược chiều mong muốn thì sao?

SG90 không đảo cực được như motor DC (đảo dây đỏ-nâu là chết servo!). Đảo trong code: write(180 - angle) cho khớp đó — thêm mảng bool INVERT[4] là gọn.

Tài nguyên tải về

Tải bản PDF của bài viết để in giáo án hoặc gửi trước cho học viên.

Tải PDF
Chia sẻ bài viết