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.
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
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() */
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
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.
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)
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.
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
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/
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 ;)
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.
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.pnghttp://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
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
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
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.
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?
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