IRMP (Deutsch)

From Ethersex_Wiki
Revision as of 18:55, 5 October 2011 by GooPie4o (talk | contribs) (Anschluss)
Jump to: navigation, search
IRMP
Status
Stable
menuconfig I/O->IR->IRMP
Pinning yes
Ecmd 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.


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_(Deutsch) moduliert. Dazu wird ein weiterer 8-Bit Timer des ATMEGAs (OC0/OC2) belegt. Auf dem Etherape_(Deutsch)-Board übernimmt ein NE555_(Deutsch) diese Funktion, d.h. die Option Use external modulator for sender ist zu aktivieren. Man spart einen Timer des AVR_(Deutsch) 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-Akriv (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.