-
-
-
Tổng tiền thanh toán:
-
Thương hiệu: (Đang cập nhật ...) Loại: (Đang cập nhật ...)
Bài 2: Tìm hiểu phần cứng tay cầm điều khiển Drone ESP32
Khóa học STEM Drone ESP32 – LINHKIEN1993
Trong Bài 1, chúng ta đã nhìn tổng quan hệ thống Drone Mini ESP32. Bài 2 tập trung vào tay cầm: hiểu joystick tạo tín hiệu điện như thế nào, ESP32 đọc và xử lý tín hiệu ra sao, sau đó chuẩn bị dữ liệu để truyền đến Drone.
Tay cầm là giao diện trực tiếp giữa người điều khiển và Drone. Theo tài liệu, tay cầm LINHKIEN1993 dùng ESP32 DEVKIT V1 làm bộ xử lý trung tâm.
Người điều khiển
↓
Joystick / Button
↓
ESP32
↓
Xử lý dữ liệu
↓
ESP-NOW
↓
Drone ESP32
Tay cầm không trực tiếp điều khiển motor. Nó nhận thao tác → chuyển thành dữ liệu → xử lý → truyền dữ liệu đến Drone.
· ESP32 DEVKIT V1 30 pin
· 2 joystick
· Các nút nhấn
· LED báo trạng thái
· Cổng USB
· Đầu nối nguồn / ngoại vi
· PCB tay cầm và linh kiện phụ trợ
Hai joystick nằm hai bên, ESP32 gần trung tâm PCB; bố cục được thiết kế để thao tác bằng hai tay.

Hình PCB tay cầm – mặt trước và mặt sau.
Sơ đồ kết nối chân của tay cầm

ESP32 DEVKIT V1 30 pin thực hiện 4 bước chính:
1. Đọc tín hiệu từ joystick, nút nhấn và các tín hiệu trạng thái cần thiết.
2. Xử lý tín hiệu thành các giá trị điều khiển có ý nghĩa.
3. Đóng gói dữ liệu điều khiển.
4. Truyền dữ liệu đến Drone qua ESP-NOW.
Ví dụ logic dữ liệu điều khiển:
struct DroneControl {
int throttle;
int roll;
int pitch;
int yaw;
};
Đây chỉ là ví dụ cấu trúc; firmware chính thức phải phù hợp với thiết kế Drone.
Mỗi joystick tạo tín hiệu thay đổi theo hai phương X/Y. Khi người dùng di chuyển cần joystick, điện áp đầu ra thay đổi và ESP32 đọc điện áp đó bằng ngõ vào tương tự.
Vị trí joystick
↓
Điện áp analog
↓
ADC ESP32
↓
Giá trị số
↓
Firmware
Joystick không gửi trực tiếp câu lệnh như “sang trái”; nó tạo ra tín hiệu điện, sau đó phần mềm chuyển tín hiệu thành dữ liệu điều khiển.
ADC (Analog to Digital Converter) biến điện áp analog thành giá trị số mà chương trình có thể xử lý. Có thể kiểm tra giá trị bằng Serial Monitor.
Ví dụ trong tài liệu: Joystick X = 2040, Y = 1985; khi di chuyển có thể xuất hiện các giá trị như X = 500 hoặc X = 3500.
Giá trị thực tế phụ thuộc joystick, mạch điện, nguồn cấp và firmware. Không nên lấy một giá trị ADC trên Internet áp dụng trực tiếp cho PCB LINHKIEN1993; cần đo trên phần cứng thực tế.
Khi joystick ở giữa, hệ thống cần hiểu đó là trạng thái không điều khiển theo hướng tương ứng. Giá trị ADC tại điểm giữa có thể khác nhau giữa các joystick, vì vậy firmware có thể cần calibration.
Ngay cả khi người dùng không chạm joystick, ADC vẫn có thể dao động nhẹ. Nếu coi mọi thay đổi là lệnh, Drone có thể nhận tín hiệu ngoài ý muốn.
Dead Zone tạo một vùng quanh điểm giữa; các dao động nhỏ trong vùng này có thể được coi là 0. Điều này giúp tay cầm ổn định hơn.
Nút nhấn có thể được firmware dùng cho Arm, Disarm, chuyển chế độ, xác nhận, chức năng phụ hoặc báo trạng thái. Về điện tử, nút tạo thay đổi logic tại GPIO.
Nút nhấn
↓
GPIO ESP32
↓
Firmware
↓
Thực hiện chức năng
Không nên tự gán chức năng cho từng nút khi chưa xác định schematic và firmware của đúng phiên bản Drone đang sử dụng.
LED giúp người dùng và kỹ thuật viên nhận biết trạng thái. Ví dụ: LED tắt có thể là chưa cấp nguồn; LED sáng là hệ thống hoạt động; LED nhấp nháy có thể là đang chờ kết nối. Trạng thái thực tế phụ thuộc firmware.
Cổng USB phục vụ nạp firmware và kiểm tra dữ liệu bằng Serial Monitor.
Máy tính
↓
USB
↓
ESP32
↓
Upload Firmware
Ví dụ Serial Monitor: Joystick X: 2048; Joystick Y: 2051; Button 1: RELEASE; Button 2: PRESS.
PCB có đường mạch, via, vùng đồng, điểm hàn, đường nguồn, đường tín hiệu và GND. Khi quan sát PCB, cần đặt các câu hỏi: ESP32 lấy nguồn từ đâu? Tín hiệu joystick vào chân nào? Nút nhấn nối GPIO nào? LED được điều khiển bởi chân nào?
Đây là tư duy quan trọng khi thiết kế, kiểm tra hoặc sửa chữa PCB.
Không nên cố đọc toàn bộ schematic cùng lúc. Hãy chia thành từng khối:
POWER
↓
ESP32
↓
Joystick + Button + LED
↓
Firmware
↓
ESP-NOW
Phân tích theo functional block giúp liên hệ schematic → PCB → linh kiện thực tế và đặc biệt hữu ích khi sửa chữa hoặc thiết kế PCB mới.
Một gói điều khiển có thể gồm:
· Throttle
· Roll
· Pitch
· Yaw
· Button / Mode
Đọc Joystick
↓
Calibration
↓
Dead Zone
↓
Mapping
↓
Đóng gói dữ liệu
↓
ESP-NOW
↓
Drone ESP32
Đây là nền tảng để tìm hiểu sâu hơn về ESP-NOW ở Bài 5 và điều khiển Drone ở Bài 6.
Hai joystick không nhất thiết có cùng điểm giữa. Tài liệu minh họa: joystick trái Center = 2048, joystick phải Center = 2015. Nếu không xử lý, hệ thống có thể hiểu joystick đang phát lệnh dù người dùng đang để ở giữa.
Calibration giúp xác định giá trị trung tâm, nhỏ nhất, lớn nhất, hướng chuyển động và vùng chết. Sau đó firmware có thể Mapping dữ liệu về khoảng phù hợp với thuật toán điều khiển.
ADC
↓
Calibration
↓
Dead Zone
↓
Mapping
↓
Roll / Pitch / Throttle / Yaw
Trước khi chuyển sang Bài 3, học viên có thể thực hiện các bài kiểm tra sau.
Cấp nguồn và kiểm tra ESP32 có hoạt động bình thường hay không.
Đọc giá trị ADC của từng trục.
Trước khi cắm nguồn hoặc cắm USB nạp code thì cần giữ nút nhấn số 2 rồi cắm nguồn hoặc cáp usb vào, giữ 1s.


Code test
|
#define J1_X 34 #define J1_Y 35 #define J2_X 32 #define J2_Y 33 #define BTN1 13 #define BTN2 12 #define BTN3 15 #define BTN4 2 void setup() { Serial.begin(115200); pinMode(BTN1, INPUT_PULLUP); pinMode(BTN2, INPUT_PULLUP); pinMode(BTN3, INPUT_PULLUP); pinMode(BTN4, INPUT_PULLUP);
Serial.println(); Serial.println("================================"); Serial.println(" TEST TAY CAM ESP32"); Serial.println("================================"); Serial.println(); } void loop() { int j1_x = analogRead(J1_X); int j1_y = analogRead(J1_Y); int j2_x = analogRead(J2_X); int j2_y = analogRead(J2_Y); bool btn1 = !digitalRead(BTN1); bool btn2 = !digitalRead(BTN2); bool btn3 = !digitalRead(BTN3); bool btn4 = !digitalRead(BTN4); Serial.println("--------------------------------"); Serial.print("Joystick 1: "); Serial.print("X = "); Serial.print(j1_x); Serial.print(" | Y = "); Serial.println(j1_y); Serial.print("Joystick 2: "); Serial.print("X = "); Serial.print(j2_x); Serial.print(" | Y = "); Serial.println(j2_y); Serial.print("BTN1 = "); Serial.print(btn1 ? "NHAN" : "THA"); Serial.print(" | BTN2 = "); Serial.print(btn2 ? "NHAN" : "THA"); Serial.print(" | BTN3 = "); Serial.print(btn3 ? "NHAN" : "THA"); Serial.print(" | BTN4 = "); Serial.println(btn4 ? "NHAN" : "THA"); delay(500); } |
Quan sát trên serial nếu kết quả là tay cầm nhận được tín hiệu và hoạt động, chưa cần phải thao tác gì trên tay cầm, nếu có hiển thị như hình bên dưới nghĩa là tay cầm đã có thể hoạt động ổn định

Để joystick ở vị trí trung tâm và ghi lại giá trị.
Như kết quả từ hình trên thì giá trị điểm giữa:
- của joystick 1 là X = 1808 , Y = 1877
- của joystock 2 là X = 1823, Y = 1808
Nhấn từng nút và quan sát trạng thái GPIO qua serial.
Nhấn nút nào thì sẽ hiển thị trạng thái nút đó tương ứng trên serial

Xác định LED nào được điều khiển bởi firmware và trạng thái của từng LED.
Khi vừa cấp nguồn thì led đỏ sẽ sáng báo hiệu trạng thái mạch được cấp nguồn.

Led xanh được nối với GPIO26, được dùng với mục đích riêng nào đó tùy mục đích người dùng.
· Phần cứng: ESP32, joystick, nút nhấn, LED, USB, PCB, nguồn.
· Điện tử: tín hiệu analog, ADC, GPIO, nguồn, GND, schematic và PCB Layout.
· Lập trình: đọc ADC/GPIO, Calibration, Dead Zone, Mapping và đóng gói dữ liệu.
· Kiến trúc hệ thống: Joystick → ADC → ESP32 → Xử lý → Packet → ESP-NOW → Drone.
Điểm quan trọng nhất: tay cầm không trực tiếp điều khiển motor. Tay cầm tạo dữ liệu điều khiển; ESP32 xử lý, đóng gói và truyền dữ liệu đến ESP32 trên Drone.
Sau khi hiểu phần cứng tay cầm, người học có nền tảng để bước sang Bài 3: tìm hiểu bo mạch Drone, ESP32, MPU6050, mạch điều khiển motor và hệ thống 4 động cơ.
LINHKIEN1993 – STEM DRONE ESP32 | Học điện tử – Học lập trình – Hiểu nguyên lý – Tự nghiên cứu
Website: linhkien1993.com | Zalo: 0367 547 577