(Khóa học: Lập trình & Điều khiển Động Cơ từ Cơ Bản tới Nâng Cao)
🎯 Mục tiêu bài học
Trong phần này, chúng ta sẽ nâng cấp hệ thống điều khiển robot từ xa bằng tính năng báo hiệu thông minh.
Hệ thống sẽ sử dụng đèn LED và còi buzzer để thông báo trạng thái hoạt động, cảnh báo mất tín hiệu, chế độ điều khiển, và phản hồi lệnh.
Sau bài này, robot của bạn sẽ không chỉ di chuyển mà còn “biết nói chuyện” với người điều khiển thông qua ánh sáng và âm thanh — giúp việc vận hành trực quan, sinh động và thân thiện hơn.
⚙️ 1. Vai trò của hệ thống báo hiệu
| Loại tín hiệu | Thiết bị | Mục đích |
|---|---|---|
| Âm thanh (Buzzer) | Buzzer 5V hoặc Active buzzer | Báo khi robot khởi động, mất kết nối hoặc lỗi |
| Ánh sáng (LED) | LED RGB hoặc LED đơn | Thể hiện trạng thái kết nối, hướng di chuyển hoặc chế độ điều khiển |
| Màn hình (tuỳ chọn) | OLED 0.96” | Hiển thị mode, tốc độ, mức pin (nâng cao) |
💡 Mục tiêu là giúp người điều khiển nhận biết trạng thái robot mà không cần nhìn trực tiếp vào serial monitor.
🧩 2. Cấu trúc hệ thống báo hiệu
Phân bổ chức năng:
| Tín hiệu | Mạch tay cầm (TX – ESP32-C3) | Xe robot (RX – ESP32 DevKit) |
|---|---|---|
| LED1 | Báo chế độ Kid / Sport | Báo trạng thái kết nối |
| Buzzer | Phát âm báo khi đổi mode | Báo mất kết nối hoặc lỗi |
| LED2 | (Tuỳ chọn) báo khi gửi lệnh | Báo hướng di chuyển |
💡 3. Kết nối phần cứng
📟 Tay cầm điều khiển (ESP32-C3)
| Thiết bị | Chân ESP32-C3 | Chức năng |
|---|---|---|
| LED Mode | GPIO20 | Báo chế độ Kid/Sport |
| Buzzer | GPIO21 | Kêu beep khi đổi mode |
🚗 Xe robot (ESP32 DevKit)
| Thiết bị | Chân ESP32 | Chức năng |
|---|---|---|
| LED Status | GPIO2 | Báo tín hiệu nhận được |
| LED Dir | GPIO4 | Báo hướng di chuyển |
| Buzzer | GPIO13 | Báo mất tín hiệu / khởi động |
⚙️ 4. Lập trình tay cầm (TX) – Báo hiệu chế độ
Tay cầm sẽ bật LED khác nhau cho từng mode và phát âm thanh mỗi khi chuyển đổi.
💻 Code mở rộng cho TX:
#define LED_MODE 20
#define BUZZER 21
void setup() {
pinMode(LED_MODE, OUTPUT);
pinMode(BUZZER, OUTPUT);
digitalWrite(LED_MODE, LOW);
digitalWrite(BUZZER, LOW);
...
}
void loop() {
// Khi nhấn nút MODE
if (pressed(BTN_MODE) && (millis() - lastModeToggle > 300)) {
sportMode = !sportMode;
lastModeToggle = millis();
// LED và Buzzer báo hiệu
digitalWrite(LED_MODE, sportMode);
tone(BUZZER, sportMode ? 2000 : 1000, 150);
Serial.printf("Mode switched to: %s\n", sportMode ? "SPORT" : "KID");
}
...
}
Giải thích
- Khi bật “Sport Mode”, LED sáng, buzzer kêu “beep cao” (2000Hz).
- Khi bật “Kid Mode”, LED tắt và buzzer phát “beep thấp” (1000Hz).
🚗 5. Lập trình robot (RX) – Báo hiệu trạng thái
Robot sẽ có 3 loại phản hồi chính:
| Sự kiện | LED | Buzzer | Mô tả |
|---|---|---|---|
| Khởi động | Nhấp nháy nhanh 3 lần | Beep 1 lần | Xác nhận robot sẵn sàng |
| Nhận lệnh điều khiển | LED sáng tương ứng hướng | – | Hiển thị hướng xe |
| Mất kết nối > 300ms | LED tắt | Còi kêu cảnh báo | Thông báo mất liên lạc |
💻 Code mở rộng cho RX:
#define LED_STATUS 2
#define LED_DIR 4
#define BUZZER 13
void signalStartup() {
for (int i = 0; i < 3; i++) {
digitalWrite(LED_STATUS, HIGH);
tone(BUZZER, 1500, 100);
delay(150);
digitalWrite(LED_STATUS, LOW);
delay(150);
}
}
void signalLostConnection() {
tone(BUZZER, 1000, 300);
digitalWrite(LED_STATUS, LOW);
}
void signalDirection(char action) {
switch (action) {
case 'F': digitalWrite(LED_DIR, HIGH); break;
case 'B': digitalWrite(LED_DIR, LOW); break;
default: break;
}
}
void setup() {
pinMode(LED_STATUS, OUTPUT);
pinMode(LED_DIR, OUTPUT);
pinMode(BUZZER, OUTPUT);
signalStartup();
...
}
void loop() {
if (radio.available()) {
radio.read(&cmd, sizeof(cmd));
lastPacketMs = millis();
digitalWrite(LED_STATUS, HIGH);
signalDirection(cmd.action);
handleCommand(cmd);
} else if (millis() - lastPacketMs > 300) {
signalLostConnection();
stopNow();
}
smoothDriveStep();
delay(10);
}
🧠 6. Tích hợp hiển thị OLED (nâng cao – tùy chọn)
Nếu bạn muốn hiển thị trực quan hơn, có thể thêm màn hình OLED 0.96” (I2C).
OLED sẽ hiển thị:
- Chế độ điều khiển (Kid / Sport)
- Tốc độ PWM hiện tại
- Trạng thái kết nối (“Connected / Lost”)
👉 Thư viện gợi ý: Adafruit_SSD1306.h hoặc U8g2lib.h.
🧪 7. Kiểm thử và quan sát
- Khi bật robot → đèn chớp, còi beep → hệ thống sẵn sàng.
- Khi điều khiển → LED hướng hiển thị theo lệnh (F/B/L/R).
- Khi mất sóng → robot dừng, còi kêu cảnh báo.
- Khi đổi chế độ tay cầm → LED mode đổi trạng thái, còi báo khác âm.
💡 Với hệ thống báo hiệu này, bạn có thể điều khiển robot mà không cần nhìn màn hình, chỉ cần nghe và quan sát đèn.
📈 8. Lợi ích của hệ thống báo hiệu thông minh
| Lợi ích | Mô tả |
|---|---|
| 🚦 Trực quan | Nhận biết ngay trạng thái mà không cần cắm USB |
| 🔉 Thân thiện | Phản hồi bằng âm thanh và ánh sáng giúp dễ thao tác |
| ⚡ An toàn | Tự động cảnh báo khi mất tín hiệu hoặc nguồn yếu |
| 🎮 Chuyên nghiệp | Giúp bộ điều khiển giống tay cầm thật sự |
🔜 9. Bước tiếp theo
Trong (phần 6): Truyền dữ liệu 2 chiều, chúng ta sẽ mở rộng hệ thống để robot gửi ngược dữ liệu cảm biến, tốc độ, và trạng thái pin về tay cầm, biến nó thành một hệ thống điều khiển thông minh hai chiều.


Để lại một bình luận