HowToRFM12 ASK

Aus Ethersex_Wiki
Wechseln zu: Navigation, Suche

Tevion

Senden

rfm12 tevion 77,42,170 86,86 99 4
OK

77,42,170: Hauscode

86,86: Steckdose 1, an

99: delay

4: Anzahl der Wiederholungen


oder auch in der Konsole:

/contrib/rfm12_ask/rfm12_ask_ecmd_send.sh tevion 1_on

Code Analysieren

Audio/Oszi Variante

Schaltet man im Menü auch

│ │                    Applications  --->
...
│ │                         [*] RFM12 ASK (EXPERIMENTAL)  --->
...
│ │                                [*]  RFM12 ASK external filter

ein, so ist es möglich an Pin 4 des RFM12-Chips Empfangssignale zu messen. Dazu ist ein ECMD Aufruf nötig:

rfm12 external filter 1
OK

rfm12 external filter ohne Argument, ruft intern rfm12_init() auf.

Ich habe einfach Pin 4 / Masse mit dem mic-in meiner Soundkarte verbunden und konnte dank http://www.baudline.com/index.html diese Aufzeichnungen machen.

Dies ist die Aufzeichnung des Handsenders, Steckdose 1 aus:

Rfm12 ask tevion.png

Um diese nachzubilden, wird der RFM12-Chip einfach im 'richtigen Takt' ein- bzw. ausgeschaltet. Um die Sequenz zu speichern merken wir uns nur die 'Pulsdauer'.

Für einen kurzen Puls eine 0 und für einen langen Puls eine 1:

                0, 1,0,0, 1, 1,  ...

Das Abgebildete Signal kann dann in folgende Sequenzen unterteilt werden:

Hauscode  : 0,1,0,0,1,1,0,1, 0,0,1,0,1,0,1,0, 1,0,1,0,1,0,1,0,1
Dose 1 aus: 0,1,0,1,0,1,0,1, 0,1,0,1,0,1,0,1

oder Hauscode und ...

Dose 1 an : 0,1,0,1,0,1,1,0, 0,1,0,1,0,1,1,0

Fassen wir immer 8 Bit zusammen, erhält man:

Hauscode  : 0,1,0,0,1,1,0,1, 0,0,1,0,1,0,1,0, 1,0,1,0,1,0,1,0, 1
            77,              42,              170              ^-dieses Bit scheint dem ersten Bit des 3. Bytes zu entsprechen!?!
Dose 1 aus: 0,1,0,1,0,1,0,1, 0,1,0,1,0,1,0,1
            85,              85

...

Dose 1 an : 0,1,0,1,0,1,1,0, 0,1,0,1,0,1,1,0
            86,              86


Um den Hauscode der Tevion Handsender zu ermitteln, gibt es das Bash Skript /contrib/rfm12_ask/analyse_tevion.sh.

Es werden folgende Tools benötigt: bash, bc, gnuplot, sox incl. libsox-fmt-all und einige std. Konsolntools wie cut und grep...

Vorab ist eine Audiodatei des zu analysierenden Signals unter contrib/rfm12_ask ubzulegen und der Dateinamen ist im Skript anzupassen.

Es sollte mit etwas längerem Rauschen beginnen. Auch am Ende sollte ein wenig Rauschen vorhanden sein. Das Audiomaterial sollte halt passend geschnitten sein!

cd contrib/rfm12_ask/
bash analyse_tevion.sh
sox sox: sox.dat: output clipped 1827 samples; decrease volume?
Read file gnu.dat
Compute data...
01001101001010101010101010101010101010101
Codes:
bin 01001101 = dec 77
bin 00101010 = dec 42
bin 10101010 = dec 170
bin 01010101 = dec 85
bin 01010101 = dec 85
call:
gnuplot gnuplot.in

Die Ausgabe des Skripts ist mittlerweile etwas umfangreicher geworden, um schneller die passenden Werte zu finden, die man ggf. ändern muss.

Diese findet man direkt am Anfang des Skriptes:

lowerboundlevel=-0.3

upperboundlevel=0.3

deltalongtime=0.005

deltashorttime=0.0009

Der gnuplot Aufruf zeigt die Wellenform dann als Punktewolke und oben sind die Zahlen eingeblendet. Hier erkennt man auch schnell, ob die eingetragenen Werte passen;-)

Man kann die Einstellungen für die Grafik in der Datei gnuplot.in ändern.

Zum Beispiel sieht man manchmal mehr, verbindet man die Punkte mit einer Linie.

Dazu ändert man den Eintrag: 'set style data point' nach 'set style data lp' fuer "LinePoint".

Nun eine Aufzeichnung des reproduzierten Signals:

rfm12 tevion 77,42,170 86,86 99 4

RFM12 ASK sensing

Schaltet man im Menü zusätzlich auch

...
│ │                    General Setup  --->
...
│ │                         [*] Enable (Serial-Line) Debugging  --->
│ │                                [*] ASK Sensing                  
...
│ │                    Applications  --->
...
│ │                         [*] RFM12 ASK (EXPERIMENTAL)  --->
...
│ │                                [*]  RFM12 ASK external filter
│ │                                [*]  RFM12 ASK sensing

ein, können die Signale des Handsenders dirket vom Debug-Screen abgelesen werden.

Hiezu ist es jedoch erforderlich einen weitern Interrupt-Pin des AVRs mit dem PIN4 des RFM12-Chips zu verbinden und im pinning einzutragen.

Ein ECMD Aufruf

rfm12 ask sense

startet den decoder. Sendet man nun ein Signal mit dem Handsender, werde der Hauscode und der Gerätecode incl. default delay usw. ausgegeben.

2272

Kangtai Powerswitch

Verschiedene Baumärkte und Pollin Vertreiben ein so genanntes Funkschaltset bestehend aus einer Funkfernbedienung und 3-5 Funksteckdosen.

Die Steckdosen werden durch 10 DIP-Schalter konfiguriert. Die ersten fünf Schalter geben den Hauscode vor, die übrigen Schalter stellen die Adresse der Steckdose ein.

Senden

rfm12 2272 0,5,81 76 4
OK

0,5,81: Haus- Gerätecode; Steckdose A, an

76: delay

4: Anzahl der Wiederholungen


oder:

/contrib/rfm12_ask/rfm12_ask_ecmd_send.sh 2272 a_on 

Code Analysieren

Ich fassen wir mal ein paar Notizen zusammen, die wir uns beim spielen mit der Funksteckdose gemacht habe. Meine Erfahrungen sind voll kompatibel zu dem was bereits hier beschrieben wurde.

Genau genommen habe ich hier einen HX2272-L2, d.h. die Geräte-Adresse wird über die Pins 7, 8, 10 und 11 (A6, A7, A8, A9) am IC gesetzt; Die Pins 12 und 13 (D1 und D0) sind Ausgänge (wobei bei mir Pin 13 (D0) der "Hauptausgang" ist und Pin 12 (D1) offen liegt).

~> Unstimmigkeit: Wo fängt der Gerätecode an, wo hört der Hauscode auf? Laut den Datenblättern haben wir 4 Pins für den Hauscode (Pins 7, 8, 10 und 11 (A6, A7, A8, A9)) und 6 Pins für den Gerätecode(Pin 1-6 (A0-A5)). Im folgenden betrachten wir aber die ersten 5 Pins (Pin 1-5 (A0-A4)) als Gerätecode und die 5 Pins Pin 6-8, 10 und 11 (A5-A9) als Hauscode. Das ist aber eigentlich auch total egal. Reine Definitionsfrage.

Byteorder

Offenbar alles MSB (das Bit was am meisten "Wert" ist steht links)

Codierung

Wir senden mit einem RFM12-Modul, das eigentlich nur FM kann, in AM indem wir den Sender im passenden Timing ein- und ausschalten.

Eine "0" wird gesendet indem man zunächst "eine Zeit lang"(0,5µs - 0,6µs?) den Sender einschaltet und dann die doppelte Länge dieser Zeit X den Sender wieder abgeschaltet lassen.

Eine "1" wird gesendet indem man zunächst die doppelte Zeit x lang den Sender ausgeschaltet lässt und dann den Sender für diese Zeit X eingeschaltet lässt.

Also wie bereits an anderer Stelle im Wiki beschrieben wird für jeden "1" die Zeichen "110" gesendet und für jede "0" wird "100" gesendet.

Adressierung

Die Chips werden mit einer 10bit "Hausadresse" und einer 10bit "Geräteadresse" versehen. Auf der Fernbedienung jumpert man den Hauscode. Die Gerätecodes (plus Ein-/Ausschaltbefehl) sind harcodiert den verschiedenen Tasten auf der Fernbedienung zugeordnet.

Offenbar sind die Gerätecodes der Fernbedienung folgende:

Tasten  |  Code
--------+-----------------
   A    | 00 01 01 01 01
   B    | 01 00 01 01 01
   C    | 01 01 00 01 01
   D    | 01 01 01 00 01
   E    | 01 01 01 01 00


Beim Empfänger kann man Haus- und Gerätecode jumpern. Die Tristate-Eingänge Pin 1-6 (A0-A5) für den Hauscode und Pins 7, 8, 10 und 11 (A5, A6, A7, A8) für den Gerätecode sind entweder "offen" oder per Jumper auf Masse ("0") gezogen. Man definiert mit jedem Pin 2 Bit vom Haus-/Gerätecode nach folgender Tabelle:

Pegel  | binär
-------+--------
 GND   |  00
 offen |  01
 VCC   |  11

Die Werte "11" können also nur per Jumpern und ohne Umlöten nicht erreicht werden.

Befehle

Wir haben bisher nur folgende Befehle ausprobiert:

 Befehl |  Funktion                        
--------+---------------------------------
 00 00  | 2ter Ausgang aus, Relais aus
 00 01  | 2ter Ausgang aus, Relais an
 01 00  | 2ter Ausgang an,  Relais aus
 01 01  | 2ter Ausgang an,  Relais an
        |
 D1 D0  | Namen der Pins
 

Beispiele

Von Handsender-Fernbedienung aufgezeichnet:

HAUSCODE          GERÄTECODE         COMAND
A0 A1 A2 A3 A4    A5 A6 A7 A8 A9     D1 D0                  
00 00 00 00 00    00 01 01 01 01     00 01  -  Gerät A on (zweiter unbelegter Ausgang off), Hauscode "all dip's on"
00 00 00 00 00    00 01 01 01 01     01 00  -  Gerät A off (zweiter unbelegter Ausgang on), Hauscode "all dip's on"
00 00 00 00 00    01 00 01 01 01     00 01  -  Gerät B on (zweiter unbelegter Ausgang off), Hauscode "all dip's on"
Empfangen

Beim Aufzeichnen sieht man immer Sequenzen von entweder

  • kurz Ruhe, dann 2 Zeiteinheiten Rauschen (== "0")

oder

  • 2 Zeiteinheiten Ruhe und dann kurz Rauschen (== "1")

Rfm12 2272.png

Senden

Möchte man die Codes senden muss man die Bitfolge noch umrechnen in das Format in der das Tool was man zum senden verwendet die Angaben haben möchte. RF12 ASK 2272 erwartet bei Aufruf 3 Byte als Dezimalzahl. Diese drei Byte werden wie folgt gebildet:

HAUSCODE          GERÄTECODE         COMAND
00 00 00 00 00    00 01 01 01 01     00 01  -  Gerät A on (zweiter unbelegter Ausgang off),  Hauscode "all dip's on"
|-Byte 1 -| |-- Byte 2 --| |-- Byte 3  --|
 0 (= 0x00)   5 (= 0x05)     81 (= 0x51)

Import von http://zerties.org/tiki/tiki-index.php?page=HowToRFM12_ASK