AVR Ethersex Vernetzung
Einleitung
Ethersex bietet verschiedene Möglichkeiten an, um einen Netzwerkzugriff zu realisieren. An erster Stelle ist da der bereits im AVR NET-IO Kapitel beschriebene Weg via Ethernet. Es ist aber nicht immer an der gewünschten Stelle eine Netzwerkverbindung vorhanden. Es besteht auch häufig die Anforderung nur wenige Sensoren oder Aktoren anzubinden. In diesem Falle ist nicht zwingend ein AVR NET-IO erforderlich. Es kann mit einem "kleineren" AVR Controller eine Verbindung zum Master Ethersex-Modul aufgebaut werden, das dann am Netzwerk hängt. Die Vernetzung zwischen einem (oder mehreren) Slaves und dem Master kann über mehrere Wege erfolgen. Folgende Möglichkeiten der Vernetzung bestehen:
- Ethernet
- ZBus (RS485 Zweidrahtbus - siehe auch: http://ethersex.de/index.php/ZBus)
- RFM12 Funkmodul
im Folgenden wird die Vernetzung via Ethernet und RFM12 Funkmodulen näher beschrieben
Vernetzung via Ethernet
Für die Vernetzung via Ethernet sind keine besonderen Voraussetzungen erforderlich. Lediglich zwei (oder mehr) AVR-Controller mit Ethernet Interface (z.B. AVR Net-IO's) werden benötigt. Wenn auf dem Slave-Ethersex Modul keine Weboberfläche erforderlich ist, reicht auf diesem ein ATMega32-Controller aus. Das Setup von beiden Ethersex-Modulen sollte analog derer in AVR_Etherse beschriebenen vorgenommen werden. Die IP-Adressen und MAC-Adressen müssen einmalig im Netzwerk gewählt werden.
Kommunikation der beiden Ethersex-Module siehe unten.
Vernetzung via RFM12-Funkmodule
Mittels RFM12 Funkmodulen besteht eine sehr zuverlässige und äusserst flexible Möglichkeit der Vernetzung mehrer Ethersex Module. im Kapitel AVR_Ethersex wurde bereits ein RFM12 Funkmodul verwendet, um Funksteckdosen anzusteuern. Es besteht die Möglichkeit das RFM Funkmodul zur Vernetzung und zur Ansteuerung von Funksteckdosen parallel zu nutzen. Um Vernetzung zu ermöglichen, muss lediglich die Konfiguration von Ethersex erweitert werden.
Verdrahtung Master
Verdrahtung Slave
Der Slave besteht hier aus einem ATMega32, 4 Tastern, 4 LED's und das RFM12 Funkmodul.
Konfiguration Master
Für das RFM12 Netzwerk muss ein eigenes, separates Subnet verwendet werden. Z.B. AVR Net-IO Ethernet: 192.168.0.x, RFM12 Subnet: 192.168.5.x. Das Master AVR Net-IO fungiert als Router fürs RFM12-Netz.
cd ~/Dokumente/ethersex make menuconfig
Folgende Einstellungen zusätzlich vornehmen:
|-Network | |-IP over RFM12 (FSK Transmitter) | | |-RFM12 Frequency: 433,92MHz | | |-RFM12 Baudrate: 19200 | | |-IP Adress:192.168.5.1 | | |-RFM12 ARP-Proxy | |-Enable IP Forwarding
Neu compilieren und auf die Zielhardware übertragen.
Konfiguration Slave
Für den Slave wird ein eigenes Ethersex-Verzeichnis verwendet.
cd ~/Dokumente git clone git://github.com/ethersex/ethersex.git ethersex_slave cd ethersex_slave make menuconfig
Folgende Einstellungen vornehmen:
|-Load a default configuration | |-RFM12 Standalone |-General Setup | |-Target MCU: ATMega32 | |-MCU Frequency: 16000000 | |-Hardware/Periphery Class: Other | |-Teensy Build deaktivieren | |-Control6 Scripts |-Network | |-IP over RFM12 (FSK Transmitter) | | |-RFM12 Frequency: 433,92MHz | | |-RFM12 Baudrate: 19200 | | |-IP Adress:192.168.5.2 | |-Default Gateway: 192.168.5.1 | |-TCP Support | |-UDP Support | |-ICMP Support |-I/O | |-I/O abstraction model: Full-featured |-Protocols | |-ECMD | | |-TCP/Telnet | | |-Send via TCP |-General Setup | |-Status LEDs | | |-Status LED Transmitted | | | |-RFM12 TX | | |-Status LED Transmitted | | | |-RFM12 RX
Pinning anpassen:
gedit pinning/other.m4
Folgende Zeilen anpassen:
ifdef(`conf_STATUSLED_TX', `dnl pin(STATUSLED_TX, PB1, OUTPUT) ')dnl ifdef(`conf_STATUSLED_RX', `dnl pin(STATUSLED_RX, PB0, OUTPUT) ')dnl ifdef(`conf_RFM12', `dnl /* port the rfm12 module CS is attached to */ pin(SPI_CS_RFM12, SPI_CS_HARDWARE) /* port the LEDS for rfm12 txrx attached to */ pin(RFM12_TX_PIN, STATUSLED_TX) pin(RFM12_RX_PIN, STATUSLED_RX) RFM12_USE_INT(1) RFM12_ASK_SENSE_USE_INT(0) ')
Named Pins anpassen:
gedit pinning/named_pins/default
Folgende Zeilen einfügen:
# PIN | IN/OUT | When active? | Name #-----+--------+--------------+---------------- PC7 OUTPUT HIGH LED_1 PC6 OUTPUT HIGH LED_2 PC5 OUTPUT HIGH LED_3 PC4 OUTPUT HIGH LED_4 PC3 INPUT LOW Taster_1 PC2 INPUT LOW Taster_2 PC1 INPUT LOW Taster_3 PC0 INPUT LOW Taster_4
Neu compilieren und auf die Zielhardware übertragen.
Kommunikation
Control6 Scripte könen verwendet werden, um Daten zwischen den beiden Ethersex Modulen auszutauschen. Mit dem Befehl ESEND können beliebige ECMD Befehle an eine beliebige IP-Adresse gesendet werden.
ESEND(Ziel_IP,"ECMD-Befehl\n");
Mit Hilfe der 4Taster am Slave sollen die 4 Steckdosen am Master Net-IO geschalten werden.
CONTROL_START CLOCK_USED; THREAD(Taster_1) ON PIN_FALLING(Taster_1) DO ESEND(192.168.5.1,"pin toggle Steckdose_1\n"); WAIT(1); END THREAD_END(Taster_1) THREAD(Taster_2) ON PIN_FALLING(Taster_2) DO ESEND(192.168.5.1,"pin toggle Steckdose_2\n"); WAIT(1); END THREAD_END(Taster_2) THREAD(Taster_3) ON PIN_FALLING(Taster_3) DO ESEND(192.168.5.1,"pin toggle Steckdose_3\n"); WAIT(1); END THREAD_END(Taster_3) THREAD(Taster_4) ON PIN_FALLING(Taster_4) DO ESEND(192.168.5.1,"pin toggle Steckdose_4\n"); WAIT(1); END THREAD_END(Taster_4) ON STARTUP DO THREAD_START(Taster_1); THREAD_START(Taster_2); THREAD_START(Taster_3); THREAD_START(Taster_4); END CONTROL_END
Am Master Net-IO wird ein Thread eingefügt, der alle zwei Sekunden die LED's am Slave aktualisiert. Die Led's am Slave werden damit auch aktualisiert, wenn via Webinterface oder Taster am Master eine Steckdose ein-/ausgeschaltet wurde.
CONTROL_START CLOCK_USED; THREAD(Taster_1) ON PIN_FALLING(Taster_1) DO PIN_TOGGLE(Steckdose_1); WAIT(1); END THREAD_END(Taster_1) THREAD(Taster_2) ON PIN_FALLING(Taster_2) DO PIN_TOGGLE(Steckdose_2); WAIT(1); END THREAD_END(Taster_2) THREAD(Taster_3) ON PIN_FALLING(Taster_3) DO PIN_TOGGLE(Steckdose_3); WAIT(1); END THREAD_END(Taster_3) THREAD(Taster_4) ON PIN_FALLING(Taster_4) DO PIN_TOGGLE(Steckdose_4); WAIT(1); END THREAD_END(Taster_4) THREAD(REFRESH_SLAVE) In Abeit THREAD_END(REFRESH_SLAVE) ON STARTUP DO THREAD_START(Taster_1); THREAD_START(Taster_2); THREAD_START(Taster_3); THREAD_START(Taster_4); THREAD_START(REFRESH_SLAVE); END
CONTROL_END