Forum: Mikrocontroller und Digitale Elektronik Lernfunktion für IR Signale.


von Adrian (Gast)


Lesenswert?

Hallo,
ich bin in meinem Projekt zum Stillstand gekommen. Ich muss ein Weg
finden, eine Lernfunktion der Infrarot Signale für mein AVR zu
programmieren. Es muss so funktionieren, wie inzwichen viele universale
Fernbediehnungen können: man drückt eine Taste auf irgendeiner IR
Fernbediehnung von irgendeinem Unterhaltungsgerät, µC merkt dies und
speichert den Signal im eeprom ab. Beim wiederholtem denselben Signal
werden entsprächende Funkrionen durchgeführt.
Das Programmieren an sich ist für mich kein Problemm.
Was mir fählt, ist der Logaritmus, wie man den Signal so abspeichern
kann, dass man ihn später wiedererkennen kann.
Ich brauche also nur den Prinzip, wie die Uni Fernbediehnungen das
realisieren.
Mir fehlt die Idee, wie man es machen könnte. Und wie gesagt, es geht
hier nur um die Lernfunktion. Das alles Andere habe ich bereits schon,
oder ich werde es noch machen.
Es stehen 2 Timer (8Bit 16Bit), ein Externer Interrupt zur Verfügung.
Taktfrequenz 4 Mhz. Trägefr. der Signale: 38 kHz(ein entsprächender
empfänger habe ich bereits.)
Bin gespannt auf eure Vorschläge.

von Malte Bayer (Gast)


Lesenswert?

Also geht es beispielsweise um einen Standard RC5 Code?
Das zeugs ist ja im prinzip nichts anderes als eine Bitfolge, die du
dann als einzelne Bytes im eeprom ablegen kannst...
die Bitzahl ist immer gleich und besteht (neben den
Start/Stop/Statusbits) aus einem Hersteller- und einem Gerätecode...
also im Prinzip kann dein Programm ziemlich dumm sein und die Bitfolge
die es empfängt original abspeichern und bei Bedarf vergleichen
(erneuter Empfang) und auch senden.

von Markus (Gast)


Lesenswert?

@Adrian:
Also theoretisch geht das garnicht, weil sich die Codes ja nicht
wiederholen müssen. Wenn Du z.B. auf der FB die "5" drückst und dann
das Signal aufzeichnest, dann ist ja nicht sicher, ob beim nächstenmal
wieder der gleiche Code für die "5" gesendet wird. Bei
Infrarot-Türöffnern für Autos wird das absichtlich gemacht (eben damit
man die Schlüssel nicht einfach kopieren kann), aber auch bei manchen
Fernbedienungen wird das so gemacht, damit der Empfänger unterscheiden
kann, ob eine Taste noch oder schon wieder gedrückt wird. Da ändert
sich zwar nur ein Bit, aber für Dich bedeutet das, daß der Empfänger
nur auf jeden 2. Tastendruck reagiert. Ein weiteres Problem ist, daß
manche Fernbedienungen die Signale ständig wiederholen solange die
Taste gedrückt ist. Dadurch bekommst Du zum einen ziemlich lange
Signalfolgen, die dann auch viel Speicher kosten, zum anderen darf die
Taste an der FB während der Lernphase nur ganz kurz gedrückt werden,
weil das ja die Mindestzeit vorgibt, die man die Taste in Zukunft
drücken muß.

Deshalb sage ich: Es gibt gar keine lernfähigen universellen
Fernbedienungen. Und meine Erfahrung bestätigt das: Die lernfähigen
Fernbedienungen kommen nicht mit allen Fernbedienungen klar, auch z.B.
Girder mit IgorPlug-USB nicht. Obwohl die definitiv Signale der
passenden Frequenz (also nicht z.B. 450kHz oder so) empfangen, haben
sie bei manchen Modellen schlicht Probleme.

Die Lösung des Problems besteht meiner Meinung nach darin, daß man eben
die gängigen Protokolle erkennen kann und dann nur deren Inhalt und das
Protokoll abspeichert.

Markus

von Sebastian Wille (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

man kann prinzipiell schon das "Rohformat" speichern. Entweder die
High- bzw. Low-Pegel messen (per Timer) und die Werte speichern oder
eben halt die ganz harte Tour und quasi bei jedem MC-Takt den
anliegenden Zustand speichern.

Ich habe mit eine RC5-Erkenn-Routine geschrieben, die zum speichern 2
Byte braucht. Auf die harte Tour müsste ich 16000 Byte speichern...

ABER: Das Problem, das Markus angeschsprochen hat, bleibt. Sobald
Toggle-Bit'S o.ä. auftauchen ist's ohne Protokoll-Beachtung vorbei.

Der Anhang ist auch ganz nützlich, eine Diplomarbeit von jemandem!

Sebastian

von Christof Krüger (Gast)


Lesenswert?

Von mir mal wieder ein theoretischer, möglicherweise total
unrealistischer Einwurf:
Stichwort Neuroinformatik
Habe mich damit nicht auseinandergesetzt, aber meine Freundin hat da in
der Uni mal was gemacht. Da wurden (in Matlab, und das gar nicht mal
soooo umfangreich) Neuronen modelliert, die bestimmte Muster lernten.
Nach vielen Lernwiederholungen konnten sie auch etwas verrauschte
Muster erkennen, wahrscheinlich würde auch ein Toggle-Bit wie bei RC5
durchgehen.

Ob das in einem AVR programmierbar ist, weiss ich leider selbst nicht.

von Markus (Gast)


Lesenswert?

Neuronale Netze müssen trainiert werden, damit sie wissen worauf es
ankommt. Und zwar nicht nur einmal, damit das Netz auch lernt, worin
die Unterschiede liegen. Wenn Du z.B. die Taste "5" 1,2 Sekunden
gedrückt hälst und die Taste "6" 1,5 Sekunden, dann muß das Netz
lernen, daß die Dauer eben kein Unterscheidungskriterium ist.

Ein weiteres Problem ist das lernen von zusätzlichen Codes. Angenommen,
Du hast am Anfang nur eine Fernbedienung. Dann lernt das Netz, daß der
Gerätecode keine Bedeutung hat, weil der ja immer gleich ist. Kommt
dann eine zweite Fernbedienung dazu, dann muß das Netz umtrainiert
werden, damit es die Unterschiede lernt. Dazu braucht man wohl auch
wieder Codes von der ersten Fernbedienung.

Markus

von Franz W. (franz-wa)


Lesenswert?

Hallo zusammen,

ich bin auch gerade an so einem ähnlichem Thema.
Habe mir dabei auch überlegt alle Protokolle zu speichern und soweiter 
und sofort habe mir dazu den IRMP-Artikel hier durchgelesen (find ich 
recht gut gelungen, so nebenbei).
Dennoch verstehe ich nicht wieso das ganze so schwer sein soll.
Kann man nicht einfach mit einem Phototransistor das Signal aufzeichnen.
Anhand eines Timers dann feststellen welche Frequenz das Signal dann hat 
(hier ist es ja bereits bekannt 38kHz) und dann das einfach abspeichern?
Das Problem mit den Togglebits müsste man halt dann einfach manuell 
lösen,
also nachschauen welches ist das Togglebit und dann beides akzeptieren.
Zum Thema mit den 16kbytes (is ja blöd auf so nem AVR :) ), ich würde 
einfach die bereits erlernten Signale übschreiben, wenn für die selbe 
Taste (soferns mit Tasten sein soll) ein anderen Signal kommt. Oder 
nicht?!?
Habe bisher nur die Theorie von meiner Schaltung und noch keine 
Erfahrungen beim Aufzeichnen der Signale.

wäre auch dankbar über Infos über die Problematik hier :)

danke

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Franz Wallner schrieb:
> Habe mir dabei auch überlegt alle Protokolle zu speichern und soweiter
> und sofort habe mir dazu den IRMP-Artikel hier durchgelesen (find ich
> recht gut gelungen, so nebenbei).

Danke für das Kompliment :-)

> Dennoch verstehe ich nicht wieso das ganze so schwer sein soll.
> Kann man nicht einfach mit einem Phototransistor das Signal aufzeichnen.

Du siehst dann aber auch den ganzen Dreck aus dem Umgebungslicht. Die 
IR-Empfänger (TSOPxxxx) nehmen Dir das ab. Sie sind auf eine 
Modulationsfrequenz getrimmt und filtern alles andere raus. Am Ausgang 
siehst Du dann aber nicht mehr sie Modulationsfrequenz, sondern nur noch 
die Information "Signal da" oder "Signal nicht da".

Bei einem einfachen Phototransistor musst Du eine optische (oder 
programmtechnische) Isolation gegenüber dem Umgebungslicht schaffen.

> Anhand eines Timers dann feststellen welche Frequenz das Signal dann hat
> (hier ist es ja bereits bekannt 38kHz) und dann das einfach abspeichern?

Prinzipiell ja. Dafür brauchst Du aber jede Menge Speicher, denn Du 
musst für jedes Bit die Puls-/Pausenlängen aufzeichnen.

Aber manchmal reicht es einfach nicht, die Signale "dumm" und ohne 
Hintergrundwissen aufzuzeichnen, manchmal muss man einfach "wissen", was 
sich hinter bestimmten Informationen verbirgt.

Dazu gehören:

   - Toggle-Bits bei RC5, RC6 und anderen(!) IR-Protokollen

   - Automatisch generierte Wiederholungsframes (mit teilweise
     invertieren Bits) zwecks Datenredundanz zur Erkennung von Fehlern

   - Wiederholungsframes durch längere Tastendrücke

   - Unterscheidung von langen und kurzen Tastendrücken

   - Repetition-Frames, z.B. im NEC-Protokoll für "wiederhole
     das letzte Kommando"

Das waren nur einige Punkte, es gibt aber noch einige weitere 
semantische Informationen, die Du nicht einfach aufzeichnen und dann 
abspielen kannst.

> Das Problem mit den Togglebits müsste man halt dann einfach manuell
> lösen,
> also nachschauen welches ist das Togglebit und dann beides akzeptieren.

Du musst also "Wissen" über die einzelnen Protokolle einbauen, d.h. sie 
auch erkennen und "verstehen". Wo Du dann am Schluss landest, ist 
vorherzusehen: IRMP :-)

> Zum Thema mit den 16kbytes (is ja blöd auf so nem AVR :) ), ich würde
> einfach die bereits erlernten Signale übschreiben, wenn für die selbe
> Taste (soferns mit Tasten sein soll) ein anderen Signal kommt. Oder
> nicht?!?

Rechnen wir mal aus, wieviele IR-Kommandos Du in einem EEPROM von 512 
Bytes abspeichern kannst, wenn Du sie nicht decodierst, sondern einfach 
als Scan (analog zu einer Tonbandaufnahme) speicherst. Als Beispiel 
nehmen wir das NEC-Protokoll mit einer Länge von 32 Bits. Das 
NEC-Protokoll ist heutzutage das Protokoll, was mit über 70 Prozent 
"Marktanteil" in unseren Haushalten vorzufinden ist. Und vergiss mal 
RC5. Das ist ausgestorben. Man findet das in keinem modernen Gerät mehr.

Ich rechne es mal kurz durch für NEC:

1 Start-Bit
32 Daten-Bits
1 Stop-Bit

Das macht 34 Bits. Du musst also 34 Puls- und 34 Pausenlängen speichern. 
Bei einer Auflösung von 8-Bit brauchst Du dafür 68 Bytes Speicher. Bei 
einem 512er EEPROM kannst Du so maximal 7 Tasten abspeichern. Nur: die 
Signal-Längen unterscheiden sich bei bestimmten IR-Protokollen um 
mehrere Größenordnungen, so dass Du mit einem 8-Bit-Zähler auch bei 
geschickter Wahl der Scan-Frequenz nicht auskommen wirst. Du brauchst 
also 16-Bit-Zähler und damit auch 16-Bit-Werte im EEPROM. Damit halbiert 
sich die Zahl der abspeicherbaren Kommandos auf lächerliche 3 Tasten. 
Dabei habe ich die dazugehörige Modulationsfrequenz mal ganz 
weggelassen.

Bei anderen Protokollen siehts noch schlimmer aus, da können bei einem 
einzelnen kurzen(!) Tastendruck bis zu 3 Frames rausgeschickt werden 
(z.B. SIRCS). Nach einem Tastendruck wäre dann schon Dein EEPROM voll! 
Andere Protokolle haben bis zu 48 Bits (z.B. Kaseikyo) mit bis zu 3 
Startbits. Da sind es auch nur noch 2 Tasten, die Du abspeichern 
könntest.

Bei IRMP wird ein kompletter IR-Frame in einer Datenstruktur von 6 Bytes 
gespeichert. Damit kannst Du 85 verschiedene Kommandos in einem 512 
Byte-EEPROM abspeichern. Das kann man sogar noch auf über 100 erhöhen, 
wenn man die Datenstruktur etwas kompakter ablegt (z.b. Protokollnummer 
und Flag in ein Byte schiebt).

Aber selbst, wenn Du jede Menge Speicher hast, wirst Du Dir wegen der 
fehlenden Semantikfunktion Deines Aufzeichnungsgedankens jede Menge 
unlösbare Probleme einhandeln. Es wird nie "richtig" funktionieren.

Gruß,

Frank

von Manfred S. (Firma: Manfred) (xfred343)


Lesenswert?

Interessant, ich habe den Gedanken weitergeführt und eine gut 90%ige 
Lösung (also 9 von 10 FBs) funktionieren gefunden, dabei analysiere ich 
nach Zeitklassen (kurz=0, lang=1, darüber=Ende einer Sequenz) und 
speichere bis zu 120 Bit/IR-Befehl im EEPROM, für 16 Befehle benötige 
ich daher 16x15=300 Bytes + 16 Verwaltungsbytes=316 Bytes im EEPROM, bei 
Bedarf können aber durch einfaches Ändern der Konstante mehr oder 
weniger Befehle gelernt werden.

Hier gibts mehr: Beitrag "Atmega - Jede beliebige IR-Fernbedienung erkennen"

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.