ESP32 Joystick
Trong hướng dẫn này, chúng ta sẽ học cách sử dụng Joystick với ESP32. Cụ thể, chúng ta sẽ học:
- Joystick hoạt động như thế nào
- Cách kết nối Joystick với ESP32 và lập trình cho nó
- Cách chuyển đổi các giá trị từ Joystick thành các giá trị điều khiển như tọa độ XY, hướng lên/xuống/trái/phải của động cơ...

Linh Kiện Cần Thiết
| 1 | × | mô-đun phát triển ESP-WROOM-32 | ||
| 1 | × | Alternatively, ESP32 Uno-form board | ||
| 1 | × | Alternatively, ESP32 S3 Uno-form board | ||
| 1 | × | Cáp USB Type-C | ||
| 1 | × | Joystick | ||
| 1 | × | breadboard | ||
| 1 | × | Dây Jumper | ||
| 1 | × | (Tùy chọn) DC Power Jack | ||
| 1 | × | (Khuyến nghị) Screw Terminal Expansion Board for ESP32 | ||
| 1 | × | (Khuyến nghị) Breakout Expansion Board for ESP32 | ||
| 1 | × | (Khuyến nghị) Power Splitter for ESP32 |
Or you can buy the following kits:
| 1 | × | DIYables ESP32 Starter Kit (ESP32 included) | ||
| 1 | × | DIYables Sensor Kit (30 sensors/displays) | ||
| 1 | × | DIYables Sensor Kit (18 sensors/displays) |
Về Cảm Biến Joystick
Bạn có thể thấy Joystick ở nhiều nơi như tay cầm game, tay điều khiển đồ chơi, hoặc thậm chí trên những máy móc lớn thực tế như máy xúc.
Joystick được cấu tạo từ hai potentiometer vuông góc với nhau và một nút nhấn. Do đó, nó cung cấp các đầu ra sau:
- Một giá trị analog (từ 0 đến 4095) tương ứng với vị trí ngang (gọi là tọa độ X)
- Một giá trị analog (từ 0 đến 4095) tương ứng với vị trí dọc (gọi là tọa độ Y)
- Một giá trị digital của nút nhấn (HIGH hoặc LOW)
Sự kết hợp của hai giá trị analog có thể tạo ra tọa độ 2-D với tâm là các giá trị khi joystick ở vị trí nghỉ. Hướng thực tế của tọa độ có thể được xác định đơn giản khi bạn chạy mã kiểm tra (trong phần tiếp theo).
Một số ứng dụng có thể sử dụng cả ba đầu ra, một số ứng dụng có thể chỉ sử dụng một phần ba đầu ra.
Sơ Đồ Chân
Một Joystick có 5 chân:
- Chân GND: cần kết nối với GND (0V)
- Chân VCC: cần kết nối với VCC (5V)
- Chân VRX: xuất ra giá trị analog tương ứng với vị trí ngang (gọi là tọa độ X).
- Chân VRY: xuất ra giá trị analog tương ứng với vị trí dọc (gọi là tọa độ Y).
- Chân SW: là đầu ra từ nút nhấn bên trong joystick. Nó thường ở trạng thái mở. Nếu chúng ta sử dụng điện trở pull-up ở chân này, chân SW sẽ ở mức HIGH khi không được nhấn, và LOW khi được nhấn.

Cách Hoạt Động
- Khi bạn đẩy cần joystick sang trái/phải, điện áp ở chân VRX thay đổi. Phạm vi điện áp từ 0 đến 5V (0 ở bên trái và 5V ở bên phải). Giá trị điện áp tỷ lệ với vị trí của cần ⇒ Giá trị đọc trên chân analog của ESP32 từ 0 đến 4095
- Khi bạn đẩy cần joystick lên/xuống, điện áp ở chân VRY thay đổi. Phạm vi điện áp từ 0 đến 5V (0 ở trên và 5V ở dưới). Giá trị điện áp tỷ lệ với vị trí của cần ⇒ Giá trị đọc trên chân analog của ESP32 từ 0 đến 4095
- Khi bạn đẩy cần joystick theo bất kỳ hướng nào, điện áp ở cả hai chân VRX và VRY thay đổi tỷ lệ với phép chiếu vị trí trên mỗi trục
- Khi bạn nhấn cần joystick từ trên xuống, nút nhấn bên trong joystick được đóng. Nếu chúng ta sử dụng điện trở pull-up ở chân SW, đầu ra từ chân SW sẽ thay đổi từ 5V xuống 0V ⇒ Giá trị đọc trên chân digital của ESP32 thay đổi từ HIGH sang LOW
Sơ Đồ Kết Nối
- Cách kết nối ESP32 và joystick sử dụng breadboard

This image is created using Fritzing. Click to enlarge image
Nếu bạn chưa rõ cách cấp nguồn cho ESP32 và các linh kiện khác, xem: Cách Cung Cấp Nguồn Điện Cho ESP32.
- Cách kết nối ESP32 và joystick sử dụng screw terminal block breakout board

Cách Lập Trình Cho Joystick
Joystick có hai phần: analog (trục X, Y) và digital (nút nhấn)
- Đối với phần analog (trục X, Y), chỉ cần đọc giá trị từ chân analog input bằng cách sử dụng hàm analogRead().
- Đối với phần digital (nút nhấn): đây là một nút nhấn. Cách đơn giản và thuận tiện nhất là sử dụng ezButton library. Thư viện này hỗ trợ chống dội cho các nút và cũng kích hoạt điện trở pull-up nội bộ. Bạn có thể tìm hiểu thêm về button trong hướng dẫn ESP32 - Button. Code sẽ được trình bày trong phần tiếp theo của hướng dẫn này.
Sau khi đọc các giá trị từ chân analog, chúng ta có thể cần chuyển đổi chúng thành các giá trị điều khiển. Phần tiếp theo sẽ cung cấp các ví dụ code cho điều này.
Code ESP32
Phần này sẽ cung cấp các ví dụ code ESP32 sau:
- Code ví dụ: đọc giá trị analog từ joystick
- Code ví dụ: đọc giá trị analog và đọc trạng thái nút từ joystick
- Code ví dụ: chuyển đổi giá trị analog thành lệnh MOVE_LEFT, MOVE_RIGHT, MOVE_UP, MOVE_DOWN
- Code ví dụ: chuyển đổi giá trị analog thành góc để điều khiển hai servo motor (ví dụ: trong camera xoay nghiêng)
Đọc giá trị analog từ joystick
Các Bước Thực Hiện
- Nếu đây là lần đầu tiên bạn sử dụng ESP32, hãy xem ESP32 - Cài Đặt Phần Mềm.
- Thực hiện kết nối theo hình ảnh trên.
- Kết nối board ESP32 với PC của bạn qua cáp micro USB
- Mở Arduino IDE trên PC.
- Chọn đúng board ESP32 (ví dụ: ESP32 Dev Module) và cổng COM.
- Sao chép code trên và mở bằng Arduino IDE
- Nhấp nút Upload trên Arduino IDE để upload code lên ESP32
- Đẩy cần joystick tối đa đến giới hạn, sau đó xoay nó theo hình tròn (thuận chiều kim đồng hồ hoặc ngược chiều kim đồng hồ)
- Xem kết quả trên Serial Monitor.
- Trong khi xoay cần joystick, hãy theo dõi Serial Monitor
- Nếu giá trị X là 0, đánh dấu hoặc ghi nhớ vị trí hiện tại là trái ⇒ hướng ngược lại là phải
- Nếu giá trị Y là 0, đánh dấu hoặc ghi nhớ vị trí hiện tại là lên ⇒ hướng ngược lại là xuống
- Nhấp vào biểu tượng Libraries trên thanh bên trái của Arduino IDE.
- Tìm kiếm "ezButton", sau đó tìm thư viện button của ArduinoGetStarted.com
- Nhấp nút Install để cài đặt thư viện ezButton.
- Sao chép code trên và mở bằng Arduino IDE
- Nhấp nút Upload trên Arduino IDE để upload code lên ESP32
- Đẩy cần joystick sang trái/phải/lên/xuống
- Nhấn cần joystick từ trên xuống
- Xem kết quả trên Serial Monitor.
- Sao chép code trên và mở bằng Arduino IDE
- Nhấp nút Upload trên Arduino IDE để upload code lên ESP32
- Đẩy cần joystick sang trái/phải/lên/xuống hoặc bất kỳ hướng nào
- Xem kết quả trên Serial Monitor.
- ADC của ESP32 không hoàn toàn chính xác và có thể cần hiệu chuẩn để có kết quả đúng. Mỗi board ESP32 có thể khác nhau một chút, vì vậy bạn cần hiệu chuẩn ADC cho từng board riêng biệt.
- Hiệu chuẩn có thể khó khăn, đặc biệt đối với người mới bắt đầu, và có thể không luôn cho kết quả chính xác như bạn mong muốn.
Bạn có thể nhận thấy rằng giá trị analog không tỷ lệ với chuyển động của joystick. Vấn đề này không phải do bản thân joystick, mà là do ADC của ESP32. Cuối hướng dẫn này sẽ giải thích tại sao điều này xảy ra.
Đọc giá trị analog và đọc trạng thái nút từ joystick
Các Bước Thực Hiện

Chuyển đổi giá trị analog thành lệnh MOVE LEFT/RIGHT/UP/DOWN
Các Bước Thực Hiện
※ Lưu ý:
Tại một thời điểm, có thể không có lệnh nào, một lệnh hoặc hai lệnh (ví dụ: UP và LEFT cùng lúc)
Chuyển đổi giá trị analog thành góc để điều khiển hai servo motor
Chi tiết được trình bày trong hướng dẫn ESP32 - Joystick - Servo Motor
※ Lưu ý:
Hướng dẫn này sử dụng hàm analogRead() để đọc giá trị từ ADC (Analog-to-Digital Converter) kết nối với joystick. ADC của ESP32 tốt cho các dự án KHÔNG cần độ chính xác cao. Tuy nhiên, đối với các dự án cần đo lường chính xác, hãy lưu ý:
Đối với các dự án cần độ chính xác cao, hãy cân nhắc sử dụng ADC bên ngoài (ví dụ: ADS1115) với ESP32 hoặc sử dụng Arduino, có ADC đáng tin cậy hơn. Nếu bạn vẫn muốn hiệu chuẩn ADC của ESP32, hãy tham khảo ESP32 ADC Calibration Driver
Video Tutorial
Việc sản xuất video tốn rất nhiều thời gian. Nếu video hướng dẫn hữu ích cho việc học của bạn, hãy đăng ký kênh YouTube để ủng hộ. Nếu nhu cầu đủ cao, chúng tôi sẽ cố gắng làm thêm nhiều video.