🍪 Privacy & Transparency

We and our partners use cookies to Store and/or access information on a device. We and our partners use data for Personalised ads and content, ad and content measurement, audience insights and product development. An example of data being processed may be a unique identifier stored in a cookie. Some of our partners may process your data as a part of their legitimate business interest without asking for consent. To view the purposes they believe they have legitimate interest for, or to object to this data processing use the vendor list link below. The consent submitted will only be used for data processing originating from this website. If you would like to change your settings or withdraw consent at any time, the link to do so is in our privacy policy accessible from our home page..

Vendor List | Privacy Policy
Skip to content

Technik Blog

Programmieren | Arduino | ESP32 | MicroPython | Python | Raspberry PI

Menu
  • Projekte
    • LED’s
    • Servo & Schrittmotoren
    • Sound
    • LCD’s
    • Kommunikation
    • Sicherheit
    • Weekend Project
  • Arduino
    • Tutorials
    • ProMini
      • Anschließen & Programmieren
    • Nano
      • Arduino Nano – Übersicht
    • UNO
      • Übersicht
    • MEGA 2560
      • Übersicht
    • Leonardo
      • Übersicht
    • NodeMCU
      • NodeMCU – “Einer für (fast) Alles!”
    • Lilypad
      • Arduino: Lilypad “Jetzt Geht’s Rund!”
    • WEMOS
      • WEMOS D1 – Arduino UNO kompatibles Board mit ESP8266 Chip
      • WEMOS D1 Mini – Übersicht
      • Wemos D1 mini Shields
    • STM32x
      • STM32F103C8T6 – Übersicht
    • Maker UNO
      • Maker UNO – Überblick und Test
    • ATTiny85
      • Mini Arduino mit ATTiny85 Chip
      • ATtiny85 mit dem Arduino UNO beschreiben
  • Android
  • Über mich
  • DeutschDeutsch
  • EnglishEnglish
Menu

LED Bargraphanzeigen & Joystick am MAKER Nano

Veröffentlicht am 17. Juni 202229. April 2023 von 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

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

Kategorien

Tools

  • 8×8 LED Matrix Tool
  • 8×16 LED Matrix Modul von Keyestudio
  • 16×16 LED Matrix – Generator
  • Widerstandsrechner
  • Rechner für Strom & Widerstände
  • ASCII Tabelle

Meta

  • Videothek
  • Impressum
  • Datenschutzerklärung
  • Disclaimer
  • Kontakt
  • Cookie-Richtlinie (EU)

Links

Blogverzeichnis Bloggerei.de Blogverzeichnis TopBlogs.de das Original - Blogverzeichnis | Blog Top Liste Blogverzeichnis trusted-blogs.com
©2023 Technik Blog | Built using WordPress and Responsive Blogily theme by Superb
x
x