PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : (universeller) Infrarot-Empfang



Bumbum
22.02.2013, 16:37
Hallo,

wie im anderen Thread bereits „erarbeitet“ würde ich gerne eine Kommunikation im Raum mit Infrarot versuchen. Dazu habe ich mir einen TSOP31236 Empfänger bestellt und mache gerade damit erste Versuche. Leider klappt das auslesen einer Fernbedienung schon mal nicht. Ich bin einfach mal davon Ausgegangen, dass die Fernbedienung RC-5 sendet, weiß es allerdings nicht. Es handelt sich um die Fernbedienung meines Media-Receivers von der Telekom.

Der Empfänger empfängt auf jeden Fall was, wenn ich eine Taste auf der Fernbedienung drücke. Das habe ich am Atmel und am Oszi überprüft. Ich habe INT0 auf die fallende Flanke konfiguriert und ein einfaches Hauptprogramm gestrickt:



ISR (INT0_vect)
{
IR_CaptureReady = TRUE;
}

int main (void)
{
if (IR_CaptureReady)
{
U32 tmp = 1;
U8 i1;
for (i1 = 0; i1 < 14; i1++)
{
_delay_us (1778);
tmp = tmp<<1;
if ((PIND & (1<<PD2)) == 0)
tmp = tmp | 1;

for (i1 = 0; i1 < 14; i1++)
{
if ((tmp & 1) == 0)
sendMsg ("0", FALSE);
else
sendMsg ("1", FALSE);
tmp = (tmp>>1);
}
sendMsg ("\r\n", FALSE);

IR_CaptureReady = FALSE;
}
}


Die Funktion sendMsg sendet mir den String über die UART-Schnittstelle an meinen PC wo ich ihn via Hyperterminal ansehe. Meisstens empfange 00000000000001. Manchmal 00000000000111. Aber nie etwas RC5-ähnliches oder mehr.

Ich habe daraufhin mal versucht ein Video vom Empfang der Daten aufzuzeichnen:

http://www.car-mp3.de/RNetz/IR_Messung.zip

Dabei habe ich am Anfang die Taste 1 der Fernbedienung gedrückt gehalten und später immer mal kurz gedrückt. Hier sieht man die Einstellungen meines historisches Oszis:

24610

Wie man an der Zeitbasis von 500µS/cm sieht müssten die „Halbbits“ der Übertragung ca. 889µS lang sein Könnte also sogar RC-5 oder was ähnliches sein. Auf jeden Fall müsste ich etwas anderes Empfangen als 13 mal die 0.

Wie würdet ihr weiter vorgehen? Bei diesem Versuch möchte ich eine Routine erstellen, die mir möglichst viele Fernbedienungen einlesen kann. Der Plan dazu ist es in bestimmten Zeitabständen das empfangene Signal via Timer-Interrupt abzutasten.

Welches Intervall wäre dafür Empfehlenswert und wie lange sollte ich versuchen abzutasten?

Hat jemand eine Idee, was ich bei meinem Empfangsversuch falsch mache?

Viele Grüße
Andreas

Searcher
22.02.2013, 18:24
Hallo Bumbum,


Ich bin einfach mal davon Ausgegangen, dass die Fernbedienung RC-5 sendet, weiß es allerdings nicht. Es handelt sich um die Fernbedienung meines Media-Receivers von der Telekom.
ich bin nicht der C-Spezialist und weis nicht, ob folgende Vorgehensweise für Dich akzeptabel ist:

Um eine RC5 Fernbedienung in Deinem Umfeld auszumachen, kurz auf BASCOM umsteigen. Beispielprogramm in der BASCOM Hilfe hat bei mir (nach Portanpassungen) sofort funktioniert. Vorteil: Vorgefertigte Kommandos für RC5, keine Unsicherheit ob der Code nicht geht oder die Fernbedienung keine RC5 ist.

Gruß
Searcher

Searcher
23.02.2013, 09:30
Hallo,
die Monster-TSOP31236 (die sind echt groß) hab ich auch kürzlich bekommen und jetzt ausprobiert. Hab Dir mal von meiner RC5 Fernbedienung ein paar Oszillogramme in verschiedenen Auflösungen angehangen.
Sie zeigen jedesmal die Ziffer 1. Bei jeder neu gesendeten Ziffer wird das Togglebit gegenüber des vorhergehenden invertiert. Das letzte Oszillogramm zeigt die gedrückt gehaltene Ziffer 1; auch hier wird das Togglebit bei jedem Ziffernburst invertiert.

Hoffe hilft Dir irgendwie weiter.

Gruß
Searcher

Bumbum
23.02.2013, 15:11
Hallo Searcher,

vielen Dank für deine Mühe.
Wie ein RC5-Signal aufgebaut ist findet man ja oft genug im Internet. Ein Bit setzt sich aus zwei Halbbits je 889µS zusammen. Wenn die Halbbits 0b01 sind ist es eine übertragene 1, wenn die Halbits 0b10 sind ist es eine übertragene 0. Das kann man auch schön in deinen Oszi-Diagrammen sehen.
Ich habe leider nur dieses antike Oszi und das Signal damit darzustellen ist echt schwer.
Ich bin aber der Meinung, dass das Timing meines Signals zumindest ähnlich ist und somit müsste ich mit meinem Code eigentlich was empfangen.

Vielleicht kann sich das ja der eine oder andere das Video auch mal genauer anschauen und eine Schätzung hier posten?

Aber wie der Thread-Titel schon sagt geht es mir gar nicht darum unbedingt RC5 zu empfangen, sondern wenn möglich so viele Fernbedienungen wie möglich. Dabei geht es mir jetzt erst mal um die optimale Abtatsfrequenz und wie lange maximal abgetastet werden sollte.

Viele Grüße
Andreas

Searcher
23.02.2013, 17:17
Hallo, ich möchte Dir RC5 nicht aufdrücken, dachte nur, daß Du dann eine Referenz hättest, weist was Du schickst und was dann rauskommen muß
Ich habe leider nur dieses antike Oszi und das Signal damit darzustellen ist echt schwer. Hatte mir das Video angeschaut und kann das nachvollziehen. Bevor ich eins hatte, habe ich mit einem Soundkartenoszi gearbeitet. Das müste hier auch gut geeignet sein. Der TSOP hat vom Ausgang einen internen Pullup von 30 kOhm. Ich würde da einen 5kOhm vom Ausgang nach GND schalten; das müßte als Spannungsteiler für einen Line In einer Soundkarte in Ordnung sein. Da läßt sich dann am PC das Signal ganz gut analysieren. Ohne Gewähr und auf eigene Gefahr. Im Netz findet man verschiedene Beschaltungsmöglichkeiten dafür.

PS Signal müsste mit einem Transistor eventuell noch invertiert weden.
PS2 und noch ein Gedanke: optimale Abtastfrequenz müßte doch 36kHz, 38kHz oder für alle Fälle 40kHz sein?

Gruß
Searcher

sternst
25.02.2013, 16:08
Ich bin einfach mal davon Ausgegangen, dass die Fernbedienung RC-5 sendet, weiß es allerdings nicht. Es handelt sich um die Fernbedienung meines Media-Receivers von der Telekom.RC5 ist wohl das best-dokumentierte Format, und daher das bekannteste und beliebteste unter Bastlern. Im kommerziellen Umfeld findet man es eher selten, und in halbwegs aktuellen Produkten praktisch gar nicht. Die Wahrscheinlichkeit, dass "die Fernbedienung meines Media-Receivers von der Telekom" RC5 verwendet, geht gegen Null.

Bumbum
25.02.2013, 19:26
Hallo,

die Problematik des Empfangs habe ich erst mal vor mich her geschoben. Ich habe über das Wochenende die Hardware zusammengebaut für die ich den IR-Empfang verwenden möchte. Bis jetzt habe ich den TSOP nur am STK500 getestet.
Quasi mal nicht an das Problem denken, dann findet sich die Lösung meisst von alleine.
Vorhin war ich fertig und die Zielhardware ist gelaufen. Ab morgen kann ich wieder mit dem Empfang experimentieren.

36kHz scheint tatsächlich das beste zu sein, da kann ich nichts verpassen. Mal schauen, ob der Atmel das schafft. Mir ist auch vorhin tatsächlich beim Nicht-Dran-Denken eine mögliche Lösung eingefallen, warum ich nur Quatsch empfange, obwohl das Timing grob passen müsste: Mein Zeitfenster ist zu kurz. Ich werde morgen mal die Anzahl der Bits erweitern auf mindestens 48 oder noch mehr, wenn es erforderlich sein sollte. Damit sollte ich dann ein passendes Signal auswerten können.
Falls ich das Timing auf 36kHz ändere brauche ich aber wohl noch viel mehr Bits.Das wären ja dann nur 1,3ms bei 48 Bits. RC5 hat ja eine Übertragungslänge von fast 25ms und ich glaube mein Signal von "der Fernedienung meines Media-Receivers" ist noch länger.

Viele Grüße
Andreas

oberallgeier
25.02.2013, 19:59
... Quasi mal nicht an das Problem denken, dann findet sich die Lösung meisst von alleine ...Whow! Cool. Krieg ich nicht hin.


... 36kHz scheint tatsächlich das beste zu sein ... Mal schauen, ob der Atmel das schafft ...Also mein RC5-Decoding (C, mega328 u.ä./20 MHz) geht in einer ISR, die mit 20 kHz tickert und - unter anderem - auf die Flanken des RC5-Codes lauert. Bei den 889µs für ein isoliertes High geht das prima.


... Mein Zeitfenster ist zu kurz ... die Anzahl der Bits ... mindestens 48 ...Du sprichst schon von RC5!? Bei mir hat das komplette Telegramm grad mal 14 Bit. 2 Start-, 1 Toggle-, 5 Adress- und 6 Datenbits. Wobei eine (übliche, Flohmarkt-) RC5-Steuerung oft nur für den Fernseher ist und der hat die Adresse 0.

oberallgeier
26.02.2013, 14:21
Nachtrag: Als Testausgabe bei Tastendruck auf die Fernsteuerung gibts bei mir aufs Terminal von br@y beispielsweise so etwas wie im Codefenster unten:
Bitmuster der gesamten Codesequenz, dezimale Entsprechung des sechsbittigen Befehlsbytes, Zeitdauer der Dekodierung vom Beginn des Codes bis zum Ende. Man kann auch schön die Funktion des Toggelbits (Bit 3) erkennen.

Zum Zeitbedarf, hier in 50µs-tupsi (tupsi ist so "meine" traditionelle Zeiteinheit): 482 tupsi zu 50 µs sind 24,2 ms; da das erste Halbbit fehlt - es kann ja erst auf die erste Flanke des Datentelegramms getriggert werden, die ist aber in der Mitte vom Startbit 1 - komme ich ziemlich genau auf die fast 25 ms der gesamten Telegrammlänge.


...Anmerkung: div-ID-Informationen...
I2C-Slave ist Adresse : 132 dez = 0x84 ,
Gute Funktion mit extINT2 für RC-5
Aktuell - Zur-Verfügung-Stellung des RC-5-Code
...

Bitte um Aktion _
11000000010100 => dez: 20 , RCges_zt = 483
11100000011001 => dez: 25 , RCges_zt = 482
11000000100011 => dez: 35 , RCges_zt = 482
11100000011011 => dez: 27 , RCges_zt = 482
11000000001010 => dez: 10 , RCges_zt = 484
11100000000110 => dez: 6 , RCges_zt = 483

Bumbum
26.02.2013, 18:18
Hallo und Hilfe!

Dieses RC5, dass ich im ersten Posting kurz erwähnt habe wird mich wohl jetzt ewig verfolgen. :-) Im itel und hier im Thread habe ich erwähnt, dass es mir um einen möglichst universellen Empfang von den verschiedensten Fernbedienungen geht.

Aber ich habe heute die Lösung gefunden. Es war tatsächlich das Zeitfenster der Aufzeichnung. (Ich habe mich da zu sehr auf RC5 versteift ;-) )

Ich habe zunächst die Abtastrate auf 36 kHz gestellt und dann das Zeitfenster so lange vergrößert bis am Ende mindestens eine handvoll Nullen empfangen wurden. Das waren bei meiner Beispiel-Fernbedienung (Media Receiver) dann insgesamt ca. 60 Bytes. Ich bin also mit der Abtatsrate immer wieder auf die halbe Frequenz bis das Ergebnis bei 4500 Hz dann perfekt war. Damit empfange ich insgesamt 7 Byte Daten. Und die empfangen Daten sind auch bei jeder gedrückten Taste anders, bzw. wenn ich eine Taster öfter drücke immer wieder gleich. Perfekt!
Jetzt muss ich nur noch ein paar andere Fernbedienungen probieren, ob die 4500 Hz und mein Zeitfenster von 8 Byte für alle ausreichend ist.

Viele Grüße
Andreas

oberallgeier
26.02.2013, 19:48
... einen möglichst universellen Empfang von den verschiedensten Fernbedienungen ...Alle Achtung, eine möglichst allgemeines Encoding. Ist sicher ne ziemlich stramme Leistung.

Es gibt ja Puls Distance Encoding, Pulse Weiten Codierung, Biphasencodierung (NRZ, Manchester..). Pulse mit 10µs, 320 µs, 500 µs, 526 µs, 560 µs (ich will nicht langweilen und alle zusammensuchen). Nullen sind beim PulsDistanzCode meist um die 1 ms lang (1,00, 1,05, 1,12), die Einsen sind dann doppelt so lange (keine Gewähr dass es immer so ist). Ausnahme bildet der PulsDistanzCode von ITT, bei dem die Nullen 100 µs und die Einsen 200 µs bei 10µs langen Pulsen sind - ich weiß nicht, mit welchen IR-Empfängern die den Code schaffen.

Codes benutzen häufig Trägerfrequenzen von 38 kHz, ich glaube, dass dies die übliche Modulationsfrequenz ist, es gibt aber auch 40 kHz, 36 kHz - und vielleicht noch etliche andere (ich glaub irgendetwas mit 55 kHZ?).

Ähnlich unterschiedlich wie der Code und Modulationsfrequenz ist der Telegrammaufbau. 4Bit-A/6Bit-B (A.. Adressbyte, B..Befehlsbyte, IA bzw. IB sind invertierte Bytes), 8Bit-A/8Bit-B, 8Bit-A/8Bit-IA/8Bit-B/8Bit-IB, 8Bit-B/4Bit-A/4Bit-Subcode, 5Bit-A/8BitC+Expansion+Check ... dabei habe ich jetzt noch nicht vom RC-5 und seinen Nachfolgern von Philips geschrieben.

Also ich denke, dass es ne recht hübsche Aufgabe wird, nur einige der häufigeren Codes zu decodieren. Aber ich will Dir keinesfalls den Elan nehmen.

Nachtrag: dazu kommen natürlich noch Fernsteuerungen für digitale "Bilderrahmen", Fotoapparate etc. Davon kenne ich nur einige Foto-Fernsteuerungen. Die sind dann wirklich einfach . . . .

Nochn Nachtrag, dadurch wirds nicht einfacher. Die verschiedenen Telegramme haben wohl immer verschiedene Startsequenzen, die sehr häufig nicht ins Zeitmuster der einzelnen Bits passen.
Und als Resumee: der RC-5 ist im Vergleich zu anderen Codes/Telegrammen einfach aufgebaut und einfach zu dekodieren *ggg*.

Bumbum
27.02.2013, 18:20
Hallo Oberallgeier,

ich wußte tatsächlich nicht, dass es so viele verschiedene Methoden gibt. Aber mir ist nach dem lesen deines Beitrags erst bewußt geworden, dass ich eine wichtige Information gar nicht geschrieben habe da ich davon ausgegangen bin das dies eh klar ist: Ich möchte die empfangen Codes gar nicht decodieren, sondern den Atmel damit nur anlernen. Man drückt quasi eine Taste "Jetzt Aufpassen", dann drückt man die Taste der Fernbedienung und der Atmel speichert den Empfangenen Code um dann später, falls dieser IR-Code wieder empfangen wird eine Aktion zu starten.

Aber ich sehe schon, das Ganze ist wieder mal viel komplizierter wie ich ursprünglich gedacht habe.

Viele Grüße
Andreas

Bumbum
03.03.2013, 16:54
Hallo nochmal,

hier noch mein End-Bericht: Das Ziel war tatsächlich zu hoch gesteckt. Kurz formuliert hat Oberallgeier in allen Punkten recht. Es gibt einfach zu viele verschiedene Protokolle, Frequenzen, Übertragungsarten, etc.
Nachdem ich eine Fernbedienung aus meinem Besitz sauber hinbekommen habe wollte ich es mit einer anderen probieren und musste schon Parameter anpassen, wodurch dann die erste nicht mehr sauber erkannt wurde. Eine dritte wollte ich dann gar nicht mehr dazu holen.
Ich war da wohl etwas blauäuig und dachte ich kann einfach das gesendete Bitmuster speichern und vergleichen. Aber selbst bei RC5 ist dies durch das Toogle-Bit schon nicht möglich. Eine genaue Protokol-Analyse müsste her, was aber durch die vielzahl der existierenden Protokolle zuviel des Guten wäre.

Ich habe also eine RC5-Fernbedienung genommen und die Software darauf optimiert. Man war das einfach nach meiner Odysee. :-)

Viele Grüße
Andreas