IRMP: Unterschied zwischen den Versionen

Aus Ethersex_Wiki
Wechseln zu: Navigation, Suche
(Durch empfangene IR-Zeichen Stella/Pins schalten)
(Der Seiteninhalt wurde durch einen anderen Text ersetzt: „[http://ethersex.de/index.php/IRMP IRMP im neuen WIKI] Category:Ethersex Category:IR Category:ECMD Category:Control6“)
 
(17 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
IRMP ist eine Portierung des [http://www.mikrocontroller.net/articles/IRMP Infrarot-Multiprotokoll-Decoders] nach [[Ethersex]].
+
[http://ethersex.de/index.php/IRMP IRMP im neuen WIKI]
 
 
 
 
== 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 '''[[Etherape]]'''-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-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)<br>'''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 [http://www.mikrocontroller.net/articles/IRMP#Die_IR-Protokolle_im_Detail 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
 
  │ │                      [ ] JVC
 
  │ │                      [ ] SAMSUNG
 
  │ │                      [ ] MATSUSHITA
 
  │ │                      [ ] KASEIKYO
 
  │ │                      [*] DENON
 
  │ │                      [ ] RECS80
 
  │ │                      [ ] RECS80EXT
 
  │ │                      [*] RC5(X)
 
  │ │                      [ ] RC6
 
  │ │                      [ ] NUBERT
 
  │ │                      [*] BANG&OLUFSEN
 
  │ │                      [*] GRUNDIG
 
  │ │                      [ ] NOKIA
 
  │ │                      [*] SIEMENS
 
  │ │                      [ ] FDC
 
  │ │                      [ ] RCCAR
 
  │ │                      [ ] NIKON
 
  │ │                      --- 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_Reference|ECMD Referenz]].
 
 
 
== [[Control6]] ==
 
 
 
=== Ausgabe empfangener IR-Zeichen via [[SYSLOG|Syslog]] ===
 
 
 
<source lang="text">
 
 
 
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
 
 
 
</source>
 
 
 
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.
 
 
 
=== [[Stella_Light|Stella]]/Pins durch IRMMP steuern ===
 
 
 
<source lang="text">
 
C6_HEADER(`/* This will be in control6.h */')
 
#include "services/stella/stella.h"
 
CONTROL_START
 
 
THREAD(test)
 
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(test)
 
 
ON STARTUP DO
 
  THREAD_START(test);
 
END
 
 
CONTROL_END
 
</source>
 
 
 
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>
 
Statt ''"stella_setValue(STELLA_SET_IMMEDIATELY, 0, 255);"'' kann auch ''"PIN_SET(LED)"'' und ''"PIN_CLEAR(LED)"'' verwendet werden ([[Named_PIN|Named PIN]]).
 
 
 
=== Senden von IR-Zeichen ===
 
 
 
<source lang="text">
 
 
 
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
 
 
 
IRMP_PROTOCOL = 2;
 
IRMP_ADDRESS = 1234;
 
IRMP_COMMAND = 5678;
 
IRMP_FLAGS = 1;
 
 
 
IRMP_WRITE;
 
 
 
</source>
 
 
 
Kommando 5678 an Gerät 1234 wird mit einer Wiederholung im NEC-Protokoll gesendet.
 
 
 
 
[[Category:Ethersex]]
 
[[Category:Ethersex]]
 
[[Category:IR]]
 
[[Category:IR]]
 
[[Category:ECMD]]
 
[[Category:ECMD]]
 
[[Category:Control6]]
 
[[Category:Control6]]

Aktuelle Version vom 5. Juni 2013, 07:40 Uhr