Daten per Infrarot versenden und Empfangen am Arduino

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:

elektronische Komponenten für den Aufbau eines Infrarotsenders am Ardunio UNO
elektronische Komponenten für den Aufbau eines Infrarotsenders am Ardunio UNO

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.

Arduino UNO mit 400 Pin Breadboard
Arduino UNO mit 400 Pin Breadboard

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.

BauteilAnschluss
Transistor 
EmitterAnode der IR Diode
Basisdigitaler Pin D3 am Arduino UNO
Kollektor5V am Arduino UNO
IR Diode 
AnodeEmitter am NPN Transistor
KathodeGND 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.

Aufbau einer LED
Aufbau einer LED

Transistor

Diese Schaltung verfügt über einen Transistor vom Typ 2N2222 und somit über einen NPN Transistor welcher wie folgt aufgebaut ist:

Aufbau eines NPN Transistors vom Typ "2N2222"
Aufbau eines NPN Transistors vom Typ “2N2222”

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.

IR Modul für den BBC micro:bit
IR Modul für den BBC micro:bit

Die Schaltung für den Empfänger ist jedoch sehr simple du benötigst eigentlich nur 

Der Infrarot Empfänger verfügt über die 3 Pins (Signal, GND und 5V). Welche jeweils über Breadboardkabel mit dem Arduino verbunden werden.

Aufbau der Infrarot Receiver Diode
Aufbau der Infrarot Receiver Diode

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.

Bibliothek "IRremote" von shirriff, z3t0 im Bibliotheksverwalter
Bibliothek “IRremote” von shirriff, z3t0 im Bibliotheksverwalter

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.

Aktivieren & Deaktivieren von LEDs per Infrarotbefehl
Aktivieren & Deaktivieren von LEDs per Infrarotbefehl

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);
  }
}

Video

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.