Michael Isik

isikmichael@gmx.net


IR-Fernbedienungs-Empfänger

Realisiert mit dem CControl System

Worum geht’s überhaupt?

Das CControl System wird so bearbeitet, dass es in der Lage ist, Signale von handelsüblichen Infrarot Fernbedienungen (z.B. für Fernseher oder HIFI) zu empfangen. Diese Daten können dann von einem Computer, der per seriellen Com Port an das System angeschlossen ist, ausgewertet werden, so dass man diesen schließlich mit irgendeiner Fernbedienung steuern kann. Außerdem kann man bildlich betrachten, wie die Fernbedienung ihre Daten verschickt.

Es gibt wahrscheinlich Möglichkeiten, einen IR Empfänger für den PC auch ohne CControl System zu realisieren. Dieses Tutorial richtet sich darum eher an diejenigen, die einfach etwas mit den Möglichkeiten des CControl spielen möchten, und vielleicht auch noch etwas mehr über die Assemblerprogrammierung des Systems lernen möchten, die ja um einiges schneller läuft, als das Basic System.

Was muss ich dafür tun?

1.        Man muss eine winzig kleine elektronische Schaltung an das CControl bauen, für die man folgende Bauteile benötigt:

Bauteil

ca. Preis

TSOP 1738 Infrarot Empfänger

1€

Widerstand 1kΩ

sehr billig

Widerstand  ca. 100kΩ

sehr billig

einige Drahtbrücken

sehr billig

 

2.        Man muss das mitgelieferte CControl Programm auf den CControl raufladen. Das Programm ist übrigens vollständig in Assembler geschrieben (bis auf den Einstiegs-Syscall in Basic, um auf die Assemblerebene zu gelangen).

3.        Man muss das mitgelieferte Programm starten, welches zum empfangen und verarbeiten der ankommenden Daten am Comport zuständig ist. Dieses ist in Visual Basic geschrieben (das Coden sollte einfach schnell gehen J). Darum wäre es auch nicht schlecht, wenn man ein Visual Basic 6.0 bei sich rumliegen hätte, denn dann könnte man das Programm schnell etwas für seine Wünsche erweitern. Ansonsten kann man natürlich auch selbst eins schreiben. Das VB Proggy ist sowieso hauptsächlich zur Demonstration und nicht für die Endanwendung gedacht.


 

Die Schaltung

Die Schaltung sieht folgendermaßen aus:

Wie man sieht benötigt der TSOP eine Versorgungsspannung von 5 Volt, welche wir am besten direkt aus dem CControl Mainboard abnehmen. Die Pinbelegung des TSOP geht notfalls auch aus dem Datenblatt hervor. Allerdings entsprechen die Reihenfolge der Pins und die Pinabstände des TSOP in der Darstellung seinem Originalaussehen. Der rechte Widerstand muss nicht unbedingt exakt 100kΩ betragen. Er sollte aber eher etwas höher sein. Letzte Unklarheiten sollten durch die beiliegenden JPGs beseitigt werden.

 

 

 

 

 

 

Der CControl Code

Der Code für den CControl besteht aus zwei Dateien namens IRRecvr.bas und IRRecvr.asm. Die bas Datei ruft sofort eine Sprungmarke (an Adresse $101) aus dem Assemblerfile auf. Basic wäre um einiges zu langsam, um die Daten schnell genug aufzunehmen, und zu versenden. Allerdings haben wir auf Maschinenebene auch noch das Problem, dass das senden über den Comport zu lange dauern würde um einen kontinuierlichen Stream aufrechtzuerhalten. Zum Glück arbeiten Fernbedienungen so, dass sie ein Vollständiges Signal (z.B. für Play), am Stück senden, und dann eine kleine Pause machen, bevor das nächste Signal an die Reihe kommt. Darum Puffern wir ein vollständiges Signal, und senden es dann in der Pause. Speicher haben wir genug (derzeit bis zu 166 Byte), da wir ja vollständig auf Basic und Interrupts verzichten (siehe Code).

Ein vollständiges Signal(z.B. für Play oder Stop)  wird im folgenden auch als Packet bezeichnet.

 Mit dem Ausdruck „Zustand Aktiv“ ist gemeint, dass der TSOP gerade angestrahlt wird, und dies auch an den Port weitergibt.

Übrigens kann man sich ein IR Signal als eine Abfolge von ein und ausschalten des IRSenders vorstellen. Wie ein Morsecode, eine spezielle Abfolge von Blinksignalen. Aber nun weiter zum Code. Wir durchlaufen eine Schleife, namens PacketLoop, die sich den Aktuellen Zustand des Ports B holt, und ihn in ein Speicherfeld mit der Anfangsadresse #IRData speichert. Jetzt könnten wir z.B. in einem PacketLoop Durchgang zuerst mal nachschauen, welcher Zustand gerade herrscht, und dann diesen Zustand in das aktuelle Bit schreiben. Anschließend das aktuelle Bit eins weitersetzen, und wieder von vorne anfangen. Dies so oft wiederholen, bis wir entweder keinen Speicher mehr haben, oder wir merken, dass wir schon längere Zeit den Zustand Inaktiv haben, und uns somit wahrscheinlich gerade in einer Pause befinden. Es ist auch fast so realisiert, nur das wir nicht dieses Bitarray als Speichermethode hernehmen, sondern eine System, welches die Daten etwas besser komprimiert. Der Algorithmus zum Abspeichern der Zustandsabfolge misst die Länge, in der ein Zustand in Folge vorgeherrscht hat, und schreibt diese in ein Byte. Wechselt nun der Zustand, springen wir zum nächsten Byte und messen wieder die Länge. Dies ist effektiv, da meist mehrmals am Stück (ca 30 mal) der gleiche Zustand auftritt. Ist die Länge zu hoch als dass sie in ein Byte „reinpassen“ würde, speichern wir einfach diesen Maximalwert in das Byte, und springen zum nächsten. Der Dateninterpreter auf dem Computer weis dann, wenn ein Byte die Maximallänge besitzt, dass dann das nächste Byte noch zu diesem dazuaddiert werden muss da zwischen diesen Bytes kein Zustandswechsel passiert ist. Der Maximalwert wäre ja normalerweise 255. Allerdings habe ich mir die 255 und 254 als Markierung für den Anfang und des Endes eines Packetes vorbehalten, so daß der Maximalwert auf 253 rutscht. Näheres zum Ablauf des Proggy’s findet sich allerdings in den vielen Kommentaren des Codes.

Das Visual Basic Proggy

Erst mal ein Screenshot:

Das Programm hat folgende Funktionen:

·         Daten der Fernbedienung anzeigen

·         Signal-Packete abspeichern, und wieder erkennen, und evtl einer Aktion zuordnen

Das bunte Feld zeigt die Signal-Packete an, wobei ein einzelnes von links nach rechts visualisiert wird, und das nächste Packet eine Reihe tiefer angelegt wird. Grün ist die Backgroundfarbe, Blau bedeutet Zustand Aktiv, und Orange dementsprechend keine Aktivität.

Wird der Record Button gedrückt, so wird das nächste eintreffende Packet abgespeichert, und man kann es einem String zuordnen. Am besten man hält die entsprechende Taste auf der Fernbedienung, und überprüft, ob die Daten korrekt ankommen. Ist dies der Fall drückt man währendessen den Record Button. Nun öffnet sich folgender Dialog:

 

Hier gibt man einen String (d.h. Text) ein, der dann zu diesem Packet abgespeichert wird. Wird nun wieder dieses Packet empfangen (durch drücken der selben Taste auf der Fernbedienung), so wird dieser String in das Textfeld unten rechts ausgegeben. Außerdem wird der String an eine Funktion namens doAction (siehe Klasse Action) weitergegeben. Diese wertet ihn aus, und startet dementsprechend eine vordefinierte Aktion (wenn definiert). Diese Funktion sollte für eigene Ansprüche abgewandelt werden. Wer allerdings kein Visual Basic hat, kann trotzdem eigene Aktionen angeben. Gibt man nämlich als ID den String sendkeys:a ein, so wird jedes Mal wenn das zugehörige Packet empfangen wird an das Programm im Vordergrund der Buchstabe a in Form einer Tastatureingabe gesendet. Man kann z.B. in Notepad a’s auftauchen lassen, alleine durch betätigen der Fernbedienung. Interessanter wird’s aber, wenn man als Aktion das aktive Programm wechseln (mit Alt Tab), oder Winamp steuern kann. Es folgen einige Beispiele:

Text nach dem String „sendkeys:“

Wirkung

abc

abc

{ENTER}

Enter Taste

%+{TAB}

Alt,Shift,Tab (Task zurück)

{UP}

Pfeiltaste hoch

 

Für eine vollständige Dokumentation der Visual Basic Funktion SendKeys (denn diese wird ja direkt aufgerufen) einfach mal Google anhaun, oder in der MSDN von Visual Basic 6 nachschlagen (oder mir ne Mail schreiben).

Schließlich kommen wir noch zum Button LoadIRData. Jedesmal wenn man per Record ein Packet abspeichert, wird dieser Eintrag anschließend in eine Datei namens irdata.txt gespeichert. Um seine Einstellungen nun nach einem Neustart wiederzuerlangen einfach den LoadIRData Button drücken.

 

 

Sonstiges

Wer weitere Fragen zu diesem Projekt hat, kann mich natürlich gerne anmailen. Vielleicht erweitere ich dann auch noch die Docu, oder erweitere das Projekt. Z.B. ist es wahrscheinlich auch nicht schwer, das Projekt um eine Sendeeinheit zu erweitern, sodass man damit z.B. auch umgekehrt seinen Fernseher steuern könnte.

Also dann noch viel Spaß,

                Michael Isik, isikmichael@gmx.net