|
| 1 | +--- |
| 2 | +title: Infrarot Empfänger |
| 3 | +tags: ["gpio"] |
| 4 | +--- |
| 5 | + |
| 6 | +## Funktionsweise |
| 7 | + |
| 8 | +Mithilfe von Infrarot können über einige Meter Distanz digitale Informationen übertragen werden, was zum Beispiel oft für die Fernbedienung |
| 9 | +eines Fernsehers genutzt wird. Die Übertragungsart gleich hierbei etwas dem Prinzip des Morsens, da die Infrarot-LED im Sendegerät eine |
| 10 | +Abfolge von Bits durch unterschiedlich lange Pausen zu dem Empfängergerät überträgt. Da jedoch auch viele andere Dinge in der Natur wie |
| 11 | +beispielsweise unsere Sonne ein Infrarot-Licht emittieren, wird für die elektronische Verwendung nur eine Frequenz von 38kHz verwendet. |
| 12 | + |
| 13 | +Um zu vermeiden, dass eine Fernbedienung über eine oder gar mehrere Sekunden komplett still gehalten werden muss, werden die einzelnen Bits |
| 14 | +in sehr kurzen zeitlichen Abständen übertragen. Dies klingt im ersten Moment natürlich praktisch, bedeutet jedoch auch dass das empfangende |
| 15 | +Gerät sehr präzise zeitliche Messungen durchführen können muss. Genau dies war jedoch beim CrowPi mit der Verwendung von Java in Kombination |
| 16 | +mit Pi4J nicht möglich, da eine Genauigkeit von rund 60 Mikrosekunden (0.00006 Sekunden) benötigt wird, was sich mit dem Design der Java |
| 17 | +Virtual Machine nicht umsetzen lässt. |
| 18 | + |
| 19 | +Um diese Komponente jedoch trotzdem zur Verfügung zu stellen, nutzt diese Implementation eine vorinstallierte Applikation namens `mode2` |
| 20 | +welche in C geschrieben wurde. Diese gibt die entsprechend erkannten Signale über die Konsole aus, welche dann automatisch in Java |
| 21 | +ausgewertet, geprüft und weitergegeben werden. Ein grosser Teil der Logik ist somit weiterhin innerhalb dieser Komponenten-Klasse |
| 22 | +aufzufinden, das Erkennen der Signale findet jedoch nicht mit Pi4J statt. Sollten sich hier in Zukunft neue Möglichkeiten ergeben, so würde |
| 23 | +sich die Komponente regulär via GPIO auslesen lassen. |
| 24 | + |
| 25 | +Eine saubere Alternative, welche sich weiterhin mit Pi4J umsetzen lässt, wäre einen dedizierten Mikrocontroller für das Empfangen der |
| 26 | +Infrarot-Signale zu verwenden, welcher dann über einen anderen Bus wie beispielsweise [I²C]({{< ref "hardware/i2c" >}}) oder [SPI]({{< ref |
| 27 | +"hardware/spi">}}) die Signale an den Raspberry Pi sendet. Auf dem CrowPi ist dies jedoch nicht vorhanden, sodass diese Möglichkeit nicht |
| 28 | +bestand. |
| 29 | + |
| 30 | +Für die Verwendung dieser Komponente muss die beigelegte Infrarot-Diode auf dem CrowPi in die 3 Pin-Header eingesteckt werden, da sich diese |
| 31 | +nicht direkt auf dem CrowPi befindet. Auf dem nachfolgenden Foto ist angegeben, wo die Infrarot-Photodiode einzustecken ist: |
| 32 | + |
| 33 | +{{< img alt="Anschluss für Infrarot-Diode" src="components/ir-receiver.jpg" height="500px" >}} |
| 34 | + |
| 35 | +## Voraussetzungen |
| 36 | + |
| 37 | +### DIP Switches |
| 38 | + |
| 39 | +Für diese Komponente werden keine spezifischen DIP-Switches benötigt, sodass diese in der Standardkonfiguration belassen werden können: |
| 40 | + |
| 41 | +{{< dip-switches >}} |
| 42 | + |
| 43 | +## Verwendung |
| 44 | + |
| 45 | +Nachfolgend wird die Verwendung der Klasse {{< javadoc class="com.pi4j.crowpi.components.IrReceiverComponent" >}} beschrieben. |
| 46 | + |
| 47 | +### Konstruktoren |
| 48 | + |
| 49 | +| Konstruktor | Bemerkung | |
| 50 | +|:-------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------| |
| 51 | +| `IrReceiverComponent()` | Initialisiert einen Infrarot-Empfänger mit Standardeinstellungen für den CrowPi. | |
| 52 | +| `IrReceiverComponent(String mode2Binary, String devicePath)` | Initialisiert einen Infrarot-Empfänger mit benutzerdefiniertem Pfad zur `mode2` Applikation sowie einem Gerätepfad. | |
| 53 | + |
| 54 | +### Methoden |
| 55 | + |
| 56 | +| | Methode | Bemerkung | |
| 57 | +|:-----------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:----------| |
| 58 | +| `void onKeyPressed(EventHandler<Key> handler)` | Setzt den Event Handler, welcher gedrückte Tasten auf der Infrarot-Fernbedienung als ersten Parameter erhält. Durch die Angabe von `null` kann das Empfangen von Infrarot-Signalen deaktiviert werden. | | |
| 59 | + |
| 60 | +### Enumerationen |
| 61 | + |
| 62 | +- {{< javadoc class="com.pi4j.crowpi.components.IrReceiverComponent" subclass="Key" >}} enthält alle unterstützten Tasten, welche sich auf |
| 63 | + der beigelegten Infrarot-Fernbedienung des CrowPi befinden. Diese Enumeration kann genutzt werden, um innerhalb eines Events die erhaltene |
| 64 | + Taste zu vergleichen und unterschiedliche Aktionen durchzuführen. |
| 65 | + |
| 66 | +## Beispielapplikation |
| 67 | + |
| 68 | +Die Beispielapplikation initialisiert zuerst den Infrarot-Empfänger, wobei hier nicht einmal der übliche Pi4J-Kontext übergeben werden muss, |
| 69 | +da wie bereits weiter oben beschrieben von dieser Komponente die Pi4J-Library nicht genutzt wird. Nach erfolgter Initialisierung wird ein |
| 70 | +Event Handler registriert, welcher jeden Tastendruck auf der Konsole ausgibt sowie beim Drücken der "CH" Taste eine zusätzliche Ausgabe |
| 71 | +vornimmt. Anschliessend wird 30 Sekunden gewartet, bevor der Event Handler wieder deaktiviert wird und die Applikation sich beendet. |
| 72 | + |
| 73 | +{{< code file="src/main/java/com/pi4j/crowpi/applications/IrReceiverApp.java" language="java" >}} |
| 74 | + |
| 75 | +## Weitere Möglichkeiten |
| 76 | + |
| 77 | +- Mit der beigelegten Fernbedienung lassen sich einwandfrei numerische Eingaben tätigen, z.B. um einen einfachen Taschenrechner mit Addition |
| 78 | + und Subtraktion zu bauen, wofür sich die Zahlentasten sowie Plus und Minus nutzen lassen würden. |
| 79 | +- Die Steuerungstasten für Previous, Next sowie Play/Pause könnten genutzt werden, um den Buzzer zu steuern und verschiedene Melodien damit |
| 80 | + abzuspielen. |
0 commit comments