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:

sơ đồ chân joystick

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.
sơ đồ chân của joystick

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

sơ đồ đấu nối joystick với Arduino

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().
int xValue = analogRead(A1); int yValue = analogRead(A0);
  • Đố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

/* * Mã Arduino này được phát triển bởi newbiely.vn * Mã Arduino này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/arduino/arduino-joystick */ #define VRX_PIN A1 // Arduino pin connected to VRX pin #define VRY_PIN A0 // Arduino pin connected to VRY pin int xValue = 0; // To store value of the X axis int yValue = 0; // To store value of the Y axis void setup() { Serial.begin(9600) ; } void loop() { // read analog X and Y analog values xValue = analogRead(VRX_PIN); yValue = analogRead(VRY_PIN); // print data to Serial Monitor on Arduino IDE Serial.print("x = "); Serial.print(xValue); Serial.print(", y = "); Serial.println(yValue); delay(200); }

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.
COM6
Send
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • 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

    Đọc các giá trị tương tự và trạng thái nút từ một joystick

    /* * Mã Arduino này được phát triển bởi newbiely.vn * Mã Arduino này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/arduino/arduino-joystick */ #include <ezButton.h> #define VRX_PIN A1 // Arduino pin connected to VRX pin #define VRY_PIN A0 // Arduino pin connected to VRY pin #define SW_PIN 2 // Arduino pin connected to SW pin ezButton button(SW_PIN); int xValue = 0; // To store value of the X axis int yValue = 0; // To store value of the Y axis int bValue = 0; // To store value of the button void setup() { Serial.begin(9600) ; button.setDebounceTime(50); // set debounce time to 50 milliseconds } void loop() { button.loop(); // MUST call the loop() function first // read analog X and Y analog values xValue = analogRead(VRX_PIN); yValue = analogRead(VRY_PIN); // Read the button value bValue = button.getState(); if (button.isPressed()) { Serial.println("The button is pressed"); // TODO do something here } if (button.isReleased()) { Serial.println("The button is released"); // TODO do something here } // print data to Serial Monitor on Arduino IDE Serial.print("x = "); Serial.print(xValue); Serial.print(", y = "); Serial.print(yValue); Serial.print(" : button = "); Serial.println(bValue); }

    Hướng dẫn từng bước

    • Đ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.
    thư viện nút Arduino
    • 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
    COM6
    Send
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    Chuyển đổi giá trị analog thành các lệnh di chuyển trái/phải/lên/xuống

    /* * Mã Arduino này được phát triển bởi newbiely.vn * Mã Arduino này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/arduino/arduino-joystick */ #define VRX_PIN A1 // Arduino pin connected to VRX pin #define VRY_PIN A0 // Arduino pin connected to VRY pin #define LEFT_THRESHOLD 400 #define RIGHT_THRESHOLD 800 #define UP_THRESHOLD 400 #define DOWN_THRESHOLD 800 #define COMMAND_NO 0x00 #define COMMAND_LEFT 0x01 #define COMMAND_RIGHT 0x02 #define COMMAND_UP 0x04 #define COMMAND_DOWN 0x08 int xValue = 0 ; // To store value of the X axis int yValue = 0 ; // To store value of the Y axis int command = COMMAND_NO; void setup() { Serial.begin(9600) ; } void loop() { // read analog X and Y analog values xValue = analogRead(VRX_PIN); yValue = analogRead(VRY_PIN); // converts the analog value to commands // reset commands command = COMMAND_NO; // check left/right commands if (xValue < LEFT_THRESHOLD) command = command | COMMAND_LEFT; else if (xValue > RIGHT_THRESHOLD) command = command | COMMAND_RIGHT; // check up/down commands if (yValue < UP_THRESHOLD) command = command | COMMAND_UP; else if (yValue > DOWN_THRESHOLD) command = command | COMMAND_DOWN; // NOTE: AT A TIME, THERE MAY BE NO COMMAND, ONE COMMAND OR TWO COMMANDS // print command to serial and process command if (command & COMMAND_LEFT) { Serial.println("COMMAND LEFT"); // TODO: add your task here } if (command & COMMAND_RIGHT) { Serial.println("COMMAND RIGHT"); // TODO: add your task here } if (command & COMMAND_UP) { Serial.println("COMMAND UP"); // TODO: add your task here } if (command & COMMAND_DOWN) { Serial.println("COMMAND DOWN"); // TODO: add your task here } }

    Hướng dẫn từng bước

    • 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.
    COM6
    Send
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    ※ 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.

Các tham chiếu hàm

Bài hướng dẫn liên quan