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 sơ đồ chân

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.
joystick sơ đồ châ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
ESP32 joystick sơ đồ đấu dây

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.

how to connect ESP32 and joystick

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

/* * Mã ESP32 này được phát triển bởi newbiely.vn * Mã ESP32 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/esp32/esp32-joystick */ #define VRX_PIN 39 // ESP32 pin GPIO39 (ADC3) connected to VRX pin #define VRY_PIN 36 // ESP32 pin GPIO36 (ADC0) connected to VRY pin int valueX = 0; // to store the X-axis value int valueY = 0; // to store the Y-axis value void setup() { Serial.begin(9600); // Set the ADC attenuation to 11 dB (up to ~3.3V input) analogSetAttenuation(ADC_11db); } void loop() { // read X and Y analog values valueX = analogRead(VRX_PIN); valueY = analogRead(VRY_PIN); // print data to Serial Monitor on Arduino IDE Serial.print("x = "); Serial.print(valueX); Serial.print(", y = "); Serial.println(valueY); delay(200); }

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

    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

    /* * Mã ESP32 này được phát triển bởi newbiely.vn * Mã ESP32 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/esp32/esp32-joystick */ #include <ezButton.h> #define VRX_PIN 39 // ESP32 pin GPIO39 (ADC3) connected to VRX pin #define VRY_PIN 36 // ESP32 pin GPIO36 (ADC0) connected to VRY pin #define SW_PIN 17 // ESP32 pin GPIO17 connected to SW pin ezButton button(SW_PIN); int valueX = 0; // to store the X-axis value int valueY = 0; // to store the Y-axis value int bValue = 0; // To store value of the button void setup() { Serial.begin(9600); // Set the ADC attenuation to 11 dB (up to ~3.3V input) analogSetAttenuation(ADC_11db); button.setDebounceTime(50); // set debounce time to 50 milliseconds } void loop() { button.loop(); // MUST call the loop() function first // read X and Y analog values valueX = analogRead(VRX_PIN); valueY = 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(valueX); Serial.print(", y = "); Serial.print(valueY); Serial.print(" : button = "); Serial.println(bValue); }

    Các Bước Thực Hiện

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

    Chuyển đổi giá trị analog thành lệnh MOVE LEFT/RIGHT/UP/DOWN

    /* * Mã ESP32 này được phát triển bởi newbiely.vn * Mã ESP32 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/esp32/esp32-joystick */ #define VRX_PIN 39 // ESP32 pin GPIO39 (ADC3) connected to VRX pin #define VRY_PIN 36 // ESP32 pin GPIO36 (ADC0) connected to VRY pin #define LEFT_THRESHOLD 1000 #define RIGHT_THRESHOLD 3000 #define UP_THRESHOLD 1000 #define DOWN_THRESHOLD 3000 #define COMMAND_NO 0x00 #define COMMAND_LEFT 0x01 #define COMMAND_RIGHT 0x02 #define COMMAND_UP 0x04 #define COMMAND_DOWN 0x08 int valueX = 0 ; // to store the X-axis value int valueY = 0 ; // to store the Y-axis value int command = COMMAND_NO; void setup() { Serial.begin(9600); // Set the ADC attenuation to 11 dB (up to ~3.3V input) analogSetAttenuation(ADC_11db); } void loop() { // read X and Y analog values valueX = analogRead(VRX_PIN); valueY = analogRead(VRY_PIN); // converts the analog value to commands // reset commands command = COMMAND_NO; // check left/right commands if (valueX < LEFT_THRESHOLD) command = command | COMMAND_LEFT; else if (valueX > RIGHT_THRESHOLD) command = command | COMMAND_RIGHT; // check up/down commands if (valueY < UP_THRESHOLD) command = command | COMMAND_UP; else if (valueY > 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 } }

    Các Bước Thực Hiện

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

    ※ 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 ý:

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

    Đố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.

Bình Luận

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