IR Übertragungvon Arduino zu Arduino

Programmierung und Hardwaredesign mit Arduino, AVR, PIC und Konsorten.

Moderatoren: MaxZ, ebastler, SeriousD

Antworten
Benutzeravatar

Thread-Ersteller
L_B_S
Beiträge: 531
Registriert: Fr 24. Jul 2015, 10:13
Schule/Uni/Arbeit: KFZ-Elktr.
Hat sich bedankt: 19 Mal
Danksagung erhalten: 23 Mal

IR Übertragungvon Arduino zu Arduino

Beitrag von L_B_S »

Hallo zusammen,

ich möchte eine Infrarot-Übertragung von Arduino zu Arduino realisieren. Dabei benutze ich die <IRremote.h>
Empfang der IR-Codes mit Aduino-Platine 1 durch die entsprechenden Aufrufe:

Code: Alles auswählen

irrecv.enableIRIn();    // Eingang auf Pin 10 aktivieren
irrecv.resume();        // Messung durchführen
irrecv.decode(&results) // Wenn die IR Bibliothek ein decodiertes Signal liefert ...
Auf den gesamten Prog-Code verzichte ich mal. Das klappt soweit auch ganz gut. Damit kann ich die Codes einer Fernbedienung problemlos auslesen.

Nun möcht ich gern Codes senden. Dazu gibt es in der IRremote-Sammlung ein Beispielprogramm:

Code: Alles auswählen

/*
 * IRremote: IRsendDemo - demonstrates sending IR codes with IRsend
 * An IR LED must be connected to Arduino PWM pin 3.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */

#include <IRremote.h>

IRsend irsend;

void setup()
{
  Serial.begin(9600);
}

void loop() {
  if (Serial.read() != -1) {
    for (int i = 0; i < 3; i++) {
      irsend.sendSony(0xa90, 12); // Sony TV power code
      delay(40);
    }
  }
}
Der Anschluss an der Arduino-Platine ist identisch mit:http://openlgtv.org.ru/wiki/index.php/L ... th_Arduino
Serielle Schnittstelle wird nicht benötigt.

Dazu habe ich einige Fragen.

1. Wird durch die <IRremote.h> automatisch Pin 3 als Anschluss für die IR-Diode festgelegt oder kann man das ändern ?
Im Prog-Code kann ich das nicht erkennen.

2. 36 kHz bzw. 38 kHz für die IR-Diode wird auch von Arduino bzw. <IRremote.h> erzeugt ?

3. Was bedeute der Befehlscode IRsend irsend; ?

4. Dann wird 4 x der Code gesendet mit.: irsend.sendSony(0xa90, 12);
Welche Bedeutung haben in diesem Fall die Argumente 0xa90, 12 ?

Ich möchte auch nicht einen Code speziell auf ein bestimmtes Gerät ( in diesem Fall Sony ) übertragen, sondern z.Bsp.
über

irsend.sendRC5(unsigned long data, int nbits);

in diesem Fall den RC5-Code mit 14 Bit übertragen, wobei eigentlich nur die letzten 6 Bit (Kommando) von Bedeutung wären.
RC-5.png
RC-5.png (2.48 KiB) 2559 mal betrachtet
Ist das mit irsend.sendRC5(unsigned long data, int nbits); möglich und welche Bedeutung haben die Argumente
unsigned long data und int nbits bzw. welche Werte müssen diese haben ?

Im Voraus vielen Dank
Ludwig
Benutzeravatar

gamerpaddy
Beiträge: 2624
Registriert: Mo 13. Aug 2012, 09:03
Spezialgebiet: Spezialgebiet
Schule/Uni/Arbeit: Schule/Uni/Arbeit
Wohnort: Mannheim
Hat sich bedankt: 33 Mal
Danksagung erhalten: 303 Mal
Kontaktdaten:

Re: IR Übertragungvon Arduino zu Arduino

Beitrag von gamerpaddy »

mit

Code: Alles auswählen

IRrecv variable1 ( 11 ); 
rufst du eine instanz der IRrecv lib auf, welche dir dann die funktionen der IRrecv.cpp / .h bereitstellt.
Dann kannst du per

Code: Alles auswählen

variable1.enableIRIn();
den jeweiligen Pin (in dem fall 11) als eingang definieren. dann noch mit

Code: Alles auswählen

decode_results results;
der variable results deren spezielle Struktur verpassen ( welche in den decodern benutzt wird). Nun per

Code: Alles auswählen

variable1.decodeRC5(&results) 
werden die daten in die results Struktur geschrieben. per

Code: Alles auswählen

xx = results.bits
und

Code: Alles auswählen

xx = results.value
kannst du die Daten auslesen.

1. IRremoteInt.h zeile 283:
https://github.com/z3t0/Arduino-IRremot ... emoteInt.h
Es muss ein spezieller Pin sein, da dort der Timer drann hängt und er muss PWM fähig sein. Je nach chip ist es ein anderer, ebenfalls zu finden in der Datei.
Ab zeile 156 wird für den jeweiligen chip der Timer festgelegt, welcher an einen pin gebunden ist. Durch das ändern der auskommentierten zeilen lässt sich auch ein anderer Timer auf einem anderen Pin nutzen. für den 328p (Uno, mini, Nano) wäre dies pin 3 oder 9.

2. IRsend.cpp zeile: 68
https://github.com/z3t0/Arduino-IRremot ... irSend.cpp
Welcher die frequenz in der IRremoteInt.h einstellt. Der wert wird in irSend.cpp auf zeile 55 an den Timer übergeben.
https://github.com/z3t0/Arduino-IRremot ... irSend.cpp
enableIROut(hz) definiert die modulationsfrequenz (38..40khz usw) welche von TIMER_CONFIG_KHZ an den jeweiligen Timer übergeben wird in IRremoteInt.h zeile 244, 309, 356, 394, 440, 476. (Je nachdem welcher Timer benutzt wird.


3.Ersteres (IRSend) ist die Library, letzteres ist die Variable. Du packst die Library instanz in die variable irsend. Wenn du nun eine funktion der Library aufrufen willst, musst du irsend. davor packen. Die variable kannst du nennen, wie du willst. Bei einigen Libraries kann man auch mehrere instanzen machen, zb. Servo servo1; Servo servo2; Servo servo3; usw.

4. ersteres sind die Datenbits, letzteres wie wie viele bits. Diese programmiersprachen sind ziemlich dumm, man muss bei fast allem angeben wie viel reinpasst, gesendet oder erwartet wird. Wenn dein Code zb. 12 bits lang ist, musst du bei parameter#2 12 eingeben.

Jeder hersteller hat ein anderen Datensatz & Header / Geräteadresse. Wenn du rohdaten senden willst, ohne die Header / Geräteadresse, nimm irsend.sendRaw
erstes Argument ist ein table/array mit den zu sendenden Daten, zweites Argument ist wie viele daten gesendet werden, drittes die Frequenz in khz.
Die frequenz muss natürlich mit dem Empfangsmodul übereinstimmen, für RC5 wäre dies 36khz.
Ich würde aber in die Daten ebenfalls ein Header oder Geräteadresse reinpacken, damit der Empfänger erkennt dass es für ihn bestimmt ist & die daten verarbeitet. Sonst würde der ja bei jeder Fernbedienung verrückt spielen.
:wurst:
Benutzeravatar

Thread-Ersteller
L_B_S
Beiträge: 531
Registriert: Fr 24. Jul 2015, 10:13
Schule/Uni/Arbeit: KFZ-Elktr.
Hat sich bedankt: 19 Mal
Danksagung erhalten: 23 Mal

Re: IR Übertragungvon Arduino zu Arduino

Beitrag von L_B_S »

Hallo gamerpaddy,

einen Dank erstmal für die umfangreiche Erklärung. Wie schon gesagt, der Empfang der Daten, auch die von verschiedenen Fernbedienungen, klappt ausgezeichnet.
Dein Vorschlag mit irsend.sendRaw zu senden klingt gut und werde ich auch mal testen. Da die <IRremote.h> bzw. die IRremote.cpp nun viel mehr Funktionen bereithält als zum Senden notwendig ist, bin ich am Überlegen, diese entsprechend zu kürzen / einige nicht benötigte Funkt. zu streichen. Dazu fehlt mit allerdings noch das entsprechende Fachwissen, muss mich da erst noch einarbeiten.
Meine Idee war es ursprünglich, die IR-LED hardwaremäßig mit 36 oder 38 kHz Takt anzusteuern und über eine Torschaltung den Code von der Arduino-Platine einzuspeisen. Reduziert die Programmgröße weil da nur gesendet werden soll. Weiß aber noch nicht, wie ich das umsetzen soll. Vielleicht hat jemand da einen Vorschlag. Es sollen wirklich nur Rohdaten gesendet werden und eine Geräteadresse ist natürlich auch sinnvoll.

Gruss
Ludwig
Antworten