Làm app điện thoại điều khiển robot ESP32 - 4 con đường từ dễ đến khó

So sánh 4 cách có app điều khiển robot - app terminal có sẵn, MIT App Inventor kéo thả, web app PWA, Flutter - kèm lộ trình BLE và thiết kế giao diện. 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.
"Em muốn có app riêng điều khiển robot"
Sau khi robot chạy được bằng app terminal generic, câu hỏi tự nhiên tiếp theo của mọi học sinh: làm sao có app CỦA MÌNH — logo mình vẽ, nút mình bố trí, tên mình đặt? Tin tốt: năm 2026 có nhiều con đường đến "app riêng" hơn bao giờ, và con đường tốt nhất cho người học không phải là học lập trình mobile chuyên nghiệp.
Bài này xếp 4 con đường theo độ khó tăng dần, kèm tiêu chí chọn.
Con đường 0 (điểm xuất phát): app có sẵn
Trước khi làm app, hãy chắc đã dùng thạo app generic:
- Serial Bluetooth Terminal (Android): gõ lệnh chữ qua Bluetooth Classic — công cụ debug số một
- Arduino Bluetooth Controller / Bluetooth RC Car (Android): giao diện gamepad, gán ký tự cho từng nút
- nRF Connect (Android/iOS): thám hiểm BLE — nhìn thấy service, characteristic của robot
Chúng đủ cho 80% nhu cầu học tập; làm app riêng là để học và để cá nhân hóa, không phải vì thiếu công cụ.
Con đường 1: MIT App Inventor - app thật trong một buổi học
App Inventor (appinventor.mit.edu) là nền tảng kéo thả của MIT: thiết kế giao diện bằng kéo nút, viết logic bằng khối Blockly quen thuộc, xuất file APK cài lên Android thật. Học sinh đã học Blockly ở phòng lab robot chuyển sang gần như không có rào cản.
Kiến trúc bài học chuẩn (Bluetooth Classic):
- Giao diện: ListPicker (chọn thiết bị Bluetooth) + 5 nút mũi tên + nhãn trạng thái
- Logic khối: nút TIẾN nhấn → BluetoothClient gửi text "F"; thả → gửi "S"
- Phía ESP32: code BluetoothSerial đọc ký tự — y hệt bài Điều khiển robot từ xa ở mục Kiến thức, không đổi một dòng
Một buổi 90 phút: học sinh về nhà với app mang tên mình trên điện thoại. Đây là con đường khuyến nghị mặc định cho lớp học 11-15 tuổi.
Giới hạn: chỉ Android (iOS rất hạn chế), giao diện kiểu "hộp xếp" khó đẹp tinh tế, BLE dùng được qua extension nhưng lích kích hơn Classic.
Con đường 2: Web app / PWA - "app" chạy mọi máy
Góc nhìn đảo ngược: trang web điều khiển (bài WiFi web server ở mục Kiến thức) chính là app rồi — thêm vài bước thành PWA (Progressive Web App): file manifest + icon, người dùng bấm "Thêm vào màn hình chính", trang web có icon riêng, mở toàn màn hình như app thật.
Ưu điểm áp đảo về triển khai: chạy iPhone lẫn Android lẫn laptop, không qua cửa hàng ứng dụng, cập nhật là sửa file HTML trong ESP32. Nhược: cần WiFi tới robot (không dùng đường Bluetooth), và muốn đẹp phải học CSS thật.
Nâng cấp đáng giá: Web Bluetooth API — trang web (mở bằng Chrome/Edge trên Android, macOS, Windows) kết nối thẳng BLE của robot, không cần WiFi. Đây chính là công nghệ phòng lab HocLapTrinhRobot dùng để nạp code qua trình duyệt. Hạn chế lớn duy nhất: iOS Safari chưa hỗ trợ Web Bluetooth.
Con đường 3: BLE + app framework thật (Flutter)
Con đường của học sinh cấp 3 định hướng lập trình và sinh viên: viết app Flutter (một code chạy cả Android lẫn iOS) nói chuyện BLE với ESP32.
Phía ESP32 chuyển từ Bluetooth Classic sang BLE với mô hình service/characteristic:
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLE2902.h>
#define SERVICE_UUID "6e400001-b5a3-f393-e0a9-e50e24dcca9e" // Nordic UART
#define CHAR_RX_UUID "6e400002-b5a3-f393-e0a9-e50e24dcca9e"
class RxCallback : public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *chr) override {
String cmd = chr->getValue(); // app ghi lệnh vào đây
if (cmd.length() > 0) handleCommand(cmd[0]);
}
};
void setup() {
BLEDevice::init("RobotBLE");
BLEServer *server = BLEDevice::createServer();
BLEService *service = server->createService(SERVICE_UUID);
BLECharacteristic *rx = service->createCharacteristic(
CHAR_RX_UUID, BLECharacteristic::PROPERTY_WRITE);
rx->setCallbacks(new RxCallback());
service->start();
server->getAdvertising()->start();
}Dùng bộ UUID Nordic UART Service như trên là quy ước khôn ngoan: mọi app terminal BLE có sẵn đều nhận ra robot của bạn — test được ngay trước khi app tự viết xong. Phía Flutter dùng package flutter_blue_plus: quét, kết nối, ghi characteristic — khoảng 100 dòng cho bản điều khiển tối thiểu.
Chi phí thật của con đường này là học framework (vài tuần đến vài tháng) — xứng đáng nếu mục tiêu là kỹ năng lập trình mobile, quá đắt nếu chỉ cần cái app bấm nút.
Bảng chọn đường
| Tiêu chí | App có sẵn | App Inventor | Web/PWA | Flutter + BLE |
|---|---|---|---|---|
| Thời gian đến app đầu tiên | 5 phút | 1 buổi | 1-2 buổi | 2-4 tuần |
| Chạy iPhone | Tùy app | Không thực tế | Có (trừ Web Bluetooth) | Có |
| Tùy biến giao diện | Không | Trung bình | Cao | Rất cao |
| Giá trị học thuật | — | Tư duy sự kiện | HTML/JS/mạng | Lập trình mobile thật |
| Hợp lứa tuổi | Mọi | 11-15 | 13+ | 16+ |
Thiết kế giao diện điều khiển tử tế - 5 quy tắc
Bất kể con đường nào, giao diện điều khiển robot tốt tuân theo:
- Nút to, cách xa nhau — ngón cái đang căng thẳng bấm trượt là robot đâm tường; tối thiểu 60x60 điểm ảnh
- Giữ-để-chạy, thả-để-dừng cho nút hướng (sự kiện nhấn/thả riêng), kèm failsafe timeout phía robot — an toàn hai lớp
- Nút DỪNG to, đỏ, ở giữa — luôn có đường thoát khẩn cấp một chạm
- Hiện trạng thái kết nối rõ ràng (xanh nối/xám rớt) — nửa số "app không chạy" thực ra là "chưa kết nối lại sau khi robot reset"
- Phản hồi hai chiều khi có thể: hiện pin, khoảng cách từ robot gửi về — biến tay cầm thành dashboard, và dạy luôn khái niệm telemetry
Câu hỏi thường gặp
Nên dạy App Inventor hay web app cho lớp STEM?
Theo nền sẵn có của lớp: lớp đã quen Blockly và toàn Android → App Inventor cho cảm giác "app thật" nhanh nhất; lớp có iPhone hoặc đang học song song HTML → web/PWA đồng bộ hơn. Nhiều giáo trình chạy cả hai: App Inventor học kỳ 1, web app học kỳ 2.
Bluetooth Classic hay BLE cho app tự viết?
App Inventor → Classic (khối có sẵn, đơn giản). Mọi con đường khác năm 2026 → BLE: iPhone chỉ có BLE, Web Bluetooth chỉ có BLE, thư viện Flutter/React Native tập trung BLE. Classic đang là công nghệ hoàng hôn — vẫn tốt cho buổi học đầu, không nên là đích dài hạn.
App có điều khiển robot qua Internet được không?
Cả 4 con đường trên là điều khiển gần (Bluetooth/WiFi cục bộ). Qua Internet cần kiến trúc khác: app publish lệnh lên MQTT broker, robot subscribe — ghép bài MQTT nhập môn ở mục Kiến thức với bất kỳ con đường app nào (App Inventor có extension MQTT, web dùng MQTT.js, Flutter có package mqtt_client).
Đưa app lên Google Play / App Store được không?
Về kỹ thuật được (App Inventor xuất APK ký được, Flutter build chuẩn cửa hàng), nhưng phí tài khoản (Google 25 USD một lần, Apple 99 USD/năm) và quy trình duyệt không đáng cho app học tập. Chia sẻ nội bộ: gửi file APK trực tiếp hoặc TestFlight/dịch vụ phân phối nội bộ là đủ.
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.



