Raspberry Pi - Joystick

Deze handleiding laat u zien hoe u een joystick gebruikt met de Raspberry Pi. We duiken in:

Raspberry Pi joystick

Hardware Benodigd

1×Raspberry Pi 5
1×ADS1115 ADC-Module
1×Joystick
1×Jumper Draden
1×(Aanbevolen) Schroefklem Block Shield voor Raspberry Pi
1×(Aanbevolen) Raspberry Pi Prototyping Basisplaat & Breadboard Kit
1×(Aanbevolen) HDMI-Touchscreen-Monitor voor Raspberry Pi

Of u kunt de volgende kits kopen:

1×DIYables Sensorkit (30 sensoren/displays)
1×DIYables Sensorkit (18 sensoren/displays)
Openbaarmaking: Sommige van de links in deze sectie zijn Amazon-affiliate links. We kunnen een commissie ontvangen voor aankopen die via deze links worden gedaan, zonder extra kosten voor u. We waarderen uw steun.

Over de 2-assige Joystick

U bent waarschijnlijk een joystick tegengekomen op verschillende plekken, zoals een gamecontroller, speelgoedbesturing of zelfs een grote machine zoals een graafmachinecontroller.

De joystick bestaat uit twee potentiometers die in een vierkante opstelling zitten, en één drukknop (push button). Het biedt de volgende outputs:

  • Een analoge waarde van 0 tot 1023 die overeenkomt met de horizontale positie (bekend als de X-coördinaat)
  • Een analoge waarde van 0 tot 1023 die overeenkomt met de verticale positie (bekend als de Y-coördinaat)
  • Een digitale waarde van de drukknop (HIGH of LOW)

De combinatie van twee analoge waarden kan 2D-coördinaten genereren waarbij het midden de waarden zijn als de joystick in ruststand staat. Om de werkelijke richting van de coördinaten te bepalen, kunt u een testcode draaien (deze wordt in de volgende sectie gepresenteerd).

Sommige toepassingen gebruiken alle drie outputs, andere alleen een deel ervan.

De Pinout van de Joystick

Een joystick heeft 5 pinnen:

  • GND pin: Moet worden aangesloten op GND (0V).
  • VCC pin: Moet worden aangesloten op VCC (5V).
  • VRX pin: Stuurt een analoge waarde uit die overeenkomt met de horizontale positie (de X-coördinaat).
  • VRY pin: Stuurt een analoge waarde uit die overeenkomt met de verticale positie (de Y-coördinaat).
  • SW pin: Dit is de output van de drukknop binnenin de joystick. Deze is normaal open. Als er een pull-up weerstand op deze pin wordt toegepast, is de SW pin HIGH wanneer niet ingedrukt, en LOW wanneer ingedrukt.
joystick pinout

Hoe het Werkt

  • Wanneer u de joystick omhoog of omlaag beweegt, verandert de spanning op de VRX pin. Deze spanningsrange loopt van 0V tot 5V, waarbij 0V aan de linkerzijde zit en 5V aan de rechterkant, wat resulteert in een uitlezing op de analoge pin van de Raspberry Pi tussen 0 en 1023.
  • Op dezelfde manier, wanneer u de joystick omhoog of omlaag beweegt, verandert de spanning op de VRY pin. Deze spanningsrange loopt van 0V tot 5V, waarbij 0V aan de bovenkant zit en 5V aan de onderkant, met een uitlezing van 0 tot 1023.
  • Bij beweging in willekeurige richtingen verandert de spanning van zowel VRX als VRY in verhouding tot de projectie van de positie op elke as.
  • Wanneer u de joystick indrukt (top naar beneden duwt), wordt de interne drukknop gesloten. Als er een pull-up weerstand gebruikt wordt op de SW pin, verandert de uitgang op SW van 5V naar 0V, wat resulteert in een digitale uitlezing die van HIGH naar LOW gaat op de Raspberry Pi.

Aansluitschema

Raspberry Pi Joystick aansluitdiagram

This image is created using Fritzing. Click to enlarge image

Raspberry Pi Code

Deze sectie laat de volgende voorbeeldcodes voor Raspberry Pi zien:

  • Voorbeeldcode: Uitlezen van analoge waarden van de joystick
  • Voorbeeldcode: Uitlezen van analoge waarden en knopstatus van de joystick
  • Voorbeeldcode: Omzetten van analoge waarden naar commando's zoals MOVE_LEFT, MOVE_RIGHT, MOVE_UP, MOVE_DOWN
  • Voorbeeldcode: Omzetten van analoge waarden naar hoeken voor de aansturing van twee servo motoren (bijvoorbeeld in een pan-tilt camera)

Uitlezen van analoge waarden van de joystick

Snelle Stappen

  • Zorg dat u Raspbian of een ander Raspberry Pi-compatibel besturingssysteem geïnstalleerd heeft op uw Pi.
  • Zorg dat uw Raspberry Pi verbonden is met hetzelfde lokale netwerk als uw pc.
  • Zorg dat uw Raspberry Pi verbonden is met internet als u nog libraries moet installeren.
  • Als dit de eerste keer is dat u een Raspberry Pi gebruikt, bekijk dan de handleiding hoe u de Raspberry Pi installeert
  • Verbind uw pc met de Raspberry Pi via SSH met de ingebouwde SSH-client op Linux en macOS of PuTTY op Windows. Bekijk hoe u uw pc verbindt met Raspberry Pi via SSH.
  • Controleer of de RPi.GPIO library geïnstalleerd is. Zo niet, installeer deze dan met het volgende commando:
sudo apt-get update sudo apt-get install python3-rpi.gpio
  • Installeer de Adafruit_ADS1x15 library door de volgende commando’s uit te voeren in de terminal van de Raspberry Pi:
sudo pip install Adafruit-ADS1x15
  • Maak een Python scriptbestand aan met de naam joystick.py en voeg de volgende code toe:
# Deze Raspberry Pi code is ontwikkeld door newbiely.nl # Deze Raspberry Pi code wordt zonder enige beperking aan het publiek beschikbaar gesteld. # Voor volledige instructies en schema's, bezoek: # https://newbiely.nl/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
  • Sla het bestand op en start het Python-script door het volgende commando in de terminal uit te voeren:
python3 joystick.py
  • Beweeg de joystick volledig naar een kant en draai hem vervolgens met de klok mee of tegen de klok in.
  • Bekijk de resultaten in het Terminal-venster.
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

Terwijl u de joystick beweegt, let goed op de Terminal.

Als de X-waarde 0 is, noteer of onthoud dan deze positie als links; de tegenovergestelde richting is rechts.

Als de Y-waarde 0 is, noteer of onthoud dan deze positie als omhoog; de tegenovergestelde richting is omlaag.

Het script draait in een oneindige lus totdat u Ctrl + C in de terminal indrukt.

Uitlezen van analoge waarden en de knopstatus van de joystick

Snelle Stappen

  • Maak een Python scriptbestand aan met de naam joystick_sw.py en voeg de volgende code toe:
# Deze Raspberry Pi code is ontwikkeld door newbiely.nl # Deze Raspberry Pi code wordt zonder enige beperking aan het publiek beschikbaar gesteld. # Voor volledige instructies en schema's, bezoek: # https://newbiely.nl/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()
  • Sla het bestand op en start het Python-script door het volgende commando in de terminal uit te voeren:
python3 joystick_sw.py
  • Beweeg de joystick naar links, rechts, omhoog of omlaag.
  • Druk de joystick in (duw de top naar beneden).
  • Bekijk de resultaten in het Terminal-venster.

Omzetten van analoge waarden naar MOVE LEFT/RIGHT/UP/DOWN commando’s

Snelle Stappen

  • Maak een Python scriptbestand aan met de naam joystick_cmd.py en voeg de volgende code toe:
# Deze Raspberry Pi code is ontwikkeld door newbiely.nl # Deze Raspberry Pi code wordt zonder enige beperking aan het publiek beschikbaar gesteld. # Voor volledige instructies en schema's, bezoek: # https://newbiely.nl/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
  • Sla het bestand op en start het Python-script door het volgende commando in de terminal uit te voeren:
python3 joystick_cmd.py
  • Beweeg de joystick in willekeurige richting.
  • Bekijk het resultaat in de Terminal.
PuTTY - Raspberry Pi
COMMAND UP COMMAND DOWN COMMAND LEFT COMMAND RIGHT

※ Notiz:

Op een gegeven moment kan er geen commando zijn, één commando, of twee commando’s tegelijk (bijvoorbeeld UP en LEFT).

Omzetten van analoge waarden naar hoeken voor het aansturen van twee servo motoren

De details zijn te vinden in de handleiding Raspberry Pi - Joystick bestuurt Servo Motor.

Video Tutorial

We overwegen het maken van videotutorials. Als u videotutorials belangrijk vindt, abonneer u dan op ons YouTube-kanaal om ons te motiveren de video's te maken.

Bekijk onze video-tutorial voor een visuele begeleiding bij dit project! De video biedt extra inzichten om de stappen beter te begrijpen.

Gerelateerde Tutorials

※ ONZE BERICHTEN

  • U bent welkom om de link naar deze tutorial te delen. Gebruik onze inhoud echter niet op andere websites. We hebben veel moeite en tijd gestoken in het maken van de inhoud, respecteer alstublieft ons werk!