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() */ |
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 | } |
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
Stefan Seyfried schrieb: > ch selber habe nicht die geringste Ahnung von den AVR-Timern etc, Arduinos sollten verboten werden.
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.
Hallo, ist das Thema noch aktuell? @Konstantin G., kannst du deine Lösung vielleicht mal hier hochladen? Wäre echt super, Danke!
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)
Ich hab vor einiger Zeit ganz gute Erfahrungen mit dieser Library gemacht: http://www.arcfn.com/2009/08/multi-protocol-infrared-remote-library.html
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 ;)
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?
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.
Ich habe einen Arduino Uno benutzt. Ich habe es aber seit längerem nicht mehr selbst ausprobiert.
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
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
Fehler gefunden: hatte auch noch die Version von https://gitorious.org/arduino-addons/irmp-arduino im Libraries Verzeichnis. Die haben sich nicht vertragen.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.