ESP32 - Joystick

Dieses Tutorial zeigt Ihnen, wie Sie einen Joystick mit dem ESP32 und MicroPython verwenden. Im Einzelnen lernen wir:

ESP32 MicroPython und Joystick

Erforderliche Hardware

1×38-pin ESP32 ESP-WROOM-32 Dev Module - Narrow
1×(Alternativ) 38-pin ESP32 ESP-WROOM-32 Dev Module - Wide
1×(Alternativ) 30-pin ESP32 ESP-WROOM-32 Dev Module - Wide
1×(Alternativ) ESP32 Uno-form board
1×(Alternativ) ESP32 S3 Uno-form board
1×USB-Kabel Typ-A zu Typ-C (für USB-A PC)
1×USB-Kabel Typ-C zu Typ-C (für USB-C PC)
1×Joystick
1×Verbindungskabel
1×(Empfohlen) Schraubklemmen-Erweiterungsboard für ESP32
1×(Empfohlen) Breakout Expansion Board for ESP32
1×(Empfohlen) Stromverteiler für ESP32

Oder Sie können die folgenden Kits kaufen:

1×DIYables ESP32 Starter-Kit (ESP32 enthalten)
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.

Überblick über Joystick

Sie haben vielleicht schon gesehen, wie ein Joystick zur Steuerung von Spielen, Spielzeug oder sogar großen Maschinen wie Baggern verwendet wird. Der Joystick besteht aus zwei Potentiometern, die quadratisch angeordnet sind, und einem Knopf. Er liefert folgende Ausgaben:

  • Einen Bereich von 0 bis 4095 für die horizontale Position (links-rechts).
  • Einen Bereich von 0 bis 4095 für die vertikale Position (auf-ab).
  • Den Status des Knopfes, entweder EIN (HIGH) oder AUS (LOW).

Durch die Kombination der beiden Analogwerte erzeugt der Joystick 2D-Koordinaten, die in Ruhestellung zentriert sind. Die tatsächliche Richtung dieser Koordinaten können Sie mit einem Testcode ermitteln, den wir im nächsten Abschnitt behandeln. Manche Anwendungen nutzen alle drei Ausgaben, andere nur einige davon.

Pinbelegung

Ein Joystick hat fünf Pins:

  • GND-Pin: Wird mit Masse (0V) verbunden.
  • VCC-Pin: Wird mit der 3,3V-Versorgung des ESP32 verbunden.
  • VRX-Pin: Liefert einen Analogwert für die horizontale Position (X-Koordinate); verbinden Sie diesen Pin mit einem ADC-Pin des ESP32.
  • VRY-Pin: Liefert einen Analogwert für die vertikale Position (Y-Koordinate); verbinden Sie diesen Pin mit einem ADC-Pin des ESP32.
  • SW-Pin: Ist mit dem Drucktaster des Joysticks verbunden, der normalerweise offen ist. Verwenden Sie einen Pull-up-Widerstand, damit dieser Pin HIGH ist, wenn der Knopf nicht gedrückt ist, und LOW, wenn er gedrückt ist.
Joystick Pinbelegung

Funktionsweise

  • Bewegung nach links/rechts:
    • Wenn Sie den Joystick nach links oder rechts bewegen, ändert sich die Spannung am VRX-Pin.
    • Eine Bewegung nach links senkt die Spannung auf 0 Volt, eine Bewegung nach rechts erhöht sie auf 3,3 Volt.
    • Der ESP32 misst diese Spannung und wandelt sie in eine Zahl zwischen 0 und 4095 um, wobei 0V dem Wert 0 und 3,3V dem Wert 4095 entspricht.
  • Bewegung nach oben/unten:
    • Wenn Sie den Joystick nach oben oder unten bewegen, ändert sich die Spannung am VRY-Pin.
    • Eine Bewegung nach oben senkt die Spannung auf 0 Volt, eine Bewegung nach unten erhöht sie auf 3,3 Volt.
    • Der ESP32 liest diese Spannung und wandelt sie, wie beim VRX-Pin, in eine Zahl von 0 bis 4095 um.
  • Kombinierte Bewegungen:
    • Wenn Sie den Joystick in eine beliebige Richtung bewegen, ändert sich die Spannung sowohl am VRX- als auch am VRY-Pin, abhängig von seiner Position auf jeder Achse.
  • Drücken des Joysticks:
    • Wenn Sie den Joystick nach unten drücken, wird ein interner Knopf betätigt.
    • Ein mit dem SW-Pin verbundener Pull-up-Widerstand bewirkt, dass die Spannung an diesem Pin beim Drücken von 3,3V auf 0V fällt.
    • Der ESP32 interpretiert dies als digitales Signal und liest HIGH (3,3V), wenn nicht gedrückt, und LOW (0V), wenn gedrückt.

    Wenn der Joystick bewegt wird, ändern sich die Spannungen an den Pins VRX und VRY, die der ESP32 als Werte von 0 bis 4095 liest. Das Drücken des Joysticks ändert die Spannung am SW-Pin, und der ESP32 erkennt diese Änderung als HIGH oder LOW.

Verdrahtungsdiagramm

  • So verbinden Sie ESP32 und Joystick über ein Breadboard
ESP32 MicroPython Joystick Schaltplan

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

So verbinden Sie ESP32 und Joystick

So programmieren Sie den Joystick

Glücklicherweise hat DIYables eine Joystick-Bibliothek entwickelt, die die Verwendung eines Joysticks mit dem ESP32 erheblich vereinfacht.

ESP32 MicroPython-Code - Zustand des Joysticks auslesen

Das folgende MicroPython-Skript:

  • Liest Analogwerte von einem Joystick.
  • Prüft, ob der Joystick-Knopf gedrückt oder losgelassen ist.
  • Liest die Anzahl der Knopfdrücke des Joysticks.
/* * Dieser ESP32 MicroPython Code wurde von newbiely.de entwickelt * Dieser ESP32 MicroPython 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/esp32-micropython/esp32-micropython-joystick */ from DIYables_MicroPython_Joystick import Joystick from machine import Pin, ADC import time VRX_PIN = 39 # The ESP32 pin GPIO39 (ADC3) connected to VRX pin of joystick VRY_PIN = 36 # The ESP32 pin GPIO36 (ADC0) connected to VRY pin of joystick SW_PIN = 17 # The ESP32 pin GPIO17 connected to SW pin of joystick adc_vrx = ADC(Pin(VRX_PIN)) adc_vry = ADC(Pin(VRY_PIN)) # Set the ADC width (resolution) to 12 bits adc_vrx.width(ADC.WIDTH_12BIT) adc_vry.width(ADC.WIDTH_12BIT) # Set the attenuation to 11 dB, allowing input range up to ~3.3V adc_vrx.atten(ADC.ATTN_11DB) adc_vry.atten(ADC.ATTN_11DB) joystick = Joystick(pin_x=VRX_PIN, pin_y=VRY_PIN, pin_button=SW_PIN) # Configure the debounce time if necessary (default is 50ms) joystick.set_debounce_time(100) # debounce time set to 100 milliseconds while True: joystick.loop() # Must be called frequently to process button debouncing # Read the analog values from the X and Y axes x_value = joystick.read_x() y_value = joystick.read_y() press_count = joystick.get_press_count() # Check if the button has been pressed or released if joystick.is_pressed(): print("Button Pressed") if joystick.is_released(): print("Button Released") # Print the joystick's X and Y coordinates, and pressed count print(f'Joystick Position - X: {x_value}, Y: {y_value}, pressed count: {press_count}') time.sleep(0.1) # Delay to reduce the output frequency

Schnelle Schritte

So richten Sie Ihren MicroPython-Code auf dem ESP32 mit der Thonny IDE ein und führen ihn aus:

  • Stellen Sie sicher, dass die Thonny IDE auf Ihrem Computer installiert ist.
  • Vergewissern Sie sich, dass die MicroPython-Firmware auf Ihrem ESP32-Board installiert ist.
  • Wenn Sie zum ersten Mal einen ESP32 mit MicroPython verwenden, lesen Sie die Anleitung ESP32 MicroPython Erste Schritte mit Schritt-für-Schritt-Anweisungen.
  • Verbinden Sie den Joystick gemäß dem Schaltplan mit dem ESP32.
  • Verbinden Sie das ESP32-Board über ein USB-Kabel mit Ihrem Computer.
  • Öffnen Sie die Thonny IDE auf Ihrem Computer.
  • Gehen Sie in der Thonny IDE zu Tools Options.
  • Wählen Sie im Tab Interpreter aus dem Dropdown-Menü MicroPython (ESP32) aus.
  • Stellen Sie sicher, dass der richtige Port ausgewählt ist. Die Thonny IDE erkennt ihn normalerweise automatisch, eventuell müssen Sie ihn aber manuell auswählen (z. B. COM12 unter Windows oder /dev/ttyACM0 unter Linux).
  • Navigieren Sie in der Thonny IDE zu Tools Manage packages.
  • Suchen Sie nach “DIYables-MicroPython-Joystick” und finden Sie die von DIYables erstellte Joystick-Bibliothek.
  • Klicken Sie auf DIYables-MicroPython-Joystick und dann auf die Schaltfläche Install, um die Joystick-Bibliothek zu installieren.
ESP32 MicroPython Joystick-Bibliothek
  • Kopieren Sie den bereitgestellten MicroPython-Code und fügen Sie ihn in den Editor von Thonny ein.
  • Speichern Sie den Code auf Ihrem ESP32:
    • Klicken Sie auf die Schaltfläche Save oder drücken Sie Ctrl+S.
    • Wählen Sie im Speicherdialog MicroPython device.
    • Nennen Sie die Datei main.py.
  • Klicken Sie auf die grüne Schaltfläche Run (oder drücken Sie F5), um das Skript auszuführen.
  • Bewegen Sie den Joystick nach links, rechts, oben oder unten.
  • Drücken Sie oben auf den Joystick.
  • Sehen Sie sich die Meldung in der Shell unten in Thonny an.
Shell x
>>> %Run -c $EDITOR_CONTENT
MPY: soft reboot MPY: soft reboot Joystick Position - X: 1808, Y: 1869, pressed count: 0 Joystick Position - X: 1415, Y: 1872, pressed count: 0 Joystick Position - X: 0, Y: 0, pressed count: 0 Joystick Position - X: 0, Y: 590, pressed count: 0 Joystick Position - X: 0, Y: 786, pressed count: 0 Joystick Position - X: 0, Y: 1088, pressed count: 0 Joystick Position - X: 0, Y: 1872, pressed count: 0 Joystick Position - X: 0, Y: 2320, pressed count: 0 Joystick Position - X: 0, Y: 4095, pressed count: 0 Joystick Position - X: 0, Y: 4095, pressed count: 0 Joystick Position - X: 834, Y: 4095, pressed count: 0 Joystick Position - X: 1802, Y: 4095, pressed count: 0 Joystick Position - X: 2924, Y: 4095, pressed count: 0 Joystick Position - X: 4095, Y: 4095, pressed count: 0 Joystick Position - X: 4095, Y: 0, pressed count: 0 Joystick Position - X: 4095, Y: 0, pressed count: 0 Joystick Position - X: 2672, Y: 0, pressed count: 0 Joystick Position - X: 1152, Y: 0, pressed count: 0 Joystick Position - X: 0, Y: 0, pressed count: 0 Joystick Position - X: 0, Y: 1872, pressed count: 0 Joystick Position - X: 0, Y: 4095, pressed count: 0 Joystick Position - X: 0, Y: 4095, pressed count: 0 Joystick Position - X: 4095, Y: 1879, pressed count: 0 Joystick Position - X: 1800, Y: 1883, pressed count: 0 Joystick Position - X: 1805, Y: 1873, pressed count: 0 Joystick Position - X: 4095, Y: 4095, pressed count: 0 Joystick Position - X: 1803, Y: 1870, pressed count: 0 Joystick Position - X: 1797, Y: 1872, pressed count: 0 Button Pressed Joystick Position - X: 1801, Y: 1873, pressed count: 0 Button Pressed Joystick Position - X: 1803, Y: 4095, pressed count: 0 Button Released Joystick Position - X: 1801, Y: 4095, pressed count: 1 Joystick Position - X: 1797, Y: 4095, pressed count: 1 Joystick Position - X: 1805, Y: 4095, pressed count: 1 Joystick Position - X: 1805, Y: 1869, pressed count: 1 Joystick Position - X: 1802, Y: 1877, pressed count: 1 Joystick Position - X: 1802, Y: 1871, pressed count: 1 Button Pressed Joystick Position - X: 1804, Y: 1872, pressed count: 1 Joystick Position - X: 1799, Y: 1861, pressed count: 1 Joystick Position - X: 1805, Y: 1870, pressed count: 1 Joystick Position - X: 1806, Y: 1877, pressed count: 1 Button Released Joystick Position - X: 1805, Y: 1866, pressed count: 2 Joystick Position - X: 1808, Y: 1859, pressed count: 2 Button Pressed Joystick Position - X: 1799, Y: 1874, pressed count: 2 Joystick Position - X: 1808, Y: 1876, pressed count: 2 Joystick Position - X: 1803, Y: 1874, pressed count: 2 Joystick Position - X: 4095, Y: 4095, pressed count: 2 Button Released Joystick Position - X: 4095, Y: 4095, pressed count: 3 Joystick Position - X: 4095, Y: 4095, pressed count: 3
MicroPython (ESP32) • CP2102 USB To UART Bridge Controller @ COM12 ≡

Beobachten Sie bei der Verwendung des Joysticks die Meldung in der Shell unten in Thonny. Ist der X-Wert 0, bedeutet das eine Position links; andernfalls rechts. Ist der Y-Wert 0, steht das für eine Position oben; andernfalls unten.

Beachten Sie, dass der theoretische Bereich für die X/Y-Werte zwar von 0 bis 4095 reicht, die Werte in der Praxis diese Extreme aufgrund der mechanischen Eigenschaften des Joysticks aber möglicherweise nicht erreichen. Diese Abweichung ist normal und für die meisten Anwendungen akzeptabel.

※ Notiz:

Dieses Tutorial zeigt, wie Sie mit der Funktion adc.read() Werte von einem ADC (Analog-Digital-Wandler) auslesen, der mit einem Joystick verbunden ist. Der ADC des ESP32 eignet sich für Projekte, die keine hohe Präzision erfordern. Wenn Ihr Projekt jedoch genaue Messungen benötigt, beachten Sie Folgendes:

  • Der ESP32-ADC ist nicht perfekt genau und muss für präzise Ergebnisse eventuell kalibriert werden. Jedes ESP32-Board kann leicht abweichen, daher ist eine Kalibrierung für jedes einzelne Board erforderlich.
  • Die Kalibrierung kann besonders für Anfänger schwierig sein und liefert nicht immer genau die gewünschten Ergebnisse.

Für Projekte mit hohen Präzisionsanforderungen sollten Sie einen externen ADC (z. B. ADS1115) mit dem ESP32 verwenden oder einen Arduino wählen, der einen zuverlässigeren ADC besitzt. Wenn Sie den ESP32-ADC dennoch kalibrieren möchten, lesen Sie den ESP32 ADC Calibration Driver.

Analogwerte in die Befehle MOVE LEFT/RIGHT/UP/DOWN umwandeln

Der folgende MicroPython-Code wandelt Analogwerte in die Befehle MOVE_LEFT, MOVE_RIGHT, MOVE_UP, MOVE_DOWN um.

/* * Dieser ESP32 MicroPython Code wurde von newbiely.de entwickelt * Dieser ESP32 MicroPython 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/esp32-micropython/esp32-micropython-joystick */ from DIYables_MicroPython_Joystick import Joystick from machine import Pin, ADC import time # Constants for threshold values LEFT_THRESHOLD = 1000 RIGHT_THRESHOLD = 3000 UP_THRESHOLD = 1000 DOWN_THRESHOLD = 3000 # Command constants COMMAND_NO = 0x00 COMMAND_LEFT = 0x01 COMMAND_RIGHT = 0x02 COMMAND_UP = 0x04 COMMAND_DOWN = 0x08 VRX_PIN = 39 # The ESP32 pin GPIO39 (ADC3) connected to VRX pin of joystick VRY_PIN = 36 # The ESP32 pin GPIO36 (ADC0) connected to VRY pin of joystick SW_PIN = 17 # The ESP32 pin GPIO17 connected to SW pin of joystick adc_vrx = ADC(Pin(VRX_PIN)) adc_vry = ADC(Pin(VRY_PIN)) # Set the ADC width (resolution) to 12 bits adc_vrx.width(ADC.WIDTH_12BIT) adc_vry.width(ADC.WIDTH_12BIT) # Set the attenuation to 11 dB, allowing input range up to ~3.3V adc_vrx.atten(ADC.ATTN_11DB) adc_vry.atten(ADC.ATTN_11DB) joystick = Joystick(pin_x=VRX_PIN, pin_y=VRY_PIN, pin_button=SW_PIN) # Configure the debounce time if necessary (default is 50ms) joystick.set_debounce_time(100) # debounce time set to 100 milliseconds def check_commands(x_value, y_value): command = COMMAND_NO # Check for left/right commands if x_value < LEFT_THRESHOLD: command |= COMMAND_LEFT elif x_value > RIGHT_THRESHOLD: command |= COMMAND_RIGHT # Check for up/down commands if y_value < UP_THRESHOLD: command |= COMMAND_UP elif y_value > DOWN_THRESHOLD: command |= COMMAND_DOWN return command while True: x_value = joystick.read_x() y_value = joystick.read_y() command = check_commands(x_value, y_value) if command & COMMAND_LEFT: print("COMMAND LEFT") if command & COMMAND_RIGHT: print("COMMAND RIGHT") if command & COMMAND_UP: print("COMMAND UP") if command & COMMAND_DOWN: print("COMMAND DOWN") time.sleep(0.5) # Delay to reduce the output frequency

Schnelle Schritte

  • Kopieren Sie den obigen Code und fügen Sie ihn in den Editor der Thonny IDE ein.
  • Speichern Sie das Skript auf Ihrem ESP32-Board.
  • Klicken Sie auf die grüne Schaltfläche Run (oder drücken Sie F5), um das Skript auszuführen.
  • Bewegen Sie den Joystick nach links, rechts, oben, unten oder in eine beliebige Richtung.
  • Sehen Sie sich die Meldung in der Shell unten in Thonny an.
Shell x
>>> %Run -c $EDITOR_CONTENT
MPY: soft reboot MPY: soft reboot COMMAND UP COMMAND RIGHT COMMAND DOWN COMMAND DOWN COMMAND DOWN COMMAND RIGHT COMMAND DOWN COMMAND RIGHT COMMAND DOWN COMMAND LEFT COMMAND DOWN
MicroPython (ESP32) • CP2102 USB To UART Bridge Controller @ COM12 ≡

※ Notiz:

Es kann sein, dass kein Befehl, ein Befehl oder sogar zwei Befehle gleichzeitig ausgegeben werden, z. B. UP und LEFT zusammen.

Analogwerte in Winkel umwandeln, um zwei Servomotoren zu steuern

Details erfahren Sie im Tutorial ESP32 MicroPython Joystick steuert Servomotor.

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.

※ 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!