In diesem Beitrag möchte ich dir zeigen wie du Daten zwischen 2 Arduino per Infrarot versenden und empfangen kannst. Ich nutze hierzu zwei Arduino UNOs Klone welche jedoch genausogut wie der Originale funktionieren.
benötigte Ressourcen
Wenn du das Beispiel aus diesem Beitrag nachprogrammieren möchtest, so benötigst du:
- einen Arduino UNO*,
- einen Transistor, 2N222*,
- eine Infrarot Diode*,
- diverse Breadboardkabel*,
- ein 400 Pin Breadboard*, oder
- ein 170 Pin Breadboard*
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
Die spätere Schaltung ist klein genug um auf einem 170 Pin Breadboard zu passen, jedoch habe ich meine Microcontroller mit einer Adapterplatte (Acryl Base Plate*) versorgt und somit gleichzeitig immer ein 400 Pin Breadboard mit dabei.
Dieses hat den Vorteil das die Schaltung auf dem Schreibtisch ordentlich liegt denn die Breadboardkabel sind manchmal doch recht unflexibel.
Aufbau der Schaltung zum versenden von Daten am Breadboard
Wie bereits erwähnt wird die Schaltung auf einem Breadboard aufgebaut, dieses hat den Vorteil das man die verwendeten Komponenten später wiederverwenden kann. Ein weiterer Vorteil ist dass, das Stecken der Bauteile deutlich schneller geht als wenn man die Schaltung auf einer Lochraster / Streifenrasterplatine aufbaut.
In diesem Schematischen Aufbau habe ich einen Arduino Nano V3 verwendet, dieser ist deutlich kleiner als der Arduino UNO aber steht diesem in fast nix nach und somit sind die meisten Schaltungen auch kompatibel mit diesem.
Bauteil | Anschluss |
---|---|
Transistor | |
Emitter | Anode der IR Diode |
Basis | digitaler Pin D3 am Arduino UNO |
Kollektor | 5V am Arduino UNO |
IR Diode | |
Anode | Emitter am NPN Transistor |
Kathode | GND am Arduino UNO |
Die Infrarot Diode ist wie eine Leuchtdiode aufgebaut und verfügt über eine Anode(+) und eine Kathode(-). Die Kathode erkennst du unteranderem auch daran das dieses Bein kürzer ist bzw. am Gehäuse eine abgeflachte Stelle angebracht ist.
Transistor
Diese Schaltung verfügt über einen Transistor vom Typ 2N2222 und somit über einen NPN Transistor welcher wie folgt aufgebaut ist:
Der Transistor verfügt über eine flache und eine abgerundete Seite. Auf der flachen Seiten des Transistors steht die Typenbezeichnung und diese Ansicht ist auch diese in welcher man die korrekte Reihenfolge der Pins abliest.
Wenn du mehr über den Transistor erfahren möchtest so kann ich dir den sehr ausführlichen Wikipedia Artikel zu diesem Bauteil empfehlen:
Seite „Transistor“. In: Wikipedia, Die freie Enzyklopädie. Bearbeitungsstand: 2. September 2020, 00:58 UTC. URL: https://de.wikipedia.org/w/index.php?title=Transistor&oldid=203321918 (Abgerufen: 27. September 2020, 11:43 UTC)
testen der Schaltung mit einer Handykamera
Um die Schaltung zu testen kann man zbsp. eine Handykamera nutzen, diese Kameras sind auch im Infrarotbereich empfindlich und daher kann man über das Display erkennen ob ein Signal anliegt oder nicht.
Aufbau der Schaltung zum empfangen von Infrarot Daten
Nachdem wir nun die Schaltung für das absenden von Daten mit dem Arduino UNO erstellt haben, benötigen wir noch eine für das empfangen der Daten. Hierzu kann man entweder ein fertiges Modul* verwenden oder man erstellt sich diese kleine Schaltung auch selber.
Die Schaltung für den Empfänger ist jedoch sehr simple du benötigst eigentlich nur
- ein Arduino* (oder kompatibler Microcontroller),
- einen Infrarot Empfänger*,
- drei Breadboardkabel, sowie
- ein 170 Pin* oder 400 Pin* Breadboard
Der Infrarot Empfänger verfügt über die 3 Pins (Signal, GND und 5V). Welche jeweils über Breadboardkabel mit dem Arduino verbunden werden.
Wie auf der Zeichnung erkennbar wird in diesem einfach fall einfach die +5V an 5V des Arduino und GND ebenso am GND des Arduino angeschlossen. Die Signalleitung des Infrarot Empfängers wird mit einem digitalen Pin des Micrcocontrollers verbunden.
Programmieren der Sketche
Wie man einen Infrarot Empfänger programmiert habe ich bereits im Beitrag Arduino Lektion 20: IR Fernbedienung auslesen ausführlich erläutert und möchte aus diesem Beitrag den Sketch wiederverwenden.
Bibliotheken
Damit wir das Programmieren der Microcontroller etwas einfacher gestalten verwenden wir eine Bibliothek. In meinem Fall nutze ich die Bibliothek von “IRremote” von shirriff und z3t0.
Auf dem GitHub Repository https://github.com/z3t0/Arduino-IRremote findest du weitere Hilfe zum Umgang mit dieser Bibliothek.
empfangen von Daten
Zunächst programmieren wir ein Programm welches ein Signal annimmt und die Werte auf dem seriellen Monitor der Arduino IDE ausgibt.
#include <IRremote.h> int irPin = 8; //Pin am Arduino UNO für den IR Receiver IRrecv irrecv(irPin); //Objekt initialisieren für die IR Übertragung decode_results results; void setup() { pinMode(irPin, INPUT); //Den IR Pin als Eingang deklarieren. irrecv.enableIRIn(); //Den IR Pin aktivieren Serial.begin(9600); //Serielle kommunikation mit 9600 Baud beginnen. } void loop() { if (irrecv.decode(&results)) { //Wenn etwas gelesen wurde dann... //Ausgabe des Wertes auf die Serielle Schnittstelle. int value = results.value; Serial.println(value, DEC); irrecv.resume(); // auf den nächsten Wert warten } }
Video
versenden von Daten
Zum versenden der Daten benötigen wir zusätzlich ein Protokoll welches wir über die Bibliothek auswählen können, in meinem Fall nutze ich “SONY”.
#include <IRremote.h> //Pin der IR Diode am digitalen Pin 3 angeschlossen int irSendPin = 3; IRsend irSender; //Message welche gesendet werden soll char message[5] = {'A','B','C','D','E'}; void setup() { //beginn der seriellen Kommunikation mit 9600 baud Serial.begin(9600); } void loop() { //Das char Array durchlaufen... for (int i = 0; i < 5; i++) { //den Charakter an Position "i" entnehmen char sign = message[i]; //in den ASCII Zahlenwert umwandeln unsigned long value = sign; //Ausgabe des Zeichens sowie der Zahl auf der seriellen Schnittstelle Serial.print("Zeichen = "); Serial.print(sign); Serial.print(" Zahl = "); Serial.println(value); //Absenden des Zahlenwertes irSender.sendSony(value,12); //eine Pause von 25ms. delay(25); } //eine Pause von 500ms. delay(500); }
Download des Sketches
empfangen von Daten
Da wir die Daten über das Protokoll “SONY” versenden, müssen wir beim Empfangen der Daten auf genau dieses Protokoll lauschen.
Dieses können wir recht einfach mit der Funktion “getProtocolString” abfragen. Wir erhalten neben dem Wert “SONY” auch “UNKNOWN” dieses sind irgendwelche Zeichen welche übertragen wurden aber für meinen Fall nicht von Relevanz sind.
#include <IRremote.h> int irPin = 9; //Pin am Arduino UNO für den IR Receiver IRrecv irrecv(irPin); //Objekt initialisieren für die IR Übertragung decode_results results; void setup() { pinMode(irPin, INPUT); //Den IR Pin als Eingang deklarieren. irrecv.enableIRIn(); //Den IR Pin aktivieren Serial.begin(9600); //Serielle kommunikation mit 9600 Baud beginnen. } void loop() { if (irrecv.decode(&results)) { //Wenn etwas gelesen wurde dann... if (irrecv.getProtocolString() == "SONY") { unsigned long value = results.value; //Ausgabe des Wertes auf die Serielle Schnittstelle. Serial.println(char(value)); } irrecv.resume(); // auf den nächsten Wert warten } }
Download des Sketches
Video
Zwischenfazit
In dem Video erkennt man sehr gut das die Daten zwar übertragen werden aber nicht zuverlässig in der richtigen Reihenfolge. Hier muss man mit dem Abstand und Winkel etwas experimentieren dann erhält man ein etwas besseres Ergebnis aber so richtig gut funktioniert das nicht. Dieses Problem kennt man wenn man an damals zurück denkt wenn man zwischen 2 Handys Daten wie MP3 Klingeltöne ausgetauscht hat, dieses hatte auch nur so bedingt funktioniert.
steuern von LEDs per Infrarot
Mit der oben gezeigten Schaltung kann man nun recht einfach 5 oder mehr LEDs steuern. Wir wollen nun jedem Charakter eine LED zuweisen und diese aufleuchten lassen wenn der entsprechende Buchstabe empfangen wurde.
Aufbau der Schaltung
Wir müssen hierzu die Schaltung zum empfangen nur um:
- 5x 220 Ohm Widerstand,
- 5x 5mm LED rot,
erweitern.
Programm / Sketch
#include <IRremote.h> int irPin = 9; //Pin am Arduino UNO für den IR Receiver int led1Pin = 8; int led2Pin = 7; int led3Pin = 6; int led4Pin = 5; int led5Pin = 4; int led1Status = 0; int led2Status = 0; int led3Status = 0; int led4Status = 0; int led5Status = 0; IRrecv irrecv(irPin); //Objekt initialisieren für die IR Übertragung decode_results results; void setup() { pinMode(irPin, INPUT); //Den IR Pin als Eingang deklarieren. pinMode(led1Pin, OUTPUT); pinMode(led2Pin, OUTPUT); pinMode(led3Pin, OUTPUT); pinMode(led4Pin, OUTPUT); pinMode(led5Pin, OUTPUT); irrecv.enableIRIn(); //Den IR Pin aktivieren Serial.begin(9600); //Serielle kommunikation mit 9600 Baud beginnen. } void loop() { if (irrecv.decode(&results)) { //Wenn etwas gelesen wurde dann... if (irrecv.getProtocolString() == "SONY") { unsigned long value = results.value; //Ausgabe des Wertes auf die Serielle Schnittstelle. Serial.println(char(value)); //Der ASCII Wert für den Buchstaben "A" ist 65, "B" ist 66 ... //Zusätzlich wir nach dem aktivieren bzw. deaktivieren der LED der Status entsprechend geändert und gespeichert. switch(value){ case 65: toogleLed(led1Pin, led1Status); led1Status == 0?led1Status=1:led1Status=0; break; case 66: toogleLed(led2Pin, led2Status); led2Status == 0?led2Status=1:led2Status=0;break; case 67: toogleLed(led3Pin, led3Status); led3Status == 0?led3Status=1:led3Status=0;break; case 68: toogleLed(led4Pin, led4Status); led4Status == 0?led4Status=1:led4Status=0;break; case 69: toogleLed(led5Pin, led5Status); led5Status == 0?led5Status=1:led5Status=0;break; } } irrecv.resume(); // auf den nächsten Wert warten } } //Aktivieren bzw. deaktivieren einer LED void toogleLed(int ledPin, int ledStatus){ if(ledStatus == 0){ digitalWrite(ledPin,HIGH); } else { Serial.println("drin"); digitalWrite(ledPin,LOW); } }
Hi,
ein paar Sachen sind verbesserungswürdig, vor der IR-LED sollte ein kleiner Widerstand und
case 65:
toogleLed(led1Pin, led1Status);
led1Status == 0?led1Status=1:led1Status=0;
if (ledStatus == 0)
ist unschön, lieber:
case ‘A’:
led1Status = ! led1Status;
digitalWrite(led1Pin, led1Status);
if (!ledStatus)
Hallo,
vielen Dank für die Anleitung.
Leider ist bei mir einiges an Hardware zerstört worden (IR-LED und Transistor, zum Glück nicht der Arduino), was aber meinen Lernprozess um einiges weiter gebracht hat.
Grundlagen lernen und niemals vergessen: Transistoren Basis immer unterhalb der Spannung ansteuern! LEDs nie ohne Vorwiderstand!
Dennoch werde ich weiterhin Ihren Blog verfolgen, da Sie interessante Ansätze für meine eigenen Projekte haben, allerdings mit entsprechender Vorsicht.
Hi,
vielen Dank für dein Feedback.
Das die Bauteile zerstört sind tut mir leid, bei meiner Schaltung ist das nicht passiert, ich schaue mir das mal genauer an und werde dann ggf. die Schaltung anpassen.
Gruß,
Stefan