Forum: Mikrocontroller und Digitale Elektronik Unbekanntes Funkprotokoll mit "RC-Switch"auswerten


von Stefan B. (adam6de)


Angehängte Dateien:

Lesenswert?

Hallo.

Ich habe ein Problem bei der Auswertung einer Funknachricht die mit 
einem AC-123-16 Funkhandsender von ANYSANE gesendet wird. (siehe Bild)
Ich möchte das Signal gerne mit einem Arduino und einem 433mhz Empfänger 
auswerten.
Ich benutze im Moment die "rc-switch" Librarry von perivar.
Diese gibt mir aber keine gültiges Signal zurück.
Wenn ich aber auf den Debug-Modus stelle kann ich die Funknachricht in 
den RAW-Werten sehen.

Ich habe die nachricht schon größtenteils entschlüsselt siehe Bild2.

Am Anfang der Nachricht kommt immer ein ganz langes HIGH und ein langes 
LOW.
Danach kommt anscheinend eine Sender-ID (Array3).
Dann kommen zwei Byte "Array4" und "Array" in denen ist des Kanal 
enthalten.
Die letzten beiden Byte enthalten welche taste gedrückt worden ist (Hoch 
Mitte Runter) und eine Prüfsumme.
Beendet wird die Nachricht von einem langen HIGH gefolgt von einem lange 
LOW.
Diese Kombination tritt in der Nachricht selbst nicht auf.

Ausgewertet werden nur "lange" Zustände.

Ich bin mir nicht sicher ob ich das durch Änderung der "rc-switch.cpp" 
abbilden kann.
1
static const RCSwitch::Protocol PROGMEM proto[] = {
2
#endif
3
    {350, {0, 0}, {1, 3}, {3, 1}, {1, 31}, false},   // protocol 1
4
    {650, {0, 0}, {1, 2}, {2, 1}, {1, 10}, false},   // protocol 2
5
    {100, {0, 0}, {4, 11}, {9, 6}, {30, 71}, false}, // protocol 3
6
    {380, {0, 0}, {1, 3}, {3, 1}, {1, 6}, false},    // protocol 4
7
    {500, {0, 0}, {1, 2}, {2, 1}, {6, 14}, false},   // protocol 5
8
    {450, {0, 0}, {1, 2}, {2, 1}, {23, 1}, true},    // protocol 6 (HT6P20B)
9
    {150, {0, 0}, {1, 6}, {6, 1}, {2, 62}, false},   // protocol 7 (HS2303-PT, i. e. used in AUKEY Remote)
10
    {250, {1, 10}, {1, 5}, {1, 1}, {1, 40}, false},  // protocol 8 (Nexa)
11
    {100, {0, 0}, {6, 6}, {6, 12}, {6, 169}, false}, // protocol 9 (Everflourish Single Button)
12
    {100, {0, 0}, {6, 6}, {6, 12}, {6, 120}, false}, // protocol 10 (Everflourish All Buttons)
13
};

Kennt jemand dieses Protokoll und kann mir helfen dieses in der .cpp zu 
deklarieren?

Danke!
Gruß
Stefan

: Bearbeitet durch User
von JJ (Gast)


Lesenswert?

Dein Bild zeigt Leitung 0/1/2/3/4 und du erzählst interessante
Beobachtungen von Array3, Array4 und Array - aber ICH erkenne da
keine Zusammenhänge.

Und die anderen 30 Leute, die da schon draufgeklickt haben, auch
nicht.

Erklär dich vielleicht mal etwas verständlicher in Zusammenhang
mit dem sichtbaren Pegel-Ablauf...???

von Wolfgang (Gast)


Lesenswert?

Stefan B. schrieb:
> Ich habe ein Problem bei der Auswertung einer Funknachricht die mit
> einem AC-123-16 Funkhandsender von ANYSANE gesendet wird. (siehe Bild)

Dazu wäre es gut, etas über den Nachrichteninhalt der gezeigten 
Mitschnitte zu wissen.

Falls die Dekodierung nur sportlicher Ehrgeiz ist, könntest du 
alternativ auch ein fertiges Kästchen hinstellen - andere haben das 
Protokoll schon nachgebaut ...
http://www.rfxcom.com/RFXtrx433E-USB-43392MHz-Transceiver/en
https://cdn.shopify.com/s/files/1/1253/2717/files/RFXtrx_User_Manual.pdf

von Mario M. (thelonging)


Lesenswert?

Stefan B. schrieb:
> Ich bin mir nicht sicher ob ich das durch Änderung der "rc-switch.cpp"
> abbilden kann.

Nein. Die genannte Library kann nur Protokolle verarbeiten, die nach 
folgendem Schema arbeiten. Jedes Element (Start-, Daten, Stopbit) 
besteht aus einem H-Teil und einem L-Teil, die in der Länge ein 
bestimmtes Vielfaches eines Grundtaktes ergeben. Das kann ich in Deiner 
Aufzeichnung nicht erkennen.

https://github.com/sui77/rc-switch/wiki/KnowHow_LineCoding

von Wolfgang (Gast)


Angehängte Dateien:

Lesenswert?

Mario M. schrieb:
> Das kann ich in Deiner Aufzeichnung nicht erkennen.

Wieso nicht?

von Harald (Gast)


Lesenswert?

> ... 433mhz Empfänger ...

Das wird nie funktionieren.

von Wolfgang (Gast)


Lesenswert?

Harald schrieb:
>> ... 433mhz Empfänger ...
>
> Das wird nie funktionieren.

Guter Einwurf ;-)

von Mario M. (thelonging)


Lesenswert?

Wolfgang schrieb:
> Wieso nicht?

Weil am Anfang, am Ende und unregelmäßig zwischendrin Kombinationen von 
langen H-Impulsen mit langen L-Impulsen auftreten, die nicht in das 
Schema passen. Der Rest sieht schon gut aus. Genaues kann man aber eh 
nicht sagen, man bräuchte mal eine "richtige" Aufzeichnung, z.B. mit 
einem Logikanalysator.

von Stefan B. (adam6de)


Angehängte Dateien:

Lesenswert?

Hallo JJ

Sorry für die schlechte Erklärung!
Ich versuchs nochmal.
Der Sender den ich benutze sendet Zyklisch in kurzen intervallen immer 
die gleiche Nachricht wenn eine Taste gedrückt wird.
Diese Sendeblöcke habe ich mit anderer Software schon separiert, 
normalisiert und als digitalen Verlauf in einem Graphen dargestellt.


Das ist dann in dem Bild z.B. leitung0 und leitung1 zu sehen.
Die Nullen und Einsen in der Grafik markieren einen High bzw Low zustand 
der eine bestimmte Dauer überschreitet
Die anderen Verläufe interessieren erstmal nicht. (stehen aber für taste 
losgelassen)

Zum besseren Verständnis habe ich noch eine Grafik angehängt.

Hallo Wofgang
Ist sportlicher Ehrgeiz!
433mhz ist natürlich falsch es müsste 433MHz heißen.
Dieser Empfänger wurde verwendet (Bild2).

von Stefan B. (adam6de)


Lesenswert?

Mario M. schrieb:
> Genaues kann man aber eh
> nicht sagen, man bräuchte mal eine "richtige" Aufzeichnung, z.B. mit
> einem Logikanalysator.

Einen Logikanalysator habe ich nicht aber wenn du mir verrätst wie eine 
solche Aufzeichnung aussieht kann ich morgen eine machen.

von Mario M. (thelonging)


Lesenswert?

Entschuldigung. Die aufeinanderfolgenden langen Impulse, die ich 
"gesehen" habe sind in Wirklichkeit Bitwechsel zwischen "0" und "1". War 
wohl noch nicht ganz wach.
Trotzdem wird das mit der rc-switch wohl nicht funktionieren, weil die 
Library mit 32Bit-Werten arbeitet, also auch nur Codes mit max. 32 Bits 
senden und empfangen kann.
Schau Dir mal folgendes Projekt an. Da wird auch erklärt, wie man die 
Impulse vermisst und den Impulszug generiert:

http://www.dserv01.de/howtos/funksteckdose-fernsteuern-mit-arduino/

von Stefan B. (adam6de)


Angehängte Dateien:

Lesenswert?

Hallo Mario,

das werde ich mir mal anschauen.

Als Bild jetzt der Originale Signalverlauf.
Vielleicht können die Experten hier darauf mehr erkennen.

Gruß
Stefan

von Stefan B. (adam6de)


Angehängte Dateien:

Lesenswert?

Hallo,

ich muss mich hier nochmal melden und um Hilfe bitten.

Wie schon weiter oben erwähnt ist eine Auswertung mittels RC-SWITCH 
nicht direkt möglich.

Wenn ich in der RCSwitch.cpp DEBUG aktiviere bekomme ich den kompletten 
Signalverlauf auf die Serielle Schnittstelle ausgegeben
1
4898,573,614,190,205,589,589,202,205,572,227,573,206,599,602,191,588,194,218,574,611,188,203,601,204,590,587,191,601,191,202,597,202,606,585,193,600,193,200,592,200,600,585,192,228,577,201,592,585,211,585,193,220,579,611,194,199,594,199,577,215,579,200,600,611,196,200,594,200,578,199,593,201,597,203,602,202,575,217,577,598,197,201,598,202,577,227,577,200,594,199,592,201,577,222,578,200,608,201,592,201,576,216,577,201,598,611,193,202,592,582,194,599,198,606,194,584,220,200,579,212,580,199,594,199,601,583,194,225,579,597,877,

Den Programmteil der die Ausgabe macht habe ich auch gefunden:
1
#ifdef DEBUG
2
  if (p > 7) // debugging protocols 8 and 9
3
  {
4
    Serial.println();
5
    Serial.print(F("Testing if this is protocol "));
6
    Serial.print(p);
7
    Serial.print(F(" using "));
8
    Serial.print(changeCount);
9
    Serial.print(F(" timings. PauseLengthInPulses: "));
10
    Serial.print(pauseLengthInPulses);
11
    Serial.print(F(". Delay: "));
12
    Serial.print(delay);
13
    Serial.print(F(". Delay tolerance: "));
14
    Serial.print(delayTolerance);
15
    Serial.print(F(". Received Bitlength: "));
16
    Serial.print(receivedBitlength);
17
    Serial.print(F(". First Data Timing Index: "));
18
    Serial.print(firstDataTiming);
19
    Serial.println();
20
21
    Serial.print(F("Raw timing data: "));
22
    for (unsigned int p = 0; p < changeCount; p++)
23
    {
24
      Serial.print(RCSwitch::timings[p]);//Hier werden die Werte übergeben.
25
      Serial.print(F(","));
26
    }
27
    Serial.println();

Mein Problem ist es dieses Array ins Hauptprogramm zu übergeben damit 
ich es auswerten kann.
Wie kann ich diese Werte übergeben damit ich sie in der MAIN-Loop 
verarbeiten kann?

Danke für eure Hilfe!

von Mario M. (thelonging)


Lesenswert?

Wie schon geschrieben, kann rc-switch derart lange Bitfolgen von Haus 
aus nicht erzeugen. Die brutalstmöglich einfache Lösung wäre, ein Array 
mit allen Zeiten (im Flash) anzulegen und in einer Schleife immer 
delay_us mit dem jeweiligen Wert aufzurufen und dann den Port-Pin zu 
toggeln. Am Anfang den Pin entsprechend des Startpegels setzen.

: Bearbeitet durch User
von Stefan B. (adam6de)


Lesenswert?

Mario M. schrieb:
> Wie schon geschrieben, kann rc-switch derart lange Bitfolgen von Haus
> aus nicht erzeugen. Die brutalstmöglich einfache Lösung wäre, ein Array
> mit allen Zeiten (im Flash) anzulegen und in einer Schleife immer
> delay_us mit dem jeweiligen Wert aufzurufen und dann den Port-Pin zu
> toggeln. Am Anfang den Pin entsprechend des Startpegels setzen.

Hallo Mario,

Ich möchte ja keine Bitfolge erzeugen.
Ich will ja nur die Nachricht vom der Fernbedienung empfangen, Auswerten 
welcher Kanal und Welche Taste und das ganze dann per W-LAN an meinen 
Homeserver übergeben. Dazu würde ich oben genannten Empfänger und einen 
WEMOS-D1-Mini verwenden.
Deshalb war meine Idee, wenn schon der Signalverlauf richtig empfangen 
wird, diesen einfach an die Main-LOOP zu übergeben, auswerten und ein 
UDP-Paket versenden.
Ich scheitere aber im Moment schon dran das ARRAY "timings[]" in die 
Hauptschleife zu bekommen.

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Stefan B. schrieb:
> Wie schon weiter oben erwähnt ist eine Auswertung mittels RC-SWITCH
> nicht direkt möglich.

vielleicht wird rolling code genutzt, dann wäre es unmöglich zu 
dekodieren.
vielleicht ist es aber nur was selbstkreiertes auch da sehe ich schwarz.

Es gibt so viele Codearten

einen kleinen Einblick bekommt man hier
https://www.mikrocontroller.net/articles/IRMP

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.