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

Phần cứng cần chuẩn bị
| 1 | × | Arduino Uno R3 | ||
| 1 | × | USB 2.0 cable type A/B (for USB-A PC) | ||
| 1 | × | USB 2.0 cable type C/B (for USB-C PC) | ||
| 1 | × | Joystick | ||
| 1 | × | dây jumper | ||
| 1 | × | (Khuyến nghị) Screw Terminal Block Shield for Arduino Uno | ||
| 1 | × | (Khuyến nghị) Breadboard Shield for Arduino Uno | ||
| 1 | × | (Khuyến nghị) Enclosure for Arduino Uno | ||
| 1 | × | (Khuyến nghị) Prototyping Base Plate & Breadboard Kit for Arduino UNO |
Or you can buy the following kits:
| 1 | × | DIYables STEM V3 Starter Kit (Arduino 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 ở đâu đó, chẳng hạn như một bộ điều khiển trò chơi, bộ điều khiển đồ chơi, hoặc thậm chí là một thiết bị lớn thật sự như bộ điều khiển của máy đào.
Joystick được cấu thành từ hai biến trở hình vuông với nhau và một nút nhấn. Do đó, nó cung cấp các đầu ra sau đây:
- Một giá trị analog (từ 0 đến 1023) tương ứng với vị trí theo chiều ngang (gọi là tọa độ X)
- Một giá trị analog (từ 0 đến 1023) tương ứng với vị trí theo chiều dọc (gọi là tọa độ Y)
- Một giá trị kỹ thuật số của một nút nhấn (HIGH hoặc LOW)
Sự kết hợp của hai giá trị tương tự có thể tạo ra các tọa độ hai chiều, với tâm là các giá trị tại vị trí nghỉ của joystick. Hướng thực sự của các tọa độ có thể được xác định một cách đơn giản khi bạn chạy một đoạn mã kiểm tra (ở 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 số trong ba đầu ra.
Bố trí chân
Một joystick có 5 chân:
- Chân GND: cần được kết nối với GND (0V)
- Chân VCC: cần được kết nối với VCC (5V)
- Chân VRX: xuất ra một giá trị analog tương ứng với vị trí theo chiều ngang (gọi là tọa độ X)
- Chân VRY: xuất ra một giá trị analog tương ứng với vị trí theo chiều 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 mở. Nếu chúng ta sử dụng một điện trở kéo lên ở chân này, chân SW sẽ ở mức HIGH khi không ấn, và LOW khi được ấn.

Cách hoạt động
- Khi bạn đẩy cần joystick sang trái hoặc sang phải, điện áp ở chân VRX sẽ bị 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ệ thuận với vị trí của cần ⇒ Giá trị đọc trên chân analog của Arduino sẽ từ 0 đến 1023.
- Khi bạn đẩy cần joystick lên hoặc xuống, điện áp ở chân VRY sẽ bị 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ệ thuận với vị trí của cần ⇒ Giá trị đọc trên chân analog của Arduino sẽ từ 0 đến 1023.
- 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 sẽ biến đổi theo tỷ lệ với phép chiếu của vị trí lên mỗi trục.
- Khi bạn đẩy cần joystick từ trên xuống dưới, nút nhấn bên trong joystick được đóng. Nếu chúng ta dùng một điện trở kéo lên ở chân SW, đầu ra từ chân SW sẽ đổi từ 5V sang 0V ⇒ Giá trị đọc trên chân digital của Arduino sẽ từ HIGH sang LOW.
Sơ đồ đấu dây

This image is created using Fritzing. Click to enlarge image
Cách Lập Trình Cho Joystick
Joystick có hai phần: analog (trục X, trục Y) và digital (nút nhấn).
- Đối với các phần tín hiệu analog (trục X, trục Y), chỉ cần đọc giá trị từ chân đầu vào analog bằng cách sử dụng hàm analogRead().
- Đối với phần kỹ thuật số (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 nhiễu (debounce) cho các nút và cũng cho phép một điện trở kéo lên nội bộ. Bạn có thể xem thêm về nút tại Arduino - Nút nhấn. Mã sẽ được trình bày ở phần tiếp theo của bài hướng dẫn này.
Sau khi đọc các giá trị từ các chân analog, chúng ta có thể cần chuyển chúng thành các giá trị có thể điều khiển được. Phần tiếp theo sẽ cung cấp các mã ví dụ cho việc này.
Mã Arduino
Phần này sẽ cung cấp các mã ví dụ Arduino sau đây:
- Mã ví dụ: đọc các giá trị analog từ joystick
- Mã ví dụ: đọc các giá trị analog và trạng thái nút từ joystick
- Mã ví dụ: chuyển đổi giá trị analog thành các lệnh MOVE_LEFT, MOVE_RIGHT, MOVE_UP, MOVE_DOWN
- Mã ví dụ: chuyển đổi các giá trị analog thành các góc để điều khiển hai động cơ servo (ví dụ trong camera pan-tilt)
Đọc các giá trị tương tự từ joystick
Hướng dẫn từng bước
- Sao chép mã ở trên và mở bằng Arduino IDE
- Nhấp nút Tải lên trên Arduino IDE để tải mã lên Arduino
- Đẩy cần của joystick tối đa đến giới hạn, sau đó xoay nó theo vòng tròn (thuận hoặc nghịch chiều kim đồng hồ)
- Xem kết quả trên Serial Monitor.
- Trong khi xoay thumbstick, hãy tiếp tục quan sát Serial Monitor
- Nếu giá trị X bằng 0, đánh dấu hoặc ghi nhớ vị trí hiện tại là sang trái ⇒ hướng ngược lại là sang phải
- Nếu giá trị Y bằng 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
- Đi tới biểu tượng Thư viện ở thanh bên trái của Arduino IDE.
- Tìm kiếm “ezButton”, sau đó tìm thư viện nút nhấn từ ArduinoGetStarted.com.
- Nhấp vào nút Cài đặt để cài đặt thư viện ezButton.
- Sao chép mã ở trên và mở bằng Arduino IDE
- Nhấp vào nút Tải lên trên Arduino IDE để tải mã lên Arduino
- Nhấn nút của joystick theo các hướng trái/phải/lên/xuống
- Nhấn nút của joystick từ phía trên
- Xem kết quả trên Serial Monitor
- Sao chép mã ở trên và mở bằng Arduino IDE
- Nhấp vào nút Upload trên Arduino IDE để tải mã lên Arduino
- Đẩy 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.
Đọc các giá trị tương tự và trạng thái nút từ một joystick
Hướng dẫn từng bước

Chuyển đổi giá trị analog thành các lệnh di chuyển trái/phải/lên/xuống
Hướng dẫn từng bước
※ Lưu ý:
Trong một lượt, có thể không có lệnh, một lệnh hoặc hai lệnh (ví dụ như UP và LEFT cùng lúc)
Chuyển đổi các giá trị tương tự thành các góc để điều khiển hai động cơ servo
Chi tiết được trình bày trên tutorial Arduino - Joystick - Động cơ servo
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.