Im Bereich des Modellbaus (z.B. Modell-Eisenbahnen) können viele Schaltungen realistische Effekte aus dem Städtebau mit dem Arduino und ein paar LEDs simuliert werden, um so eine lebendige Modell-Landschaft zu schaffen. Im diesem Beitrag werden einige Schaltungen und deren Programmierung mit anpassungsfähigen Arduino-Librarys gezeigt.
In den folgenden Beispielen wird jeweils immer ein Arduino Uno verwendet, jedoch kann auch recht leicht ein Arduino Nano, ATtiny85 oder ESP32 verwendet werden. Je nachdem müssen die Anschlüsse, Libraries bzw. die Sketche auf den entsprechenden Mikrocontroller angepasst werden.
Die hier zur Verfügung gestellten Libraries können auch beliebig kombiniert werden, sofern nicht gleiche Pin-Belegungen verwendet werden. Somit kann für mehrere Simulationen nur ein Mikrocontroller verwendet werden.
Für eine einfache Simulation einer PKW-Verkehrsampel genügen schon drei verschiedenfarbige LEDs
und ein wenig Programmierung für den Arduino, um die Simulation zu starten.
Eine etwas aufwendigere Simulation kann man in dem Beitrag Arduino-Ampelschaltung finden.
Um die Ampel-Simulation zum Laufen zu bekommen, wird die folgende Library heruntergeladen und dann in der Arduino-IDE direkt als .zip-Datei eingefügt. Dann kann das folgende Beispiel direkt ausprobiert werden.
#include <TrafficLights.h>
TrafficLights tl = TrafficLights(8, 9, 10);
void setup() {}
void loop()
{
tl.update();
}
Will man ein Haus mit einer oder zwei LEDs beleuchten, so ist die max. Stromstärke, die der Arduino verkraftet durch den Vorwiderstand nicht überschritten. Verwendet man allerdings etliche LEDs, die mehrere Häuser gleichzeitig beleuchten sollen, so empfiehlt sich der Einsatz von einem Transistor, um den Arduino nicht zu überlasten oder gar zu zerstören.
Der Sketch für die Häuserbeleuchtung ist recht einfach, denn es wird neben dem Pin für die LED nur ein Zeitinterval (in s) für die aktive Leuchtzeit und ebenfall für die Dunkelzeit benötigt. Zusätzlich gibt man noch an, ob der anfängliche Zustand an oder aus sein soll. (Will man die Häuserbeleuchtug abhängig vom Umgebungslicht machen, so ist die Programmierung für Strassenbeleuchtung gut geeignet.
#include <HouseLighting.h>
HouseLighting h = HouseLighting(/* ledPin */ 8, /* timeOn */ 5, /* timeOff */ 5, /* initialState */ 0);
void setup() {}
void loop()
{
h.update();
}
Die Simulation einer Straßenleuchtung sind eigentlich nur beliebig viele LEDs (meist: weiß), die allerdings nur dann erleuchten sollen, wenn das Umgebungslicht eine gewisse Intensität unterschreitet. Dies wird mit einem lichtabhängigen Widerstand (LDR) realisiert. Auch hier gilt beim Einsatz von mehreren LEDs wieder, dass man am besten wie bei der Häuserbeleuchtung mit einem Transistor arbeiten sollte. In diesem Beispiel werden vier weiße LEDs mit je einem 1kΩ-Vorwiderstand verwendet, was kein Problem für den Arduino darstellt.
#include <StreetLighting.h>
StreetLighting sl = StreetLighting(/* ledPin */ 9, /* ldrPin*/ A0, /* sensorOn */ 700, /* sensorOff */ 650);
void setup() {}
void loop()
{
sl.update();
}
Auf einer (Straßen-)Baustelle werden zur Umleitung von PKW oft Lauflichter verwendet. Auch sieht man hin und wieder das gleißende Licht eines arbeitenden Schweißers. Diese beiden Effekte werden hier mit LEDs nachempfunden.
Für jeden Effekt wird eine eigene Library zur Verfügung gestellt, so dass sie unabhängig voneinander genutzt werden können.
#include <ChaseLight.h>
#include <WeldingLight.h>
ChaseLight cl = ChaseLight(8, 9, 10, 11, 12, 13);
WeldingLight wl = WeldingLight(6);
void setup() {}
void loop()
{
cl.update();
wl.update();
}
Für die Simulation eines Leuchtturm können man eine LED in einem Turm wirklich kreisen lassen, jedoch wäre hierbei ein Motor involviert, der v.a. bei kleineren Modelllandschaften wertvollen Platz verbraucht und u.U. sogar zu hören ist. Eine andere Möglichkeit wäre ein Kreis aus x LED, welche dann in der Form eines Lauflichts nacheinander leuchten. Die sparsamste Möglichkeit wird hier gezeigt, denn sie benötigt nur eine einzige LED und hat jedoch den Nachteil, dass das Licht des simulierten Leuchtturms nur in eine Richtung strahlt. Daher sollte der Leuchtturm nicht im Zentrum der Anlage stehen.
#include <LightHouse.h>
LightHouse lh = LightHouse(6);
void setup() {}
void loop()
{
lh.update();
}
Diese Art von Kennleuchten sind schon im Beitrag Blaulicht-Simulationen in verschiedenen Variationen beschrieben worden, jedoch wird hier ein einfaches Wechsel-Blaulicht in einer Library für den Arduino verpackt, damit dies auch einfach parallel zu den anderen Simulationen gestartet werden kann.
#include <VehicleLight.h>
VehicleLight vl = VehicleLight(5, 6);
void setup() {}
void loop()
{
vl.update();
}
Feuersimulationen basieren meist auf flackernden LEDs, von denen im Beitrag Flackerndes Licht mit LEDs und Flackerndes Licht mit LEDs II. schon einige Varianten vorgestellt wurden. Um möglichst wenige Platz zu verbrauchen, wir hier eine Simulation mit zwei verschiedenfarbigen LEDs (gelb und rot) verwendet.
#include <Fire.h>
Fire f = Fire(6, 9);
void setup() {}
void loop()
{
f.update();
}
Für einen Bahnübergang mit Schranken werden auf beiden Seiten ein rotes Licht (je eine LED) und zwei Servo-Motoren für die Schranken verwendet. Als Auslöser für den Bahnübergang wird eine Lichtschranke mit Infrarot-LED und entsprechendem Sensor benutzt.
LED1
bildet mit P1
die Lichtschranke, die an einer geeigneten Stelle in der Landschaft
positioniert wird. Löst die Lichtschranke aus, so werden die beiden Servos so verstellt, dass die Schranken sich schließen
können, während LED2
und LED3
dies blinkend anzeigen. Die Servos sollten mit einer externen
Gleichstromquelle versorgt werden, denn der recht hohe Stromfluss kann den Arduino zerstören. Je nach Bauart der Schranken
kann auch nur ein einziger Servo verwendet werden.
In der Library Crossing werden im Constructor fünf Werte angegeben. Diese sind
irLedPin
(Anschluss für die IR-LED), irSensorPin
(Anschluss für die Fotodiode),
ledPin
(Anschluss für die roten Warnlichter), servoPin
(Steuerungsanschluss für
den/die Servo(s)) und openTime
(Zeit in Sekunden, wie lange die Schrank geschlossen ist und dann
wieder öffnet).
Damit der Servo für die Schranke(n) die richtigen Positionen einnimmt, muss die Werte
in setServoValues(min, max)
selbst ausprobieren, denn diese sind pro Servo-Fabrikate etwas
unterschiedlich.
#include <Crossing.h>
Crossing cr(7, A0, 3, 9, 5);
void setup()
{
cr.setServoValues(900, 2400);
}
void loop()
{
cr.update();
}
zurück