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 x Arduino UNO Rev3 [A000066] - All-in-One Mikrocontroller-Board für Elektroniklernen und Prototyping
- 8 x ELEGOO Widerstände Sortiment Kit 525 Stück 1/4W Metallfilm 0 Ohm -1M Ohm
- 8 x ELEGOO Bunte LEDs 3mm 5mm Farbe Sortiert Klar Leuchtdioden Kit mit UV, RGB CC/CA für Arduino (350er Set)
- 1 x HELLOYEE Trimpot Potentiometer für Steckplatine mit Drehknopf, 10 K Ohm, für Arduino (10 Stück)
- 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:
Angebot
Angebot
Das Video mit Erklärung und der aufgebauten Schaltung
und der skizzierte Aufbau der Schaltung im Fritzing:
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)
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
Pingback: Das Schieberegister 74HC595 am Arduino | Makerblog.at
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?
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!
Ok vielen dank
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
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
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
Kann man die programmierung auch bei anderen modulen verwenden?
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????
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.
Auch gerade eine Woche dabei und es funktioniert einwandfrei. Danke schön
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
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);
}
}