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

Benötigt werden:

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

Das Video mit Erklärung und der aufgebauten Schaltung

und der skizzierte Aufbau der Schaltung im Fritzing:

arduino-lauflicht-800px

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);
  }
}Code-Sprache: Arduino (arduino)

14 thoughts on “Arduino LED Lauflicht – Knight Rider…

  • 19. August 2014 at 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

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

  • 4. Februar 2016 at 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?

    Reply
    • 4. Februar 2016 at 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!

      Reply
  • 2. März 2016 at 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

    Reply
  • 3. März 2016 at 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

    Reply
  • 26. April 2016 at 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

    Reply
  • 1. September 2016 at 18:40
    Permalink

    Kann man die programmierung auch bei anderen modulen verwenden?

    Reply
  • 22. Mai 2017 at 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????

    Reply
    • 13. Februar 2018 at 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.

      Reply
  • 13. Februar 2018 at 8:55
    Permalink

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

    Reply
  • 26. Mai 2019 at 8:22
    Permalink

    Guten Tag,
    Ich bin absoluter Anfänger was den Adruiono angeht. Ich suche Unterstützung für das Programmieren von Beleuchtung von Fahrzeugen für Lego Technik Baumaschinen, Truck’s usw. Ich habe einen UNO und 2 NANO’s mit Treibern. Sich brauche im genauen das Blinken,Licht, Arbeitslicht und Rundumleuchten sowie Lauflicht .
    Ich hoffe das mir einer dabei helfen kann das Umzusetzen.
    Danke im voraus.

    Gruß Ches

    Reply
  • 1. April 2021 at 0:25
    Permalink

    Hallo, ich bin neu in der Programmierwelt und lerne jetzt mit C zu arbeiten, ich versuche Arduino Code in C zu schreiben in Atmel Studio und hoffe, dass mir jemand helfen kann. Fasst habe ich es geschaft, die LEDs nach oben verschwinden im Array, da wo die Nullen stehen, nur schaffe ich es nicht, dass beim Rückweg die LEDs in den Null Werten verschwinden, was mache ich hier falsch, bitte um Hilfe, vielen Dank.

    if (button_state4())
    {
    unsigned char ledsA[] = {0,0,0,0,1,2,3,4,5,6,7,0,0,0}; // {0,1,2,3,4,5,6,7} or {LED1,LED2,LED3,LED4,LED5,LED6,LED7,LED8} array with 8 bits of memory == amount of leds
    unsigned char x;

    for(x = 0; x 8
    {

    PORTA = (ledsA[x], (3< 0; x–) // Led from 0 <- 8
    {
    PORTA = (ledsA[x], (3< leds are too -> no repeat
    {
    PORTA = 0b00000000; // no output
    }

    else // else when Button on -> start the program again
    {
    PORTA = (ledsA[x], (3<<x));
    _delay_ms(LOCK_INPUT_TIME);
    }

    }

    Reply

Schreibe einen Kommentar zu martin Antworten abbrechen

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.