라즈베리 파이 조이스틱

이 튜토리얼은 라즈베리 파이와 함께 조이스틱을 사용하는 방법을 안내합니다. 우리는 다음을 탐구할 것입니다:

라즈베리 파이 조이스틱

Hardware Preparation

1×Raspberry Pi 4 Model B Amazon
1×ADS1115 ADC Module Amazon
1×Joystick 쿠팡 | Amazon
1×Jumper Wires Amazon
1×(추천) Screw Terminal Block Shield for Raspberry Pi 쿠팡 | Amazon
1×(추천) USB-C Power Cable with On/Off Switch for Raspberry Pi 4B Amazon
1×(추천) Plastic Case and Cooling Fan for Raspberry Pi 4B Amazon
1×(추천) HDMI Touch Screen Monitor for Raspberry Pi Amazon
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

2축 조이스틱에 대하여

당신은 게임 컨트롤러, 장난감 컨트롤러, 또는 굴삭기 조종기와 같은 큰 기계에서처럼 다양한 장소에서 조이스틱을 접했을 수 있습니다.

조이스틱은 사각형으로 배열된 두 개의 가변저항기와 하나의 푸시 버튼으로 구성되어 있습니다. 다음과 같은 출력을 제공합니다:

  • 수평 위치에 해당하는 0에서 1023까지의 아날로그 값 (X-좌표로 알려져 있음)
  • 수직 위치에 해당하는 0에서 1023까지의 아날로그 값 (Y-좌표로 알려져 있음)
  • 푸시 버튼의 디지털 값 (HIGH 또는 LOW)

두 개의 아날로그 값을 결합하면 조이스틱이 쉬고 있을 때의 값을 중심으로 하는 2차원 좌표를 생성할 수 있습니다. 실제 좌표의 방향을 결정하기 위해 테스트 코드를 실행할 수 있습니다(다음 섹션에 설명됨).

일부 애플리케이션은 세 가지 출력 모두를 사용할 수 있으며, 다른 애플리케이션은 일부만 사용할 수 있습니다.

조이스틱 핀아웃

조이스틱은 5개의 핀이 있습니다.

  • GND 핀: 이것은 GND(0V)에 연결되어야 합니다.
  • VCC 핀: 이것은 VCC(5V)에 연결되어야 합니다.
  • VRX 핀: 이것은 수평 위치에 해당하는 아날로그 값을 출력합니다 (X 좌표로 알려져 있음).
  • VRY 핀: 이것은 수직 위치에 해당하는 아날로그 값을 출력합니다 (Y 좌표로 알려져 있음).
  • SW 핀: 이것은 조이스틱 내부의 푸시버튼으로부터의 출력입니다. 일반적으로 열려 있습니다. 이 핀에 풀업 저항을 사용하면 SW 핀은 눌리지 않았을 때 HIGH, 눌렸을 때 LOW가 됩니다.
조이스틱 핀아웃

작동 방식

  • 조이스틱을 좌우로 움직이면 VRX 핀의 전압이 변합니다. 이 전압 범위는 0V에서 5V까지이며, 왼쪽에서는 0V, 오른쪽에서는 5V가 되어 Raspberry Pi의 아날로그 핀에서 0에서 1023까지의 읽기 값이 나옵니다.
  • 마찬가지로, 조이스틱을 위아래로 움직이면 VRY 핀의 전압이 변합니다. 이 전압 범위는 0V에서 5V까지이며, 위쪽에서는 0V, 아래쪽에서는 5V가 되어 Raspberry Pi의 아날로그 핀에서 0에서 1023까지의 읽기 값이 나옵니다.
  • 조이스틱을 어느 방향으로든 움직이면, 위치를 각 축에 따른 투영에 비례하여 VRX와 VRY 핀의 전압이 변합니다.
  • 조이스틱을 위에서 아래로 누르면 조이스틱 안의 푸시 버튼이 닫힙니다. SW 핀에 풀업 저항을 사용하면 SW 핀의 출력이 5V에서 0V로 변하여 Raspberry Pi의 디지털 핀에서 읽기 값이 HIGH에서 LOW로 변합니다.

Wiring Diagram

라즈베리 파이 조이스틱 배선도

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

배선 구성을 간단하고 체계적으로 만들기 위해, Raspberry Pi용 스크루 터미널 블록 실드 사용을 권장합니다. 이 실드는 아래와 같이 더욱 안정적이고 관리하기 쉬운 연결을 제공합니다:

Raspberry Pi Screw Terminal Block Shield

라즈베리 파이 코드

이 섹션에서는 다음과 같은 Raspberry Pi 예제 코드를 제시할 것입니다:

  • 예제 코드: 조이스틱에서 아날로그 값 얻기
  • 예제 코드: 조이스틱에서 아날로그 값과 버튼 상태 얻기
  • 예제 코드: 아날로그 값을 MOVE_LEFT, MOVE_RIGHT, MOVE_UP, MOVE_DOWN 명령으로 변환하기
  • 예제 코드: 두 개의 서보 모터를 제어하기 위한 각도로 아날로그 값 변환하기 (예: 팬 틸트 카메라)

조이스틱에서 아날로그 값을 읽습니다.

Detailed Instructions

  • Raspberry Pi에 Raspbian 또는 기타 Raspberry Pi 호환 운영 체제가 설치되어 있는지 확인하세요.
  • Raspberry Pi가 PC와 동일한 로컬 네트워크에 연결되어 있는지 확인하세요.
  • 라이브러리를 설치해야 하는 경우 Raspberry Pi가 인터넷에 연결되어 있는지 확인하세요.
  • Raspberry Pi를 처음 사용하는 경우 Raspberry Pi 설정 방법을 참조하세요.
  • Linux와 macOS에서는 내장된 SSH 클라이언트를 사용하거나 Windows에서는 PuTTY를 사용하여 Raspberry Pi에 SSH로 PC를 연결하세요. PC를 Raspberry Pi에 SSH로 연결하는 방법을 참조하세요.
  • RPi.GPIO 라이브러리가 설치되어 있는지 확인하세요. 설치되어 있지 않으면 다음 명령어를 사용하여 설치하세요.
sudo apt-get update sudo apt-get install python3-rpi.gpio
  • Raspberry Pi 터미널에서 다음 명령을 실행하여 Adafruit_ADS1x15 라이브러리를 설치하세요:
sudo pip install Adafruit-ADS1x15
  • 파이썬 스크립트 파일 joystick.py를 만들고 다음 코드를 추가하세요:
# 이 Raspberry Pi 코드는 newbiely.kr 에서 개발되었습니다 # 이 Raspberry Pi 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. # 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: # https://newbiely.kr/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
  • 파일을 저장하고 터미널에서 다음 명령어를 실행하여 Python 스크립트를 실행하세요:
python3 joystick.py
  • 조이스틱의 엄지를 최대한 밀고 시계 방향 또는 반시계 방향으로 회전하세요.
  • 터미널에서 결과를 확인하세요.
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

조이스틱의 스틱을 돌리는 동안 터미널을 주시하세요.

X 값이 0이면 현재 위치를 왼쪽으로 기록하거나 기억하고, 반대 방향은 오른쪽임을 명심하세요.

Y 값이 0이면 현재 위치를 위로 기록하거나 기억하고, 반대 방향은 아래로 합니다.

스크립트는 터미널에서 Ctrl + C를 누를 때까지 무한 루프에서 계속 실행됩니다.

아날로그 값을 읽고 조이스틱에서 버튼 상태를 읽습니다.

Detailed Instructions

  • <span class="highlight-text-2">joystick_sw.py</span> 파일을 생성하고 다음 코드를 추가하세요:
# 이 Raspberry Pi 코드는 newbiely.kr 에서 개발되었습니다 # 이 Raspberry Pi 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. # 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: # https://newbiely.kr/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()
  • 파일을 저장하고 터미널에서 다음 명령을 실행하여 Python 스크립트를 실행하십시오:
python3 joystick_sw.py
  • 조이스틱의 조작 레버를 왼쪽, 오른쪽, 위쪽, 아래쪽으로 움직입니다.
  • 조이스틱의 조작 레버를 위에서 누릅니다.
  • 터미널에서 결과를 확인합니다.

아날로그 값을 왼쪽/오른쪽/위/아래 이동 명령으로 변환합니다.

Detailed Instructions

  • Python 스크립트 파일 joystick_cmd.py을(를) 생성하고 다음 코드를 추가하세요:
# 이 Raspberry Pi 코드는 newbiely.kr 에서 개발되었습니다 # 이 Raspberry Pi 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. # 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: # https://newbiely.kr/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
  • 파일을 저장하고 터미널에서 다음 명령을 실행하여 Python 스크립트를 실행하십시오:
python3 joystick_cmd.py
  • 조이스틱을 아무 방향으로나 움직이세요.
  • 터미널에서 결과를 확인하세요.
PuTTY - Raspberry Pi
COMMAND UP COMMAND DOWN COMMAND LEFT COMMAND RIGHT

※ NOTE THAT:

주어진 순간에는 명령이 없거나, 하나의 명령이 있거나, 동시에 두 개의 명령이 있을 수 있습니다 (예: 위쪽과 왼쪽).

아날로그 값을 각도로 변환하여 두 개의 서보 모터를 제어합니다.

자세한 내용은 Raspberry Pi - 조이스틱으로 서보 모터 제어라는 튜토리얼에서 확인할 수 있습니다.

Video Tutorial

비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.

관련 튜토리얼