Difference between revisions of "IRMP (Deutsch)"
(→ECMD) |
m (quelltext passagen korrigiert) |
||
Line 107: | Line 107: | ||
=== Ausgabe empfangener IR-Zeichen via [[SYSLOG_(Deutsch)|Syslog]] === | === Ausgabe empfangener IR-Zeichen via [[SYSLOG_(Deutsch)|Syslog]] === | ||
− | + | CONTROL_START | |
− | + | ||
− | CONTROL_START | + | THREAD(read_irmp) |
− | + | ON IRMP_READ > 0 DO | |
− | THREAD(read_irmp) | + | SYSLOG("IRMP %02hhd:%04hX:%04hX:%02hhX\n", |
− | ON IRMP_READ > 0 DO | ||
− | |||
IRMP_PROTOCOL, IRMP_ADDRESS, IRMP_COMMAND, IRMP_FLAGS); | IRMP_PROTOCOL, IRMP_ADDRESS, IRMP_COMMAND, IRMP_FLAGS); | ||
− | END | + | END |
− | THREAD_END(read_irmp) | + | THREAD_END(read_irmp) |
− | + | ||
− | ON STARTUP DO | + | ON STARTUP DO |
− | + | THREAD_START(read_irmp); | |
− | END | + | END |
− | + | ||
− | CONTROL_END | + | CONTROL_END |
− | |||
− | |||
Mit IRMP_READ wird auf empfangenen IR-Code geprüft und dieser in die Variablen IRMP_PROTOCOL, IRMP_ADDRESS, IRMP_COMMAND und IRMP_FLAGS gespeichert. Rückgabewerte größer Null signalisieren die Gültigkeit der Variablen. Bei IRMP_FLAGS=1 handelt es sich um eine Wiederholung. | Mit IRMP_READ wird auf empfangenen IR-Code geprüft und dieser in die Variablen IRMP_PROTOCOL, IRMP_ADDRESS, IRMP_COMMAND und IRMP_FLAGS gespeichert. Rückgabewerte größer Null signalisieren die Gültigkeit der Variablen. Bei IRMP_FLAGS=1 handelt es sich um eine Wiederholung. | ||
Line 130: | Line 126: | ||
=== Steuern von [[Stella_Light_(Deutsch)|Stella]]/Pins durch IR-Zeichen === | === Steuern von [[Stella_Light_(Deutsch)|Stella]]/Pins durch IR-Zeichen === | ||
− | + | C6_HEADER(`/* This will be in control6.h */') | |
− | + | #include "services/stella/stella.h" | |
− | C6_HEADER(`/* This will be in control6.h */') | + | CONTROL_START |
− | #include "services/stella/stella.h" | + | |
− | CONTROL_START | + | THREAD(control_stella) |
− | + | ON IRMP_READ > 0 DO | |
− | THREAD(control_stella) | + | if(IRMP_PROTOCOL==8 && IRMP_ADDRESS==0x0002) |
− | ON IRMP_READ > 0 DO | ||
− | |||
− | |||
− | |||
{ | { | ||
− | + | switch(IRMP_COMMAND) | |
+ | { | ||
+ | case 0x0268: | ||
stella_setValue(STELLA_SET_IMMEDIATELY, 0, 255); | stella_setValue(STELLA_SET_IMMEDIATELY, 0, 255); | ||
break; | break; | ||
− | + | ||
− | + | case 0x0068: | |
stella_setValue(STELLA_SET_IMMEDIATELY, 0, 0); | stella_setValue(STELLA_SET_IMMEDIATELY, 0, 0); | ||
break; | break; | ||
+ | } | ||
} | } | ||
− | + | END | |
− | END | + | THREAD_END(control_stella) |
− | THREAD_END(control_stella) | + | |
− | + | ON STARTUP DO | |
− | ON STARTUP DO | + | THREAD_START(control_stella); |
− | + | END | |
− | END | + | |
− | + | CONTROL_END | |
− | CONTROL_END | ||
− | |||
− | |||
Das Script schaltet den Stella Channel 0 auf 255 oder auf 0, die Fernbedienung ist hier eine Denon (Protocol 8). Mit ''include'' wurde dem Script der Zugriff auf die Stellasourcen gestattet.<br> | Das Script schaltet den Stella Channel 0 auf 255 oder auf 0, die Fernbedienung ist hier eine Denon (Protocol 8). Mit ''include'' wurde dem Script der Zugriff auf die Stellasourcen gestattet.<br> | ||
Line 167: | Line 159: | ||
=== Senden von IR-Zeichen === | === Senden von IR-Zeichen === | ||
− | + | dnl 01 = SIRCS | |
− | dnl 01 = SIRCS | + | dnl 02 = NEC |
− | dnl 02 = NEC | + | dnl 03 = SAMSUNG |
− | dnl 03 = SAMSUNG | + | dnl 04 = MATSUSHITA |
− | dnl 04 = MATSUSHITA | + | dnl 05 = KASEIKYO |
− | dnl 05 = KASEIKYO | + | dnl 06 = RECS80 |
− | dnl 06 = RECS80 | + | dnl 07 = RC5(x) |
− | dnl 07 = RC5(x) | + | dnl 08 = DENON |
− | dnl 08 = DENON | + | dnl 09 = RC6 |
− | dnl 09 = RC6 | + | dnl 10 = SAMSUNG32 |
− | dnl 10 = SAMSUNG32 | + | dnl 11 = APPLE |
− | dnl 11 = APPLE | + | dnl 12 = RECS80EXT |
− | dnl 12 = RECS80EXT | + | dnl 13 = NUBERT |
− | dnl 13 = NUBERT | + | dnl 14 = BANG&OLUFSEN |
− | dnl 14 = BANG&OLUFSEN | + | dnl 15 = GRUNDIG |
− | dnl 15 = GRUNDIG | + | dnl 16 = NOKIA |
− | dnl 16 = NOKIA | + | dnl 17 = SIEMENS |
− | dnl 17 = SIEMENS | + | dnl 18 = FDC |
− | dnl 18 = FDC | + | dnl 19 = RCCAR |
− | dnl 19 = RCCAR | + | dnl 20 = JVC |
− | dnl 20 = JVC | + | dnl 21 = RC6A |
− | dnl 21 = RC6A | + | dnl 22 = NIKON |
− | dnl 22 = NIKON | + | dnl 23 = RUWIDO * no tx support yet |
− | dnl 23 = RUWIDO * no tx support yet | + | dnl 24 = IR60 * no tx support yet |
− | dnl 24 = IR60 * no tx support yet | + | dnl 25 = KATHREIN * no tx support yet |
− | dnl 25 = KATHREIN * no tx support yet | + | dnl 26 = NETBOX * no tx support yet |
− | dnl 26 = NETBOX * no tx support yet | + | dnl 27 = NEC16 |
− | dnl 27 = NEC16 | + | dnl 28 = NEC42 |
− | dnl 28 = NEC42 | + | dnl 29 = LEGO |
− | dnl 29 = LEGO | + | dnl 30 = THOMSON * no tx support yet |
− | dnl 30 = THOMSON * no tx support yet | + | |
− | + | IRMP_PROTOCOL = 2; | |
− | IRMP_PROTOCOL = 2; | + | IRMP_ADDRESS = 1234; |
− | IRMP_ADDRESS = 1234; | + | IRMP_COMMAND = 5678; |
− | IRMP_COMMAND = 5678; | + | IRMP_FLAGS = 1; |
− | IRMP_FLAGS = 1; | + | |
− | + | IRMP_WRITE; | |
− | IRMP_WRITE; | ||
− | |||
Kommando 5678 an Gerät 1234 wird mit einer Wiederholung im NEC-Protokoll gesendet. | Kommando 5678 an Gerät 1234 wird mit einer Wiederholung im NEC-Protokoll gesendet. |
Revision as of 01:11, 3 January 2012
IRMP | |
---|---|
Status | Stable
|
menuconfig | I/O->IR Receivers->IRMP |
Pinning | yes |
Ecmd | yes |
Control6 | yes |
Depends on | ECMD |
Requires | - |
Code | https://github.com/ethersex/ethersex/tree/master/hardware/ir/irmp |
IRMP ist eine Portierung des Infrarot-Multiprotokoll-Decoders nach Ethersex.
Contents
Anschluss
Der Empfang der IR-Signale erfolgt durch einen Empfänger vom Typ TSOP1736 (oder ähnlich). Dieser kann an einem beliebigen Pin angeschlossen werden. Die Abfrage des Pins und die Dekodierung des IR-Protokolls erfolgt in einer ISR, die einen 8-Bit-Timer des ATMEGAs belegt.
Beim Senden wird das Signal mit der Trägerfrequenz des jeweiligen IR-Protokolls über PWM moduliert. Dazu wird ein weiterer 8-Bit Timer des ATMEGAs (OC0/OC2) belegt. Auf dem Etherrape-Board übernimmt ein NE555 diese Funktion, d.h. die Option Use external modulator for sender ist zu aktivieren. Man spart einen Timer des AVR und ist auf eine Trägerfrequenz festgelegt.
Beispiel für einen ATMega32 aus: pinning/hardware/pollin_evalboard_addon.m4
ifdef(`conf_IRMP', `dnl pin(IRMP_RX, PD2) #define IRMP_USE_TIMER2 #define IRMP_RX_LOW_ACTIVE #undef IRMP_RX_LED_LOW_ACTIVE pin(IRMP_TX, PD7) dnl OC2/OC2A #undef IRMP_TX_LED_LOW_ACTIVE ')
Bedeutung:
- IRMP_RX - Pin an dem der IR-Empfänger angeschlossen ist
- IRMP_USE_TIMER2 - benutze Timer2 für den Empfang, Timer0 für das Senden (undef = umgekehrt)
- IRMP_RX_LOW_ACTIVE - der IR-Empfänger ist Low-Aktiv (undef = High-aktiv)
- IRMP_RX_LED_LOW_ACTIVE - die Kontroll-LED des Empfängers ist gegen USS geschaltet (undef = gegen GND geschaltet)
- IRMP_TX - Pin an dem der IR-Sender angschlossen ist (=Ausgang des Timer0 oder Timer2, vgl. IRMP_USE_TIMER2)
Achtung: 0A bzw 2A bei MCU mit A/B Kanal - IRMP_TX_LED_LOW_ACTIVE - die Kontroll-LED des Senders ist gegen USS geschaltet (undef = gegen GND geschaltet)
Konfiguration
Jedes unterstützte IR-Protokoll "verbrät" Speicher an Code. Deshalb sollte man nur die benötigten Protokolle auswählen. Eine detailierte Übersicht über die Protokolle gibt der Artikel im Mikrocontroller Forum.
│ │ Load a Default Configuration ---> │ │ General Setup ---> │ │ [*] Status LEDs ---> │ │ [*] Status LED (Received) │ │ [-] RFM12 RX │ │ [ ] ZBUS RX │ │ [*] IRMP RX ... │ │ Network ---> │ │ I/O ---> ... │ │ [*] IR Receivers ---> ... │ │ [ ] RC5 IR ---> │ │ [*] IRMP IR ---> ... │ │ [*] Receive IR-codes │ │ [*] Send IR-codes │ │ [ ] Use external modulator for sender │ │ [*] IRMP ecmd │ │ --- Protocols │ │ [ ] SIRCS │ │ [*] NEC │ │ [ ] NEC16 │ │ [ ] NEC42 │ │ [ ] JVC │ │ [ ] SAMSUNG │ │ [ ] MATSUSHITA │ │ [ ] KASEIKYO │ │ [*] DENON │ │ [ ] RECS80 │ │ [ ] RECS80EXT │ │ [*] RC5(X) │ │ [ ] RC6 │ │ [ ] NUBERT │ │ [*] BANG&OLUFSEN │ │ [*] GRUNDIG │ │ [ ] NOKIA │ │ [*] SIEMENS │ │ [ ] FDC │ │ [ ] RCCAR │ │ [ ] NIKON │ │ [ ] RUWIDO │ │ [ ] IR60 │ │ [ ] KATHREIN │ │ [ ] NETBOX │ │ [ ] LEGO │ │ [ ] THOMSON │ │ --- Debugging Flags │ │ [ ] IRMP Debug
IRMP dekodiert auch das RC5-Protokoll, so dass der separat in Ethersex enthaltene RC5-Dekoder nicht länger benötigt wird.
ECMD
IRMP implementiert eine ECMD Schnittestelle zum Auslesen empfangener und dekodierter IR-Kommandos und zum Senden von IR-Kommandos. Siehe ECMD Referenz.
Control6
Ausgabe empfangener IR-Zeichen via Syslog
CONTROL_START THREAD(read_irmp) ON IRMP_READ > 0 DO SYSLOG("IRMP %02hhd:%04hX:%04hX:%02hhX\n", IRMP_PROTOCOL, IRMP_ADDRESS, IRMP_COMMAND, IRMP_FLAGS); END THREAD_END(read_irmp) ON STARTUP DO THREAD_START(read_irmp); END CONTROL_END
Mit IRMP_READ wird auf empfangenen IR-Code geprüft und dieser in die Variablen IRMP_PROTOCOL, IRMP_ADDRESS, IRMP_COMMAND und IRMP_FLAGS gespeichert. Rückgabewerte größer Null signalisieren die Gültigkeit der Variablen. Bei IRMP_FLAGS=1 handelt es sich um eine Wiederholung.
Steuern von Stella/Pins durch IR-Zeichen
C6_HEADER(`/* This will be in control6.h */') #include "services/stella/stella.h" CONTROL_START THREAD(control_stella) ON IRMP_READ > 0 DO if(IRMP_PROTOCOL==8 && IRMP_ADDRESS==0x0002) { switch(IRMP_COMMAND) { case 0x0268: stella_setValue(STELLA_SET_IMMEDIATELY, 0, 255); break; case 0x0068: stella_setValue(STELLA_SET_IMMEDIATELY, 0, 0); break; } } END THREAD_END(control_stella) ON STARTUP DO THREAD_START(control_stella); END CONTROL_END
Das Script schaltet den Stella Channel 0 auf 255 oder auf 0, die Fernbedienung ist hier eine Denon (Protocol 8). Mit include wurde dem Script der Zugriff auf die Stellasourcen gestattet.
Statt "stella_setValue(STELLA_SET_IMMEDIATELY, 0, 255);" kann auch "PIN_SET(LED)" und "PIN_CLEAR(LED)" verwendet werden (Named PIN).
Senden von IR-Zeichen
dnl 01 = SIRCS dnl 02 = NEC dnl 03 = SAMSUNG dnl 04 = MATSUSHITA dnl 05 = KASEIKYO dnl 06 = RECS80 dnl 07 = RC5(x) dnl 08 = DENON dnl 09 = RC6 dnl 10 = SAMSUNG32 dnl 11 = APPLE dnl 12 = RECS80EXT dnl 13 = NUBERT dnl 14 = BANG&OLUFSEN dnl 15 = GRUNDIG dnl 16 = NOKIA dnl 17 = SIEMENS dnl 18 = FDC dnl 19 = RCCAR dnl 20 = JVC dnl 21 = RC6A dnl 22 = NIKON dnl 23 = RUWIDO * no tx support yet dnl 24 = IR60 * no tx support yet dnl 25 = KATHREIN * no tx support yet dnl 26 = NETBOX * no tx support yet dnl 27 = NEC16 dnl 28 = NEC42 dnl 29 = LEGO dnl 30 = THOMSON * no tx support yet IRMP_PROTOCOL = 2; IRMP_ADDRESS = 1234; IRMP_COMMAND = 5678; IRMP_FLAGS = 1; IRMP_WRITE;
Kommando 5678 an Gerät 1234 wird mit einer Wiederholung im NEC-Protokoll gesendet.