Series
Lập Trình & Điều Khiển Động Cơ với ESP32
  1. Series: Lập trình & Điều khiển Động Cơ từ Cơ Bản tới Nâng Cao
  2. 1Lập trình & Điều khiển Động Cơ – Bài 1: Giới thiệu về Động cơ và Nguyên lý Hoạt động
  3. 2Lập trình & Điều khiển Động Cơ – Bài 2: Điều khiển tốc độ Động cơ DC bằng PWM
  4. 3Lập trình & Điều khiển Động Cơ – Bài 3: Đảo chiều quay của động cơ DC bằng mạch cầu H (L298N)
  5. 4Lập trình & Điều khiển Động Cơ – Bài 4: Viết hàm điều khiển chuyển động cho xe robot
  6. 5Lập trình & Điều khiển Động Cơ – Bài 5: Cảm biến vật cản cho xe robot (Tự dừng khi gặp chướng ngại vật)
  7. 6Lập trình & Điều khiển Động Cơ – Bài 6: Xe tránh vật cản tự động bằng cảm biến siêu âm HC-SR04
  8. 7Lập trình & Điều khiển Động Cơ – Bài 7: Điều khiển xe robot bằng điện thoại qua WiFi (Web Remote)
  9. 8Lập trình & Điều khiển Động Cơ – Bài 8: Điều khiển xe robot bằng Bluetooth từ điện thoại (ESP32 + App Android)
  10. 9Lập trình & Điều khiển Động Cơ – Bài 9: Lập trình xe robot dò line (chạy theo vạch đen)
  11. 10Lập trình & Điều khiển Động Cơ – Bài 10: Xe robot tránh vật cản kết hợp dò line (robot tự hành thông minh)
  12. 11Lập trình & Điều khiển Động Cơ – Bài 11: Điều khiển Servo bằng ESP32 (Cơ bản và Ứng dụng trong robot)
  13. 12Lập trình & Điều khiển Động Cơ – Bài 12: Kết hợp Servo và Cảm biến siêu âm HC-SR04 – Quay theo vật cản (Radar mini)
  14. 13Lập trình & Điều khiển Động Cơ – Bài 13: Servo Tracking, tạo hệ thống đầu quay cảm biến tự động theo vật cản
  15. 14Lập trình & Điều khiển Động Cơ – Bài 14: Lăp ráp đầu cảm biến quay theo vật cản lên xe robot (Xe radar thông minh)
  16. 15Lập trình & Điều khiển Động Cơ – Bài 15: Tích hợp còi cảnh báo và đèn LED vào xe robot (Báo hiệu trạng thái thông minh)
  17. 16Lậ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
  18. 17Lậ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 1): Hiểu nguyên lý
  19. 18Lậ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 2): Thiết kế phần cứng
  20. 19Lậ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 3): Lập trình cơ bản
  21. 20Lậ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 4): Tối ưu điều khiển
  22. 21Lậ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
  23. 22Lậ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 6): Truyền dữ liệu 2 chiều
  24. 23Lậ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 7): Kiểm thử & demo thực tế
Kiến thức

Lập trình & Điều khiển Động Cơ – Bài 7: Điều khiển xe robot bằng điện thoại qua WiFi (Web Remote)

Th11 2025
Lập trình & Điều khiển Động Cơ – Bài 7: Điều khiển xe robot bằng điện thoại qua WiFi (Web Remote)

(Từ khóa học: Lập trình & Điều khiển Động Cơ từ Cơ Bản tới Nâng Cao)


Giới thiệu

Ở các bài trước, xe robot của bạn đã tự tránh vật cản.

Bây giờ, chúng ta sẽ điều khiển robot thủ công bằng điện thoại, thông qua mạng WiFi của ESP32.

Bài học này giúp bạn hiểu cách tạo giao diện web đơn giản (Web Remote) để gửi lệnh điều khiển tiến – lùi – rẽ – dừng tới robot. Đây là bước đầu tiên để phát triển robot điều khiển từ xa qua Internet hoặc ứng dụng di động.

1. Nguyên lý hoạt động

  • ESP32 hoạt động như Web Server nội bộ (Access Point hoặc STA).
  • Khi bạn truy cập địa chỉ IP của ESP32 từ điện thoại, trang web hiển thị các nút:
    Tiến | Lùi | ️ Trái | ️ Phải | ️ Dừng
  • Khi nhấn nút, lệnh được gửi qua HTTP → ESP32 nhận và điều khiển L298N → động cơ hoạt động tương ứng.

2. Sơ đồ kết nối phần cứng

ESP32 PinL298N PinChức năng
GPIO26IN1Motor trái chiều 1
GPIO27IN2Motor trái chiều 2
GPIO25IN3Motor phải chiều 1
GPIO33IN4Motor phải chiều 2
GPIO14ENAPWM Motor trái
GPIO32ENBPWM Motor phải
5V, GNDL298N 5V, GNDNối nguồn chung

3. Code mẫu: Web điều khiển xe robot qua WiFi

/*
 * Bài 7 - IoTLabs Motor Course
 * Điều khiển xe robot bằng Web Server qua WiFi (ESP32)
 */

#include <WiFi.h>
#include <WebServer.h>

const char* ssid = "IoTLabs_Robot";
const char* password = "12345678";

WebServer server(80);

#define IN1 26
#define IN2 27
#define IN3 25
#define IN4 33
#define ENA 14
#define ENB 32

#define PWM_FREQ 5000
#define PWM_RES 8

void setupMotors() {
  pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT);
  ledcSetup(0, PWM_FREQ, PWM_RES);
  ledcSetup(1, PWM_FREQ, PWM_RES);
  ledcAttachPin(ENA, 0);
  ledcAttachPin(ENB, 1);
}

void goForward() {
  digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
  digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
  ledcWrite(0, 200); ledcWrite(1, 200);
}

void goBackward() {
  digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH);
  digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);
  ledcWrite(0, 200); ledcWrite(1, 200);
}

void turnLeft() {
  digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH);
  digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
  ledcWrite(0, 200); ledcWrite(1, 200);
}

void turnRight() {
  digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);
  ledcWrite(0, 200); ledcWrite(1, 200);
}

void stopMotor() {
  digitalWrite(IN1, LOW); digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW); digitalWrite(IN4, LOW);
  ledcWrite(0, 0); ledcWrite(1, 0);
}

String htmlPage() {
  String html = "<html><body style='text-align:center;'>";
  html += "<h2>IoTLabs Robot Control</h2>";
  html += "<button onclick=\"location.href='/forward'\"> Tiến</button><br><br>";
  html += "<button onclick=\"location.href='/left'\"> Trái</button>";
  html += "<button onclick=\"location.href='/stop'\"> Dừng</button>";
  html += "<button onclick=\"location.href='/right'\">Phải </button><br><br>";
  html += "<button onclick=\"location.href='/back'\"> Lùi</button>";
  html += "</body></html>";
  return html;
}

void setup() {
  Serial.begin(115200);
  setupMotors();

  WiFi.softAP(ssid, password);
  Serial.println("Access Point Started!");
  Serial.println(WiFi.softAPIP());

  server.on("/", []() { server.send(200, "text/html", htmlPage()); });
  server.on("/forward", []() { goForward(); server.send(200, "text/html", htmlPage()); });
  server.on("/back", []() { goBackward(); server.send(200, "text/html", htmlPage()); });
  server.on("/left", []() { turnLeft(); server.send(200, "text/html", htmlPage()); });
  server.on("/right", []() { turnRight(); server.send(200, "text/html", htmlPage()); });
  server.on("/stop", []() { stopMotor(); server.send(200, "text/html", htmlPage()); });

  server.begin();
}

void loop() {
  server.handleClient();
}

Kết quả:

  • Điện thoại kết nối WiFi: IoTLabs_Robot → Mở trình duyệt nhập IP (ví dụ: 192.168.4.1).
  • Giao diện xuất hiện 5 nút điều khiển.
  • Khi nhấn, robot di chuyển tương ứng theo lệnh.

4. Giải thích

  • WiFi.softAP() tạo mạng WiFi riêng của ESP32.
  • WebServer server(80) khởi tạo server trên cổng 80.
  • Mỗi server.on() là một endpoint cho một nút bấm.
  • Giao diện được sinh trực tiếp bằng HTML gửi từ ESP32.

5. Mục tiêu học tập

  • Hiểu cách ESP32 tạo web server điều khiển thiết bị.
  • Thiết kế giao diện điều khiển robot đơn giản qua WiFi.
  • Chuẩn bị cho bài sau: Điều khiển robot qua Internet (IoT Cloud).

6. Hoạt động mở rộng

  • Thêm thanh trượt (slider) điều chỉnh tốc độ PWM.
  • Tích hợp hiển thị trạng thái (đang tiến/lùi/dừng) trên web.
  • Thiết kế giao diện đẹp hơn với CSS hoặc Bootstrap.

7. Linh kiện cần thiết

Linh kiệnSố lượngGhi chú
ESP32 DevKit 38 Pin1Bộ điều khiển
L298N Motor Driver1Cầu H kép
Motor DC 3–6V2Trái và phải
Nguồn pin 7.4V hoặc 9V1Cấp nguồn động cơ
Điện thoại hoặc laptop1Kết nối WiFi

8. Kết luận

Bạn đã biến xe robot thành một thiết bị IoT điều khiển qua mạng WiFi. Khi hiểu cơ chế giao tiếp HTTP và WebServer, bạn có thể phát triển hệ thống điều khiển qua Internet hoặc tích hợp AI điều khiển bằng giọng nói.