Hallo Ingolf,
Du hast recht, das CAN Bus Protokoll enthält einigen Overhead, aber das bekommt man als Anwender nicht mit. Die Zusätzlichen Bits und Bytes erleichtern die Kommunikation. Ein Beispiel ist die CRC Prüfung. Darum muss man sich auf der Anwenderseite nicht kümmern. Die CRC wird automatisch vom CAN Controller eingefügt und überprüft. Im Fehlerfall wird die Nachricht wiederholt. Das Programm bekommt nur gültige Pakete.
Es sind auch nicht so viele Overhead Bits. Das Arbitrierungsfeld dient auf der einen Seite der Priorisierung von Messages und der Kollisionsverhinderung. Es ist aber auch wichtiger Bestandteil der Daten denn es beschreibt was die Daten enthalten. Das Arbitrierungsfeld ist die Message Id. Im KFZ Bereich wird z.B. die MsgID 7E0 nach dem OBD Standard dazu verwendet Anfragen an ein Steuergerät zu schicken. Das betroffene Gerät antwortet dann auf der MsgID 7E8 – 7EF Abhängig vom Steuergerät. Übertragen auf unser Problem enthält die MsgID den Befehl an das Lichtmodul. Die Zusätzlichen Bytes sind die Parameter des Befehls.
Aber darüber müssen wir hier nicht diskutieren. RS485 und CAN sind beides mögliche Busse mit denen die Module untereinander kommunizieren können. Dein Thread hat mich dazu gebracht etwas über die RS484 zu lesen und das hat mir gezeigt, dass dieser Bus ähnlich Leistungsfähig ist wie der CAN Bus. Beide Busse haben ihre vor und Nachteile.
Mustergenerator:
Bei meiner Lichtsteuerung werden alle Effekte vom Arduino
autark erzeugt. Dieser benötigt im Betrieb
keine Verbindung zum PC. Die Befehle zum ein und ausschalten eines Hauses kommen momentan von den Schaltern im Weichenstellpult, weil es den Kindern (und mir) Spaß macht, wenn man mit den vielen Schalter die Lichter steuern kann.
Bild: Weichenstellpult
Es ist aber auch denkbar das die Häuser ähnlich wie bei Dir über eine Zeit oder über die Helligkeit automatisch zu steuern. Im letzten Fall braucht man nur einen Arduino und einen Lichtsensor (LDR).
Die wichtigsten Effekte sind die Häuser mit ihren verschiedenen Zimmern welche zufällig an und aus gehen. Diesen Teil habe ich bereits implementiert.
Gerade beschäftige ich mit der Erzeugung anderer Effekte bei denen mehrere
LEDs zeitlich nacheinander gesteuert werden sollen (Mustergenerator). Ein schönes Beispiel ist eine
Ampel bei der die verschiedenen Ampelfarben in der richtigen Reihenfolge nacheinander geschaltet werden sollen.
Eine ähnliche Aufgabe ist die Ansteuerung von
Baustellenblitzlichtern. Ein ganz einfacher Effekt ist das
Leuchtfeuer eines Windrads: 1 Sek An, 0.5 Sek. Aus, 1 Sek. An, 1.5 Sek aus.
Alle diese Effekte sollen durch ein frei konfigurierbares Modul innerhalb des Arduino Programms möglich sein. Im Speicher des Mikrokontrollers wird dazu eine Tabelle abgelegt die den Effekt beschreibt. Diese Tabelle soll möglichst kompakt sein damit viele Effekte gleichzeitig möglich sind. Die Beschreibung einer Kreuzungsampel mit zwei Fahrzeug und zwei Fußgängerampeln belegen nur 56 Bytes im Speicher des Arduinos. Das Leuchtfeuer für das Windrad benötigt 20 Bytes. Auf diese Weise sind sehr viele Effekte für eine Belebte Anlage auf einfachste Weise konfigurierbar. Ich habe dazu eine kleine Excel Tabelle erstellt in der man die LEDs beschreibt:
Bild: Exceltabelle zur Konfiguration der Muster mit dem Beispiel einer Ampelkonfiguration
In der Tabelle trägt man einfach die gewünschten Zeiten und die aktiven LEDs ein. Das Ergebnis ist eine Konfigurationszeile mit der der Arduino gefüttert wird:
Code: Alles auswählen
#define Ampel(LED,StNr,InNr) PatternT4(LED,StNr,InNr,10,0,255,0,0,2 Sec,1 Sec,10 Sec,3 Sec,73,1,89,1,97,2,81,1,73,1,75,1,140,1,74,1)
Ja, das sieht fürchterlich kompliziert aus…
Ist es aber gar nicht. Damit wird der neue Befehl „Ampel“ definiert welcher die drei Parameter „LED“, „StNr“ und „InNr“ erwartet. Er steht später im Programm und kann in der Konfigurationsdatei so benutzt werden:
Code: Alles auswählen
Ampel(Ampel_Hauptstrasse, 0, Schalter_Ampel1)
Haus(Eckhaus, 3, 128, ROOM_BRIGHT, ROOM_CHIMNEY, ROOM_TV0, ROOM_COL1)
BlueLight1(FeuerwehrTranspA, 0, Schalter_FeuWeTr_A)
Das ist zwar längst nicht so komfortabel wie das was Du gezeigt hast, aber dafür sehr Flexibel. Wenn ich eine neue Funktionalität einbaue, dann muss ich diese nicht in der Konfigurationsoberfläche hinzufügen. Der Befehl kann einfach so in der Textdatei verwendet werden. Die Konfiguration verändert man ja sowieso nicht so häufig. Wichtig ist mir, dass es frei konfigurierbar ist und dass ich auch in einem Jahr noch verstehe wie es geändert wird.
Wenn man so eine Steuerung kommerziell verkaufen will, dann kommt man nicht um eine Ansprechend gestaltete Oberfläche herum. Aber für meine private Anwendung reicht eine Textdatei aus und hoffe das auch andere aus der Stummigemeinde damit zurechtkommen.
Aber irgendwie ist das Interesse der Kollegen nicht so groß an unseren Ideen zur Lichtsteuerung, Schade…
Vielleicht kann man das ja mit ein paar Bildern ändern.
Hier mein Versuchsaufbau:
Bild: Versuchsaufbau Arduino mit WS281x LEDs
In dem Bild sieht man links oben den Arduino Nano der die Lichteffekte erzeugt. Die Schaltung ist über ein 4 poliges Flachkabel mit einer Verteilerplatine verbunden. An diese ist als erstes das „Brennende Haus“ abgeschlossen in dem mehrere RGB LEDs zusammen mit einem Rauchgenerator für eine Feuersimulation sorgen. Über eine weitere Verteilerplatine ist ein Feuerwehrfahrzeug mit blitzendem Blaulicht, Blinklicht und Fahrtscheinwerfern verbunden. Des Weiteren führt von dem Verteiler ein Kabel zu einem WS2811 Verteiler (rechts unten). Dieser steuert verschiedene mit LED oder Glühbirne bestückte Straßenlaternen an. Am ersten Verteiler ist noch ein LED Strang für die Beleuchtung in einem Haus angesteckt.
Das schöne daran ist die einfache Verkabelung. Alle Objekte besitzen eine 4-poliges Kabel welches in einen Verteiler gesteckt wird. An den Verteiler können weitere Verteiler angeschlossen werden so dass man mit kurzen Leitungen die ganze Anlage verdrahten kann.
Bild: Überblick Arduino Häuser und Verteilung
Ich hoffe, dass ich damit zeigen konnte wie einfach die Beleuchtung einer Modellandschaft mit dem WS2811 und WS2812 sein kann.
Hardi