Lichtsteuerung/Client: Unterschied zwischen den Versionen
(+EEPROM Memory Map) |
K (Abschnitt Firmware zu "Client" verschoben) |
||
Zeile 66: | Zeile 66: | ||
|0x0600||16||Modus der Eingänge | |0x0600||16||Modus der Eingänge | ||
|} | |} | ||
== Firmware == | |||
Die Firmware ist generisch gehalten, sodaß die selbe Firmware für Haupt- und Nebenraum eingesetzt werden kann. Die Konfigurationsdaten werden im EEPROM vorgehalten. | |||
Auf der Lichtsteuerung kommt deshalb [http://bitlash.net/ bitlash] zum Einsatz, welches rudimentäres Scripting ermöglicht. Folgende Funktionen stehen zur Verfügung: | |||
=== setDeviceName === | |||
<pre> | |||
setDeviceName("description"); | |||
</pre> | |||
Setzt den Namen der Lichtsteuerung. Maximal 32 Zeichen ASCII. Wird im EEPROM abgespeichert. Kann über RDM gesetzt und abgefragt werden (DEVICE_LABEL). Beispiel: | |||
<pre> | |||
setDeviceName("Lichtsteuerung Hauptraum"); | |||
</pre> | |||
=== getDeviceName === | |||
<pre> | |||
getDeviceName(); | |||
</pre> | |||
Liefert den Namen der Lichtsteuerung. Beispiel: | |||
<pre> | |||
print getDeviceName(); | |||
> Lichtsteuerung Hauptraum | |||
</pre> | |||
=== getDMXStartAddress === | |||
<pre> | |||
getDMXStartAddress(); | |||
</pre> | |||
Liefert die konfigurierte DMX Startaddresse zurück. Kann über RDM gesetzt und abgefragt werden (DMX_START_ADDRESS). Beispiel: | |||
<pre> | |||
print getDMXStartAddress(); | |||
> 32 | |||
</pre> | |||
=== setDMXStartAddress === | |||
<pre> | |||
setDMXStartAddress(number); | |||
</pre> | |||
Setzt die DMX-Startaddresse. Wird im EEPROM abgespeichert. Beispiel: | |||
<pre> | |||
setDMXStartAddress(32); | |||
</pre> | |||
=== getRDMUID === | |||
<pre> | |||
getRDMUID(); | |||
</pre> | |||
Liefert die RDM UID zurück. Beispiel: | |||
<pre> | |||
print getRDMUID(); | |||
> 1f13:abde1000 | |||
</pre> | |||
=== setOutputName === | |||
<pre> | |||
setOutputName(number, "Description"); | |||
</pre> | |||
Gibt dem Ausgang mit <code>number</code> eine Beschreibung, maximal 32 Zeichen, nur ASCII. Wird im EEPROM abgespeichert. Die Beschreibung kann über RDM abgefragt werden. Beispiel: | |||
<pre> | |||
setOutputName(1, "Lichtkreis 1 (Lager)"); | |||
</pre> | |||
=== getOutputName === | |||
<pre> | |||
getOutputName(number); | |||
</pre> | |||
Liefert den Namen eines Ausgangs zurück. Beispiel: | |||
<pre> | |||
print getOutputName(1); | |||
> Lichtkreis 1 (Lager) | |||
</pre> | |||
=== setOutputState === | |||
<pre> | |||
setOutputState(number, state); | |||
</pre> | |||
Setzt den Ausgang <code>number</code> auf den Zustand 0 (aus) oder 1 (an). Beispiel: | |||
<pre> | |||
setOutputState(10, 1); | |||
</pre> | |||
=== getOutputState === | |||
<pre> | |||
getOutputState(number); | |||
</pre> | |||
Gibt den Zustand des Ausgangs <code>number</code> zurück. | |||
Beispiel: | |||
<pre> | |||
print getOutputState(10); | |||
> 1 | |||
</pre> | |||
=== toggleOutputState === | |||
<pre> | |||
toggleOutputState(number); | |||
</pre> | |||
Toggelt den Zustand des Ausgangs <code>number</code>. | |||
Beispiel: | |||
<pre> | |||
toggleOutputState(1); | |||
print getOutputState(1); | |||
> 1 | |||
toggleOutputState(1); | |||
print getOutputState(1); | |||
> 0 | |||
</pre> | |||
=== setInputName === | |||
<pre> | |||
setInputName(number, "Description"); | |||
</pre> | |||
Gibt dem Eingang mit <code>number</code> eine Beschreibung, maximal 32 Zeichen, nur ASCII. Wird im EEPROM abgespeichert. Beispiel: | |||
<pre> | |||
setInputName(1, "Lichtschalter Tuer Lager"); | |||
</pre> | |||
=== getInputName === | |||
<pre> | |||
getInputName(number); | |||
</pre> | |||
Gibt den Namen des Eingangs zurück. Beispiel: | |||
<pre> | |||
print getInputName(1); | |||
> Lichtschalter Tuer Lager | |||
</pre> | |||
=== setInputMode === | |||
<pre> | |||
setInputMode(number, mode); | |||
</pre> | |||
Setzt den Modus des Eingangs. Wird im EEPROM abgespeichert. Folgende Modis sind definiert: | |||
<pre> | |||
MODE_TOGGLE: Wechselschalter | |||
MODE_MOMENTARY: Taster | |||
</pre> | |||
Beispiel: | |||
<pre> | |||
setInputMode(1, "MODE_MOMENTARY"); | |||
</pre> | |||
=== getInputMode === | |||
<pre> | |||
getInputMode(number); | |||
</pre> | |||
Liefert den Modus des Eingangs. | |||
Beispiel: | |||
<pre> | |||
print getInputMode(1); | |||
> MODE_MOMENTARY | |||
</pre> | |||
=== listOutputs === | |||
<pre> | |||
listOutputs(); | |||
</pre> | |||
Gibt alle Ausgänge inklusive der Namen auf dem Terminal zurück. Beispiel: | |||
<pre> | |||
listOutputs(); | |||
> #1: Lichtkreis 1 (Lager) | |||
> #2: Lichtkreis 2 (Lager) | |||
> #3: Lichtkreis 3 (Lager) | |||
> ... | |||
> #32: Nicht belegt | |||
</pre> | |||
=== listInputs === | |||
<pre> | |||
listInputs(); | |||
</pre> | |||
Gibt alle Ausgänge inklusive der Namen und des Modus auf dem Terminal zurück. Beispiel: | |||
<pre> | |||
listInputs(); | |||
> #1: Lichtschalter Tuer (Lager) [MODE_TOGGLE] | |||
> #2: Lichtschalter Tuer (Beamer) [MODE_TOGGLE] | |||
> #3: Lichtschalter Tuer (Tafel) [MODE_TOGGLE] | |||
> #4: Lichtschalter Tuer (Kueche) [MODE_TOGGLE] | |||
> ... | |||
> #16: Nicht belegt [MODE_TOGGLE] | |||
</pre> | |||
=== anyOutputOn === | |||
<pre> | |||
anyOutputOn (number[,number,...]); | |||
</pre> | |||
Gibt zurück, ob ein Eingang in der Range eingeschalten ist. Beispiel: | |||
<pre> | |||
anyOutputOn(1,2,3,4,5,6); | |||
> 0 | |||
</pre> | |||
=== onInput === | |||
<pre> | |||
function onInputN {} | |||
</pre> | |||
Wird aufgerufen, wenn sich der logische Zustand des Eingangs ändert. Bei einem Taster ist dies analog zu einem kurzen Tasterdruck. Der Zustand wird mit arg(1) abgerufen. N wird dabei durch den entsprechenden Eingang ersetzt. | |||
Beispiel: Prüft, ob einer der Lichtkreise der Tafel an ist. Wenn ja, schalte alle Lichtkreise der Tafel aus. Wenn nein, schalte alle Lichtkreise der Tafel an. | |||
<pre> | |||
function onInput1 { z=anyOutputOn(5,6,7,11,12,13); setOutputState(5, !z); setOutputState(6, !z); | |||
setOutputState(7, !z); setOutputState(11, !z); setOutputState(12, !z); setOutputState(13, !z);} | |||
</pre> | |||
= Tests des Prototypboards = | = Tests des Prototypboards = |
Version vom 5. Dezember 2013, 15:07 Uhr
Einführung
Der Lichtsteuerungsclient sorgt dafür, Schaltwünsche von Benutzern in Lichtzustände umzusetzen. Technisch: DMX-Input zu Relaisoutput.
Features
- DMX Ein- und Ausgang
- Batteriegestützte Realtime Clock
- 1024KB I²C EEPROM
- 32 Ausgänge
- 16 Eingänge
- RS232
Kaskadierung
Lichtsteuerungsclients können kaskadiert werden, da sie einen DMX-Ausgang besitzen. Haupt- und Nebenraum besitzen jeweils einen eigenen Lichtsteuerungsclient.
Relais schalten und Verkabeln
Am Relais liegt +24V an und wird nach GND durch den Relaistreiber durchgeschalten. Der maximale Strom pro Port beträgt 500mA.
Die Versorgungsspannung der Relais sollte von den Klemmen X1 und X2 abgegriffen werden, da diese jeweils mit einer 200mA Polyfuse gesichert sind. Somit ist gewährleistet, daß der Relaistreiber nicht beschädigt wird.
Reichen 500mA nicht aus, so darf man laut ULN2803-Datenblatt mehrere Ausgänge parallel schalten, dies wurde aber bisher nicht getestet.
Die Ausgänge besitzen keine Freilaufdioden. Der Relaistreiber besitzt Dioden, allerdings sollte man Relais verwenden, die eine Freilaufdiode eingebaut haben.
Die Kraft der zwei Prozessoren
Jeder Lichtsteuerungsclient kann alle empfangenen DMX-Daten auch wieder weitergeben. Da DMX darauf basiert, daß die Schaltzustände dauerhaft wiederholt werden, gibt es hierzu einen eigenen Atmega8.
Schaltzustände
Schaltzustände können über DMX mittels RDM erfragt werden. Inwiefern das Probleme mit existierendem DMX-Equipment gibt, ist bisher unklar; laut Wikipedia soll dies aber keine Probleme verursachen.
EEPROM Memory Map (Atmega64, 2K)
Adresse | Länge (Bytes) | Inhalt |
---|---|---|
0x0000 | 1 | Signatur 1 von DMXSerial2 |
0x0001 | 1 | Signatur 2 von DMXSerial2 |
0x0002 | 2 | DMX-Startaddresse |
0x0004 | 32 | Gerätebezeichnung |
0x0024 | 6 | Geräte-UID |
0x002A | 2006 | Reserviert für bitlash-Funktionen |
EEPROM Memory Map (I2C, 1MB)
Adresse | Länge (Bytes) | Inhalt |
---|---|---|
0x0000 | 1024 | Namen der Ausgänge (32x32 Zeichen) |
0x0400 | 512 | Namen der Eingänge (16x32 Zeichen) |
0x0600 | 16 | Modus der Eingänge |
Firmware
Die Firmware ist generisch gehalten, sodaß die selbe Firmware für Haupt- und Nebenraum eingesetzt werden kann. Die Konfigurationsdaten werden im EEPROM vorgehalten.
Auf der Lichtsteuerung kommt deshalb bitlash zum Einsatz, welches rudimentäres Scripting ermöglicht. Folgende Funktionen stehen zur Verfügung:
setDeviceName
setDeviceName("description");
Setzt den Namen der Lichtsteuerung. Maximal 32 Zeichen ASCII. Wird im EEPROM abgespeichert. Kann über RDM gesetzt und abgefragt werden (DEVICE_LABEL). Beispiel:
setDeviceName("Lichtsteuerung Hauptraum");
getDeviceName
getDeviceName();
Liefert den Namen der Lichtsteuerung. Beispiel:
print getDeviceName(); > Lichtsteuerung Hauptraum
getDMXStartAddress
getDMXStartAddress();
Liefert die konfigurierte DMX Startaddresse zurück. Kann über RDM gesetzt und abgefragt werden (DMX_START_ADDRESS). Beispiel:
print getDMXStartAddress(); > 32
setDMXStartAddress
setDMXStartAddress(number);
Setzt die DMX-Startaddresse. Wird im EEPROM abgespeichert. Beispiel:
setDMXStartAddress(32);
getRDMUID
getRDMUID();
Liefert die RDM UID zurück. Beispiel:
print getRDMUID(); > 1f13:abde1000
setOutputName
setOutputName(number, "Description");
Gibt dem Ausgang mit number
eine Beschreibung, maximal 32 Zeichen, nur ASCII. Wird im EEPROM abgespeichert. Die Beschreibung kann über RDM abgefragt werden. Beispiel:
setOutputName(1, "Lichtkreis 1 (Lager)");
getOutputName
getOutputName(number);
Liefert den Namen eines Ausgangs zurück. Beispiel:
print getOutputName(1); > Lichtkreis 1 (Lager)
setOutputState
setOutputState(number, state);
Setzt den Ausgang number
auf den Zustand 0 (aus) oder 1 (an). Beispiel:
setOutputState(10, 1);
getOutputState
getOutputState(number);
Gibt den Zustand des Ausgangs number
zurück.
Beispiel:
print getOutputState(10); > 1
toggleOutputState
toggleOutputState(number);
Toggelt den Zustand des Ausgangs number
.
Beispiel:
toggleOutputState(1); print getOutputState(1); > 1 toggleOutputState(1); print getOutputState(1); > 0
setInputName
setInputName(number, "Description");
Gibt dem Eingang mit number
eine Beschreibung, maximal 32 Zeichen, nur ASCII. Wird im EEPROM abgespeichert. Beispiel:
setInputName(1, "Lichtschalter Tuer Lager");
getInputName
getInputName(number);
Gibt den Namen des Eingangs zurück. Beispiel:
print getInputName(1); > Lichtschalter Tuer Lager
setInputMode
setInputMode(number, mode);
Setzt den Modus des Eingangs. Wird im EEPROM abgespeichert. Folgende Modis sind definiert:
MODE_TOGGLE: Wechselschalter MODE_MOMENTARY: Taster
Beispiel:
setInputMode(1, "MODE_MOMENTARY");
getInputMode
getInputMode(number);
Liefert den Modus des Eingangs.
Beispiel:
print getInputMode(1); > MODE_MOMENTARY
listOutputs
listOutputs();
Gibt alle Ausgänge inklusive der Namen auf dem Terminal zurück. Beispiel:
listOutputs(); > #1: Lichtkreis 1 (Lager) > #2: Lichtkreis 2 (Lager) > #3: Lichtkreis 3 (Lager) > ... > #32: Nicht belegt
listInputs
listInputs();
Gibt alle Ausgänge inklusive der Namen und des Modus auf dem Terminal zurück. Beispiel:
listInputs(); > #1: Lichtschalter Tuer (Lager) [MODE_TOGGLE] > #2: Lichtschalter Tuer (Beamer) [MODE_TOGGLE] > #3: Lichtschalter Tuer (Tafel) [MODE_TOGGLE] > #4: Lichtschalter Tuer (Kueche) [MODE_TOGGLE] > ... > #16: Nicht belegt [MODE_TOGGLE]
anyOutputOn
anyOutputOn (number[,number,...]);
Gibt zurück, ob ein Eingang in der Range eingeschalten ist. Beispiel:
anyOutputOn(1,2,3,4,5,6); > 0
onInput
function onInputN {}
Wird aufgerufen, wenn sich der logische Zustand des Eingangs ändert. Bei einem Taster ist dies analog zu einem kurzen Tasterdruck. Der Zustand wird mit arg(1) abgerufen. N wird dabei durch den entsprechenden Eingang ersetzt.
Beispiel: Prüft, ob einer der Lichtkreise der Tafel an ist. Wenn ja, schalte alle Lichtkreise der Tafel aus. Wenn nein, schalte alle Lichtkreise der Tafel an.
function onInput1 { z=anyOutputOn(5,6,7,11,12,13); setOutputState(5, !z); setOutputState(6, !z); setOutputState(7, !z); setOutputState(11, !z); setOutputState(12, !z); setOutputState(13, !z);}
Tests des Prototypboards
Status | Titel | Beschreibung | Bearbeiter | Letzte Änderung |
---|---|---|---|---|
Relais-Ausgänge | ||||
DS1307 RTC | ||||
24FC1024 I²C EEPROM | ||||
Eingänge | ||||
DMX IN | ||||
DMX OUT |