PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : IR RC dekodieren



linux_80
19.02.2007, 15:42
Hallo,

bei Pollin gibts z.Zt. eine Fernbedienung u.a. mit Joystick drauf:
http://www.pollin.de/shop/images/article/small/K620134.JPG (http://www.pollin.de/shop/detail.php?pg=Ng==&a=NTY4OTczOTk=&ts=0)

So eine hab ich schon länger hier rumliegen, aber nie genauer damit befasst, ausser herausgefunden, das die interesanten Tasten kein RC5 o.ä bekanntes aussenden.
Jetzt hab ich aber endlich eine RC-visu gebaut:
https://www.roboternetz.de/phpBB2/album_thumbnail.php?pic_id=1260 (https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=1260)

Die Tasten erzeugen diese Ausgabe, nach dem TSOP:
https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=1259

Die Linie in der Mitte trennt den Teil der bei allen gleich ist (linke Seite), von dem der bei jeder Taste unterschiedlich ist.
Der kürzeste Abschnitt ist ca. 0,6ms lang (mit Oszi gemessen).
Da die Codes unterschiedlich lang sind, nehme ich mal an, das der letzte Teil von den kürzeren noch als Low dazugehört :-k

Ich hab schon alle RC Seiten durch, aber dieser Code passt zu keinem die ich gefunden habe.


Wie kann man dies jetzt am besten decodieren, um damit digital weiterverarbeitet zu werden ?


PS:
Zu dieser FB gäbe es auch noch eine QUERTZ-Tastatur (gleicher IR-Code), evtl. gibts die ja auch mal bei Pollin :-k
https://www.roboternetz.de/phpBB2/album_thumbnail.php?pic_id=1261 (https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=1261)
Hier hab ich mir noch nicht die Arbeit gemacht den Code abzuschreiben #-o

linux_80
03.08.2008, 23:12
Hi,

hab diese Woche gesehen, das es nun diese Tastatur (SWK-8650) auch beim Pollin gibt:
http://www.pollin.de/shop/detail.php?pg=Ng==&a=MDk5ODgyOTk=&ts=20

Programm hab ich immer noch keins, aber die Codes visualisiert,
mit einem TSOPxx36 kommt das an (siehe PDF im Anhang).

So wie ich das bis jetzt sehe sind das 9 Bit Nutzdaten, die ersten 9 Bit kann man wohl als Startsequenz betrachten.

linux_80
05.08.2008, 01:40
Hallo,

hab mich nun doch hingesetzt, und die Sache entschlüsselt.
Es ist eine Sub draus geworden, die den Code, so wie er im PDF von oben zu finden ist, zurückgibt.
Da dies so komische Werte sind, wandle ich diese mit einer Tabelle um.
Dann nur für diesen Test nochmal mit einer 2. Tabelle um das in was lesbares zu bringen.
Da es die TV-RC und die Tatatur getrennt gab, habe ich die Codes so zusammengestellt, dass man je nach verwendetem Gerät nur die eine oder andere Tabelle braucht, oder beide wenn man eben beides hat ;-)

Noch was zur Tabelle, die Codes sind zwar auf 9 Bit verteilt, überschneiden sich aber nicht, deshalb hab ich das 9. Bit einfach weggelassen um in der Tabelle zu suchen !

Buchstaben und Zahlen habe ich nach Möglichkeit an die ASCII-Stelle in der Tabelle gelegt, dass man nicht unbedingt weiter umwandeln müsste.
Die Sondertasten wie Shift usw. sind zum Schluss, somit kann man nur durch die Nummer >= 113 abfragen und merken falls man das auswerten will.

Während dieser bastelei bin ich noch drauf gekommen, dass wenn die TV-RC neu ist, also Batterie frisch eingelegt, alle anderen Tasten auch diesen IR-Code aussenden, so kann man unterscheiden, ob die "1" von der Tastatur oder RC gekommen ist.
Es gibt aber trotzdem ein paar Tasten die bei beiden gleiche Codes liefern (macht aber nix ;-) ).

Noch eine Anmerkung: Die TV-RC konnte man an ein TV-Gerät anpassen, damit sie diese Codes sendet zB. bei "0"-"9".

Ein Tastenpieps hab ich auch mit drin, denn so gut läuft das mit dem schreiben auch nicht, man muss immer sicherstellen, dass die Taste erkannt wurde, also keine verschluckt wird.


Ist für Mega644 und Mega32 getestet,
alphaVersion:

' IR Tastatur
'
' auf RN-Control
'

$regfile = "M32def.dat" ' the used chip
'$regfile = "M644def.dat" ' the used chip
$crystal = 16000000 ' frequency used
$baud = 38400


' configs

Config Portc = &B00111111

Config Timer0 = Timer , Prescale = 64 , Clear Timer = 1
Const Prescale64 = &H03

#if _chip = 23
On Oc0 Timer0isr
#endif
#if _chip = 37
On Oc0a Timer0isr
#endif

' Dim

Dim Cnt As Byte ' zähler für Timeraufrufe
Dim Rc_flag As Bit ' Flag ob was gekommen ist
Dim Z As Byte ' Zähler
Dim Rc(20) As Byte ' Bits von RC
Dim Rcdata(2) As Byte
Dim Rcdatal As Word At Rcdata(1) Overlay
Dim Idxw As Word ' Index aus der 1. Tabelle
Dim Idxb(2) As Byte At Idxw Overlay
Dim Taste As String * 12

' div

Portc = &HFF

#if _chip = 23
Ocr0 = &HC8 ' damits 800 µs werden
#endif
#if _chip = 37
Ocr0a = &HC8 ' damits 800 µs werden
#endif

Print
Print "NetBox IR Tastatur"
Print

Enable Interrupts

' Main
Do

#if _chip = 23
Toggle Portc.0
#endif
#if _chip = 37
Pinc.0 = 1
#endif

' IR-Daten holen
Gosub Getrcnetbox

Idxw = 0

If Rcdatal <> 0 Then
'Print " " ; Bin(rcdata(2)) ; Bin(rcdata(1)) ; " " ; Hex(rcdata(2)) ; Hex(rcdata(1)) ;

Idxw = Lookdown(rcdata(1) , Hex2keyrc , 118)

Print " " ;
Print Idxw

'Taste = Lookupstr(idxb(2) , Key2txtrc) ' geht irgendwie ned, kommt immer nur das 1. raus !?!
Restore Key2txtrc
If Idxw < 119 Then
For Z = 1 To Idxw
Read Taste
Next Z

Print Taste
End If

Sound Portd.7 , 300 , 250 'BEEP

End If

Waitms 100

Loop


End

' subs

' wartet auf IR
Getrcnetbox:
#if _chip = 23
Enable Oc0
#endif
#if _chip = 37
Enable Oc0a
#endif

' start init
Stop Timer0
Timer0 = 0
Rc_flag = 0

Rcdatal = 0 ' RC Daten löschen

Bitwait Pinc.6 , Reset ' warten auf low

Cnt = 0
Start Timer0

' warten bis der Timer fertig ist
Bitwait Rc_flag , Set

If Rc_flag = 1 Then

' nur wenn die ersten Bits 0010 sind, könnte der Rest passen, sonst von haus aus garnicht !
If Rc(1) = 0 And Rc(2) = 0 And Rc(3) = 1 And Rc(4) = 0 Then
For Z = 5 To 20
Shift Rcdatal , Left , 1
Rcdatal.0 = Rc(z)

Next Z

' debug ausgabe!
' For Z = 1 To 20
' Print Rc(z) ;
' Rc(z) = 0
' Next Z

' Print

' passen die Daten ?
If Rcdata(2) <> &H94 And Rcdata(2) <> &H95 Then
Rcdatal = 0
End If

End If

Timer0 = 0
Rc_flag = 0

End If

#if _chip = 23
Disable Oc0
#endif
#if _chip = 37
Disable Oc0a
#endif

Return


' Timer ISR

Timer0isr:

Incr Cnt
Rc(cnt) = Pinc.6

If Cnt = 20 Then

Stop Timer0

Cnt = 0
Rc_flag = 1
End If

Return


' Codetabellen

' erste Tabelle Codes die auf der TV-RC vorkommen, incl. der die auf beiden vorkommen
Hex2keyrc:
Data &HF4 , &HF5 , &H9C , &HC1 , &HA8 , &HF9 , &H24 , &H65
Data &H14 , &H95 , &HD4 , &H8D , &H20 , &H10 , &HE4 , &HAD
Data &H1C , &H35 , &H85 , &HB5 , &H0D , &H04 , &H05 , &H25
Data &H34 , &HA5 , &H15 , &HB1

' Tabelle 2, codes die nur auf dem Keyboard vorkommen
Hex2keykb:
Data &HB9 , &H30 , &H00 , &H38 , &H00 , &H00 , &HF8 , &H54
Data &H39 , &H00 , &H5D , &H00 , &H00 , &H00 , &H1D , &H9D
Data &H2C , &H8C , &H6D , &H6C , &H71 , &H60 , &H50 , &H48
Data &H49 , &H7C , &H7D , &H5C , &H4D , &H00 , &H00 , &H31
Data &H64 , &HE5 , &HD5 , &HB4 , &HF1 , &H08 , &H91 , &HD0
Data &HD1 , &HC8 , &H88 , &HBD , &HDD , &HFD , &HDC , &HCD
Data &HBC , &H3D , &HCC , &HED , &HF0 , &HC9 , &HE0 , &H09
Data &HFC , &H89 , &HE1 , &HA1 , &HB0 , &H3C , &HAC , &HEC
Data &H2D , &H70 , &H61 , &H51 , &H11 , &H90 , &HA0 , &HB8
Data &H0C , &H4C , &H79 , &H78 , &H55 , &H74 , &H94 , &H69
Data &HE8 , &HA4 , &H75 , &H28


Hex2keyshift:
Data &H29 , &H40 , &H98 , &H18 , &H21 , &HA9 , &H00 , &H00


' Text der zur Taste kommt
Key2txtrc:
Data "1 RC" , "2 RC" , "3 RC" , "4 RC" , "5 RC" , "6 RC" , "7 RC" , "8 RC"
Data "9 RC" , "0 RC" , "Mute RC" , "./.. RC" , "Enter RC" , "Prev RC" , "Menu RC" , "Vol + RC"
Data "Vol - RC" , "Rot RC" , "Grün RC" , "Gelb RC" , "Blau RC" , "CH + RC" , "CH - RC" , "C links"
Data "C rechts" , "C auf" , "C ab" , "TV/Web"

Key2txtkb:
Data 13 , " Tab" , "_" , " " , "_" , "_" , "#" , " Entf"
Data " Backspace" , "_" , "´" , "_" , "_" , "_" , "+" , ","
Data "-" , "." , "ß" , "0" , "1" , "2" , "3" , "4"
Data "5" , "6" , "7" , "8" , "9" , "_" , "_" , "<"
Data "Oben" , "Bild Auf" , "Bild Ab" , "Unten" , "a" , "b" , "c" , "d"
Data "e" , "f" , "g" , "h" , "i" , "j" , "k" , "l"
Data "m" , "n" , "o" , "p" , "q" , "r" , "s" , "t"
Data "u" , "v" , "w" , "x" , "y" , "z" , "ä" , "ö"
Data "ü" , "^" , "Home" , "WWW.." , "Album" , "Suche" , "E-Mail" , "F6"
Data "TV Mute" , "TV Video" , "F9" , "Neu laden" , "zurück" , "Weiter" , "Hilfe" , "Drucken"
Data "Option" , "Stop" , "Lesezeichen" , "Menü "

Key2txtshift:
Data "Alt Gr" , "Strg" , "Shift rechts" , "Shift links" , "Shift Lock" , "Alt"

TSOP1x36 ist an PORTC.6 angeschlossen,
an Portc.0 ist nur eine StatusLED, um zu sehen ob sich was tut.

Und ein Bildchen hab ich auch noch gemacht von der ganzen Testumgebung:
zum Bild (http://roboter.net-con.net/rn/CIMG0152s.JPG)

fhs
05.08.2008, 04:18
Hi linux_80,

da hast Du Dir sehr viel Mühe gemacht, den Code zu entschlüsseln und mit Hilfe einer Tabelle verwendbar zu machen! Diese Postings von Dir sind eine sehr schöne Demonstration, wie man ein Problem angehen und erfolgreich zu Ende bringen kann, obwohl Dir niemand einen Tipp zu diesem spezifischen Code geben konnte.

Weiter viel Erfolg,

Fred

uffi
05.08.2008, 09:44
Hi linux_80,

schönes Projekt. Die Fernbedienung ist programmierbar und kann auch noch andere Codes, unter anderem auch RC5:

Man wählt z.B. einen Code von Loewe Opta, den 009.

1. AUS + TV/WEB gleichzeitig drücken und gedrückt halten, bis LED dauerhaft leuchtet
2. 3-stelligen Code eingeben
3. zum Speichern TV/WEB drücken

Ab sofort wird RC5 gesendet.

Damit kannst Du die TV-RC sicher noch besser von der Tastatur unterscheiden.

Gruß, uffi.

uffi
05.08.2008, 09:47
Noch ne Frage: wie ist Deine Reichweite mit dem TSOPxx36? Bist Du sicher, dass die TV-RC und die Tastatur 36 kHz Bursts senden, oder sind es evtl. doch 38 kHz?

Kannst Du die Bursts mit einem Fototransistor ausmessen?

uffi
05.08.2008, 09:51
Für die RC5 Decodierung habe ich einen Interrupt-basierten Algorithmus in C für einen ATMEGA entwickelt, zu finden hier:

http://freenet-homepage.de/uffmann/RemoteControl1.html

linux_80
05.08.2008, 11:53
Mahlzeit,

ob es 36 oder 38kHz sind hab ich nicht gemessen, hab nur 'nen 36er TSOP da, und da kommt was an. Bei Gelegenheit mess ich mal.

Das mit dem umproggen des Codes auf RC5 geht natürlich, aber dann muss die Auswerteroutine beide Codes gleichzeigt beherrschen, denn der Joystick da drauf sendet immer nur diesen speziellen Code, und dieser war ja das Ziel der Übung ;-)

Dank des Tastenpieps kann man die Reichweite gut ausprobieren, also quer durchs Zimmer, auch wenn man in die andere Richtung zeigt ist kein Problem. Bin auch mal in den Gang raus, dann sinds ca. 8m, auch keine Probleme.
Nur wenn Sonne oder Neonröhre dazwischenfunken muss man manchmal öfter drücken bis der Tastenpieps piept. Aber aus meiner Routine kommen keine falschen Werte, nur solche die in der Tabelle vorkommen.

Man darf auch nicht zu schnell schreiben, denn wenn man die nächste Taste drückt, bevor das Senden der letzten abgeschlossen ist, wird gleich mit der neuen begonnen, dann sind beide verloren !

uffi
05.08.2008, 14:14
o.k. bei der Reichweite sind es wohl definitiv 36 kHz Bursts (sonst würdest Du keine 8m erreichen).

Aber dass bei Änderung des Codes auf RC5 die "Joystick"-Tasten immer noch mit dem seltsamen 9-bit Code arbeiten, wundert mich schon sehr!