Funkfernbedienung

Aus LaborWiki
Wechseln zu: Navigation, Suche

Worum geht es[Bearbeiten]

Solche oder ähnliche Funksteckdosen

Es geht um die Funksteckdosen, die mit einem 12bit tristate Encoder ausgestattet sind (das sind die meissten). Solche Steckdosen gibt es in Sets oder einzeln von diversen Elektronikhändlern, Bau- und Supermärkten zu kaufen. Im Grunde haben alle intern so ziemlich die gleiche Technik und dementsprechend trifft die folgende Beschreibung auf eine große Anzahl dieser Steckdosen zu.

Codierung[Bearbeiten]

Die Codes werden am Sender gesetzt, indem die 12 Codier-Pins des ICs auf GND oder VCC gelegt werden, oder offen gelassen werden.

Pegel  | Wert
-------+------
 GND   |   0 
 offen |   1
 VCC   |   2 

Dadurch ergibt sich ein Code im Trinärsystem. Dieser wird aber nicht trinär gesendet, sondern stattdessen binär.

Pegel  | trinär| binär
-------+-------+-------
 GND   |   0   |  00
 offen |   1   |  01
 VCC   |   2   |  11

Wenn man jetzt immer 2 Trinärstellen zu einer Hex-Ziffer zusammenfasst, ergibt sich folgende Kodierung:

trinär | hex
------ +-------
  00   |  0
  01   |  1
  02   |  3
  10   |  4
  11   |  5
  12   |  7
  20   |  C
  21   |  D
  22   |  F

Codes der verschiedenen Modelle[Bearbeiten]

Pollin/Kangthai/etc.[Bearbeiten]

zu Kangthai siehe auch Diskussion:Funkfernbedienung

Die 5 Doppeltasten sind folgendermassen codiert:

TASTE  | hex Code
-------+---------
  A    | 055
  B    | 115
  C    | 145
  D    | 151
  E    | 154


Zur Codierung der Dipschalter werden die ersten vier Schalter jeweils in Zweiergruppen zusammengefasst. Für diese Schalter gilt jeweils die gleiche Codierung:

  DIP  | 1 AN | 1 AUS
-------+------+------
 2 AN  |  0   |   4
 2 AUS |  1   |   5  

Tabelle 2: Dipschaltercodes

Der 5. Dip-Schalter addiert zu der ersten Stelle des Codes der An/Aus Schalter (s.o.) eine 4, wenn er aus geschaltet ist. (Wenn er auf Stellung an ist, passiert nichts.)


Der gesamte Code, der gesedet wird, ergibt sich aus den obigen Tabellen. Die erste Stelle repräsentiert den Code für die ersten beiden Dipschalter (s. Tabelle 2). Für die 2. Stelle gilt dies analog.
Die 3. Stelle ist die erste Stelle der Schalter aus Tabelle 1 plus die Codierung, die sich aus dem Dipschalter 5 ergibt.
Die 4. und 5. Stellen sind die übrigen 2. und 3. Codeziffern aus Tabelle 1.
Die 6. und letzte Stelle des Codes ergibt die Stellung der Schalter A bis E: 1 steht dabei für an, 4 steht für aus.

Verwirrend? - Hier ist ein Beispiel[Bearbeiten]

Es soll die Steckdose A angeschaltet werden. Der Systemcode (=Dipschalterstellung) sei 01100. Daraus ergibt sich folgender Code:

   4   1    4    5    5    1

...und deren bitweise represaentation...

0100 0001 0100 0101 0101 0001

...und so setzt er sich zusammen:

  4 <-- Dip 1 aus und Dip 2 an
  1 <-- Dip 3 an  und Dip 4 aus
  4 <-- Erste Stelle des Schalters A ist 0. Dip 5 steht auf aus, also 0+4
  5 <-- Die 2. Stelle des Codes für Schalter A
  5 <-- Die 3. Stelle des Codes für Schalter A
  1 <-- Wir schalten das Gerät an

REV[Bearbeiten]

Die guten REV Steckdosen haben die ersten 10 bits des Wortes einfach direkt auf die 10 Dipschalter geführt.

  DIP  | trinär  | binär
-------+---------+-------
 off   |    1    |  01
 on    |    0    |  00

Über die letzten beiden Bits wird die Dose an und aus geschaltet.

 Befehl | trinär  | hex
--------+---------+-------
   An   |    1    |  4
   An   |    1    |  6
   An   |    1    |  C
   An   |    1    |  E
  Aus   |         |  1
  Aus   |         |  3
  Aus   |         |  1
 schmuh |    0    |  F
 schmuh |    0    |  D
 schmuh |    0    |  7
 schmuh |    0    |  5


Gesendeter Code[Bearbeiten]

Bevor der Code gesendet wird, wird dieser vorher nochmals codiert. Dabei wird jede Eins des obigen codes mit "110" und jede Null mit "100" codiert. Der resultierende Code aus hex 414551 wäre also 72 bits lang und sähe so aus:

100 110 100 100   100 100 100 110   100 110 100 100   100 110 100 110   100 110 100 110   100 100 100 110

Zu den Timings: Zwischen zwei flanken liegen in etwa 400 microsekunden.

Codes im Labor reverse-engineeren[Bearbeiten]

Dank Peter hatten wir im Labor die Möglichkeit, die entsprechenden Funk-Codes auf relativ einfache Weise selbst herauszufinden, ohne dabei ein Oszilloskop aufzubauen. Der Hauptschalter sendete erkannte Codes einfach über den Canbus, sodass man mit Hilfe von lapcontrol diese einfach nur auslesen musste.

Dazu logged man sich entweder auf Roulette ein und tippt

 lapcontrol dump

Beim drücken eines Buttons auf der passenden Fernbedienung zu den Steckdosen, sollten nun die Codes in Hex auf dem Bildschirm erscheinen. Die Ausgabe sieht in etwa so aus:

 20:29.45:  00:21 -> ff:21    5d 45 14 00 
 20:29.45:  00:21 -> ff:21    5d 45 14 00 
 20:29.45:  00:21 -> ff:21    5d 45 14 00 
 20:29.45:  00:21 -> ff:21    5d 45 14 00 
 20:29.45:  00:21 -> ff:21    5d 75 d5 00 

Die Hexwerte in der Spalte Rechts repräsentieren dabei die erkannten Funkcodes.

In der letzten Zeile erkennt man wie schlecht eigentlich diese Technik funktioniert: Um Übertragungsfehler zu kompensieren wird entsprechender Funkcode von den Fernbedienungen gleich mehrmals gesendet. Oft kommt beim Empfänger auch Quatsch an, wie hier deutlich zu sehen ist.

"Geheime" codes[Bearbeiten]

Aus der gewöhnlichen Codierung der Tasten ergeben sich viele unbelegte Kombinationen von Schaltercodes, die mit einer Fernbedienung nur durch das Drücken mehrerer Tasten gleichzeitig erreichbar sind. Auf diese Weise lässt sich z.B. bei den Fernbedienungen mit 10bit Codierschalter das volle Spektrum von 1024 Kombinationen ausreizen.


Die entsprechenden Codes kann man aus den obigen Tabellen errechnen. Dabei nimmt man die letzten 5 bit der Codierschalter (= die Dipschalter, die normalerweise die Nummer der Steckdose bestimmen) und schaut sich deren Stellung an. Ein Schalter in on Stellung zieht den Eingang des Encoder-ICs auf GND, ein Dipschalter in Stellung off ist ein offener Eingang.

Aus der Dipschalterstellung 10010 ergibt sich damit, dass die Eingänge des ICs auf GND, offen, offen, GND, offen liegen. Den 5 Dipschaltern vorangestellt ist ein weiterer (nullter) Eingang der fest auf GND verlötet ist. Zum berechnen des zu sendenden Codes nimmt man also GND, GND, offen, offen, GND, offen.


Im zweiten Schritt können wir nun von den Trinärcode bestimmen - dabei wird jedes "GND" zu 0 und "offen" zu 1. Aus obigem Beispiel ergibt sich folgender Trinärcode: 001101.

Je zwei Zeichen des Trinärcodes werden nun zu je einem Hex Zeichen zusammen gefasst - es ergibt sich in diesem Beispiel demnach der Hexcode: 051, welcher dem tatsächlich zu sendenden Code entspricht.

Quellcode im SVN[Bearbeiten]

  • Firmware für den Rfm12usb mit OOK Funktion: hier
  • Beispielcode zur Berechnung und senden der Codes via Rfm12usb: hier
  • Im SVN gibt es eine Implementierung eines Gerätes mit RFM12, das zeitgesteuert eine Funksteckdose vor einer Kaffeemaschine an/ausschaltet. Code per Trac einsehen ...oder runterladen mit SVN:
svn co https://www.das-labor.org/svn/microcontroller/src-atmel/rfm12/coffeetimer
  • Ferner gibt es einen etwas älteren proof-of-concept Code, mit dem man Funksteckdosen schalten kann. Von dessen Verwendung wird allerdings abgeraten, da er in einer Vollmondnacht entstanden ist und ziemlich gefrickelt ist. Wer auf Schmerzen steht, ist jedoch gerne eingeladen, sich den Code mit Trac anzusehen oder direkt runter zu laden:
svn co https://www.das-labor.org/svn/microcontroller/src-atmel/rfm12/funkysteckdosen

Links[Bearbeiten]