Raspberry Pi Joystick

Hướng dẫn này sẽ chỉ bạn cách sử dụng joystick với Raspberry Pi. Chúng ta sẽ tìm hiểu:

Raspberry Pi joystick

Phần Cứng Cần Thiết

1×Raspberry Pi 5
1×mô-đun ADC ADS1115
1×Joystick
1×dây jumper (dây nối jumper)
1×(Khuyến nghị) Screw Terminal Block Shield for Raspberry Pi
1×(Khuyến nghị) Raspberry Pi Prototyping Base Plate & Breadboard Kit
1×(Khuyến nghị) HDMI Touch Screen Monitor for Raspberry Pi

Or you can buy the following kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)

Về Joystick 2 trục

Bạn có thể đã gặp Joystick ở nhiều nơi khác nhau, chẳng hạn như trong tay cầm game, điều khiển đồ chơi, hoặc thậm chí trong các máy móc lớn như máy xúc.

Joystick được tạo thành từ hai biến trở (potentiometer) được bố trí theo hình vuông, và một nút nhấn. Nó cung cấp các đầu ra sau:

  • Một giá trị analog từ 0 đến 1023 tương ứng với vị trí ngang (được gọi là tọa độ X)
  • Một giá trị analog từ 0 đến 1023 tương ứng với vị trí dọc (đượ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ỉ. Để xác định hướng thực tế của tọa độ, bạn có thể chạy một đoạn code thử nghiệm (sẽ được trình bày trong phần tiếp theo).

Một số ứng dụng có thể sử dụng cả ba đầu ra, trong khi những ứng dụng khác chỉ sử dụng một số trong đó.

Sơ Đồ Chân Joystick

Một Joystick có 5 chân:

  • Chân GND: Phải được kết nối với GND (0V).
  • Chân VCC: Phải được kết nối với VCC (5V).
  • Chân VRX: Đầu ra analog tương ứng với vị trí ngang (tọa độ X).
  • Chân VRY: Đầu ra analog tương ứng với vị trí dọc (tọa độ Y).
  • Chân SW: Đây là đầu ra từ nút nhấn bên trong joystick. Nó thường ở trạng thái mở. Nếu sử dụng điện trở pull-up ở chân này, chân SW sẽ là 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 di chuyển cần joystick sang trái hoặc phải, điện áp ở chân VRX sẽ thay đổi. Phạm vi điện áp này là từ 0V đến 5V, với 0V ở bên trái và 5V ở bên phải, dẫn đến giá trị đọc được trên chân analog của Raspberry Pi từ 0 đến 1023.
  • Tương tự, khi bạn di chuyển cần joystick lên hoặc xuống, điện áp ở chân VRY sẽ thay đổi. Phạm vi điện áp này là từ 0V đến 5V, với 0V ở trên và 5V ở dưới, dẫn đến giá trị đọc được trên chân analog của Raspberry Pi từ 0 đến 1023.
  • Khi bạn di chuyển cần joystick theo bất kỳ hướng nào, điện áp ở cả hai chân VRX và VRY sẽ thay đổi tỷ lệ với hình chiếu của vị trí trên mỗi trục.
  • Khi bạn nhấn cần joystick từ trên xuống dưới, nút nhấn bên trong joystick sẽ đó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, dẫn đến giá trị đọc được trên chân digital của Raspberry Pi thay đổi từ HIGH sang LOW.

Sơ Đồ Kết Nối

Raspberry Pi joystick sơ đồ đấu dây

This image is created using Fritzing. Click to enlarge image

Code Raspberry Pi

Phần này sẽ trình bày các code ví dụ sau cho Raspberry Pi:

  • Code ví dụ: Đọc giá trị analog từ joystick
  • Code ví dụ: Đọc giá trị analog và trạng thái nút nhấn từ joystick
  • Code ví dụ: Chuyển đổi giá trị analog thành các 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 pan-tilt)

Đọc giá trị analog từ joystick

Các Bước Nhanh

  • Đảm bảo bạn đã cài đặt Raspbian hoặc bất kỳ hệ điều hành tương thích Raspberry Pi nào khác trên Pi của bạn.
  • Đảm bảo Raspberry Pi của bạn được kết nối với cùng mạng nội bộ với PC của bạn.
  • Đảm bảo Raspberry Pi của bạn được kết nối internet nếu cần cài đặt một số thư viện.
  • Nếu đây là lần đầu bạn sử dụng Raspberry Pi, hãy xem Raspberry Pi - Cài Đặt Phần Mềm
  • Kết nối PC của bạn với Raspberry Pi qua SSH sử dụng SSH client tích hợp sẵn trên Linux và macOS hoặc PuTTY trên Windows. Xem cách kết nối PC với Raspberry Pi qua SSH.
  • Đảm bảo bạn đã cài đặt thư viện RPi.GPIO. Nếu chưa, hãy cài đặt nó bằng lệnh sau:
sudo apt-get update sudo apt-get install python3-rpi.gpio
  • Cài đặt thư viện Adafruit_ADS1x15 bằng cách chạy các lệnh sau trên terminal Raspberry Pi:
sudo pip install Adafruit-ADS1x15
  • Tạo file script Python joystick.py và thêm code sau:
# Mã Raspberry Pi này được phát triển bởi newbiely.vn # Mã Raspberry Pi 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/raspberry-pi/raspberry-pi-joystick import time import Adafruit_ADS1x15 # Create an ADS1115 instance ADC = Adafruit_ADS1x15.ADS1115() # Set the gain to ±4.096V (adjust if needed) GAIN = 1 # Specify the ADC channels for the joystick axes X_CHANNEL = 0 Y_CHANNEL = 1 try: while True: x_value = ADC.read_adc(X_CHANNEL, gain=GAIN) y_value = ADC.read_adc(Y_CHANNEL, gain=GAIN) print(f"X-axis Value: {x_value}, Y-axis Value: {y_value}") time.sleep(0.1) except KeyboardInterrupt: pass
  • Lưu file và chạy script Python bằng cách thực thi lệnh sau trong terminal:
python3 joystick.py
  • Đẩy cần joystick đến vị trí tối đa rồi xoay nó theo chiều kim đồng hồ hoặc ngược chiều kim đồng hồ.
  • Kiểm tra kết quả trên Terminal.
PuTTY - Raspberry Pi
X-axis Value: 256, Y-axis Value: 256 X-axis Value: 500, Y-axis Value: 500 X-axis Value: 800, Y-axis Value: 800 X-axis Value: 1000, Y-axis Value: 1000 X-axis Value: 1000, Y-axis Value: 1000 X-axis Value: 1000, Y-axis Value: 1000 X-axis Value: 900, Y-axis Value: 900 X-axis Value: 600, Y-axis Value: 600 X-axis Value: 300, Y-axis Value: 300 X-axis Value: 50, Y-axis Value: 50 X-axis Value: 50, Y-axis Value: 50

Trong khi xoay cần joystick, hãy quan sát Terminal.

Nếu giá trị X là 0, hãy ghi nhớ vị trí hiện tại là trái, với hướng ngược lại là phải.

Nếu giá trị Y là 0, hãy ghi nhớ vị trí hiện tại là lên, với hướng ngược lại là xuống.

Script sẽ chạy trong vòng lặp vô hạn liên tục cho đến khi bạn nhấn Ctrl + C trong terminal.

Đọc giá trị analog và đọc trạng thái nút nhấn từ joystick

Các Bước Nhanh

  • Tạo file script Python joystick_sw.py và thêm code sau:
# Mã Raspberry Pi này được phát triển bởi newbiely.vn # Mã Raspberry Pi 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/raspberry-pi/raspberry-pi-joystick import time import Adafruit_ADS1x15 # Create an ADS1115 instance ADC = Adafruit_ADS1x15.ADS1115() # Set the gain to ±4.096V (adjust if needed) GAIN = 1 # Specify the ADC channels for the joystick axes X_CHANNEL = 0 Y_CHANNEL = 1 # Define the GPIO pin for the push button BUTTON_PIN = 16 # GPIO16 # Initialize the GPIO pin for the button import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Initialize variable for previous button state prev_button_state = GPIO.HIGH try: while True: x_value = ADC.read_adc(X_CHANNEL, gain=GAIN) y_value = ADC.read_adc(Y_CHANNEL, gain=GAIN) button_state = GPIO.input(BUTTON_PIN) print(f"X-axis Value: {x_value}, Y-axis Value: {y_value}, Button State: {button_state}") # Detect button press event (transition from HIGH to LOW) if prev_button_state == GPIO.HIGH and button_state == GPIO.LOW: print("Button Pressed!") # Detect button release event (transition from LOW to HIGH) if prev_button_state == GPIO.LOW and button_state == GPIO.HIGH: print("Button Released!") prev_button_state = button_state time.sleep(0.1) except KeyboardInterrupt: pass finally: GPIO.cleanup()
  • Lưu file và chạy script Python bằng cách thực thi lệnh sau trong terminal:
python3 joystick_sw.py
  • Di chuyển cần joystick sang trái, phải, lên hoặc xuống.
  • Nhấn cần joystick từ trên xuống.
  • Kiểm tra kết quả trên Terminal.

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

Các Bước Nhanh

  • Tạo file script Python joystick_cmd.py và thêm code sau:
# Mã Raspberry Pi này được phát triển bởi newbiely.vn # Mã Raspberry Pi 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/raspberry-pi/raspberry-pi-joystick import time import Adafruit_ADS1x15 # Create an ADS1115 instance ADC = Adafruit_ADS1x15.ADS1115() # Set the gain to ±4.096V (adjust if needed) GAIN = 1 # Specify the ADC channels for the joystick axes X_CHANNEL = 0 Y_CHANNEL = 1 # Read center values initially to calculate thresholds CENTER_SAMPLES = 100 x_center = sum([ADC.read_adc(X_CHANNEL, gain=GAIN) for _ in range(CENTER_SAMPLES)]) / CENTER_SAMPLES y_center = sum([ADC.read_adc(Y_CHANNEL, gain=GAIN) for _ in range(CENTER_SAMPLES)]) / CENTER_SAMPLES # Calculate thresholds based on center values THRESHOLD_DELTA = 200 # Adjust this value as needed LEFT_THRESHOLD = x_center - THRESHOLD_DELTA RIGHT_THRESHOLD = x_center + THRESHOLD_DELTA UP_THRESHOLD = y_center - THRESHOLD_DELTA DOWN_THRESHOLD = y_center + THRESHOLD_DELTA COMMAND_NO = 0x00 COMMAND_LEFT = 0x01 COMMAND_RIGHT = 0x02 COMMAND_UP = 0x04 COMMAND_DOWN = 0x08 try: while True: value_X = ADC.read_adc(X_CHANNEL, gain=GAIN) value_Y = ADC.read_adc(Y_CHANNEL, gain=GAIN) command = COMMAND_NO if value_X < LEFT_THRESHOLD: command |= COMMAND_LEFT elif value_X > RIGHT_THRESHOLD: command |= COMMAND_RIGHT if value_Y < UP_THRESHOLD: command |= COMMAND_UP elif value_Y > DOWN_THRESHOLD: command |= COMMAND_DOWN if command & COMMAND_LEFT: print("COMMAND LEFT") # TODO: Add your task here if command & COMMAND_RIGHT: print("COMMAND RIGHT") # TODO: Add your task here if command & COMMAND_UP: print("COMMAND UP") # TODO: Add your task here if command & COMMAND_DOWN: print("COMMAND DOWN") # TODO: Add your task here time.sleep(0.1) except KeyboardInterrupt: pass
  • Lưu file và chạy script Python bằng cách thực thi lệnh sau trong terminal:
python3 joystick_cmd.py
  • Di chuyển joystick theo bất kỳ hướng nào.
  • Kiểm tra kết quả trong Terminal.
PuTTY - Raspberry Pi
COMMAND UP COMMAND DOWN COMMAND LEFT COMMAND RIGHT

※ Lưu ý:

Tại một thời điểm nhất định, có thể không có lệnh nào, một lệnh, hoặc hai lệnh đồng thời (ví dụ: UP và LEFT).

Chuyển đổi giá trị analog thành góc để điều khiển hai servo motor

Chi tiết có thể được tìm thấy trong hướng dẫn có tiêu đề Raspberry Pi - Joystick điều khiển Servo Motor.

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ài hướng dẫn liên quan