Ein Lauflicht mit 8 LEDs ist mit dem Arduino schnell gebaut und schon ein spannenderes Projekt, das auch einige Experimente erlaubt.

Benötigt werden:

– 1 Arduino z.B. Uno R3
– 8 Widerstände 200 Ohm
– 8 LEDs -Farbe egal
– 1 Potentiometer
– und ein Breadboard samt einigen Steckbrücken oder Kabel

Alle diese Bauelemente findest du in jedem Arduino Starter Kit von den verschiedenen Herstellern, z.B. in:

und die Schaltung im Fritzing:arduino-lauflicht-800pxDas Video mit Erklärung und der aufgebauten Schaltung

 

Dann einfach noch den folgenden Sketch auf den Arduino spielen und fertig.

Der Sourcecode für das LED Lauflicht Projekt:

// Das Array mit den belegten Pins. Die Nullen vorne und hinten sind ein Trick,
// damit sich das Lauflicht, dass sich über mehrere LEDs erstreckt, komplett
// aus dem Bild laufen kann. 
int pinArray[] = {0,0,0,6,7,8,9,10,11,12,13,0,0,0};
 
// Die Anzahl der Elemente im Array. Die Elemente sind dann über die
//Indizes [0] bis [13] zu erreichen.
int pinCount = 14;
 
// Der aktive Eintrag des Array, pinArray[2] ist das 3(!) Element. Das wird
// zum Start gesetzt, die beiden hinterherlaufenden Lichter kriegen dann die 
// Einträge [1] und [0], also sind zum Start alle // anzusprechenden Pins = 0
int activePin = 2;
 
// Die Laufrichtung, in der für den nächsten Schritt zum activePin addiert 
// wird. dx ist +1 (aufwärts im Array) oder -1 (abwärts im Array)
int dx = 1;
 
// Der vom Potentiometer gelieferte Wert
int poti = 0;
 
// Mindestverzögerung zwischen zwei Schritten des Lauflichts. 
// Mit z.B. mintime=20 kann man die maximale Geschwindigkeit begrenzen.
int mintime = 0;
 
// setup() wird einmal bei Programmstart ausgeführt
void setup() {
  // Serielle Übertragung starten
  Serial.begin(9600);
  // Durch das Array gehen, alle Pins auf OUTPUT setzen außer es kommt 0.
  for (int i=0; i< pinCount; i++) {
    if (pinArray[i] != 0) {
      pinMode(pinArray[i], OUTPUT);
    }
  }
}
 
// loop() wird während des Programmablaufs endlos immer wieder aufgerufen
void loop() {
 
  // Zuerst schalten wir alle Pins of Array auf LOW, als Hilfsfunktion
  // verwenden wir digitalWriteNot0(), damit die Array-Einträge mit 
  // Wert 0 ignoriert werden.
  for (int i=0; i<pinCount; i++) {
    digitalWriteNot0(pinArray[i], LOW);
  }
 
  // Sind wir am Ende des Arrays angekommen? Wenn ja, dann einen Schritt 
  // zurückgehen (zum vorletzten 0-Element) und mit dx = -1 die Laufrichtung#
  // ändern.
  if (activePin == (pinCount-1)) {
    activePin = (pinCount - 2);
    dx = -1;
  }
 
  // Sind wir am Anfang des Arrays angekommen? Wenn ja, dann einen Schritt 
  // weitergehen (zum 2. 0-Element) und mit dx = 1 die Laufrichtung aufwärts setzen.
  if (activePin == 0) {
    activePin = 1;
    dx = 1;
  }
 
  // Zum aktiven Pin die Laufrichtung hinzuzählen. An den Rändern des Array mit
  // den 3 Nullen sind wir damit mindestens 2 Elemente vom Rand entfernt, haben 
  // also Platz um 2 weitere LEDs leuchten zu lassen
  activePin += dx;
 
  // Potentiometer von Pin 0 einlesen (Wert zwischen 0 und 1023)
  poti = analogRead(0);
 
  // Wenn der Wert < 1023 ist, dann...
  if (poti < 1023) {
    // Die LED auf activePin einschalten
    digitalWriteNot0(pinArray[activePin], HIGH);
    // und die LED in entgegengesetzter Laufrichtung davor
    digitalWriteNot0(pinArray[activePin-dx], HIGH);
    // und eine weitere LED in entgegengesetzter Laufrichtung davor
    digitalWriteNot0(pinArray[activePin-2*dx], HIGH);
    // Das funktoniert, weil wir durch die 3 Nullen an den Rändern des Arrays genug
    // Platz haben, um im Array zu lesen, ohnen die Arraygrenzen zu sprengen. Wenn 
    // als Pin eine 0 drinsteht, wird dieses beim Schalten der LEDs einfach ignoriert.
  }
 
  // Debug-Ausgabe für den Seriellen Monitor. Einfach über "Tools" einschalten
  Serial.print(poti);
  Serial.print(" - ");
  Serial.println(activePin);
 
  // Den geviertelten Wert des Potentiometers verwenden wir für die Wartezeit 
  // zwischen den Schritten in Millisekunden mintime kann als Mindestwert gesetzt 
  // werden, damit wird die maximale Geschwindigkeit des Lauflichts begrenzt.
  delay(mintime+analogRead(0)/4);
 
}
 
// digitalWriteNot0() ist eine Hilfsfunktion, die nur dann digitalWrite() ausführt,
// wenn das übergebene Pin nicht 0 ist. Damit werden die Füllelemente des pinArray
// bei der Ausgabe einfach ignoriert.
void digitalWriteNot0(int pin, boolean state) {
  if (pin > 0) {
    digitalWrite(pin, state);
  }
}

12 thoughts on “Arduino LED Lauflicht – Knight Rider…

  • 19. August 2014 um 0:38
    Permalink

    Hallo AdiDax!
    Wie könnte man das Programm dahingehend verändern.dass die Laufrichtung der Dioden einmal nach links läuft und dann wenn ein Schalter umgelegt wird, nach rechts läuft –> als Fahrtrichtungsanzeiger am Fahrrad zu benutzen.
    Lediglich ein Microumschalter mit Neutralstellung soll dazu dienen die Fahrtrichtung einzuschalten.
    L.G.
    Peter

    Antworten
  • Pingback: Das Schieberegister 74HC595 am Arduino | Makerblog.at

  • 4. Februar 2016 um 16:30
    Permalink

    Ich fang gerade erst mit Arduino an und wollte mal fragen, ob man da noch was ändern oder einfügen muss bei dem sketch oder kann man das einfach so auf das angeschlossene board und es funktioniert?

    Antworten
    • 4. Februar 2016 um 16:35
      Permalink

      Hallo Dave, da solltest du nichts mehr ändern müssen. Wenn du die Schaltung wie gezeigt nachbaust und den Code in die Arduino Entwicklungsumgebung kopierst und von dort auf den Arduino rauflädst, dann sollte das direkt funktionieren. Viel Erfolg!

      Antworten
  • 2. März 2016 um 14:39
    Permalink

    Hallo … ist es wohl auch möglich damit Chiplights ( 12 V Leds ) anzusteuern ? Wollte ein realistisches Lauflicht(wie bei Knight Rider) bauen und nicht die kleinen Dioden benutzen.

    Grüße Andy

    Antworten
  • 3. März 2016 um 22:24
    Permalink

    Hallo, wie groß sollte das Potentiometer sein?
    So von 10 k bis 100 k denke ich. Darunter zieht
    ev. unnötig mehr Strom als notwendig.

    Die 5Volt-Leitung ist doch nur für das Potentiometer
    notwendig; da hätte ich eine Idee wie man diese
    einsparen könnte:

    Mit einzelnen 1N4148-Dioden könnte man von jedem
    (zweiten) Ausgang etwas „Saft“ abzweigen und dann
    über einen gemeinsamen 470 Ohm – 1 k Widerstand
    einen Elko mit 47 – 220 uF laden, welcher die Spannung für
    das Potentiometer zur Verfügung stellt.

    (Das ganze wirkt wie ein diskretes ODER-Gatter)

    Grüße
    Franz

    Antworten
  • 26. April 2016 um 19:21
    Permalink

    Hallo, so jetzt endlich nachgebaut und bestens zufrieden.

    Das mit der 5-Volt-Leitung habe ich so gelöst, dass ich
    einfach eine Leitung vom nächsten Pin zusätzlich lege
    (liegt ja schön daneben) und damit über einen zusätzlichen
    100 Ohm-Widerstand das Potentiometer (10 kOhm) versorge.
    Natürlich schon in der setup()-Funktion den Pin als Ausgang
    geschaltet und auf HIGH gelegt.

    pinMode(3, OUTPUT);
    digitalWrite(3, HIGH);

    Das Lauflicht kann sogar noch auf 10 LEDs erweitert werden.

    Wer sich das anschauen möchte:

    http://fraba.bplaced.net/ardknight.mp4

    Der (hoffentlich) Original-K.I.T.T. war im Februar 2016 im
    Automobilmuseum in Stockerau ausgestellt und das Lauflicht
    hatte 8 Lampen und 4 Lichtpunkte.

    Grüße
    Franz

    Antworten
  • 1. September 2016 um 18:40
    Permalink

    Kann man die programmierung auch bei anderen modulen verwenden?

    Antworten
  • 22. Mai 2017 um 16:55
    Permalink

    ich hab den Aufbau gemacht den Sketch ausgedruckt und abgeschrieben, da copy paste oft probleme bereitet….
    bei mir heisst es dann beim kompilieren…..
    digitalWriteNot0 was not declared in this scope

    was mach ich falsch????

    Antworten
    • 13. Februar 2018 um 9:03
      Permalink

      Thorsten:
      kann ich schlecht sagen, aber versuche noch mal copy/paste. Noch nie Probleme mit c/p gehabt. Sei sicher, dass Du Ctrl+A drückst, dann „Delete“ um alle Code aus dem Program zu löschen. Danach den Code von hier ganz und gar copieren, und es sollte keine Probleme geben. So ging es jedenfalls für mich. Viel Glück.

      Antworten
  • 13. Februar 2018 um 8:55
    Permalink

    Auch gerade eine Woche dabei und es funktioniert einwandfrei. Danke schön

    Antworten

Schreibe einen Kommentar

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

Time limit is exhausted. Please reload the CAPTCHA.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.