Arduino-Lauflicht mit LEDs (Larson-Scanner)

Funktionsweise

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.

Aufbau mit 5mm-LEDs

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)

Video: Live-Demonstration

Verwendete Bauteile

Aufbau

Schaltplan
Abb.: Schaltplan

Sketch

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

Erweiterter Larson-Scanner mit WS2812B-LEDs

Video: Demonstration

Um den typischen Nachglüh-Effekt des Lauflichts zu imitieren, werden für den folgenden Aufbau eine Reihe von WS2812B-Modulen verwendet.

Verwendete Bauteile

Aufbau

siehe: RGB-LED-Modul WS2812B (NeoPixel)

Sketch

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