In diesem Beitrag möchte ich dir das Arduino Joystick Shield vorstellen und zeigen, wie dieses in der Arduino IDE programmiert wird. Du kannst mit diesem einfachen Shield einen Roboterarm oder auch ein kleines Fahrzeug über Bluetooth steuern.
Das Joystick Shield verfügt über zwei analoge Joysticks, eine separate Schnittstelle für ein Bluetoothmodul sowie eine Stiftleiste für freie digitale Pins vom Mikrocontroller. Der aktive Betrieb des Moduls wird dir über eine 5 mm LED angezeigt.
Inhaltsverzeichnis
- Bezug des Arduino Joystick Shield
- Aufbau des Joystick Shields
- Anschluss von Servomotoren an das Joystick Shield
- Programmieren in der Arduino IDE
- Steuern eines Servomotors mit dem Joystick Shield
- Fazit und Ausblick
Bezug des Arduino Joystick Shield
Das hier vorgestellte Shield bekommst du besonders günstig bei aliexpress.com. Auf ebay.de bekommst du andere Shields welche über einen Joystick und ein Tastenkreuz verfügen und ähnlich funktionieren.
Aufbau des Joystick Shields
Das Joystick Shield verfügt wie bereits erwähnt über:
- zwei analoge Joysticks,
- eine rote, 5 mm LED,
- eine separate Schnittstelle für Bluetoothmodule vom Typ HC-05 & HC-06, sowie
- eine Stiftleiste für Servomotoren
Das Shield lässt sich auf die bestehenden Buchsenleisten der Arduinos stecken (ausgenommen natürlich dem Nano V3 und den Minis). Beim Arduino Mega 2560 R3 musst du auf die Buchsenbeschriftungen achten, denn dieser hat deutlich mehr Pins zur Verfügung.
Pinout des Shields
Das Joystick Shield ist wie in der Grafik zu sehen aufgebaut.
Komponente | Pin am Arduino |
---|---|
LED | digitaler Pin D3 |
Joystick 1 (links) | |
X | analog A0 |
Y | analog A1 |
Taster | digitaler Pin D2 |
Joystick 2 (rechts) | |
X | analog A3 |
Y | analog A2 |
Taster | digitaler Pin D4 |
Auf meinem Shield ist der Taster vom linken Joystick nicht mit dem Shield verbunden.
Anschluss von Servomotoren an das Joystick Shield
Das Shield hat, wie du in der Grafik siehst, 6 paar Stiftenleisten für Servomotoren. An diese kannst du theoretisch den Servomotor direkt anschließen, denn diese sind korrekt dafür ausgelegt.
Für die kleinen Servomotoren ist dieses auch voll okay.
Jedoch haben die großen Servomotoren deutlich mehr Kraft und ziehen dadurch auch mehr Leistung, das kann dieses Shield nicht leisten und dein Mikrocontroller würde einen Schaden nehmen!
Für den großen Servomotor vom Typ MG996R benötigst du eine zusätzliche Stromversorgung mit min. 2A bei 5V. Also bevor du deinen Servomotor an dieses Shield anschließt, prüfe zunächst in den technischen Daten des Servomotors wie viel Last / Strom dieser zieht.
Programmieren in der Arduino IDE
Einen Mikrocontroller der Arduino-Familie kannst du am einfachsten in der Arduino IDE programmieren. Diese bringt die meisten Features gleich mit und wenn dir doch eins fehlt, kannst du dieses über die internen Board- /Bibliotheksverwalter nachinstallieren.
Bevor wir jedoch mit der Programmierung beginnen und das Shield auf den Mikrocontroller stecken, spielen wir ein leeres Programm auf den Mikrocontroller auf. Mit diesem leeren Programm stellen wir sicher, dass keine Pins auf HIGH gesetzt werden, welche ggf. das Modul beschädigen kann.
Auslesen der Werte der analogen Joysticks
Bevor wir etwas steuern können, müssen wir erst einmal die Joysticks auslesen und die Werte speichern. Das nachfolgende kleine Programm dient uns auch später als Grundgerüst.
//Koordinaten des linken Joysticks #define joystick1X_Pin A0 //X #define joystick1Y_Pin A1 //Y #define joystick1Button_Pin 4 //Taster //Koordinaten des rechten Joysticks #define joystick2X_Pin A3 //X #define joystick2Y_Pin A2 //Y #define joystick2Button_Pin 2 //Taster //rote, 5mm LED am digitalen Pin D3 //angeschlossen #define led 3 //Felder zum speichern der letzten Werte //linker Joystick int lastJ1X = -1; //X int lastJ1Y = -1; //Y //rechter Joystick int lastJ2X = -1; //X int lastJ2Y = -1; //Y void setup() { //begin der seriellen Kommunikation mit 9600 baud Serial.begin(9600); //Pins der Taster an den Joysticks //als Ausgang definieren, zusätzlich //werden diese Pins über den internen 10 kOhm //Widerstand umgeleitet. pinMode(joystick1Button_Pin, INPUT_PULLUP); pinMode(joystick2Button_Pin, INPUT_PULLUP); //Pin der LED als Ausgang definieren pinMode(led, OUTPUT); } //Funktion um die Werte eines Joysticks auszugeben. void printJoyStickValues(String joystick, int valueX, int valueY) { Serial.print("Joystick :" + joystick); //lesen der X-Position und umwandeln in ein String Serial.print(" X: " + String(valueX, DEC)); Serial.print(", "); //lesen der Y-Position und umwandeln in ein String Serial.println("Y: " + String(valueY, DEC)); } void loop() { //lesen der aktuellen Position des linken Joysticks int joyStick1X = analogRead(joystick1X_Pin); int joyStick1Y = analogRead(joystick1Y_Pin); //Wenn die gelesenen Werte sich von den zuvor gespeicherten //Werten unterscheiden, dann... if (joyStick1X != lastJ1X || joyStick1Y != lastJ1Y) { lastJ1X = joyStick1X; lastJ1Y = joyStick1Y; printJoyStickValues("links", joyStick1X, joyStick1Y); } //lesen der aktuellen Position des rechten Joysticks int joyStick2X = analogRead(joystick2X_Pin); int joyStick2Y = analogRead(joystick2Y_Pin); //Wenn die gelesenen Werte sich von den zuvor gespeicherten //Werten unterscheiden, dann... if (joyStick2X != lastJ2X || joyStick2Y != lastJ2Y) { lastJ2X = joyStick2X; lastJ2Y = joyStick2Y; printJoyStickValues("rechts", joyStick2X, joyStick2Y); } //Wenn der Taster am linken Joystick gedrückt wird, dann... if (digitalRead(joystick1Button_Pin) == LOW) { Serial.println("Taster Joystick links gedrückt!"); } //Wenn der Taster am rechten Joystick gedrückt wird, dann... if (digitalRead(joystick2Button_Pin) == LOW) { Serial.println("Taster Joystick rechts gedrückt!"); } //kleine Pause von 450 ms. //Diese wird lediglich benötigt um die Ausgaben im seriellen Monitor //der Arduino IDE zu lesen. Im Live betrieb sollte dieser entfernt werden! delay(450); }
Der Code bewirkt, dass die Daten auf der seriellen Schnittstelle ausgegeben werden, jedoch, nur wenn diese sich ändern.
Steuern eines Servomotors mit dem Joystick Shield
Über die bereits gezeigten Stiftleisten kannst du wie erwähnt kleine, einfache Servomotoren anschließen und mit recht wenig Code steuern.
Dabei musst du beachten, dass der Joystick sich in der Mittelposition befindet und somit einen ungefähren Wert von 511 liefert.
//Einbinden der Bibliothek //zum steuern eines Servomotors. #include <Servo.h> //Der Servomotor ist am //digitalen Pin D6 angeschlossen. #define servoPin 6 //Die X Koordinate des linken Joysticks //ist am analogen Pin A0 angeschlossen. #define joystickXPin A0 //initialisieren eines Servoobjektes Servo servo; void setup() { //verbinden des Pins vom Servo zum Objekt servo.attach(servoPin); } void loop() { //auslesen der aktuellen Position der X Koordinate //des Joysticks int joystickXPos = analogRead(joystickXPin); //anlegen einer Variable für den berechneten Wert //des Servos int servoValue = -1; //Der Joystick befindet sich in der Mittelposition, //das bedeutet das wir ca. 511 als analogen Wert empfangen. if (joystickXPos > 511) { //Den Wert der Variable joystickXPos mit dem Gültigkeitsbereich // 511 bis 1023 auf die Winkel 90 bis 0 mappen. servoValue = map(joystickXPos, 511, 1023, 90, 0); } else { //Den Wert der Variable joystickXPos mit dem Gültigkeitsbereich // 511 bis 0 auf die Winkel 90 bis 180 mappen. servoValue = map(joystickXPos, 511, 0, 90, 180); } //Zuweisen der neuen Position am Servoobjekt servo.write(servoValue); }
Damit du den Code nicht abtippen oder kopieren musst, kannst du dir diesen hier als ZIP-Datei herunterladen.
Im nachfolgenden kleinen Video siehst du, dass wenn der linke Joystick nach links bewegt wird, sich das Ruderhorn des Servos ebenso in diese Richtung bewegt und andersherum.
Wenn wir nun diesen Code etwas erweitern, dann können wir einen kleinen Pan-Tilt Bausatz steuern. Dieser Bausatz verfügt über zwei Servomotoren und eine kleine Adapterplatte, wo wir eine Kamera montieren können.
Hier im Bild zusehen der Pan-Tilt Bausatz mit der M5Stack Kamera welche ich dir bereits im Beitrag Kleine Kamera, große Leistung: Vorstellung der ESP32 S3 CAM von M5Stack vorgestellt habe.
Dieser Bausatz hat wie erwähnt zwei Servomotoren, welche wir ebenso an das Joystick Shield anschließen können und mit den beiden Joysticks lässt dieses dich dann super einfach in fast alle Richtungen bewegen.
Fazit und Ausblick
Ich habe dir nun den Aufbau des Shields gezeigt sowie ein erstes kleines Programm, mit welchen die X/Y Position der Joysticks ausgelesen werden können. Im nächsten Beitrag werde ich dir dann zeigen, wie du mit diesem Shield einen 3DOF Roboterarm steuern kannst.
Ein weiterer Beitrag wird darum gehen, wie du mit diesem Shield ein kleines Fahrzeug mit dem Calliope Mini 3 steuern kannst.
Bleib also dran und erfahre, wie du mit diesem Shield coole Projekte umsetzen kannst.
1 thought on “Arduino Joystick Shield Basics: Programmierung leicht gemacht für Anfänger”