Das folgende Lauflicht lässt in einer Kette von LEDs immer nacheinander eine LED aufleuchten, so dass bei entsprechender Geschwindigkeit die Illusion einer wandernden Leuchte bzw. ein Lauflicht entsteht. Oftmals wird diese Art von Lauflicht, in der die leuchtende LED immer hin- und herpendelt, auch als Larson-Scanner bezeichnet, benannt nach dem Filmproduzenten Glen A. Larson, der in den 80ern und 90ern mit Serien wie Kampfstern Galaktika und Knight Rider berühmt wurde. Die dort verwendeten Effekte ("Zylonen" und "K.I.T.T") haben daher dieser Art von Lauflichtern seinen Namen gegeben.
Der Aufbau der Schaltung ist recht simpel: Es werden 13 LEDs mit jeweiligem Vorwiderstand an den PINs 1-13 des Arduinos angeschlossen. (Die Menge an LEDs kann nach Belieben variiert werden)
#define LED_AMOUNT 13
#define CHASE_DELAY 15
int chaseDirection = 1;
byte activePin = 1, lastPin = 1;
void setup()
{
for(byte pin=1; pin<=LED_AMOUNT; pin++) {
pinMode(pin, OUTPUT);
}
}
void loop()
{
lastPin = activePin;
activePin += chaseDirection;
digitalWrite(activePin, HIGH);
digitalWrite(lastPin, LOW);
if (activePin >= LED_AMOUNT || activePin <= 1) {
chaseDirection *= -1;
}
delay(CHASE_DELAY);
}
Da in diesem Sketch davon ausgegangen wird, dass die 13 LEDs von Pin #1 bis #13 angeschlossen sind, habe ich hier noch einen etwas flexibleren Sketch geschrieben, der eine Liste mit Pins verwendet:
#define LED_AMOUNT 10
#define CHASE_DELAY 50
byte ledPin[LED_AMOUNT] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
int chaseDirection = 1;
byte activePos = 0, lastPos = 0;
void setup()
{
for (byte i = 0; i < LED_AMOUNT; i++) {
pinMode(ledPin[i], OUTPUT);
}
}
void loop()
{
lastPos = activePos;
activePos += chaseDirection;
digitalWrite(ledPin[activePos], HIGH);
digitalWrite(ledPin[lastPos], LOW);
if (activePos >= LED_AMOUNT-1 || activePos < 1) {
chaseDirection *= -1;
}
delay(CHASE_DELAY);
}
Um den typischen Nachglüh-Effekt des Lauflichts zu imitieren, werden für den folgenden Aufbau eine Reihe von WS2812B-Modulen verwendet.
siehe: RGB-LED-Modul WS2812B (NeoPixel)
Hier wird wie bei den anderen Versuchen mit dem WS2812B-Modul die Library
https://github.com/adafruit/Adafruit_NeoPixel
verwendet. Das "Nachglühen" wird dadurch erreicht, dass zunächst die aktuelle LED mit der maximalen
Helligkeit angesteuert wird (hier nur mit 100
). All anderen LEDs werden jeweils um einen bestimmten
Wert (hier: 10
) verringert, bis sie wieder auf 0
zurückfallen.
Je nach verwendeter Anzahl an LED-Modulen und gewünschter Helligkeit können diese Werte variert werden, damit
der Effekt gut zur Geltung kommt.
#include <Adafruit_NeoPixel.h>
#define PIN_LED 9
#define NUM_LEDS 8
#define SCAN_DELAY 90 // in ms
int currentLedIndex = 0;
int scanDirection = 1;
int ledValues[NUM_LEDS];
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUM_LEDS, PIN_LED, NEO_GRB + NEO_KHZ800);
void setup()
{
pixels.begin();
for (byte i = 0; i < NUM_LEDS; i++) {
ledValues[i] = 0;
}
}
void loop()
{
ledValues[currentLedIndex] = 100;
for (byte i = 0; i < NUM_LEDS; i++) {
if (ledValues[i] > 0) {
ledValues[i] -= 10;
ledValues[i] = max(0, ledValues[i]);
}
pixels.setPixelColor(i, pixels.Color(ledValues[i], 0, 0));
}
pixels.show();
delay(SCAN_DELAY);
currentLedIndex += scanDirection;
if (currentLedIndex >= NUM_LEDS - 1 || currentLedIndex <= 0) {
scanDirection *= -1;
}
}
zurück