In diesem kurzen Beitrag möchte ich dir zeigen wie du dir eine kleine Platine mit LED Bargraphanzeigen zum Anzeigen der Position eines Joystick am MAKER Nano erstellen und programmieren kannst.

Die LED Bargraphanzeigen sowie den Joystick habe ich dir bereits in den nachfolgend aufgeführten Beiträgen vorgestellt.
- Arduino Lektion 19 – Teil 2: KY-037 mit LED Balkenanzeige
- LED Bargraph am Arduino Nano
- LED Bargraph am Arduino Nano per Schieberegister
- Arduino Lektion 38: Joystick
- Arduino Leonardo & Joystick als Mausersatz
- Arduino UNO – steuern eines DC Motors mit dem Joystick
Hier soll es nun darum gehen, wie du die eine kleine Platine lötest und dir darauf mit zwei 5fach LED Bargraphanzeigen sowie zwei Schieberegister die Position des Joysticks anzeigen lassen kannst.
Der Vorteil einer sollchen kleinen Platine ist, dass du so recht einfach zbsp. einen Pan-Tilt Bausatz oder eine 6DOF Claw etwas genauer steuern kannst.
Benötigte Ressourcen
Für den Nachbau des Projektes benötigst du:
- einen Arduino Nano V3* / MAKER Nano*
- ein Mini-USB* / Micro-USB* Datenkabel,
- einen Joystick*,
- zwei 5fach LED Bargraph Anzeigen*,
- zwei Schieberegister* Typ 74HC595N,
Du kannst die Schaltung auf einem Breadboard aufbauen oder auch auf einer Lochrasterplatine.
Für den Aufbau auf einem Breadboard benötigst du noch zusätzlich:
- ein 830 Pin Breadboard*,
- diverse Breadboardkabel*, männlich – männlich, 10 cm
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
Aufbau 5fach LED Bargraphanzeige auf Lochrasterplatine mit Joystick
Bauen wir zunächst auf einer Lochrasterplatine eine kleine Schaltung mit
- zwei 5fach LED Bargraphanzeige / Balkenanzeigen,
- 16fach Stiftleiste*,
- zehn 220 Ohm Widerstände*,
- eine 5fach Buchsenleiste*,
- eine 5fach Buchsenleiste*, mit langen Anschlüssen
Pan Tilt Bausatz mit zwei Servomotoren
Mit dieser Schaltung können wir zwei Servomotoren wie diese am Pan Tilt Bausatz* verbaut sind steuern und können über die LEDs der Bargraphanzeigen die Position ablesen.
Platine für LED Balkenanzeige & analoger Joystick
Die beiden 5fach LED Balkenanzeigen sollen jeweils die X bzw. Y Position des Joysticks anzeigen. Da dieses auf einem Breadboard nur schwer zu realisieren ist, habe ich mir auf einer Lochrasterplatine eine kleine Schaltung gelötet, wo ich dieses in annehmbarer Zeit umsetzen konnte.



Programmieren des Joystick & LED Bargraphanzeigen am Arduino Nano
Wie bereits erwähnt habe ich bereits vorgestellt wie man eine 10fach LED Bargraphanzeige mit zwei Schieberegister programmiert. Hier möchte ich nun darauf eingehen, wie du einen Joystick einbindest und die zwei Servomotoren am Pan Tilt Bausatz steuerst.
Die Pins D0 & D1 sind jeweils für RX & TX belegt und man müsste jeweils vor dem Upload eines neuen Sketches die Kabel trennen, daher fange ich mit dem Pin D2 an.
Bauteil | Arduino Nano V3 |
---|---|
5fach LED Balkenanzeige (Y-Achse) | |
1 | D2 |
2 | D3 |
3 | D4 |
4 | D5 |
5 | D6 |
5fach LED Balkenanzeige (X-Achse) | |
1 | D7 |
2 | D8 |
3 | D9 |
4 | D10 |
5 | D11 |
analoger Joystick | |
GND | GND |
+5V | 5V |
VRX | A0 |
VRY | A1 |
SW | – |
Servo 1 – „unten“ | |
braun | GND |
orange | 5V |
gelb | D12 |
Servo 2 – „oben“ | |
braun | GND |
orange | 5V |
gelb | D13 |
Schritt 1 – mappen der analogen Werte auf die LED Balkenanzeigen
Im ersten Schritt möchte ich dir jedoch zeigen, wie du die Position des Joysticks auf zwei 5fach LED Bargraphanzeigen umwandelst.
#define joystickX A0 #define joystickY A1 const int JOYSTICK_MIDDLE_X = 501; const int JOYSTICK_MIDDLE_Y = 519; const int JOYSTICK_MAX = 1023; const int JOYSTICK_MIN = 0; int ledsX[5] = {2, 3, 4, 5, 6}; int ledsY[5] = {7, 8, 9, 10, 11}; void setup() { //Pins der LEDs als Ausgang definieren for (int i = 0; i < 5; i++) { pinMode(ledsX[i], OUTPUT); pinMode(ledsY[i], OUTPUT); } } void loop() { //auslesen der X & Y Position des Joysticks int posX = analogRead(joystickX); int posY = analogRead(joystickY); //Variablen zum Zwischenspeichern der gemappten Werte int ledPosX = 0; int ledPosY = 0; //Mappen der analogen Werte (0..1023) des Joysticks auf die //maximale Anzahl der LEDs in der LED Balkenanzeige. if (posX > 512) { ledPosX = map(posX, JOYSTICK_MAX, JOYSTICK_MIDDLE_X, 0, 2); } else { ledPosX = map(posX, JOYSTICK_MIN, JOYSTICK_MIDDLE_X, 4, 2); } if (posY > 512) { ledPosY = map(posY, JOYSTICK_MAX, JOYSTICK_MIDDLE_Y, 0, 2); } else { ledPosY = map(posY, JOYSTICK_MIN, JOYSTICK_MIDDLE_Y, 4, 2); } //Alle LEDs deaktivieren for (int i = 0; i < 5; i++) { digitalWrite(ledsX[i], LOW); digitalWrite(ledsY[i], LOW); } //LEDs je nach Position des Joysticks aktivieren digitalWrite(ledsX[ledPosX], HIGH); digitalWrite(ledsY[ledPosY], HIGH); //eine kleine Pause von 25ms. delay(25); }
Schritt 2 – steuern der Servos über den analogen Joystick
Wollen wir nun die beiden Servos in die Schaltung und in das Programm integrieren. Wie du einen Servomotor am Arduino steuerst, habe ich dir im gleichnamigen Beitrag Arduino, Lektion 16: Servo ansteuern gezeigt.
Die beiden Servomotoren des Pan-Tilt Bausatzes sind jeweils am digitalen Pin D12 (der obere) und Pin 13 (der untere) angeschlossen.
#include <Servo.h> //Bibliothek zum ansteuern von Servo //Pins für die Achsen des Joysticks #define joystickX A0 #define joystickY A1 //Pins für die Servormotoren #define servoBottomPin 13 #define servoTopPin 12 //default Positionen des Joysticks const int JOYSTICK_MIDDLE_X = 501; const int JOYSTICK_MIDDLE_Y = 520; const int JOYSTICK_MAX = 1023; const int JOYSTICK_MIN = 0; //Maximaler / Minimaler Wert der Servomotoren const int SERVO_MIN = 0; const int SERVO_MAX = 180; int ledsX[5] = {2, 3, 4, 5, 6}; int ledsY[5] = {7, 8, 9, 10, 11}; //Instanziieren der Objekte für die Servomotoren Servo servoBottom; Servo servoTop; void setup() { //Pins der LEDs als Ausgang definieren for (int i = 0; i < 5; i++) { pinMode(ledsX[i], OUTPUT); pinMode(ledsY[i], OUTPUT); } pinMode(servoBottomPin, OUTPUT); pinMode(servoTopPin, OUTPUT); //verbinden der Pins der Servos und der zugehörigen Objekte servoBottom.attach(servoBottomPin); servoTop.attach(servoTopPin); } void loop() { //auslesen der X & Y Position des Joysticks int posX = analogRead(joystickX); int posY = analogRead(joystickY); //Variablen zum zwischenspeichern der gemappten Werte int ledPosX = 0; int ledPosY = 0; int servoBottomPos = 0; int servoTopPos = 0; //Mappen der analogen Werte (0..1023) des Joysticks auf die //maximale Anzahl der LEDs in der LED Balkenanzeige. if (posX > 512) { ledPosX = map(posX, JOYSTICK_MAX, JOYSTICK_MIDDLE_X, 0, 2); servoBottomPos = map(posX, JOYSTICK_MAX, JOYSTICK_MIDDLE_X, SERVO_MIN, 90); } else { ledPosX = map(posX, JOYSTICK_MIN, JOYSTICK_MIDDLE_X, 4, 2); servoBottomPos = map(posX, JOYSTICK_MIN, JOYSTICK_MIDDLE_X, SERVO_MAX, 90); } if (posY > 512) { ledPosY = map(posY, JOYSTICK_MAX, JOYSTICK_MIDDLE_Y, 0, 2); servoTopPos = map(posY, JOYSTICK_MAX, JOYSTICK_MIDDLE_X, SERVO_MIN, 90); } else { ledPosY = map(posY, JOYSTICK_MIN, JOYSTICK_MIDDLE_Y, 4, 2); servoTopPos = map(posY, JOYSTICK_MIN, JOYSTICK_MIDDLE_Y, SERVO_MAX, 2); } //Alle LEDs deaktivieren for (int i = 0; i < 5; i++) { digitalWrite(ledsX[i], LOW); digitalWrite(ledsY[i], LOW); } //LEDs je nach Position des Joysticks aktivieren digitalWrite(ledsX[ledPosX], HIGH); digitalWrite(ledsY[ledPosY], HIGH); //setzen der aktuellen Servoposition servoBottom.write(servoBottomPos); servoTop.write(servoTopPos); //eine kleine Pause von 25ms. delay(25); }
Schritt 3 – erweitern der Schaltung um zwei Schieberegister
Wollen wir zum Schluss nun die halbe Schaltung umwerfen und zwei Schieberegister vom Typ 74HC595N implementieren.

Der Vorteil beim Einsatz von Schieberegister ist das wir hier nur 3 digitale Pins für die Daten und 2 für die Spannungsversorgung benötigen um in diesem Fall 10 LEDs zu steuern.
Wenn du weitere 10 oder mehr LEDs steuern möchtest dann benötigst entsprechend mehr Schieberegister und entsprechende Breadboardkabel zum Anschluss.
Pinout eines Schieberegister 74HC595N
Hier nun nochmal zur Vollständigkeit die Pinbelegung eines Schieberegisters vom Typ 74HC595N.
Programmieren der Schieberegister
Um nun die LEDs zu steuern müssen wir die jeweiligen Pins des Schieberegisters auf HIGH bzw. LOW setzen.
Wie man ein Schieberegister programmiert habe ich dir bereits im Beitrag Arduino Lektion #100: Schieberegister 74HC595N N2B5 ausführlich gezeigt. In diesem Abschnitt soll es nun darum gehen wie du die Joystickpositionen auf den zwei 5fach LED Balkenanzeigen anzeigst.
#include <Servo.h> //Bibliothek zum ansteuern von Servo #define joystickX A0 #define joystickY A1 int shiftPin = 8; //SHCP int storePin = 9; //STCP int dataPin = 10; //DS //globale Variable //dient als Index für die aktive LED //im Lauflicht int activeIndex = -1; //Anzahl der LEDs im Bargraph const int MAX_LEDS = 10; //Wert für die Pause zwischen den Wechsel der LEDs const int PAUSE = 125; int muster[MAX_LEDS] = {}; //Pins für die Servormotoren #define servoBottomPin 13 #define servoTopPin 12 //default Positionen des Joysticks const int JOYSTICK_MIDDLE_X = 501; const int JOYSTICK_MIDDLE_Y = 520; const int JOYSTICK_MAX = 1023; const int JOYSTICK_MIN = 0; //Maximaler / Minimaler Wert der Servomotoren const int SERVO_MIN = 0; const int SERVO_MAX = 180; //Instanziieren der Objekte für die Servomotoren Servo servoBottom; Servo servoTop; void setup() { //setzen der Pins als Ausgang pinMode(storePin, OUTPUT); pinMode(shiftPin, OUTPUT); pinMode(dataPin, OUTPUT); //setzen des Pins am digitalen Pin D8 //auf LOW quasi Status "AUS" digitalWrite(storePin, LOW); pinMode(servoBottomPin, OUTPUT); pinMode(servoTopPin, OUTPUT); //verbinden der Pins der Servos und der zugehörigen Objekte servoBottom.attach(servoBottomPin); servoTop.attach(servoTopPin); } void loop () { //auslesen der X & Y Position des Joysticks int posX = analogRead(joystickX); int posY = analogRead(joystickY); //Variablen zum zwischenspeichern der gemappten Werte int ledPosX = 0; int ledPosY = 0; int servoBottomPos = 0; int servoTopPos = 0; //Mappen der analogen Werte (0..1023) des Joysticks auf die //maximale Anzahl der LEDs in der LED Balkenanzeige. if (posX > 512) { ledPosX = map(posX, JOYSTICK_MAX, JOYSTICK_MIDDLE_X, 4, 2); servoBottomPos = map(posX, JOYSTICK_MAX, JOYSTICK_MIDDLE_X, SERVO_MIN, 90); } else { ledPosX = map(posX, JOYSTICK_MIN, JOYSTICK_MIDDLE_X, 0, 2); servoBottomPos = map(posX, JOYSTICK_MIN, JOYSTICK_MIDDLE_X, SERVO_MAX, 90); } if (posY > 512) { ledPosY = map(posY, JOYSTICK_MAX, JOYSTICK_MIDDLE_Y, 4, 2); servoTopPos = map(posY, JOYSTICK_MAX, JOYSTICK_MIDDLE_X, SERVO_MIN, 90); } else { ledPosY = map(posY, JOYSTICK_MIN, JOYSTICK_MIDDLE_Y, 0, 2); servoTopPos = map(posY, JOYSTICK_MIN, JOYSTICK_MIDDLE_Y, SERVO_MAX, 2); } //setzen der aktuellen Servoposition servoBottom.write(servoBottomPos); servoTop.write(servoTopPos); writeMuster(ledPosX + 5, ledPosY); delay(PAUSE); //eine kleine Pause von 150ms. } void writeMuster(int ledPosX, int ledPosY) { //Das "Ausgangsmuster" wo alle LEDs //deaktivert sind. for (int i = 0; i < MAX_LEDS; i++) { if (i == ledPosX) { muster[i] = 1; } else if (i == ledPosY) { muster[i] = 1; } else { muster[i] = 0; } } //Von 0 bis 8 mache... for (int i = 0; i < MAX_LEDS; i++) { digitalWrite(shiftPin, LOW); digitalWrite(dataPin, muster[i]); digitalWrite(shiftPin, HIGH); } //schreiben der Daten digitalWrite(storePin, HIGH); delay(20); //eine kleine Pause //zurücksetzen digitalWrite(storePin, LOW); }