mikrocontroller.net

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


Autor: Stefan B. (adam6de)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.
static const RCSwitch::Protocol PROGMEM proto[] = {
#endif
    {350, {0, 0}, {1, 3}, {3, 1}, {1, 31}, false},   // protocol 1
    {650, {0, 0}, {1, 2}, {2, 1}, {1, 10}, false},   // protocol 2
    {100, {0, 0}, {4, 11}, {9, 6}, {30, 71}, false}, // protocol 3
    {380, {0, 0}, {1, 3}, {3, 1}, {1, 6}, false},    // protocol 4
    {500, {0, 0}, {1, 2}, {2, 1}, {6, 14}, false},   // protocol 5
    {450, {0, 0}, {1, 2}, {2, 1}, {23, 1}, true},    // protocol 6 (HT6P20B)
    {150, {0, 0}, {1, 6}, {6, 1}, {2, 62}, false},   // protocol 7 (HS2303-PT, i. e. used in AUKEY Remote)
    {250, {1, 10}, {1, 5}, {1, 1}, {1, 40}, false},  // protocol 8 (Nexa)
    {100, {0, 0}, {6, 6}, {6, 12}, {6, 169}, false}, // protocol 9 (Everflourish Single Button)
    {100, {0, 0}, {6, 6}, {6, 12}, {6, 120}, false}, // protocol 10 (Everflourish All Buttons)
};

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

Danke!
Gruß
Stefan

: Bearbeitet durch User
Autor: JJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...???

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/...

Autor: Mario M. (thelonging)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Wolfgang (Gast)
Datum:
Angehängte Dateien:

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

Wieso nicht?

Autor: Harald (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ... 433mhz Empfänger ...

Das wird nie funktionieren.

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Harald schrieb:
>> ... 433mhz Empfänger ...
>
> Das wird nie funktionieren.

Guter Einwurf ;-)

Autor: Mario M. (thelonging)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan B. (adam6de)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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).

Autor: Stefan B. (adam6de)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mario M. (thelonging)
Datum:

Bewertung
0 lesenswert
nicht 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-fernste...

Autor: Stefan B. (adam6de)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (adam6de)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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
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:
#ifdef DEBUG
  if (p > 7) // debugging protocols 8 and 9
  {
    Serial.println();
    Serial.print(F("Testing if this is protocol "));
    Serial.print(p);
    Serial.print(F(" using "));
    Serial.print(changeCount);
    Serial.print(F(" timings. PauseLengthInPulses: "));
    Serial.print(pauseLengthInPulses);
    Serial.print(F(". Delay: "));
    Serial.print(delay);
    Serial.print(F(". Delay tolerance: "));
    Serial.print(delayTolerance);
    Serial.print(F(". Received Bitlength: "));
    Serial.print(receivedBitlength);
    Serial.print(F(". First Data Timing Index: "));
    Serial.print(firstDataTiming);
    Serial.println();

    Serial.print(F("Raw timing data: "));
    for (unsigned int p = 0; p < changeCount; p++)
    {
      Serial.print(RCSwitch::timings[p]);//Hier werden die Werte übergeben.
      Serial.print(F(","));
    }
    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!

Autor: Mario M. (thelonging)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Stefan B. (adam6de)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Joachim B. (jar)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.