Infrarot Fernbedienung mit dem .Net Micro Framework

By | 27. November 2013

Hi folks!

Some years ago we had a speaker session at the adesso AG summit and this is the article from this session.

The goal was to build a

passend zum kommenden summIT der adesso AG hier der Artikel zum Vortrag. Ziel hierbei ist es mit Hilfe des .Net Micro Frameworks eine anlernbare Steuerung zu bauen um Signale von Geräten wie Fernsehern, Beamern, Radios und allem anderem was mit einer Infrarot Fernbedienung zu bedienen ist auszulesen und wiederzugeben. In diesem Beispiel lesen wir die Signale codeseitig aus und müssen die decodieren, das ist nötig damit unsere Steuerung “lernen” kann. Wenn man einzelne Signale auslesen möchte ohne dafür etwas zu programmieren kann man sich auch einen “Poor Man Oszilloskop” mit Hilfe einer Soundkarte  bauen. Die Bauanleitung folgt auch hier im Blog in einem anderem Artikel.

Zutaten:

  • FEZ Cobra II
  • 38Khz Infrared Receiver E- Block
  • IRLED Transmitter E- Block
  • E-Block Expansion Modul

Hardware:

Bevor wir starten müssen wir die Hardware entsprechend aufbauen. Das gestaltet sich aber sehr einfach da wir hier schon fertige Module nutzen. Das FEZ Cobra II muss mit mindestens 3,3 V versorgt werden. Das garantieren wir über das eingebaute USB Power Modul welches wir per USB-Kabel (schon allein um das Programm auf den Chip zu ziehen) an eine Stromquelle schließen. Da wir beim FEZ Cobra II einen G120 Chip eingebaut haben können wir auch auf die Premium Library von GHI Electronics zugreifen. Es können auch andere Boards benutzt werden solange diese die Premium Hardware von GHI Electronics besitzen. Es gibt zwar schon Projekte in denen versucht wird die Premium Library für Open-Source Boards zu portieren aber das hab ich mir noch nicht angesehen. Wie im Beitrag zum 434 MHZ Modul brauchen wir hier die SignalGenerator und die SignalCapture Klasse. Um die Infrarot Signale zu senden benutzten wir hier das E-Block Modul mit dem IRLED Transmitter. Um ein schnelles Ergebnis zu erlangen eignet sich dieses ganz gut. Es empfiehlt sich aber ein eigenes Modul zu bauen da die Sendereichweite des Modules recht bescheiden ist. Meine Empfehlung bei dem eigen Bau ist diese LED zu benutzen: “Super-bright 5mm IR LED – 940 nm”. Weiterhin verwenden wir einen 38Khz Infrarot Empfänger Modul um Signale von Fernbedienungen auszuwerten. Das E-Block Expansion Modul ist ein Modul welches 9 GPIOs zur Verfügung stellt und die daran angesteckten Module mit 3,3 V versorgt. Man kann das ganze natürlich auch ohne die E-Block Module bauen indem man sich die passenden Komponenten kauft und die Module selber baut.

Das 38Khz Modul verbinden wir mit Pin 6 vom E-Block Expansion Modul und das IRLED Transmitter Modul mit Pin 3.  Man kann aber auch jeden anderen Pin wählen. Das E-Block Expansion Modul verbinden wir mit Socket 4 des FEZ Cobra II Board.

Software:

 

In dem Projekt benutzen wir das NETMF 4.2 zusammen mit dem Gadgeteer SDK.

Als erstes erstellen wir ein neues .Net Gadgeteer Modul Projekt im Visual Studio 2012. Das erste Modul was wir hier bauen soll zum Empfangen und Auswerten der Infrarot Signale dienen.

Unbenannt

Dem Konstruktor übergeben wir das Socket an dem das E-Block Expansion Modul angeschlossen ist und den Pin an dem das Empfänger Modul mit dem E-Block Expansion Modul verbunden ist. In unserm Fall Socket 4 und Pin 3.

Innerhalb des Konstruktors initialisieren wir die SignalCapture Klasse mittels des Cpu Pins den wir vom Socket 4 benutzen.

   private Socket socket;

        private SignalCapture IRin;

        private Cpu.Pin PIRCapture;

        public EasyRedReceiver(int socketNumber, int pin)
        {          
           this.socket = Socket.GetSocket(socketNumber, true, this, null);
           PIRCapture = GT.Socket.GetSocket(this.socket.SocketNumber, false, null, null).CpuPins[pin];
           IRin = new SignalCapture(PIRCapture, Port.ResistorMode.Disabled);        
        }

Nach dem wir das Modul initialisiert haben können wir nun über die Read Methode anfangen Signal in ein Array zu schreiben. In dem Beispiel unten nehmen wir  erst Mal ein  Array mit recht großen Bereich. In der Regel hat ein Infrarot Signal für eine Taste ca. 75 Zustände.

 int edges;
                buffer = new uint[1000];                             

                edges = this.IRin.Read(false, buffer, 0, buffer.Length, 3000); // with 3 seconds timeout

Die SignalCapture Klasse aus der Premium Library fängt für uns die Signale über den gewählten Pin aus und schreibt diese in ein Array. Die Werte die in das Array geschrieben werden stellen die Delays zwischen der Bit Folge des Signals da. Das Signal kommt bespielsweise so an: 10011001010. Die Delays im Array sagen uns wie lange ein Bit gehalten wird. So wird vielleicht das erste Bit 250 Microsekunden und das nächste Bit 300 Microsekunden gehalten.

Nachdem wir das Signal decodiert haben müssen wir noch einen Weg finden um ein klares Signal aus dem Array zu lesen. Da das Array eine bestimmte Länge hat wird das Signal wiederholt in das Array geschrieben (durch halten der entsprechende Taste der Fernbedienung). Wenn wir das Signal so wegschicken wie es gekommen ist würde vielleicht wenn es die Programm + Taste war nicht nur ein Kanal am Fernseher weitergeschaltet sondern so oft wie das Signal im Array vorhanden ist hochgezählt werden. Ich hab mir dafür einen kleinen Algorithmus geschrieben um ein Signal auszulesen.

Nachdem wir ein klares Signal haben können wir es jetzt mit der SignalGenerator Klassse wiedergeben. Dieses Prinzip funktioniert nicht nur bei Infrarot Sendern sondern auch bei den meisten anderen Frequenzen, man benötigt nur die entsprechenden Sende- und Empfängermodule (siehe 434 MHZ Störsender).

 

WP_20131126_001

 

Daraus können wir uns jetzt einen Treiber für unser Modul erstellen.

Wieder erstellen wir ein Visual Studio Modul Projekt wie oben beschrieben.

Der SignalGenerator arbeitet wie der SignalCapture aber auf umgekehrten Weg. Wir übergeben dem SignalGenerator ein Array von Delays. Der SignalGenerator durchläuft dieses und gibt abwechselnd ein An und Aus Signal an einen Pin ab.

Der Konstruktor wird fast genau so aufgebaut nur das wir anstatt der SignalCapture Klasse die SignalGenerator Klasse

 

 private Cpu.Pin PIRSender;

        private SignalGenerator sg;

        private Socket socket;

        public EasyRedSender(int socketNumber, int Pin)
        {           
            this.socket = Socket.GetSocket(socketNumber, true, this, null);
            this.PIRSender = GT.Socket.GetSocket(this.socket.SocketNumber, false, this, null).CpuPins[Pin];
            sg = new SignalGenerator(this.PIRSender, true, 2);
        }

 

Anschließend brauchen wir noch eine Methode um die Sende Methode (setBlocking) vom SignalGenerator zu benutzen. Unserer SendSignal Methode können wir dann das Array übergeben welches wir zuvor ausgelesen und bearbeitet haben.

public void SendSignal(uint[] buffer)
{

sg.SetBlocking(true, buffer, 0, buffer.Length, 100, true, 38000);

}

Damit wär unser Sendemodul auch schon fertig.

 

WP_20131126_002

 

Wenn wir daraus auch eine Assembly erstellen können wir beide in einem .Net Gadgeteer Application Projekt einbinden und auf beliebige Events benutzen. Beispielsweise könnte man eine Windows Phone etc. App erstellen und über ein Webserver mit dem Board kommunizieren um Geräte per Infrarot zu steuern. Weiterhin gibt es im Netz auch einige Seiten mit Hex Files, die bereits sämtliche Codes für Geräte beinhalten. Dazu müssen lediglich die Hex-Codes für die setBlocking Methode umgewandelt werden. Dazu aber auch mehr in einem anderem Artikel.

Schluss:

 

Und zum Schluss noch ein Video vom Sender. Bei dem Video habe ich noch einen Button benutzt um das decodierte Signal wiederzugeben.

http://www.youtube.com/watch?v=H2k_FWybL6Y&feature=youtu.be

 

 

Leave a Reply