Lichtsteuerung/Client: Unterschied zwischen den Versionen

Aus RaumZeitLabor Wiki
Keine Bearbeitungszusammenfassung
KKeine Bearbeitungszusammenfassung
 
(19 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
= Einführung =
= Einführung =


Der Lichtsteuerungscontroller sorgt dafür, Schaltwünsche von Benutzern in Lichtzustände umzusetzen. Technisch: DMX-Input zu Relaisoutput.
Der Lichtsteuerungsclient sorgt dafür, Schaltwünsche von Benutzern in Lichtzustände umzusetzen. Technisch: DMX- oder Benutzerinput zu Relaisoutput.


= Features =
= Features =
[[Image:Lichtsteuerung board top.png|thumb|right|Controllerplatine Oberseite]]
[[Image:Lichtsteuerung board top.png|thumb|right|Clientplatine Oberseite]]
[[Image:Lichtsteuerung board bottom.png|thumb|right|Controllerplatine Unterseite]]
[[Image:Lichtsteuerung board bottom.png|thumb|right|Clientplatine Unterseite]]
* DMX Ein- und Ausgang
* DMX/RDM Ein- und Ausgang
* Batteriegestützte Realtime Clock
* Batteriegestützte Realtime Clock
* 1024KB I²C EEPROM
* 1024KB I²C EEPROM
Zeile 15: Zeile 15:
= Kaskadierung =
= Kaskadierung =


Lichtsteuerungscontroller können kaskadiert werden, da sie einen DMX-Ausgang besitzen. Haupt- und Nebenraum besitzen jeweils einen eigenen Lichtsteuerungscontroller.
Entgegen des ursprünglichen Plans besitzt der aktuelle Lichtsteuerungsclient nur noch einen Ein/Ausgang, der im Halbduplexmodus genutzt wird. Kaskadierung wird über RS485-Hubs gelöst.


= Relais schalten und Verkabeln =
= Relais schalten und Verkabeln =
Zeile 27: Zeile 27:
Die Ausgänge besitzen keine Freilaufdioden. Der Relaistreiber besitzt Dioden, allerdings sollte man Relais verwenden, die eine Freilaufdiode eingebaut haben.
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 =
= Schaltzustände =


Jeder Lichtsteuerungscontroller 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 können über DMX mittels [http://en.wikipedia.org/wiki/RDM_(lighting) 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) =
 
{| class="wikitable"
|-----
!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) =
 
{| class="wikitable"
|-----
!Adresse!!Länge (Bytes)!!Inhalt
|-
|0x00000||1024||Namen der Ausgänge (32x32 Zeichen)
|-
|0x00400||512||Namen der Eingänge (16x32 Zeichen)
|-
|0x00600||16||Modus der Eingänge
|-
|0x00610||32||Private-Flag für die Ausgänge
|-
|0xF000||4096||Backup des Arduino-EEPROMS
 
|}
 
= 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 und können zum Beispiel über die serielle Schnittstelle oder vom PI aus ausgeführt werden:
 
== 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 ==
 
Obsolet; DMX-Startaddresse wird nur über RDM gesetzt.
 
== getRDMUID ==
 
<pre>
getRDMUID();
</pre>
 
Liefert die RDM UID zurück. Beispiel:
 
<pre>
print getRDMUID();
&gt; 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>
 
 
== setPrivateFlag ==
 
<pre>
setPrivateFlag(port,private)
</pre>
 
Setzt das "private" flag für einen Ausgang. "private" bedeutet, daß der Port nicht für den Endbenutzer sichtbar sein soll - dies ist für Ports nützlich, die eine Sonderfunktion haben, z.b. ein Warnsignal, welches vor einem Shutdown des Nebenraumes warnt.
 
Beispiel:
 
<pre>
setPrivateFlag(1,1);
</pre>
 
Dies setzt den Ausgang 1 auf "private".
== 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>
 
== onInputOn, onInputOff==
 
<pre>
function onInputNOff {}
function onInputNOn {}
function onInputN {}
</pre>
 
onInputN wird aufgerufen, wenn sich der logische Zustand des Eingangs ändert. Bei einem Taster ist dies analog zu einem kurzen Tasterdruck. N wird dabei durch den entsprechenden Eingang ersetzt.
 
onInputNOff wird aufgerufen, wenn sich der logische Zustand des Eingangs auf 0 ändert.
onInputNOn wird aufgerufen, wenn sich der logische Zustand des Eingangs auf 1 ändert.
 
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>
 
Kurzform:
 
<pre>
function onInput1 { z=aoo(5,6,7,11,12,13); sos(5, !z); sos(6, !z);sos(7, !z); sos(11, !z); sos(12, !z); sos(13, !z);}
</pre>


= Tests des Prototypboards =
= Tests des Prototypboards =
Zeile 42: Zeile 354:
{{TaskListItem
{{TaskListItem
| title = DS1307 RTC
| title = DS1307 RTC
| description =
| status = done
| last_changed =
}}
{{TaskListItem
| title = 24FC1024 I²C EEPROM
| description =
| status = done
| last_changed =
}}
{{TaskListItem
| title = Eingänge
| description =
| status = done
| last_changed =
}}
{{TaskListItem
| title = DMX IN
| description =
| status = done
| last_changed =
}}
{{TaskListItem
| title = DMX OUT
| description =  
| description =  
| status = done
| status = done
Zeile 47: Zeile 383:
}}
}}
{{TaskListEnd}}
{{TaskListEnd}}
[[Kategorie:Infrastruktur]]

Aktuelle Version vom 12. Dezember 2023, 22:11 Uhr

Einführung

Der Lichtsteuerungsclient sorgt dafür, Schaltwünsche von Benutzern in Lichtzustände umzusetzen. Technisch: DMX- oder Benutzerinput zu Relaisoutput.

Features

Clientplatine Oberseite
Clientplatine Unterseite
  • DMX/RDM Ein- und Ausgang
  • Batteriegestützte Realtime Clock
  • 1024KB I²C EEPROM
  • 32 Ausgänge
  • 16 Eingänge
  • RS232

Kaskadierung

Entgegen des ursprünglichen Plans besitzt der aktuelle Lichtsteuerungsclient nur noch einen Ein/Ausgang, der im Halbduplexmodus genutzt wird. Kaskadierung wird über RS485-Hubs gelöst.

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.

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
0x00000 1024 Namen der Ausgänge (32x32 Zeichen)
0x00400 512 Namen der Eingänge (16x32 Zeichen)
0x00600 16 Modus der Eingänge
0x00610 32 Private-Flag für die Ausgänge
0xF000 4096 Backup des Arduino-EEPROMS

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 und können zum Beispiel über die serielle Schnittstelle oder vom PI aus ausgeführt werden:

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

Obsolet; DMX-Startaddresse wird nur über RDM gesetzt.

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");


setPrivateFlag

setPrivateFlag(port,private)

Setzt das "private" flag für einen Ausgang. "private" bedeutet, daß der Port nicht für den Endbenutzer sichtbar sein soll - dies ist für Ports nützlich, die eine Sonderfunktion haben, z.b. ein Warnsignal, welches vor einem Shutdown des Nebenraumes warnt.

Beispiel:

setPrivateFlag(1,1);

Dies setzt den Ausgang 1 auf "private".

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

onInputOn, onInputOff

function onInputNOff {}
function onInputNOn {}
function onInputN {}

onInputN wird aufgerufen, wenn sich der logische Zustand des Eingangs ändert. Bei einem Taster ist dies analog zu einem kurzen Tasterdruck. N wird dabei durch den entsprechenden Eingang ersetzt.

onInputNOff wird aufgerufen, wenn sich der logische Zustand des Eingangs auf 0 ändert. onInputNOn wird aufgerufen, wenn sich der logische Zustand des Eingangs auf 1 ändert.

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

Kurzform:

function onInput1 { z=aoo(5,6,7,11,12,13); sos(5, !z); sos(6, !z);sos(7, !z); sos(11, !z); sos(12, !z); sos(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