Forum: Mikrocontroller und Digitale Elektronik IR Protokoll auslesen und mit µC wiedergeben


von Dirk (Gast)


Lesenswert?

Hallo

Nach einem Hinweis hier in Forum habe ich mit meinem kleinen 
LogicAnalyzer die Befehle der Fernbedienung an einen RGB Controller 
ausgelesen.

Das war ja noch recht einfach und ich glaube zu verstehen was ich getan 
habe.
Jetzt habe ich mit den Befehl für die Farbe Rot mal als Datei 
exportiert:
1
Time [s],Value,Parity Error,Framing Error
2
-0.009035416666667,'0',,Error
3
0.004481000000000,'0',,Error
4
0.005641041666667,'0',,Error
5
0.006776000000000,'0',,Error
6
0.007860125000000,'0',,Error
7
0.009019208333333,'0',,Error
8
0.010154583333333,'0',,Error
9
0.011237083333333,'0',,Error
10
0.012397333333333,'0',,Error
11
0.013531958333333,'0',,Error
12
0.015774000000000,'0',,Error
13
0.017992916666667,'0',,Error
14
0.020284833333333,'0',,Error
15
0.022527458333333,'0',,Error
16
0.024743791666667,'0',,Error
17
0.027038625000000,'0',,Error
18
0.029254833333333,'0',,Error
19
0.031497291666667,'0',,Error
20
0.032658083333333,'0',,Error
21
0.033792625000000,'0',,Error
22
0.034875291666667,'0',,Error
23
0.037170041666667,'0',,Error
24
0.039412041666667,'0',,Error
25
0.040547041666667,'0',,Error
26
0.042790083333333,'0',,Error
27
0.043923083333333,'0',,Error
28
0.046165250000000,'0',,Error
29
0.048383875000000,'0',,Error
30
0.050651208333333,'0',,Error
31
0.051784833333333,'0',,Error
32
0.052919500000000,'0',,Error
33
0.055135208333333,'0',,Error
34
0.056296958333333,'0',,Error
35
0.058514541666667,'0',,Error
36
0.099018625000000,'0',,Error
37
0.110292541666667,'0',,Error
38
0.667000958333333,'255',,

Meine große Frage ist: Wie bekomme ich daraus einen Code für meinen 
Arduino?

Danke Dirk

P.S.
Die Software ist Salea Logic und ich habe keine Einstellung verändert

von W.A. (Gast)


Lesenswert?

Dirk schrieb:
> Meine große Frage ist: Wie bekomme ich daraus einen Code für meinen
> Arduino?

Daraus gar nicht. Was du da exportiert hast, ist im wesentlichen eine 
Liste mit Abtastzeitpunkten zu denen das Signal offensichtlich 0 war, 
bis auf die letzte Zeile, die aber vom Timestamp völlig aus der Reihe 
liegt.

> P.S.
> Die Software ist Salea Logic und ich habe keine Einstellung verändert

Das hättest du vielleicht vor dem Export tun sollen.

von Sebastian S. (amateur)


Lesenswert?

>Das war ja noch recht einfach und ich glaube zu verstehen was ich getan
>habe.
Es ist ja wirklich schön, dass Du weist, was Du tust!

Vielleicht lässt Du uns ja an Deinem Wissen teilhaben?

Ich jedenfalls habe, wie der eine oder andere auch, keinen Dingsbums.

Ich weiß auch nicht, wie Du an die Daten gekommen bist.

Vielleicht beschreibst Du mal den Versuchs- bzw. Messaufbau.

Muss aber nicht sein.

von Georg A. (georga)


Lesenswert?

Klar kann man dumm einfach nur die Timings samplen und wieder 
rausnudeln, so wie es diverse lernfähige Fernbedienungen auch machen. 
Solange es sich aber nur im einn Typ handelt, ist es deutlich 
sinnvoller, sich aus den Timings das das zugrunde liegende 
Modulationsschema rauszuziehen und wie die Struktur der Bits in dem 
Codeword ist.

Dirk schrieb:
> Das war ja noch recht einfach und ich glaube zu verstehen was ich getan
> habe.

Ich verstehe es nicht und ich habe schon dutzende IR-FBs 
reverse-engineered und Empfänger/Sender in SW dafür geschrieben... Der 
Dump macht keinen Sinn, weil es keine Info über die Längen der 1-Pulse 
gibt. Ist auch recht unwahrscheinlich, dass ein Codeword fast 60ms 
dauert.

von batman (Gast)


Lesenswert?

Da wärst du evt. mit IRMP besser gefahren. Das hat eine Scanfunktion für 
IR-Übertragungen und vielleicht schon das Protokoll implementiert.

von Dirk (Gast)


Angehängte Dateien:

Lesenswert?

Nabend

Also mein Messaufbau war dann doch recht einfach:

Das Gehäuse von dem Controller geöffnet und drei Leitungen zu der IR 
Diode gefunden.
(Damit ist es scheinbar keine Diode mehr?)
Die Mittlere Leitung liegt auf GND.
Also die GND Klemme des LA auf die Mitte gesetzt und erst die eine,
dann die andere Leitung auf einen Kananl des LA gelegt.

Bei einem Kanal kam nix an, bei dem anderen das, was ich exportiert 
habe.

Als ich geschrieben habe, dass och verstanden habe was ich da mache, 
meinte ich, dass ich mit dem LA die Befehle, die die IR Diode empfängt 
und an den Chip im Controller weitergibt sichtbar machen kann.
Es scheint aber nicht so einfach zu sein, wie ich es mir gedacht habe,
daher frage  ich nach.

Ich habe mal eine Screenshon angehängt,
vielleicht ist der aussagekräftiger als die Textdatei.

Wenn mir jemand mit den Einstellungen helfen kann, wenn notwendig, wäre 
ich sehr dankbar.

In meiner blauäugigkeit würde ich jetzt einfach mal versuchen das so 
nachzubauen:

digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(9);
digitalWrite(ledPin, HIGH);
delay(4.5);
digitalWrite(ledPin, LOW);
delay(0.5);

und so weiter.


Danke Dirk

von batman (Gast)


Lesenswert?

Dirk schrieb:
> Das Gehäuse von dem Controller geöffnet und drei Leitungen zu der IR
> Diode gefunden.
> (Damit ist es scheinbar keine Diode mehr?)

Bingo, vmtl. ein integrierter IR-Receiver, der einen gefilterten, 
demodulierten Manchester-Code an den Controller gibt.
Der genaue Typ (Aufdruck) des Receivers verrät die Trägerfrequenz, nach 
Abzählen der Bits in der Sendung etc. kommt man evt. auf ein bekanntes 
Protokoll.

von Hmmm (Gast)


Lesenswert?

Dirk schrieb:
> Bei einem Kanal kam nix an, bei dem anderen das, was ich exportiert
> habe.

Das sieht danach aus:

http://www.instructables.com/id/Reverse-Engineering-RGB-LED-Bulb-with-IR-remote/

> In meiner blauäugigkeit würde ich jetzt einfach mal versuchen das so
> nachzubauen:

Das wird nichts, bei einer einfachen IR-LED musst Du die 38kHz selbst 
erzeugen. High-Pegel in Deinem Screenshot entspricht "LED dunkel", die 
Low-Pegel sind die 38kHz-Bursts.

von Wolfgang (Gast)


Lesenswert?

Hmmm schrieb:
> Das wird nichts, bei einer einfachen IR-LED musst Du die 38kHz selbst
> erzeugen. High-Pegel in Deinem Screenshot entspricht "LED dunkel", die
> Low-Pegel sind die 38kHz-Bursts.

Die 38kHz muss man nur erzeugen, wenn man mit dem µC-Signal eine 
IR-Diode zur Fernsteuerung betreiben möchte. Falls man den IR-Empfänger 
vom Controler entfernt und statt dessen dort ein mit dem µC selbst 
generiertes Signal einspeist, muss man genau das Signal nachbauen, was 
man jetzt mit dem LA misst.

von W.A. (Gast)


Lesenswert?

Dirk schrieb:
> Ich habe mal eine Screenshon angehängt,
> vielleicht ist der aussagekräftiger als die Textdatei.

Jedenfalls allemal besser als eine Textdatei ohne nützlichen Inhalt ;-)

Der eine oder andere würde wohl auch etwas mit der Capture-Datei 
anfangen können. Dann kann man gleich rein gucken und muss sie nicht 
erst wieder mühsam visualisieren. (Vorher Trigger festlegen und 
Aufzeichnungslänge passend setzen)

Für den Export probier doch mal sinnvolle Einstellungen, i.e.
 - Zeitmarken für den relevanten Zeitbereich setzen (Taste 1, 2)

Beim Export
 - Kanalauswahl auf den Kanal mit dem Signal beschränken
 - Samples zwischen den Zeitmarken
 - Ausgabe der Flanken (Output one Row per Change)

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Ist das dieses Ding hier?
https://www.led-universum.de/led-universum-24-tasten-fernbedienung-fuer-rgb-led-streifen.html

Die Controller benutzen das gute alte NEC Protokoll mit Geräte Adresse 
0xEF00.

Die Tasten sind von links nach rechts und von oben nach unten 
durchnummeriert. Oben links fängt es mit Code 0x0000 an, die ON Taste 
hat z.B. Code 0x0003. Reines Rot mit 0x0004 und reines Blau mit 0x0006.
Tipp: Lade dir auf deinen Arduino IRMP mit vielen freigeschalteten 
Protokollen und hänge ein LC Display mit dran. Dann hast du einen recht 
universellen IR Dekoder.

: Bearbeitet durch User
von W.A. (Gast)


Lesenswert?


von Joachim B. (jar)


Lesenswert?

Matthias S. schrieb:
> Ist das dieses Ding hier?
> 
https://www.led-universum.de/led-universum-24-tasten-fernbedienung-fuer-rgb-led-streifen.html

dann ist es NEC und IRMP ist gut geeignet.

Beitrag "Re: Minutengenaue 24 Stunden-Wortuhr - wer will mitbauen?"

1
#ifdef IRMP_SUPPORT_NEC_PROTOCOL
2
        case IRMP_NEC_PROTOCOL: DEBUG_PRINT(F("IR: ")); DEBUG_PRINT(F("NEC")); DEBUG_PRINT(F(", Address: ")); DEBUG_PRINT(irmp_data.address); DEBUG_PRINT(F(", Command: ")); DEBUG_PRINTLN(irmp_data.command); 
3
          if (irmp_data.flags & IRMP_FLAG_REPETITION)
4
          { // Benutzer hält die Taste länger runter  // entweder:  //   ich ignoriere die (Wiederholungs-)Taste
5
            // oder:  //   ich benutze diese Info, um einen Repeat-Effekt zu nutzen
6
  #ifndef BIG_FB
7
            if(irmp_data.address==RGB_LED_FB && (irmp_data.command==HELL_UP)  && led_hell<MAX_LEDHELL)
8
            { led_hell++;
9
10
// ...... Schnipsel

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Joachim B. schrieb:
> dann ist es NEC und IRMP ist gut geeignet.

Mit den Dingern und IRSND habe ich mal eine nette kleine Kickerarena 
ausgestattet. IRSND wird von Piezoscheiben hinter den Toren getriggert 
und blinkt rot beim Tor für das rote Team und blau für das blaue Team. 
Dreimal flashen, dann schaltet es wieder auf weiss :-)

von Georg M. (g_m)


Lesenswert?


von Hmmm (Gast)


Lesenswert?

Wolfgang schrieb:
> Hmmm schrieb:
> Das wird nichts, bei einer einfachen IR-LED musst Du die 38kHz selbst
> erzeugen. High-Pegel in Deinem Screenshot entspricht "LED dunkel", die
> Low-Pegel sind die 38kHz-Bursts.
>
> Die 38kHz muss man nur erzeugen, wenn man mit dem µC-Signal eine
> IR-Diode zur Fernsteuerung betreiben möchte.

Klar, ich ging bloss bei der Bezeichnung "ledPin" davon aus, dass eine 
IR-LED verwendet werden soll.

von A. S. (Gast)


Lesenswert?

Ich hab jetzt nicht jeden Link verfolgt, aber hat dem TO eigentlich 
schon jemand mal gesagt, dass sein Logic-Mitschnitt wertlos ist?

Für mich sieht das nicht wie ein UART-signal aus. Also sollte er doch 
erstmal den Analyser auf einfaches Samplen stellen (wenn er kein Oszi 
hat) um Herauszufinden, ob es

IRDA ist (kurze Impulse von etwa 1µs)
oder ein Frequenzsignal (High/low etwa 50%)

Und dann dementsprechend weiter zu forschen.

von W.A. (Gast)


Lesenswert?

Achim S. schrieb:
> Ich hab jetzt nicht jeden Link verfolgt, aber hat dem TO eigentlich
> schon jemand mal gesagt, dass sein Logic-Mitschnitt wertlos ist?

So schlecht sieht das doch gar nicht aus

Dirk schrieb:
> LA.jpg

von Jacko (Gast)


Lesenswert?

Nach der undurchsichtigen Zeitauflistung war ja der Plot
vom Analyzer etwas aufschlussreicher.

Aber was soll jetzt
> digitalWrite(ledPin, HIGH);
> delay(1000);
> digitalWrite(ledPin, LOW);
> delay(9);
> digitalWrite(ledPin, HIGH);
> delay(4.5);
> digitalWrite(ledPin, LOW);
> delay(0.5);
für dein Vorhabeb bringen?

Ein IR-Signal wird für die im Code vorgesehene Dauer von Logisch
NULL mit z.B. 36 kHz pulsierend eingeschaltet, für die Dauer von
Logisch EINS macht es Pause.
Dein L.A.-Plot zeigt die Umhüllende davon (oder, je nach Abtastrate
vielleicht auch irreführende Alias-Signale)...

Sollte der Plot stimmen, hast du auf den ersten Blick nach einer
Startsequenz (lange NULL, etwa halb so lange EINS eine Codierung
des Signals mit variabler Pausendauer.

Die Länge der Pause entspricht einer EINS, oder einer NULL im
eigentlichen FB-Code.

Bevor du mit dem delay-Unsinn lospfriemelst, schau dir erst mal
ALLE möglichen Codes an und such mal nach dem Muster:

Meist ist ein Teil des Codes für das GERÄT (Adresse = konstant)
und ein Teil der eigentliche BEFEHL (bei jedem Befehl anders).

Wenn du das ermittelt hast, überlegen wir uns mal eine
Strategie, die ganzen FB-Knöpfe OPTIMIERT und WIRKSAM zu senden!

Für die Erfassung des ECHTEN IR-Signals könnte ich auch noch eine
Schaltung anbieten. Denn:
Je näher am Original-Signal, desto klappt's.   ;-)

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.