Điều khiển nâng cao

Robot tự cân bằng hai bánh - dự án đỉnh cao của điều khiển vòng kín

8 phút đọc05/07/2026HocLapTrinhRobot
Robot tự cân bằng hai bánh - dự án đỉnh cao của điều khiển vòng kín

Hướng dẫn đầy đủ robot tự cân bằng - nguyên lý con lắc ngược, phần cứng MPU6050 + motor encoder, vòng PID góc 200Hz, code khung và quy trình chỉnh từng bước. 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.

Vì sao robot cân bằng là "kỳ thi tốt nghiệp" của người học điều khiển?

Xe dò line chạy sai thì lệch vạch; robot cân bằng sai thì ngã — ngay lập tức, không khoan nhượng. Dự án này bắt bạn tổng hợp mọi kỹ năng đã học thành một hệ thống chạy đúng cùng lúc: đọc cảm biến sạch (MPU6050 + lọc bù), vòng điều khiển nhanh (200 Hz không delay), PID chỉnh chuẩn, cơ khí hợp lý và nguồn ổn định. Thiếu một mắt xích — ngã. Vì thế nó là bài kiểm tra trung thực nhất, và là dự án gây "wow" bậc nhất khi thành công: một cây gậy hai bánh tự đứng như có phép.

Bài này là bản đồ đầy đủ: nguyên lý, phần cứng, kiến trúc code và quy trình chỉnh — kèm các bẫy đã làm vô số người bỏ cuộc oan.

Nguyên lý - con lắc ngược trên bánh xe

Robot cân bằng là con lắc ngược (inverted pendulum): trọng tâm nằm trên trục bánh, tự nhiên muốn đổ. Chiến lược duy nhất: khi robot nghiêng về phía nào, lái bánh xe chạy về phía đó — đưa điểm tựa trở lại dưới trọng tâm, như bạn giữ cán chổi thăng bằng trên lòng bàn tay bằng cách di chuyển tay theo hướng chổi đổ.

Chu trình lặp hàng trăm lần mỗi giây:

  1. Đo góc nghiêng hiện tại (MPU6050 + lọc bù)
  2. So với góc đích (điểm thăng bằng, gần 0 độ)
  3. PID biến sai lệch thành lệnh tốc độ motor
  4. Motor chạy về phía ngã — robot dựng lại

Vật lý cho hai kết luận thiết kế ngược trực giác: trọng tâm càng cao càng dễ điều khiển (con lắc dài đổ chậm hơn — pin đặt trên đỉnh!) và robot không bao giờ đứng yên tuyệt đối — nó dao động quanh điểm cân bằng, mục tiêu là dao động nhỏ đến mức mắt không thấy.

Phần cứng - chọn đúng ngay từ đầu

Hạng mụcKhuyến nghịVì sao
Bo điều khiểnESP32Vòng 200+ Hz nhẹ nhàng, dư sức thêm Bluetooth điều khiển
Cảm biến gócMPU6050I2C, đủ chính xác với lọc bù; gắn sát trục bánh, chắc chắn
MotorDC giảm tốc 1:30-1:50 có encoder (JGA25-370 encoder)Cần phản hồi tốc độ + đáp ứng nhanh; TT motor 1:48 không encoder vẫn đứng được nhưng trôi
DriverTB6612 / DRV8833Đáp ứng nhanh, không sụt 2V như L298N — độ trễ và độ yếu của driver ăn thẳng vào chất lượng cân bằng
Bánh xe65-80 mm, lốp cao su bámBánh to = mỗi vòng bù được nhiều = dễ cứu các cú nghiêng lớn
Pin2S 18650/LiPo, đặt CAO nhấtNâng trọng tâm (xem nguyên lý) + dòng xả tốt
Khung2-3 tầng dọc: motor dưới, bo giữa, pin trênKết cấu con lắc chuẩn

Tổng linh kiện ngoài bo: ~500.000-800.000 đ. Lưu ý cơ khí đặc thù: mọi thứ phải cứng — khung ọp ẹp rung là MPU6050 đọc rác, không PID nào cứu nổi (nguyên tắc từ bài Cơ khí robot cơ bản ở mục Kiến thức).

Kiến trúc code - vòng điều khiển là vua

cpp
// Khung sườn - các hàm đọc góc (lọc bù) và setMotor như các bài trước
float targetAngle = 0;      // điểm cân bằng - HIỆU CHỈNH THEO ROBOT THẬT
float Kp = 25, Ki = 130, Kd = 1.6;   // điểm xuất phát tham khảo, PHẢI chỉnh lại
float integral = 0, lastError = 0;
unsigned long lastLoop = 0;
const int LOOP_US = 5000;   // 5 ms = 200 Hz - giữ CỐ ĐỊNH

void loop() {
  if (micros() - lastLoop < LOOP_US) return;   // giữ nhịp đều
  float dt = (micros() - lastLoop) / 1e6;
  lastLoop = micros();

  float angle = readAngleComplementary(dt);    // bài MPU6050

  // NGÃ QUÁ 35 ĐỘ: tắt motor - an toàn bắt buộc
  if (abs(angle) > 35) {
    setMotors(0, 0);
    integral = 0;
    return;
  }

  float error = angle - targetAngle;
  integral += error * dt;
  integral = constrain(integral, -3, 3);       // chống windup
  float derivative = (error - lastError) / dt;
  lastError = error;

  float output = Kp * error + Ki * integral + Kd * derivative;
  int pwm = constrain((int)output, -255, 255);
  setMotors(pwm, pwm);
}

Bốn điểm sống còn trong khung này:

  • Nhịp vòng cố định 5 ms: PID cần dt đều; Serial.print dày hay delay lẻ làm nhịp thọt là robot rung — đo thời gian vòng theo kỹ thuật bài Debug bằng Serial Monitor
  • Ngắt an toàn 35 độ: quá góc này không cứu nổi — tắt motor thay vì để robot phóng điên trên sàn; đây là failsafe phiên bản cân bằng
  • Chống windup tích phân: robot bị giữ nghiêng vài giây mà không giới hạn integral là khi thả ra motor phóng hết cỡ
  • targetAngle không phải 0.00: trọng tâm robot thật luôn lệch nhẹ — hiệu chỉnh bằng cách giữ robot đứng thăng bằng tay, đọc góc trung bình, lấy làm đích

Quy trình chỉnh - đúng thứ tự, từng bước một

Chỉnh robot cân bằng khác chỉnh dò line: sai là ngã, nên cầm sẵn robot bằng dây treo lỏng hoặc trên bàn có đệm.

  1. Kiểm chuỗi tín hiệu trước khi chỉnh: nghiêng tay robot — góc trên Serial đổi đúng chiều, mượt? Đẩy PWM tay ±100 — hai bánh quay đúng chiều "chạy về phía ngã"? (Sai chiều motor là lỗi số 1: robot tự đạp mình ngã nhanh hơn)
  2. Kp trước (Ki = Kd = 0): tăng từ 5, mỗi lần gấp rưỡi. Đủ Kp: robot phản kháng rõ khi nghiêng, giữ được 1-2 giây rồi dao động tăng dần mà đổ. Ghi giá trị bắt đầu dao động
  3. Kd dập dao động: từ Kp/20, tăng dần đến khi robot đứng được nhiều giây, dao động nhỏ lại thay vì lớn lên. Kd quá tay: rung tần số cao kèm tiếng motor gắt
  4. Ki kéo về đích: robot đứng nhưng trôi dần một hướng rồi đổ xa — tăng Ki từ 20-50 đến khi robot tự kéo về vị trí. Ki là hệ số nhạy cảm nhất với windup
  5. Hiệu chỉnh targetAngle lần cuối: robot đứng mà cứ bò về một phía đều đặn = điểm đích lệch — chỉnh ±0.1-0.5 độ

Thêm hai mẹo của người đi trước: chỉnh trên sàn hơi nhám (sàn trơn bánh trượt, PID đúng vẫn ngã); và pin đầy — pin yếu làm PWM thật giảm, bộ số chỉnh với pin yếu sẽ quá tay khi pin đầy.

Nâng cấp sau khi đứng vững

  • Vòng tốc độ (cascade): PID góc lồng trong PID tốc độ từ encoder — robot đứng yên tại chỗ tuyệt đối thay vì bò nhẹ, nền tảng để nhận lệnh di chuyển
  • Điều khiển chạy: dịch targetAngle ±1-3 độ là robot "ngã có chủ đích" về hướng đó = chạy tới/lui; trộn chênh lệch PWM hai bánh = rẽ — ghép Bluetooth/ESP-NOW từ các bài Kết nối không dây
  • Đứng dậy từ nằm (self-up): quay motor giật mạnh đúng nhịp cho robot lật dựng lên — thuật toán swing-up, thử thách xứng đáng cho học sinh chuyên
  • Đề tài KHKT: so sánh lọc bù vs Kalman, ảnh hưởng chiều cao trọng tâm đến độ ổn định — số liệu đo được ngay trên robot

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

Robot cứ giật giật rồi ngã trong 1-2 giây, lỗi gì phổ biến nhất?

Theo thứ tự gặp: chiều motor ngược (robot tự đạp ngã — kiểm tra bước 1 quy trình); vòng lặp không đều do Serial.print dày; góc đọc nhiễu vì khung rung/MPU6050 lỏng; L298N sụt áp làm lực bù đuối. Cả bốn đều không phải "PID chưa chuẩn" — chỉnh PID chỉ có nghĩa khi chuỗi tín hiệu đã sạch.

Không có motor encoder, làm được không?

Được — vòng PID góc thuần (như code khung) đứng được với motor TT thường. Giới hạn: robot bò trôi chậm theo sàn nghiêng và không đứng chết tại chỗ được. Encoder cần cho vòng cascade và điều khiển di chuyển chính xác — nâng cấp sau khi đã đứng, đúng tinh thần mỗi-lần-một-thứ.

Dùng bộ số PID trong bài có đứng được luôn không?

Gần như chắc chắn không — Kp/Ki/Kd phụ thuộc khối lượng, chiều cao trọng tâm, motor, bánh, điện áp của TỪNG robot. Bộ số trong bài chỉ định cỡ độ lớn (Kp hàng chục, Ki hàng trăm, Kd hàng đơn vị cho thang góc độ-PWM 255). Quy trình chỉnh mới là thứ tái sử dụng được.

Mất bao lâu để robot đứng được?

Với nền tảng đủ (đã xong dò line PID, hiểu MPU6050): lắp 1-2 buổi, chỉnh 2-5 buổi. Người nhảy cóc thiếu nền thường kẹt hàng tháng — vì mọi lỗi nền (nguồn, nhiễu, cơ khí) đều bị dự án này phơi ra cùng lúc. Lộ trình các dự án nền ở bài 10 dự án robot ESP32 trong mục Kiến thức.

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