original in es Ismael Ripoll & Elisa Acosta
es to en Georges Tarbouriech
en to de Katja Socher
Ismael Ripoll erhielt 1996 seinen Ph.D. von der Polytechnischen Universität in Valencia. Jetzt ist er Professor für Betriebssysteme an der Fakultät DISCA. Seine Forschungsinteressen umfassen Real-time Programme und Betriebssysteme. Er benutzt Linux seit 1994. Seine Hobbies: Trekking durch das Pyrenäengebirge, Skilaufen und Heimelektronik.
Elisa Acosta ist eine Computeringenieurin an der Polytechnischen Schule von Valencia. Momentan arbeitet sie für Indra (eine Kommunikationsfirma) an Jahr 1900 Problemen :-)
Dieser Artikel basiert auf dem, was Elisa Acosta in ihrem Abschlußjahrprojekt gemacht hat.
Durch Benutzung einer einfachen elektronische Schaltung können wir RT-Linux dazu bringen, Befehle von einer Infrarot-Fernbedienung zu empfangen.
Du brauchst keine Elektronik- und Hardwarekenntnisse, um diesen Artikel zu verstehen, obwohl wir über eine kleine Hardwarekomponente reden werden, die für Infrarot-Fernsteuerungen benutzt wird.
Ein Projekt namens "lirc" (Linux Infra-red Remote Control) (Linux Infrarot-Fernsteuerung) wurde von Ralph J. K. Metzler (http://fsinfo.cs.uni-sb.de/~columbus/lirc/) begonnen, für das ein Infrarotempfängertreiber entwickelt wurde, der die "normalen" Dienste von Linux nutzt. Mit "normal" meine ich, daß es keine RT-Linux real time Erweiterungen benutzt. In diesem Artikel beginnen wir mit demselben Thema, schauen uns aber Lösungen an, die auf RT-Linux basieren.
Im ersten Teil unseres Projekts betrachten wir die Hardware, die gebraucht wird, um den Infrarotempfänger und den Computer miteinander zu verbinden. Im zweiten Teil sehen wir, wie wir die Signale des Infrarotempfängers unter Benutzung von Real-Time Linux auswerten können. Wir brauchen nur ein Minimum an Hardware : einen Sharp (IS1U60) Infrarotempfänger sowie einige Kabel und Stecker.
Der IS1U60 Infrarotempfänger ist ein elektronisches Wunder; Es ist ein Scahltkreis mit nur drei Pins (zwei für Strom und einen für Erde) und er ist in der Lage, fast die gesamte Empfangs- und Umsetzungsarbeit zu leisten. Am dritten Anschluß liefert er ein normales TTL Signal.
PCs haben eine Menge Stecker, um jeden Typ von digitalen Peripheriegeräten (Modems, Drucker, SCSI, Tastatur, Monitore, etc...) zu verkabeln, aber nichts, das uns erlaubt, einfache elektronische Geräte anzuschließen. In anderen Worten, ein Standard PC hat keine Analog/Digital-Wandlerkarte, eine Karte, mit der man in der Lage ist, die Spannung einer bestimmten Leitung zu lesen.
Zufällig kann der Parallelport (genauso wie der Serialport) als allgemeiner in/out Anschluß benutzt werden. Viele Peripheriegeräte benutzen dieses Feature, um mit dem PC zu kommunizieren, wie z.B. der Iomega ZIP Treiber.
Wir benutzen den Parallelport, um Daten des Infrarotempfängers zu empfangen. Wir brauchen nur einen Pin des Parallelports, da der Infrarotempfänger nur einen einzigen Datenpin besitzt.
Wie schon erwähnt, ist der IS1U60 ein Infrarotempfänger, der speziell als Empfänger für häusliche Anwendungen entwickelt wurde.
Das Fernsteuerungssignal ist wirklich komplex, da verschiedene Typen von Kodierung und Modulation miteinander verbunden wurden. Wir wollen das Signal etwas genauer beobachten.
Das physische Medium, das das Fernsteuerungssignal trägt, ist eine Lichtwelle im Infrarotspektrum. Diese Art von Licht ist im Gegensatz zu ultraviolettem Licht, völlig harmlos. Das Infrarotlicht ist für das menschliche Auge unsichtbar, nicht jedoch für Diapositive von Halbleitern. Die Quellen des Infrarotlichts sind: die Sonne, weißglühende Glühbirnen, LED Dioden etc. Eine Infrarot-LED wird von der Fernsteuerung zum Aussenden des Signals benutzt.
Infrarotlicht | sichtbares Licht | ultraviolettes Licht |
|
Jeder Halbleiterchip ist lichtempfindlich (irgendeine Farbe/Frequenz). Die meisten Halbleiter sind deshalb in schwarzes Plastik verpackt, damit sie vor Licht geschützt sind. Ein Infrarotsensor besteht grundsätzlich aus einer Halbleiterdiode, mit einem Glas oben drauf, das nur das Infrarotlicht durchläßt.
Ein so gebauter Infrarotsensor ist in der Lage, jedes Infrarotlicht zu entdecken, welche Quelle auch immer es erzeugt. Fernsteuerungsentwickler mußten ein Verschlüsselungsfeature zu dem von der Fernsteuerung ausgesendeten (emittierten) Licht hinzufügen, um es von den übrigen Lichtquellen zu unterscheiden. Das von der Fernsteuerung emittierte Licht wird bei Frequenzen zwischen 32 und 40 Khz moduliert, dies hängt ein bißchen von der Herstellung und vom Modell ab. Laßt uns annehmen, daß die Fernsteuerungsfrequenz 38 Khz ist, da dies der am häufigsten vorkommenste Wert ist. Mehr als 90% der Geräte benutzen diese Frequenz oder eine, die sehr nahe bei diesem Wert liegt.
Der Infrarotempfänger. |
Wir müssen im Kopf behalten, das alles, was getan wird, um ein Signal auszusenden, während des Empfangs entfernt werden muß. Wenn wir ein Infrarotlicht aussenden, dann müssen wir es empfangen, wenn dieses Signal mit einem 38 Khz Träger moduliert wird, dann muß dieser Träger demoduliert (gefiltert) werden. Die Demodulation wird auf analoge Weise mit einem Einzelbandpaßfrequenzfilter (um jede Frequenz weit weg von der Emissionsfrequenz zu löschen) und einem Gleichrichter-/Integral- Filter durchgeführt.
Das bei 38 Khz modulierte Infrarotlicht ist das, zwischen dem Emittenten (Fernsteuerung) und dem Empfänger (TV, Video, etc.), benutzte Kommunikationsmedium. Jetzt müssen wir entscheiden, wie die Information übertragen werden soll, d.h welche Bits die gedrückten Tasten auf der Fernsteuerung identifizieren.
Die Verschlüsselung dieser Information ist von der Herstellung abhängig, aber glücklicherweise müssen wir für dieses Projekt diese Methoden nicht kennen, wir müssen sie nur vergleichen.
Betrachtet man die Modulation des Signals, so ist es offentsichtlich, daß die Informationen in Serie übertragen werden. Ein Bit nach dem anderen und dementsprechend erhalten wir nur einen Datenstrom auf der Empfangsseite.
Das folgende ist der technischen Spezifikationen des Sensors IS1U60 entnommen. (http://ns14.sharp.co.jp/ecg/unit/is1u60/is1u60-fea.html), und zeigt die interne Struktur. Die beiden linken Pfeile stellen das von der Fernbedienung ausgesendete Infrarotlicht dar. Das Signal wird verstärkt, die direkte Komponente gelöscht, es wird gefiltert, um Frequenten nahe 38 Khz durchzulasssen. als nächstes wird es gleichgerichtet (Demodulator+Integrator), und schließlich wird es in ein TTL kompatibles Signal umgewandelt.
Der Parallelport wurde entwickelt, um mit Druckern zu kommunizieren, aber mit der Zeit, und weil es nichts vergleichbars auf PCs gab, wurde er benutzt, um alle Arten von Peripheriegeräten zu verbinden.
Momentan gibt es zumindest zwei Varianten (ECP, EPP), um einen Parallelport in einen echten allgemeinen Kommunikationsport umzuwandeln. Unser Projekt ist eher bescheiden, was die vom Parallelport geforderten Funktionenen betrifft, daher ist jede Version brauchbar. Tatsächlich brauchen wir nur eine Eingangsleitung.
Das Zustandsregisters |
Der PC steuert den Parallelport mit drei 8-Bit Registern. Es gibt einen Datenregister (0x378), einen Zustandsregister (0x379) und einen Steuerungsregister (0x37A). Die Werte in Klammern stellen die gewöhnlichen Registeradressen des ersten Parallelports dar.
Schreiben in das Steuerungsregister ermöglicht das Programmieren des Ports . Von den 8 Bits des Registers werden nur 4 Bits benutzt. Schreiben einer "1" in dieses Bit verursacht bei der Port-Hardware die Erzeugung einer Unterbrechung (interrupt) (normalerweise Nummer 7), wenn eine fallede Flanke and der ACK Zustandsleitung anliegt (vom hohen Niveau (5 Volt) zum niedrigen Niveau (0 Volt)).
Der Datenregister ist ein offenes Tor zu den Pins des Steckers. Jede Dateninformation, die wir in diesen Port schreiben, erscheint in Pins 2 bis 9 des Parallelsteckers. Dieser Port ist nur ein OUT Port. Da wir die Werte lesen müssen, mit denen uns der Infrarotstecker versorgt, ist dieser Port für uns nutzlos.
Der Zustandport informiert uns über den Zustand der Druckersteuerungszeile. Durch diese Leitungen ist es dem Drucker möglich, den Computer über seinen Zustand zu informieren. Diese Leitungen verwaltet der Drucker (oder ein externes Gerät) und der Computer liest sie, dementsprechend sind sie IN (Eingangs-) Leitungen. Obwohl es ein 8-Bit Register ist, sind nur die fünf höchsten Bits an die Leitungen gebunden, die anderen 3 Bits sind immer null. Die Zeilennummern sind nach der Funktionalität benannt, die sie haben, wenn sie mit einem Drucker kommunizieren, aber diese Leitungen sind in Wirklichkeit allgemeine digitale Leitungen, die man für beinahe alles benutzen kann.
Unter diesen 5 Leitungen ist Pin 10 (Bit 6 auf dem Register) der interessanteste, da er als digitale Eingabeleitung benutzt wird, aber er kann auch Interrups produzieren, wenn der Zustand der Leitung sich ändert (von 5 auf 0), wie oben erwähnt.
Physikalische Beschreibung von Chip und binding |
Der Infrarotempfänger braucht zwischen 4.7 und 5.3 Volt. Wenn die Spannung niedriger als 4.7 wird, dann hört der Empfänger auf zu arbeiten. Diese Versorgungsspannung kann auf verschiedenen Wegen erhalten werden:
Durch Benutzen von Batterien. In diesem Fall ist es besser eine 4V5 Batterie in Serie mit einer kleinen gebrauchten 1V5 Batterie zu benutzen. Die resultierende Spannung ist dann nicht 6V, sondern 5.5V da die 1V5 Batterie schon etwas verbraucht ist.
Benutzen eines regelbaren Netzteils (ein Gerät, das Wechselstrom in Gleichstrom mit niedriger Spannung umwandelt). Ein solches Gerät kann man in Bastelläden kaufen.
Die 5 Volt dem Computer entnehmen. In einem Computer sind zwei Arten von Kabeln vorhanden: flache Kabel (sie übertragen die Daten) und dicke rote, schwarze und gelbe Kabel für die Stromquelle. Das rote Kabel ist +5V und das schwarze ist die Erde oder 0V.
Um den Strom zum Empfänger zu schaffen, verbinden wir das schwarze Kabel mit Pin2 des Empfängers und das rote (5V) an Pin 3.
Die Verbindung zum Parallelport geht einfach durch Verbinden von Pin 1 des Infrarotempfängers mit Pin 10 des Parallelports und Empfängerpin2 mit Pin 18 des Parallelports. Beachte, daß GND (Erde) an zwei Stellen verbunden sein muß: Stromquellenerde und Parallelporterde.
Um diese Verbindungen herzustellen, kann man jede Art von Kabel benutzen.
REAL-TIME module |
---|
#define PERIOD 100 #define SIZE 8192 #define FIFO_ZERO 0 #define LP0 0x378 /*Address /dev/lp0*/ #define STS LP0+1 RT_TASK task; //---------- Real time task void Real_Time_Task(){ unsigned short data1, data2=0; unsigned long cont = 0L; while(1){ // Read the port value data1=inb(STS) & 0x40; // If no change.. if ( data2 == data1) { // Increment the counter. cont++; } else { // Send the counter value. rtf_put(FIFO_ZERO, (char *) &cont, sizeof(cont)); cont = 0L; data2 = data1; } rt_task_wait(); } } //------------- Main program int init_module(){ RTIME now = rt_get_time(); // Create communication FIFO with Linux. rtf_create(FIFO_ZERO,SIZE); // Create the real time task. rt_task_init(&task,Real_Time_Task,1,3000,4); // Make it periodic. rt_task_make_periodic(&task,now+3000,PERIOD); return 0; // Everything worked. } //------------- To unload the module void cleanup_module(){ rt_task_delete(&task); rtf_destroy(FIFO_ZERO); } |
Der einfachste Weg, den Zustand des Parallelport ACK Pins zu messen, ist, eine periodische Abfrage zu schreiben, die den Zustand des Registers (Pin) liest. Wenn sie eine Änderung entdeckt, starten wir einen Zähler. Auf diese Weise stellen die Zählerticks die Zeit dar, während der das Bit auf demselben Niveau blieb. Wenn wir eine Wertänderung entdecken, dann senden wir den Zählwert zu einem normalen Linux-Userprocess über ein FIFO. Ein Linuxprozeß muß an dem FIFO warten und es lesen. Die Lesewerte sind äquvivalent zu der Signal Zeit auf niedrigem Pegel und dann auf hohem Pegel.
Es ist wichtig, eine genaue Messung des vom Empfänger abgegebenen Signals zu bekommen, dies ist der einzige Grund, warum wir ein Echtzeitsystem benutzen. Interpretieren der Wertefolgen, die durch die Echtzeitabfrage gegeben werden, um die gedrückte Taste zu identifizieren, hat keine Zeitbeschränkung und kann innerhalb eines normalen Linuxprozesses verwaltet werden.
Ein anderer Weg, um Änderungen im ACK Pin zu messen, ist, einen Interrupt-manager auf Interrupt 7 zu installieren. Mit dieser Lösung braucht man keine periodische Abfrage.
Die Funktion init_module startet die Abfrage. Man muß nur die Kommunikation zum FIFO für die Abfrage erzeugen und periodisch Werde übergeben. Der Periodenwert (100 RT-Ticks, was ungefähr 90 Mikrosekunden sind) ist für Testen und Fehlerbehandlung gegeben. Je kürzer die Periode, desto höher die Auflösung unserer Messung, aber eine schnelle Schleife mit kurzen Perioden verbraucht mehr CPU Leistung.
Das folgende Benutzerprogramm schickt zum Standardoutput, was es vom Device /dev/rtf0 liest. Mit diesem einfachen Programm können wir die Form jedes von einem Infrarotsender geschickten Pulspaket "sehen" , wenn eine Taste gedrückt ist.
User program |
---|
#include |
Der Wert 700, der in dem Programm erscheint, ist ein geschätzter Wert und stellt den kleinsten Betrag an Zeit zwischen zwei aufeinanderfolgenden Rahmen dar.
Obwohl die meisten Fernsteuerungen ein ähnliches Infrarotsignal benutzen, kann das Entschlüsseln der Tasten unterschiedlich sein. Eine gedrückte Taste zu erkennen, ist ein Problem der "Formerkennung" und kein "Echtzeit-Problem ". Der beste Weg, um ein Programm zum Erkennen eines konkreten Befehls zu bekommen, ist, den Output dieses Programms zu beobachten und dadurch ein Idee zu kriegen, wie unsere Fernsteuerung Daten sendet.
Vereinfachend können wir sagen, wenn eine Fernsteuerungstaste gedrückt ist, sendet es eine Typenfolge aus, die wir als Nummernfolge auf dem Bildschirm sehen können. Wenn wir die Taste gedrückt halten, wird der Befehl dieselbe Frequenz periodisch aussenden (SONY Fernsteuerungen stellen hier eine Ausnahme dar).
Laßt uns beobachten was passiert (du mußt daran denken, die nötigen Echtzeitmodule: FIFO und Planifier zu installieren):
# modprobe rt_fifo_new # modprobe rt_prio_sched # insmod ir # ir_get 0 126509 13 6 23 7 13 7 12 7 12 7 12 7 12 8 11 8 11 8 11 8 11 8 11 19 11 1081 13 6 23 7 12 7 12 8 11 8 11 8 11 8 12 7 12 8 11 8 11 8 11 19 11 1080 14 6 23 7 12 7 12 7 12 7 12 8 11 8 11 8 11 9 11 7 12 8 11 19 11 1080 13 6 24 6 13 7 12 7 12 7 12 7 12 7 12 8 11 8 11 8 11 8 11 19 11
Wir können beobachten, daß dieser Befehl diesselben Frequenzen wiederholt, wenn die Taste gedrückt wird. Außerdem muß man den Messungfehler beachten. Die Zahlen der verschiedenen Pulse haben nur eine Variation von 1, dies stellt den Quantifikationsfehler dar.
Um eine Erkennungssoftware zu programmieren, muß man nur in einem Feld, das jeder Puls von seinem Befehl sendet, bleiben und dann, jedes Mal, wenn der Puls ankommt, ihn mit den anderen, die man in dem Feld hat, vergleichen (akzeptiere einen Fehler von + oder - 1). Dieses Programm ist für den Leser als Übung gedacht.
Einige Fernsteuerungen emittieren jedes Mal, wenn die Taste gedrückt wird, einen anderen Puls, selbst wenn wir immer auf dieselbe Taste drücken. Hier ist, was sie tun: Wenn wir eine Taste drücken, schicken sie einen Puls, den wir "Puls A" nennen, wenn wir loslassen und die Taste wieder drücken, emittieren sie "Puls B", auf das nächste Drücken emittieren sie wieder "Puls A" und so weiter. Wenn wir die Taste gedrückt lassen, wird derselbe Puls mehrere Male gesendet. Auf diese Weise kann der Empfänger den Unterschied zwischen einem langen Drücken und einem aufeinanderfolgenden Drücken unterscheiden. Wie denkst du, wird der die Tastenfolge 1 1 (elf) auf einer neuen Fernbedienung verwaltet?