Lập trình & Điều khiển Động Cơ – Nâng cao – Bài 16: Thiết kế bộ điều khiển từ xa cho Robot (phần 5): Báo hiệu thông minh


(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ệuThiết bịMục đích
Âm thanh (Buzzer)Buzzer 5V hoặc Active buzzerBá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 đơnThể 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ệuMạch tay cầm (TX – ESP32-C3)Xe robot (RX – ESP32 DevKit)
LED1Báo chế độ Kid / SportBáo trạng thái kết nối
BuzzerPhát âm báo khi đổi modeBáo mất kết nối hoặc lỗi
LED2(Tuỳ chọn) báo khi gửi lệnhBá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-C3Chức năng
LED ModeGPIO20Báo chế độ Kid/Sport
BuzzerGPIO21Kêu beep khi đổi mode

🚗 Xe robot (ESP32 DevKit)

Thiết bịChân ESP32Chức năng
LED StatusGPIO2Báo tín hiệu nhận được
LED DirGPIO4Báo hướng di chuyển
BuzzerGPIO13Bá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 modephá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ệnLEDBuzzerMô tả
Khởi độngNhấp nháy nhanh 3 lầnBeep 1 lầnXác nhận robot sẵn sàng
Nhận lệnh điều khiểnLED sáng tương ứng hướngHiển thị hướng xe
Mất kết nối > 300msLED tắtCòi kêu cảnh báoThô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

  1. Khi bật robot → đèn chớp, còi beep → hệ thống sẵn sàng.
  2. Khi điều khiển → LED hướng hiển thị theo lệnh (F/B/L/R).
  3. Khi mất sóng → robot dừng, còi kêu cảnh báo.
  4. 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 íchMô tả
🚦 Trực quanNhận biết ngay trạng thái mà không cần cắm USB
🔉 Thân thiệnPhản hồi bằng âm thanh và ánh sáng giúp dễ thao tác
⚡ An toànTự động cảnh báo khi mất tín hiệu hoặc nguồn yếu
🎮 Chuyên nghiệpGiú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.

Comments

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

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *