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


von Stefan S. (seife)


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.

von Markus (Gast)


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

von Konstantin G. (djun)


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

1
#include "TimerOne.h"
2
/* first include Arduino.h, the IDE includes it after irmp*.h ... */
3
#include "Arduino.h"
4
/* ... and then chokes on uintX_t ... */
5
6
7
extern "C" {
8
#include "irmpconfig.h"
9
#include "irmp.h"
10
#include "irsndconfig.h"
11
#include "irsnd.h"
12
}
13
14
int IRSND_BIT = 3;
15
#define SER_BAUD 115200
16
17
18
/* F_INTERRUPTS is the interrupt frequency defined in irmpconfig.h */
19
#define US (1000000 / F_INTERRUPTS)
20
21
22
void setup()
23
{
24
25
  Serial.begin(SER_BAUD);
26
  /* greeting string and debugging ouput */
27
  Serial.println("Start sending...");
28
  Serial.print("Interrupt each ");
29
  Serial.print(US);
30
  Serial.println(" µs");
31
  /* configure the input pin. IRMP_BIT is defined in irmpconfig.h,
32
     default is digital pin 2 */
33
  //pinMode(IRMP_BIT, INPUT);
34
  pinMode(IRSND_BIT, OUTPUT);
35
  //digitalWrite(IRSND_BIT, HIGH);
36
  delay(20); /* make sure the greeting string is out before starting */
37
  
38
  // init IRSND
39
  //irsnd_init();
40
  
41
  //Timer1.initialize(100000);
42
  // set the interrupt callback function
43
  //Timer1.attachInterrupt(timerinterrupt);
44
45
46
}
47
48
49
void loop()
50
{
51
  
52
  //IRMP_DATA irmp_data;
53
  send_close();
54
  delay(3000);
55
  /*
56
  irmpd.protocol = 2;
57
  irmpd.address = 0x3F40;
58
  irmpd.command = 0xd;
59
  irmpd.flags = 0;
60
  irsnd_send_data(&irmpd, TRUE);
61
  delay(3000);
62
  
63
  
64
  if (irmp_get_data (&irmp_data))
65
  {
66
    Serial.print(irmp_data.protocol);
67
    Serial.print(":");
68
    Serial.print(irmp_data.address, HEX);
69
    Serial.print(":");
70
    Serial.print(irmp_data.command, HEX);
71
    Serial.print(":");
72
    Serial.print(irmp_data.flags, HEX);
73
    Serial.println("");
74
    // Relay
75
    //irsnd_send_data(&irmp_data, TRUE);
76
    //Serial.println("Data relayed!");
77
  }*/
78
  
79
}
80
81
/* helper function: attachInterrupt wants void(), but irmp_ISR is uint8_t() */
82
83
void timerinterrupt()
84
{
85
  uint8_t ir_detected;
86
  //uint8_t irsnd_is_on;
87
88
  //if(!irsnd_ISR(&irsnd_is_on)) {
89
  irmp_ISR(&ir_detected);
90
  Serial.println(ir_detected);
91
  //}
92
  /*
93
  if(count % 30000 == 0) {
94
    IRMP_DATA irmpd;
95
    irmpd.protocol = 2;
96
    irmpd.address = 0x3F40;
97
    irmpd.command = 0xd;
98
    irmpd.flags = 0;
99
    irsnd_send_data(&irmpd, TRUE);
100
    count = 0; 
101
    send_close();
102
  }
103
  count++;
104
  */
105
}
106
107
108
/** manual sending **/
109
110
void send_close() {
111
    digitalWrite(3, LOW);
112
    // 38kHz pulse for 9000µs => ~ 342 * 26.32µs 
113
    for(int i=0;i<342;i++) {
114
      toggle_led();
115
      delayMicroseconds(26);
116
    }
117
    digitalWrite(3, LOW);
118
    delayMicroseconds(4500); 
119
    // start bit
120
121
    send_bit0();
122
    send_bit0();
123
    send_bit0();
124
    send_bit0();
125
    send_bit0();
126
    send_bit0();
127
    send_bit1();
128
    send_bit0();
129
    send_bit1();
130
    send_bit1();
131
    send_bit1();
132
    send_bit1();
133
    send_bit1();
134
    send_bit1();
135
    send_bit0();
136
    send_bit0();
137
    // address
138
    
139
    send_bit1();
140
    send_bit0();
141
    send_bit1();
142
    send_bit1();
143
    send_bit0();
144
    send_bit0();
145
    send_bit0();
146
    send_bit0();
147
    // command
148
    
149
    send_bit0();
150
    send_bit1();
151
    send_bit0();
152
    send_bit0();
153
    send_bit1();
154
    send_bit1();
155
    send_bit1();
156
    send_bit1();
157
    // inv command
158
    
159
    send_bit0();
160
    // stop bit
161
}
162
163
inline void send_bit0() {
164
    // 38kHz pulse for 560µs => ~ 21.28 * 26.32µs 
165
    for(int i=0;i<21;i++) {
166
      toggle_led();
167
      delayMicroseconds(26);
168
    }
169
    toggle_led();
170
    delayMicroseconds(560);
171
}
172
inline void send_bit1() {
173
    // 38kHz pulse for 560µs => ~ 21.28 * 26.32µs 
174
    for(int i=0;i<21;i++) {
175
      toggle_led();
176
      delayMicroseconds(26);
177
    }
178
    toggle_led();
179
    delayMicroseconds(1690);
180
}
181
182
inline void toggle_led() {
183
    digitalWrite(3, 1-digitalRead(3));
184
}

von Stefan S. (seife)


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

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

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

Arduinos sollten verboten werden.

von Konstantin G. (djun)


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.

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

Konstantin G. schrieb:
> und spielt eine lustige Melodie über einen
> kleinen Lautsprecher.

Genial!

von heinz11 (Gast)


Lesenswert?

Hallo,
ist das Thema noch aktuell?

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

von probono (Gast)


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)

von Verwirrter Anfänger (Gast)


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

von probono (Gast)


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.

von probono (Gast)


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

von Konstantin G. (djun)


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/

von heinz11 (Gast)


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

von probono (Gast)


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?

von Maik (Gast)


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.

von Stefan S. (seife)


Lesenswert?

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

von Falko T. (boman)


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

von Falko T. (boman)


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

von Anfänger (Gast)


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

von Anfänger (Gast)


Lesenswert?

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

von Anfänger (Gast)


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.

von Frank M. (ukw) (Moderator) Benutzerseite


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?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.