Raspberry Pi - Joystick

Dieses Tutorial zeigt Ihnen, wie Sie einen Joystick mit dem Raspberry Pi verwenden. Wir werden Folgendes erkunden:

Raspberry Pi joystick

Benötigte Hardware

1×Raspberry Pi 5
1×ADS1115 ADC Modul
1×Joystick
1×Jumper Kabel
1×(Empfohlen) Schraubklemmenblock-Shield für Raspberry Pi
1×(Empfohlen) Raspberry Pi Prototyping-Grundplatte & Breadboard-Kit
1×(Empfohlen) HDMI-Touchscreen-Monitor für Raspberry Pi

Oder Sie können die folgenden Kits kaufen:

1×DIYables Sensor-Kit (30 Sensoren/Displays)
1×DIYables Sensor-Kit (18 Sensoren/Displays)
Offenlegung: Einige der in diesem Abschnitt bereitgestellten Links sind Amazon-Affiliate-Links. Wir können eine Provision für Käufe erhalten, die über diese Links getätigt werden, ohne zusätzliche Kosten für Sie. Wir schätzen Ihre Unterstützung.

Über den 2-Achsen Joystick

Sie haben möglicherweise schon einen Joystick an verschiedenen Stellen angetroffen, wie z.B. bei einem Spiele-Controller, einem Spielzeug-Controller oder sogar bei einer großen Maschine wie einem Bagger-Controller.

Der Joystick besteht aus zwei Potentiometern, die in einer quadratischen Anordnung platziert sind, und einem Druckknopf. Er bietet die folgenden Ausgänge:

  • Einen analogen Wert von 0 bis 1023, der der horizontalen Position entspricht (bekannt als X-Koordinate)
  • Einen analogen Wert von 0 bis 1023, der der vertikalen Position entspricht (bekannt als Y-Koordinate)
  • Einen digitalen Wert des Druckknopfs (entweder HIGH oder LOW)

Die Kombination der zwei analogen Werte kann 2D-Koordinaten erzeugen, wobei das Zentrum die Werte sind, wenn sich der Joystick in seiner Ruheposition befindet. Um die tatsächliche Richtung der Koordinaten zu bestimmen, kann ein Test-Code ausgeführt werden (wird im nächsten Abschnitt vorgestellt).

Einige Anwendungen verwenden alle drei Ausgänge, während andere nur einige davon nutzen.

Die Joystick-Pinbelegung

Ein Joystick hat 5 Pins:

  • GND Pin: Dieser muss mit GND (0V) verbunden werden.
  • VCC Pin: Dieser muss mit VCC (5V) verbunden werden.
  • VRX Pin: Dieser gibt einen analogen Wert aus, der der horizontalen Position entspricht (bekannt als X-Koordinate).
  • VRY Pin: Dieser gibt einen analogen Wert aus, der der vertikalen Position entspricht (bekannt als Y-Koordinate).
  • SW Pin: Dies ist der Ausgang des Druckknopfs im Inneren des Joysticks. Er ist normalerweise geöffnet. Wenn ein Pull-up-Widerstand an diesem Pin verwendet wird, ist der SW Pin HIGH wenn er nicht gedrückt wird, und LOW wenn er gedrückt wird.
joystick pinout

Funktionsweise

  • Wenn Sie den Joystick-Daumen nach links oder rechts bewegen, ändert sich die Spannung am VRX Pin. Diese Spannung reicht von 0V bis 5V, wobei 0V links und 5V rechts ist, was zu einem Messwert am analogen Pin des Raspberry Pi von 0 bis 1023 führt.
  • Ähnlich ändert sich die Spannung am VRY Pin, wenn Sie den Joystick-Daumen nach oben oder unten bewegen. Diese Spannung reicht von 0V bis 5V, wobei 0V oben und 5V unten ist, was zu einem Messwert am analogen Pin des Raspberry Pi von 0 bis 1023 führt.
  • Wenn Sie den Joystick-Daumen in eine beliebige Richtung bewegen, ändert sich die Spannung sowohl am VRX als auch am VRY Pin proportional zur Projektion der Position auf jeder Achse.
  • Wenn Sie den Joystick-Daumen von oben nach unten drücken, schließt sich der Druckknopf im Inneren des Joysticks. Wenn wir einen Pull-up-Widerstand am SW Pin verwenden, ändert sich der Ausgang vom SW Pin von 5V auf 0V, was dazu führt, dass sich der Messwert am digitalen Pin des Raspberry Pi von HIGH auf LOW ändert.

Schaltplan

Raspberry Pi Joystick wiring diagram

Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.

Um Ihren Verdrahtungsaufbau zu vereinfachen und zu organisieren, empfehlen wir die Verwendung eines Schraubklemmenblock-Shields für Raspberry Pi. Dieses Shield gewährleistet sicherere und besser verwaltbare Verbindungen, wie unten gezeigt:

Raspberry Pi Schraubklemmenblock-Shield

Raspberry Pi Code

Dieser Abschnitt präsentiert die folgenden Raspberry Pi Beispiel-Codes:

  • Beispiel-Code: Analoge Werte vom Joystick erhalten
  • Beispiel-Code: Analoge Werte und Button-Status vom Joystick erhalten
  • Beispiel-Code: Umwandlung analoger Werte in MOVE_LEFT, MOVE_RIGHT, MOVE_UP, MOVE_DOWN Befehle
  • Beispiel-Code: Umwandlung analoger Werte in Winkel zur Steuerung von zwei Servo-Motoren (z.B. bei einer Pan-Tilt-Kamera)

Liest analoge Werte vom Joystick

Schnelle Schritte

  • Stellen Sie sicher, dass Sie Raspbian oder ein anderes Raspberry Pi-kompatibles Betriebssystem auf Ihrem Pi installiert haben.
  • Stellen Sie sicher, dass Ihr Raspberry Pi mit demselben lokalen Netzwerk wie Ihr PC verbunden ist.
  • Stellen Sie sicher, dass Ihr Raspberry Pi mit dem Internet verbunden ist, wenn Sie Bibliotheken installieren müssen.
  • Falls Sie den Raspberry Pi zum ersten Mal verwenden, siehe Raspberry Pi einrichten
  • Verbinden Sie Ihren PC über SSH mit dem Raspberry Pi, indem Sie den integrierten SSH-Client unter Linux und macOS oder PuTTY unter Windows verwenden. Siehe PC mit Raspberry Pi über SSH verbinden.
  • Stellen Sie sicher, dass Sie die RPi.GPIO Bibliothek installiert haben. Falls nicht, installieren Sie sie mit folgendem Befehl:
sudo apt-get update sudo apt-get install python3-rpi.gpio
  • Installieren Sie die Adafruit_ADS1x15 Bibliothek, indem Sie folgende Befehle in Ihrem Raspberry Pi Terminal ausführen:
sudo pip install Adafruit-ADS1x15
  • Erstellen Sie eine Python-Skriptdatei joystick.py und fügen Sie folgenden Code hinzu:
# Dieser Raspberry Pi Code wurde von newbiely.de entwickelt # Dieser Raspberry Pi Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. # Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: # https://newbiely.de/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
  • Speichern Sie die Datei und führen Sie das Python-Skript aus, indem Sie folgenden Befehl im Terminal eingeben:
python3 joystick.py
  • Drücken Sie den Joystick-Daumen auf sein Maximum und drehen Sie ihn dann im oder gegen den Uhrzeigersinn.
  • Überprüfen Sie die Ergebnisse im 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

Behalten Sie das Terminal im Auge, während Sie den Joystick-Daumen drehen.

Wenn der X-Wert 0 ist, notieren oder merken Sie sich die aktuelle Position als links, wobei die entgegengesetzte Richtung rechts ist.

Wenn der Y-Wert 0 ist, notieren oder merken Sie sich die aktuelle Position als oben, wobei die entgegengesetzte Richtung unten ist.

Das Skript läuft in einer Endlosschleife kontinuierlich, bis Sie Strg + C im Terminal drücken.

Liest analoge Werte und den Button-Status vom Joystick

Schnelle Schritte

  • Erstellen Sie eine Python-Skriptdatei joystick_sw.py und fügen Sie folgenden Code hinzu:
# Dieser Raspberry Pi Code wurde von newbiely.de entwickelt # Dieser Raspberry Pi Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. # Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: # https://newbiely.de/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()
  • Speichern Sie die Datei und führen Sie das Python-Skript aus, indem Sie folgenden Befehl im Terminal eingeben:
python3 joystick_sw.py
  • Bewegen Sie den Joystick-Daumen nach links, rechts, oben oder unten.
  • Drücken Sie den Joystick-Daumen von oben.
  • Überprüfen Sie die Ergebnisse im Terminal.

Wandelt analoge Werte in MOVE LEFT/RIGHT/UP/DOWN Befehle um

Schnelle Schritte

  • Erstellen Sie eine Python-Skriptdatei joystick_cmd.py und fügen Sie folgenden Code hinzu:
# Dieser Raspberry Pi Code wurde von newbiely.de entwickelt # Dieser Raspberry Pi Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. # Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: # https://newbiely.de/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
  • Speichern Sie die Datei und führen Sie das Python-Skript aus, indem Sie folgenden Befehl im Terminal eingeben:
python3 joystick_cmd.py
  • Bewegen Sie den Joystick in eine beliebige Richtung.
  • Überprüfen Sie das Ergebnis im Terminal.
PuTTY - Raspberry Pi
COMMAND UP COMMAND DOWN COMMAND LEFT COMMAND RIGHT

※ Notiz:

Zu einem gegebenen Zeitpunkt kann es keinen Befehl, einen Befehl oder zwei Befehle gleichzeitig geben (z.B. UP und LEFT).

Wandelt analoge Werte in Winkel zur Steuerung von zwei Servo-Motoren um

Die Details finden Sie im Tutorial Raspberry Pi - Joystick steuert Servo Motor.

Video Tutorial

Wir erwägen die Erstellung von Video-Tutorials. Wenn Sie Video-Tutorials für wichtig halten, abonnieren Sie bitte unseren YouTube-Kanal , um uns zu motivieren, die Videos zu erstellen.

Verwandte Tutorials

※ UNSERE NACHRICHTEN

  • Sie können gerne den Link zu diesem Tutorial teilen. Bitte verwenden Sie jedoch unsere Inhalte nicht auf anderen Websites. Wir haben viel Mühe und Zeit in die Erstellung der Inhalte investiert, bitte respektieren Sie unsere Arbeit!