ESP32 - Joystick

In diesem Tutorial werden wir lernen, wie man einen Joystick mit dem ESP32 verwendet. Genauer gesagt werden wir Folgendes lernen:

Joystick-Pinbelegung

Erforderliche Hardware

1×ESP32 ESP-WROOM-32 Entwicklungsmodul
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×Breadboard
1×Verbindungskabel
1×(Optional) DC-Stromanschluss
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 (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 Joystick-Sensor

Du siehst den Joystick wahrscheinlich irgendwo, zum Beispiel bei einem Gamecontroller, einem Spielzeugcontroller oder sogar bei einer großen echten Maschine wie einem Baggersteuergerät.

Der Joystick besteht aus zwei Potentiometern, die zueinander rechtwinklig angeordnet sind, und einem Druckknopf. Daher liefert er die folgenden Ausgänge:

  • Ein analoger Wert (von 0 bis 4095), der der horizontalen Position entspricht (X-Koordinate genannt)
  • Ein analoger Wert (von 0 bis 4095), der der vertikalen Position entspricht (Y-Koordinate genannt)
  • Ein digitaler Wert eines Pushbuttons (HIGH oder LOW)

Die Kombination aus zwei analogen Werten kann zweidimensionale Koordinaten erzeugen, deren Werte in der Mitte liegen, wenn der Joystick in der Ruheposition ist. Die tatsächliche Richtung der Koordinaten lässt sich einfach ermitteln, wenn Sie einen Testcode ausführen (im nächsten Teil).

Manche Anwendungen verwenden alle drei Ausgänge, andere verwenden einige der drei Ausgänge.

Pinbelegung

Ein Joystick hat fünf Pins:

  • GND-Pin: muss mit GND (0 V) verbunden werden
  • VCC-Pin: muss mit VCC (5 V) verbunden werden
  • VRX-Pin: gibt einen analogen Wert aus, der der horizontalen Position entspricht (X-Koordinate genannt).
  • VRY-Pin: gibt einen analogen Wert aus, der der vertikalen Position entspricht (Y-Koordinate genannt).
  • SW-Pin: ist der Ausgang des Druckknopfs im Joystick. Er ist normalerweise offen. Wenn wir an diesem Pin einen Pull-up-Widerstand verwenden, wird der SW-Pin HIGH sein, wenn er nicht gedrückt ist, und LOW, wenn er gedrückt wird.
Joystick-Pinbelegung

Wie es funktioniert

  • Wenn Sie den Joystick nach links oder rechts drücken, ändert sich die Spannung am VRX-Pin. Der Spannungsbereich liegt von 0 bis 5 V (0 links und 5 V rechts). Der Spannungswert ist proportional zur Position des Joysticks; der Messwert am analogen Eingang des ESP32 liegt im Bereich von 0 bis 4095.
  • Wenn Sie den Joystick nach oben oder unten drücken, ändert sich die Spannung am VRY-Pin. Der Spannungsbereich liegt von 0 bis 5 V (0 oben und 5 V unten). Der Spannungswert ist proportional zur Position des Joysticks; der Messwert am analogen Eingang des ESP32 liegt im Bereich von 0 bis 4095.
  • Wenn Sie den Joystick in eine beliebige Richtung drücken, ändert sich die Spannung sowohl am VRX- als auch am VRY-Pin proportional zur Projektion der Position auf jeder Achse.
  • Wenn Sie den Joystick von oben nach unten drücken, wird der Druckknopf im Inneren des Joysticks geschlossen. Wenn wir am SW-Pin einen Pull-up-Widerstand verwenden, ändert sich der Ausgang am SW-Pin von 5 V zu 0 V ⇒ Der Messwert am digitalen Pin des ESP32 ändert sich von HIGH zu LOW.

Verdrahtungsdiagramm

  • Wie man ESP32 und Joystick mit dem Breadboard verbindet
ESP32 Joystick-Schaltplan

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

Wenn Sie nicht wissen, wie Sie ESP32 und andere Komponenten mit Strom versorgen, finden Sie Anleitungen im folgenden Tutorial: Wie man ESP32 mit Strom versorgt.

So verbindet man ESP32 und Joystick

Wie man für Joystick programmiert

Der Joystick besteht aus zwei Teilen: analog (X- und Y-Achse) und digital (Druckknopf).

  • Für die analogen Teile (X- und Y-Achse) muss lediglich der Wert vom analogen Eingangspin gelesen werden, und zwar mithilfe der [analogRead()]-Funktion.
int valueX = analogRead(A0); int valueY = analogRead(A1);
  • Für den digitalen Teil (Taster): Es handelt sich um einen Taster. Der einfachste und bequemste Weg ist die Verwendung der ezButton-Bibliothek. Diese Bibliothek unterstützt die Entprellung von Tastern und aktiviert außerdem einen internen Pull-Up-Widerstand. Weitere Informationen zum Taster finden Sie im ESP32 - Button-Tutorial. Der Code wird im nächsten Abschnitt dieses Tutorials vorgestellt.

Nachdem wir die Werte von analogen Pins gelesen haben, müssen wir sie möglicherweise in steuerbare Werte umwandeln. Der nächste Teil wird hierfür die Beispielcodes bereitstellen.

ESP32-Code

In diesem Abschnitt werden die folgenden ESP32-Beispielcodes bereitgestellt:

  • Beispielcode: liest analoge Werte vom Joystick
  • Beispielcode: liest analoge Werte und den Tastenstatus des Joysticks aus
  • Beispielcode: wandelt analoge Werte in MOVE_LEFT-, MOVE_RIGHT-, MOVE_UP- und MOVE_DOWN-Befehle um
  • Beispielcode: wandelt analoge Werte in Winkel um, um zwei Servomotoren zu steuern (z. B. in einer Pan-Tilt-Kamera)

Liest analoge Werte vom Joystick

/* * Dieser ESP32 Code wurde von newbiely.de entwickelt * Dieser ESP32 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/esp32-joystick */ #define VRX_PIN 39 // ESP32 pin GPIO39 (ADC3) connected to VRX pin #define VRY_PIN 36 // ESP32 pin GPIO36 (ADC0) connected to VRY pin int valueX = 0; // to store the X-axis value int valueY = 0; // to store the Y-axis value void setup() { Serial.begin(9600); // Set the ADC attenuation to 11 dB (up to ~3.3V input) analogSetAttenuation(ADC_11db); } void loop() { // read X and Y analog values valueX = analogRead(VRX_PIN); valueY = analogRead(VRY_PIN); // print data to Serial Monitor on Arduino IDE Serial.print("x = "); Serial.print(valueX); Serial.print(", y = "); Serial.println(valueY); delay(200); }

Schnelle Schritte

  • Falls dies das erste Mal ist, dass Sie ESP32 verwenden, siehe wie man die Umgebung für ESP32 in der Arduino IDE einrichtet.
  • Verbinden Sie die Verkabelung wie im obigen Bild.
  • Schließen Sie das ESP32-Board über ein Micro-USB-Kabel an Ihren PC an.
  • Öffnen Sie die Arduino IDE auf Ihrem PC.
  • Wählen Sie das richtige ESP32-Board (z. B. ESP32 Dev Module) und den COM-Port aus.
  • Kopieren Sie den obigen Code und öffnen Sie ihn in der Arduino IDE.
  • Klicken Sie auf die Schaltfläche Hochladen in der Arduino IDE, um den Code auf den ESP32 hochzuladen.
  • Drücken Sie den Joystick-Knopf maximal bis zum Anschlag und drehen Sie ihn anschließend in einer Kreisbewegung (im Uhrzeigersinn oder gegen den Uhrzeigersinn).
  • Sehen Sie das Ergebnis im Serial Monitor.
COM6
Send
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Während Sie den Joystick drehen, beobachten Sie weiterhin den Serial Monitor
    • Wenn der X-Wert 0 ist, markieren oder sich die aktuelle Position als links merken → die entgegengesetzte Richtung ist rechts
    • Wenn der Y-Wert 0 ist, markieren oder sich die aktuelle Position als oben merken → die entgegengesetzte Richtung ist unten

    Vielleicht ist Ihnen aufgefallen, dass der analoge Wert nicht proportional zur Bewegung des Joysticks ist. Dieses Problem liegt nicht am Joystick selbst, sondern vielmehr am ADC des ESP32. Am Ende dieses Tutorials wird erklärt, warum dies geschieht.

    Liest analoge Werte aus und liest den Knopfzustand eines Joysticks aus

    /* * Dieser ESP32 Code wurde von newbiely.de entwickelt * Dieser ESP32 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/esp32-joystick */ #include <ezButton.h> #define VRX_PIN 39 // ESP32 pin GPIO39 (ADC3) connected to VRX pin #define VRY_PIN 36 // ESP32 pin GPIO36 (ADC0) connected to VRY pin #define SW_PIN 17 // ESP32 pin GPIO17 connected to SW pin ezButton button(SW_PIN); int valueX = 0; // to store the X-axis value int valueY = 0; // to store the Y-axis value int bValue = 0; // To store value of the button void setup() { Serial.begin(9600); // Set the ADC attenuation to 11 dB (up to ~3.3V input) analogSetAttenuation(ADC_11db); button.setDebounceTime(50); // set debounce time to 50 milliseconds } void loop() { button.loop(); // MUST call the loop() function first // read X and Y analog values valueX = analogRead(VRX_PIN); valueY = analogRead(VRY_PIN); // Read the button value bValue = button.getState(); if (button.isPressed()) { Serial.println("The button is pressed"); // TODO do something here } if (button.isReleased()) { Serial.println("The button is released"); // TODO do something here } // print data to Serial Monitor on Arduino IDE Serial.print("x = "); Serial.print(valueX); Serial.print(", y = "); Serial.print(valueY); Serial.print(" : button = "); Serial.println(bValue); }

    Schnelle Schritte

    • Klicken Sie auf das Bibliotheken-Symbol in der linken Leiste der Arduino IDE.
    • Suchen Sie nach „ezButton“, und finden Sie dann die Button-Bibliothek von ArduinoGetStarted.com.
    • Klicken Sie auf die Installieren-Schaltfläche, um die ezButton-Bibliothek zu installieren.
    ESP32-Taster-Bibliothek
    • Kopiere den obigen Code und öffne ihn mit der Arduino IDE.
    • Klicke auf die Schaltfläche Upload in der Arduino IDE, um den Code auf den ESP32 hochzuladen.
    • Drücke den Joystick nach links/rechts/oben/unten.
    • Drücke den Joystick von oben.
    • Sieh das Ergebnis im Serial Monitor.
    COM6
    Send
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    Wandelt einen analogen Wert in Befehle zum Bewegen nach links, rechts, oben und unten um

    /* * Dieser ESP32 Code wurde von newbiely.de entwickelt * Dieser ESP32 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/esp32-joystick */ #define VRX_PIN 39 // ESP32 pin GPIO39 (ADC3) connected to VRX pin #define VRY_PIN 36 // ESP32 pin GPIO36 (ADC0) connected to VRY pin #define LEFT_THRESHOLD 1000 #define RIGHT_THRESHOLD 3000 #define UP_THRESHOLD 1000 #define DOWN_THRESHOLD 3000 #define COMMAND_NO 0x00 #define COMMAND_LEFT 0x01 #define COMMAND_RIGHT 0x02 #define COMMAND_UP 0x04 #define COMMAND_DOWN 0x08 int valueX = 0 ; // to store the X-axis value int valueY = 0 ; // to store the Y-axis value int command = COMMAND_NO; void setup() { Serial.begin(9600); // Set the ADC attenuation to 11 dB (up to ~3.3V input) analogSetAttenuation(ADC_11db); } void loop() { // read X and Y analog values valueX = analogRead(VRX_PIN); valueY = analogRead(VRY_PIN); // converts the analog value to commands // reset commands command = COMMAND_NO; // check left/right commands if (valueX < LEFT_THRESHOLD) command = command | COMMAND_LEFT; else if (valueX > RIGHT_THRESHOLD) command = command | COMMAND_RIGHT; // check up/down commands if (valueY < UP_THRESHOLD) command = command | COMMAND_UP; else if (valueY > DOWN_THRESHOLD) command = command | COMMAND_DOWN; // NOTE: AT A TIME, THERE MAY BE NO COMMAND, ONE COMMAND OR TWO COMMANDS // print command to serial and process command if (command & COMMAND_LEFT) { Serial.println("COMMAND LEFT"); // TODO: add your task here } if (command & COMMAND_RIGHT) { Serial.println("COMMAND RIGHT"); // TODO: add your task here } if (command & COMMAND_UP) { Serial.println("COMMAND UP"); // TODO: add your task here } if (command & COMMAND_DOWN) { Serial.println("COMMAND DOWN"); // TODO: add your task here } }

    Schnelle Schritte

    • Kopieren Sie den obigen Code und öffnen Sie ihn in der Arduino IDE.
    • Klicken Sie auf die Schaltfläche Hochladen in der Arduino IDE, um den Code auf den ESP32 hochzuladen.
    • Drücken Sie den Joystick nach links/rechts/oben/unten oder in eine beliebige Richtung.
    • Sehen Sie das Ergebnis im Serial Monitor.
    COM6
    Send
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    ※ Notiz:

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

    Wandelt analoge Werte in Winkel um, um zwei Servomotoren zu steuern

    Die Details werden im Tutorial ESP32 - Joystick controls Servo Motor vorgestellt.

    ※ Notiz:

    Dieses Tutorial verwendet die Funktion analogRead(), um Werte von einem ADC (Analog-Digital-Wandler) zu lesen, der an einen Joystick angeschlossen ist. Der ESP32-ADC ist gut für Projekte, die KEINE hohe Genauigkeit benötigen. Wer jedoch präzise Messungen benötigt, dem sei Folgendes zu beachten:

    • Der ESP32-ADC ist nicht perfekt genau und muss möglicherweise kalibriert werden, um korrekte Ergebnisse zu liefern. Jedes ESP32-Board kann etwas unterschiedlich sein, daher müssen Sie den ADC für jedes einzelne Board kalibrieren.
    • Die Kalibrierung kann schwierig sein, insbesondere für Anfänger, und liefert möglicherweise nicht immer die genauen Ergebnisse, die Sie wünschen.

    Für Projekte, die eine hohe Präzision benötigen, ziehen Sie den Einsatz eines externen ADC (z. B. ADS1115) mit dem ESP32 in Betracht oder die Verwendung eines Arduino-Boards, das über einen zuverlässigeren ADC verfügt. Wenn Sie den ESP32-ADC dennoch kalibrieren möchten, lesen Sie den ESP32 ADC Calibration Driver.

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!