Joystick-Position auf 8x8 LED-Matrix anzeigen

Die 8x8 LED-Matrix am Breadbaord Prototype Shield aus dem letzten Projekt will ich gleich weiterverwenden, um darauf die Position eines Joysticks vorzustellen - dem heute neu vorgestellten Bauteil.
Joysticks kennt bestimmt jeder, der einmal ein Computerspiel gespielt hat oder an einem Arcade-Automaten stand. Dies sind diese Steuerknüplle, die man in die Richtung bewegt, in die man sich bewegen will, und damit ein klassisches Eingabegerät. Für den Arduino gibt es den Joystick als Modul KY-023.



Auf dem Modul sehen wir zuerst einen großen schwarzen Gummiknubbel, der alles überdeckt. Diesen Knubbel können wir frei in alle Richtungen bewegen und wenn der Joystick in der Mitte positioniert ist, diesen sogar hinunterdrück, was mit einem kleinen Klick quittiert sind.

Auf der linken Seite befinden sich 5 Anschlussleitungen (von oben nach unten):


Wenn man den Gummiknubbel abnimmt, kann man an zwei Seiten jeweils ein Potentiometer erkennen, das durch die Bewegung des weißen Hebels in der Mitte manipuliert werden. Durch Federn wird der Joystick wieder in die Mitte gezogen. Dies ist die Ruheposition, bei dem beide Potis in Mittelstellung ruhen. Wenn wir hier die analogen Werte am Arduino auslesen, bekommen wir einen Wert von je ca. 512

Bewegen wir jetzt den Joystick in eine Richtung, also in X oder Y-Richtung, ändert sich der analoge Wert, der an den X oder Y-Leitung anliegt entsprechend im Bereich von 0 bis 1023. Und wird der Knopf gedrückt, dann wird die entsprechende digitale Leitung auf HIGH gezogen.

So lässt sich theoretisch durch die Positionierung des Joysticks jeder Punkt auf einer 1024x1024 breiten Matrix ansteuern und halten. In der Praxis macht einem der fummelige Gummiknubbel und die Rückstellkräfte einen Strich durch die Rechnung.

Aber auf jeden Fall ist die Genauigkeit ausreichend, um eine bestimmte Position in einer 8x8 Matrix einzunehmen, was unser Programm dann auch gleich auf einem entsprechenden LED-Display anzeigen soll.

Da eine 8x8-Matrix keinen Mittelpunkt hat, habe ich mich im Programm entschieden, die Position mit einem 2x2 großem, erleuchteten Feld anzuzeigen. So ist ein Mittelpunkt gegeben und gleichzeitig ist die Position besser ablesbar. Das Niederrücken des Joysticks wird durch Blinken angezeigt.

Im folgenden Video zeige ich kurz, wie das Programm funktioniert und was es anzeigt und gehe auf die Funktionsweise der Potis ein:



Und hier der Quellcode, falls ihr den Aufbau selbst nachbauen wollt:

Source-Code


//////////////////////////////////////////////////////// // (C) 2019 by Oliver Kuhlemann // // Bei Verwendung freue ich mich über Namensnennung, // // Quellenangabe und Verlinkung // // Quelle: http://cool-web.de/arduino/ // //////////////////////////////////////////////////////// #include "LedControl.h" // Lib für 8fach-7Segment-Anzeige mit MAX7219 #define PinX A2 #define PinY A3 #define PinS 8 LedControl lc=LedControl(7,5,6,1); // Anzeige initialisieren // 7 = DIN // 5 = CLK // 6 = CS / LOAD // 1 = 1 MAX7291 void setup() { lc.shutdown(0,false); // MAX7219 aufwecken (schläft zu Beginn) lc.setIntensity(0,8); // Helligkeit setzen (0 bis 15) lc.clearDisplay(0); // Display leeren pinMode(PinS, INPUT_PULLUP); // Serial.begin(115200); } void loop() { float x,y; int p0=0; int pAlt=0; lc.clearDisplay(0); while (1) { x=floor(analogRead(PinX)/(1023./7)); y=floor(analogRead(PinY)/(1023./7)); if (x>6) x=6; if (y>6) y=6; pAlt=p0; p0=y*8+x; if (p0 != pAlt) { lc.clearDisplay(0); lc.setLed(0,y,x,true); lc.setLed(0,y,x+1,true); lc.setLed(0,y+1,x,true); lc.setLed(0,y+1,x+1,true); } if (digitalRead(PinS) == LOW) { // Joystick niedergedrückt for (int w=0; w<3; w++) { lc.shutdown(0,true); delay (500); lc.shutdown(0,false); delay (500); } } delay(10); } //end while 1 } //end loop()