mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik IRMP "arduino-fähig" gemacht


Autor: Stefan S. (seife)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich war in der Verlegenheit, für ein Projekt einen IR-Dekoder zu 
benötigen.
=> IRMP, keine Frage.
Nun bin ich aber Mikrocontroller-Anfänger => Arduino, den kann auch ich 
programmieren ;-)

Von Haus aus ist IRMP aber nicht kompatibel mit Arduino.

=> https://gitorious.org/arduino-addons/irmp-arduino

Damit gehts :-)

Da ist auch ein Beispielprogramm mit drin, das ich zum Testen 
herangezogen habe.

Viel Spass damit, vielleicht hilft es ja dem einen oder anderen...

Ciao,

Stefan

Achso: irsnd ist noch nicht portiert, weil ich es nicht gebraucht habe. 
Sollte aber im Zweifelsfall relativ einfach sein.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo allerseits,

danke erst einmal an Stefan für den Arduino-Port von irmp. Gibt es denn 
jemanden, der es geschafft hat irsnd zu portieren?

Gruß Markus

Autor: Konstantin G. (djun)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Stefan,

vielen Dank, dass du den arduinofähigen IRMP-Quelltext zur Verfügung 
stellst!

Da ich von Haus aus kein Microcontroller-Fachmann bin, sondern 
Produktdesignstudent, hat es zwar etwas länger gedauert, aber zu guter 
Letzt funktionierte das Dekodieren einer Fernbedienung hervorragend.

Arduino ist für mich als Laie einfach schneller auf die Reihe zu 
bekommen.

Doch beim Codeschreiben hapert es. Ich benötige dringend eine 
arduinofähige IRSND Version. Aber ich werde es definitiv nicht 
rechtzeitig alleine auf die Reihe bekommen. Eine funktionierende Version 
habe ich bisher nicht gefunden (mehr dazu siehe unten).

> Achso: irsnd ist noch nicht portiert, weil ich es nicht gebraucht habe.
> Sollte aber im Zweifelsfall relativ einfach sein.

Da du meintest es sei relativ einfach es zu portieren, könntest du mir 
da evtl. mit Rat und Tat zur Seite stehen? Für mich ist das ein Buch mit 
sieben Siegeln. Ich benötige einen arduinotauglichen IRSND-Quelltext mit 
den passenden #include Dateien (und der Möglichkeit von meiner FB 
ausgelesene Codes mit einer seperaten IR-LED auszusenden.

Ich würde mich sehr über eine zeitnahe Antwort freuen!

Viele Grüße
Konstantin

P.S. nachfolgend der von mir gefundene Code, mit einigen Problemen:
Den Pin für den Output(IRLED) habe ich zunächst selbst festgelegt, da 
ich vermute, dass das in einer der include-Dateien noch fehlte
int IRSND_BIT = 3;

Der nächste Kompilierungsfehler war für mich nicht mehr nachvollziehbar:
("at this point in file")
irmp_ISR(&ir_detected);

Der Code stammt von Tim Stoeber, erhältlich unter dem Link: 
http://code.google.com/p/disco-infrared/source/browse/arduino/irmpsend/?r=f64892f3f5994df2677caad6b46d1be5b74670d6#irmpsend%253Fstate%253Dclosed

#include "TimerOne.h"
/* first include Arduino.h, the IDE includes it after irmp*.h ... */
#include "Arduino.h"
/* ... and then chokes on uintX_t ... */


extern "C" {
#include "irmpconfig.h"
#include "irmp.h"
#include "irsndconfig.h"
#include "irsnd.h"
}

int IRSND_BIT = 3;
#define SER_BAUD 115200


/* F_INTERRUPTS is the interrupt frequency defined in irmpconfig.h */
#define US (1000000 / F_INTERRUPTS)


void setup()
{

  Serial.begin(SER_BAUD);
  /* greeting string and debugging ouput */
  Serial.println("Start sending...");
  Serial.print("Interrupt each ");
  Serial.print(US);
  Serial.println(" µs");
  /* configure the input pin. IRMP_BIT is defined in irmpconfig.h,
     default is digital pin 2 */
  //pinMode(IRMP_BIT, INPUT);
  pinMode(IRSND_BIT, OUTPUT);
  //digitalWrite(IRSND_BIT, HIGH);
  delay(20); /* make sure the greeting string is out before starting */
  
  // init IRSND
  //irsnd_init();
  
  //Timer1.initialize(100000);
  // set the interrupt callback function
  //Timer1.attachInterrupt(timerinterrupt);


}


void loop()
{
  
  //IRMP_DATA irmp_data;
  send_close();
  delay(3000);
  /*
  irmpd.protocol = 2;
  irmpd.address = 0x3F40;
  irmpd.command = 0xd;
  irmpd.flags = 0;
  irsnd_send_data(&irmpd, TRUE);
  delay(3000);
  
  
  if (irmp_get_data (&irmp_data))
  {
    Serial.print(irmp_data.protocol);
    Serial.print(":");
    Serial.print(irmp_data.address, HEX);
    Serial.print(":");
    Serial.print(irmp_data.command, HEX);
    Serial.print(":");
    Serial.print(irmp_data.flags, HEX);
    Serial.println("");
    // Relay
    //irsnd_send_data(&irmp_data, TRUE);
    //Serial.println("Data relayed!");
  }*/
  
}

/* helper function: attachInterrupt wants void(), but irmp_ISR is uint8_t() */

void timerinterrupt()
{
  uint8_t ir_detected;
  //uint8_t irsnd_is_on;

  //if(!irsnd_ISR(&irsnd_is_on)) {
  irmp_ISR(&ir_detected);
  Serial.println(ir_detected);
  //}
  /*
  if(count % 30000 == 0) {
    IRMP_DATA irmpd;
    irmpd.protocol = 2;
    irmpd.address = 0x3F40;
    irmpd.command = 0xd;
    irmpd.flags = 0;
    irsnd_send_data(&irmpd, TRUE);
    count = 0; 
    send_close();
  }
  count++;
  */
}


/** manual sending **/

void send_close() {
    digitalWrite(3, LOW);
    // 38kHz pulse for 9000µs => ~ 342 * 26.32µs 
    for(int i=0;i<342;i++) {
      toggle_led();
      delayMicroseconds(26);
    }
    digitalWrite(3, LOW);
    delayMicroseconds(4500); 
    // start bit

    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit1();
    send_bit0();
    send_bit1();
    send_bit1();
    send_bit1();
    send_bit1();
    send_bit1();
    send_bit1();
    send_bit0();
    send_bit0();
    // address
    
    send_bit1();
    send_bit0();
    send_bit1();
    send_bit1();
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    // command
    
    send_bit0();
    send_bit1();
    send_bit0();
    send_bit0();
    send_bit1();
    send_bit1();
    send_bit1();
    send_bit1();
    // inv command
    
    send_bit0();
    // stop bit
}

inline void send_bit0() {
    // 38kHz pulse for 560µs => ~ 21.28 * 26.32µs 
    for(int i=0;i<21;i++) {
      toggle_led();
      delayMicroseconds(26);
    }
    toggle_led();
    delayMicroseconds(560);
}
inline void send_bit1() {
    // 38kHz pulse for 560µs => ~ 21.28 * 26.32µs 
    for(int i=0;i<21;i++) {
      toggle_led();
      delayMicroseconds(26);
    }
    toggle_led();
    delayMicroseconds(1690);
}

inline void toggle_led() {
    digitalWrite(3, 1-digitalRead(3));
}

Autor: Stefan S. (seife)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Konstantin,

tatsächlich habe ich mich kürzlich (vor 4 Wochen) mal an IRSND versucht, 
war aber auf die Schnelle nicht Erfolgreich: das Arduino-Framework 
scheint da bei den Timern dazwischenzufunken, so dass ich statt 38kHz 
Träger immer nur 490Hz bekommen habe, was etwas wenig ist :-)

Ich selber habe nicht die geringste Ahnung von den AVR-Timern etc, 
deswegen (und weil ich es auch nicht wirklich gebraucht habe), habe ich 
dann auch schnell wieder aufgehört.

Sorry dass ich da keine besseren Nachrichten überbringen kann, aber das 
müsste sich idealerweise mal jemand anschauen, der sich sowohl mit den 
Innereien des Arduino-Frameworks als auch mit den AVR-Timern auskennt.

Ciao,

        Stefan

Autor: Kan a. (Firma: Basta) (kanasta)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Stefan Seyfried schrieb:
> ch selber habe nicht die geringste Ahnung von den AVR-Timern etc,

Arduinos sollten verboten werden.

Autor: Konstantin G. (djun)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank Stefan!
Habe nichts von deinem Denkansatz verstanden :-)
(was selbstverständlich an meiner unzulänglichen Kompetenz liegt!)

Nun habe ich ein paar Stunden geflucht und probiert und gemeckert und am 
Ende einen Erfolg zu verbuchen!

Neben einigen Ordnerstruktur-Problemen (niemals einfach so Arduino-Zeugs 
hin und her schieben, nur um eine vermeintliche Ordnung herzustellen!) 
habe ich noch einen anderen interessanten Konflikt entdeckt:

Die irmp.h von Stefan ist nicht mit der irmp.h von Tim identisch. Im 
Quellcode fügt Arduino dann somit entweder beim Dekodier-Code oder aber 
beim Senden-Code die falsche h-Datei ein.

Meine Lösung: Tims irmp.h umbenannt zu irmpforsend.h, ebenso in der 
Datei selbst den Namen ganz zu Beginn dahingehend geändert. Anschließend 
im Quellcode noch #include "irmp.h" zu #include "irmpforsend.h" 
geändert.

Zwischenergebnis: zwei Arduinos: eins mit Stefans Code zum Empfangen und 
das zweite mit Tims Code zum senden.

Nächstes Ziel: Auf Tastendruck soll "Tim" nun "Stefan" einen bestimmten 
Fernbedienungscode aus den IRMP-Protokollen übermitteln. Daraufhin sagt 
"Stefan": "habe ich erkannt!" und spielt eine lustige Melodie über einen 
kleinen Lautsprecher.

Grüße!



@ Kan asta: deine meinung interessiert hier niemanden.

Autor: Kan a. (Firma: Basta) (kanasta)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Konstantin G. schrieb:
> und spielt eine lustige Melodie über einen
> kleinen Lautsprecher.

Genial!

Autor: heinz11 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ist das Thema noch aktuell?

@Konstantin G., kannst du deine Lösung vielleicht mal hier hochladen?
Wäre echt super, Danke!

Autor: probono (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bin auch noch auf der Suche nach einer Lösung... das Folgende 
funktioniert jedenfalls nicht:
https://gist.github.com/3263996
Die LED bleibt einfach dunkel... (getestet mit Digitalkamera)

Autor: Verwirrter Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab vor einiger Zeit ganz gute Erfahrungen mit dieser Library 
gemacht:
http://www.arcfn.com/2009/08/multi-protocol-infrared-remote-library.html

Autor: probono (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier habe ich IRSND mit Arduino funktionierend am Laufen:
https://gist.github.com/3263996/cfbfeb61296d95d42a7072cc3d54c013d77548e7
Funktioniert bei mir mit NEC-Protokoll, aber noch nicht mit 
Grundig-Protokoll.

Wie sende ich "15:0:11:0" (so ausgegeben von IRMP)?

Die Library auf arcfn.com kann das Protokoll nicht.

Autor: probono (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Protokoll war in den Includes an zwei Stellen (irmpconfig.h und 
irsndconfig.h) nicht auf enabled gestellt...

Jetzt kann ich senden, allerdings ist das produzierte Signal anders als 
das der Originalfernbedienung! Und funktioniert somit nicht wirklich.

https://gist.github.com/3263996/e8bb9283026dd934155bc75776d69ad2b60b2de5

Autor: Konstantin G. (djun)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Heinz,

ich habe den Wald vor lauter Bäumen nicht mehr gesehen und eine sinnlos 
komplizierte Lösung gesucht.
IRMP ist für meinen Fall viel zu kompliziert gewesen. Habe ich aber erst 
nach einigen Wochen bemerkt...

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1176098434

Der Eintrag #6 von David Cuartielles beinhaltet einen sehr einfachen 
Senden und Empfangen Code. Beide Codes kann man mit etwas 
Einarbeitungszeit sogar als Arduinoneuling beinahe komplett selbst 
schreiben.

Diese beiden Codes als Grundlage haben mir geholfen eine 
IR-Kommunikation zwischen zwei Arduinos herzustellen.

Viel mehr kann ich an dieser Stelle erstmal nicht sagen, da es Teil 
eines Studienprojekts ist. Wenn alles abgeschlossenen ist, kann ich ja 
bei Interesse nocheinmal einen entsprechenden Post bringen. Und wie es 
so oft im Leben eines "Erfinders" passiert, gibt es / gab es alles schon 
einmal, also für die Neugierigen unter euch:

am Ende ähnelt es stark dem hier (Video anschauen, erklärt alles):

http://www.engadget.com/2012/05/23/incantor-brings-world-of-warcraft-to-real-life-hands-on/

Autor: heinz11 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
ich glaube IRMP ist für mich auch zu kompliziert. Habe diese Anleitung 
für Empfänger und Sender gefunden: http://learn.adafruit.com/ir-sensor/

Kann mir jemand noch einen Tipp geben wie ich am einfachsten eigene 
Timings berechne, brauche etwa 200 verschieden Signal-Codes und alle 
aufzuschreiben wäre nen bisschen blöd ;)

Autor: probono (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat jemand eine Ahnung, warum
https://gist.github.com/3263996/e8bb9283026dd934155bc75776d69ad2b60b2de5
zwar "etwas" sendet, aber nicht wirklich das Signal, das gesendet werden 
soll?

Mache ich irgend etwas mit dem Interrupt falsch?

Autor: Maik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Seyfried schrieb:
> Hallo,
>
> ich war in der Verlegenheit, für ein Projekt einen IR-Dekoder zu
> benötigen.
> => IRMP, keine Frage.
> Nun bin ich aber Mikrocontroller-Anfänger => Arduino, den kann auch ich
> programmieren ;-)
>
> Von Haus aus ist IRMP aber nicht kompatibel mit Arduino.
>
> => https://gitorious.org/arduino-addons/irmp-arduino
>
> Damit gehts :-)
>
> Da ist auch ein Beispielprogramm mit drin, das ich zum Testen
> herangezogen habe.
>
> Viel Spass damit, vielleicht hilft es ja dem einen oder anderen...
>
> Ciao,
>
> Stefan
>
> Achso: irsnd ist noch nicht portiert, weil ich es nicht gebraucht habe.
> Sollte aber im Zweifelsfall relativ einfach sein.

Mit was für einem Arduino hast Du es zum laufen bekommen. Ich habe hier 
einen Mega2560 und damit geht es nicht. Wobei ich nicht ausschließen 
möchte das ich da einen Fehler mache.

Besten Dank.

Autor: Stefan S. (seife)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe einen Arduino Uno benutzt. Ich habe es aber seit längerem nicht 
mehr selbst ausprobiert.

Autor: Falko T. (boman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Maik,

ich bin gerade über den Thread gestolpert und falls du noch vor dem 
Problem stehst.

Der Pin am Atmega2560 ist nicht der gleiche wie bei dem Atmega8.

Wie man hier sieht:
http://arduino.cc/en/uploads/Hacking/Arduino-To-Atmega8-Pins.png
http://arduino.cc/en/uploads/Hacking/PinMap2560sma_.png

gehört zu Digital Pin 2 am Atmega8 --> PD2 und
PD2 am Atmega2560 gehört zu --> Digital Pin 19

Somit musst du den Empfänger an Digital Pin 19 deines Arduino 
anschliessen.

Grüße, Falko

Autor: Falko T. (boman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
An dieser Stelle will ich noch meine eigene Portierung der aktuellen 
IRMP-Version 2.3.8 verlinken:

https://github.com/Boman/IRMPforArduino

IRSND läuft zwar, allerdings ohne die Modulation auf ein 38 kHz Signal, 
da dies für meinen Gebrauch nicht nötig war.

Viel Spaß,
Falko

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
https://github.com/Boman/IRMPforArduino kann ich nicht für mein Arduino 
Uno kompilieren, was mache ich falsch?

arduino_irmp_example.cpp: In function ‘void setup()’:
arduino_irmp_example.cpp:45:18: error: ‘F_INTERRUPTS’ was not declared 
in this scope
arduino_irmp_example.cpp:50:14: error: ‘irsnd_init’ was not declared in 
this scope
arduino_irmp_example.cpp: In function ‘void loop()’:
arduino_irmp_example.cpp:79:50: error: ‘irsnd_send_data’ was not 
declared in this scope
arduino_irmp_example.cpp:98:54: error: ‘irsnd_send_data’ was not 
declared in this scope
arduino_irmp_example.cpp: In function ‘void timerinterrupt()’:
arduino_irmp_example.cpp:118:19: error: ‘irsnd_ISR’ was not declared in 
this scope

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fehler gefunden: hatte auch noch die Version von 
https://gitorious.org/arduino-addons/irmp-arduino im Libraries 
Verzeichnis. Die haben sich nicht vertragen.

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
läuft zwar, aber das Gerät (Sat-Receiver) schaltet nicht ein. Ich 
benutze den gleichen Code, wie beim Empfangen von der Original FB. 
Komisch mit IRMP auf einem AVR-NET-IO habe ich es hinbekommen.

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anfänger schrieb:
> läuft zwar, aber das Gerät (Sat-Receiver) schaltet nicht ein. Ich
> benutze den gleichen Code, wie beim Empfangen von der Original FB.
> Komisch mit IRMP auf einem AVR-NET-IO habe ich es hinbekommen.

Habe ich nicht irgendwo in diesem Thread gelesen, dass derjenige zwar 
IRMP und IRSND auf Arduino portiert hat, aber die Modulation des 
IR-Signals nicht umgesetzt hat, weil er es nicht brauchte?

Achja, hier: 
Beitrag "Re: IRMP "arduino-fähig" gemacht"

Ohne Modulation kannst Du das vergessen. Oder benutzt Du eine andere 
Portierung?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.