LED Bargraphanzeigen & Joystick am MAKER Nano

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.

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:

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:

Aufbau 5fach LED Bargraphanzeige auf Lochrasterplatine mit Joystick

Bauen wir zunächst auf einer Lochrasterplatine eine kleine Schaltung mit

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 ansehen auf YouTube.

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 ansehen auf YouTube.

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);
}

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht.