Skip to content

Technik Blog

Programmieren | Arduino | ESP32 | MicroPython | Python | Raspberry Pi | Raspberry Pi Pico

Menu
  • Smarthome
  • Arduino
  • ESP32 & Co.
  • Raspberry Pi & Pico
  • Solo Mining
  • Über mich
  • Deutsch
  • English
Menu

LED Bargraphanzeigen & Joystick am MAKER Nano

Posted on 17. Juni 202210. März 2024 by Stefan Draeger

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
  • Aufbau 5fach LED Bargraphanzeige auf Lochrasterplatine mit Joystick
  • Pan Tilt Bausatz mit zwei Servomotoren
  • Platine für LED Balkenanzeige & analoger Joystick
  • Programmieren des Joystick & LED Bargraphanzeigen am Arduino Nano
    • Schritt 1 – mappen der analogen Werte auf die LED Balkenanzeigen
    • Schritt 2 – steuern der Servos über den analogen Joystick
    • Schritt 3 – erweitern der Schaltung um zwei Schieberegister
      • Pinout eines Schieberegister 74HC595N
      • Programmieren der Schieberegister

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.

Bausatz fertig montiert
Bausatz fertig montiert

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.

BauteilArduino Nano V3
5fach LED Balkenanzeige (Y-Achse)
1D2
2D3
3D4
4D5
5D6
5fach LED Balkenanzeige (X-Achse)
1D7
2D8
3D9
4D10
5D11
analoger Joystick
GNDGND
+5V5V
VRXA0
VRYA1
SW–
Servo 1 – „unten“
braunGND
orange5V
gelbD12
Servo 2 – „oben“
braunGND
orange5V
gelbD13
Schaltung - LED Balkenanzeige, Joystick & Servomotoren am Arduino Nano
Schaltung – LED Balkenanzeige, Joystick & Servomotoren am Arduino Nano

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);
}
analoger Joystick & 5fach LED Balkenanzeigen am Arduino Nano
Dieses Video auf YouTube ansehen.

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);
}
steuern eines Pan-Tilt Kits mit einem Joystick am Arduino Nano
Dieses Video auf YouTube ansehen.

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.

Pinbelegung des Schieberegisters 74HC595N
Pinbelegung des Schieberegisters 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);
}

Schreibe einen Kommentar Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Fragen oder Feedback?

Du hast eine Idee, brauchst Hilfe oder möchtest Feedback loswerden?
Support-Ticket erstellen

Newsletter abonnieren

Bleib auf dem Laufenden: Erhalte regelmäßig Updates zu neuen Projekten, Tutorials und Tipps rund um Arduino, ESP32 und mehr – direkt in dein Postfach.

Jetzt Newsletter abonnieren

Unterstütze meinen Blog

Wenn dir meine Inhalte gefallen, freue ich mich über deine Unterstützung auf Tipeee.
So hilfst du mit, den Blog am Leben zu halten und neue Beiträge zu ermöglichen.

draeger-it.blog auf Tipeee unterstützen

Vielen Dank für deinen Support!
– Stefan Draeger

Kategorien

Tools

  • Unix-Zeitstempel-Rechner
  • ASCII Tabelle
  • Spannung, Strom, Widerstand und Leistung berechnen
  • Widerstandsrechner
  • 8×8 LED Matrix Tool
  • 8×16 LED Matrix Modul von Keyestudio
  • 16×16 LED Matrix – Generator

Links

Blogverzeichnis Bloggerei.de TopBlogs.de das Original - Blogverzeichnis | Blog Top Liste Blogverzeichnis trusted-blogs.com

Stefan Draeger
Königsberger Str. 13
38364 Schöningen

Tel.: 01778501273
E-Mail: info@draeger-it.blog

Folge mir auf

  • Impressum
  • Datenschutzerklärung
  • Disclaimer
  • Cookie-Richtlinie (EU)
©2025 Technik Blog | Built using WordPress and Responsive Blogily theme by Superb
Cookie-Zustimmung verwalten
Wir verwenden Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wir tun dies, um das Surferlebnis zu verbessern und um personalisierte Werbung anzuzeigen. Wenn Sie diesen Technologien zustimmen, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn Sie Ihre Zustimmung nicht erteilen oder zurückziehen, können bestimmte Funktionen beeinträchtigt werden.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
Optionen verwalten Dienste verwalten Verwalten von {vendor_count}-Lieferanten Lese mehr über diese Zwecke
Einstellungen anzeigen
{title} {title} {title}