Offline
Full Member
Karma: 0
Posts: 216
ATmega 2560
|
 |
« on: February 11, 2013, 09:52:51 am » |
Hallo, ich habe mir den Vishay TSOP4836 gekauft und wollte jetzt damit rumspielen. Habe dazu aus dem elektor Buch Arduino von Günther Spanner zuerst die Library runtergeladen von http:\\arcfn.com/files/IRremote.zip. Die machte aber beim kompilieren nur Fehler. Dann habe ich von hier: https://github.com/shirriff/Arduino-IRremote eine andere runtergeladen. Die macht beim kompilieren keine Sorgen. Ich habe eine HAMA 52451 Mediacenterfernbedienung http://www.amazon.de/Hama-MCE-Remote-Control-PC-Fernbedienung/dp/B000X1EL4W und eine von meinem harman kardon AV Receiver. Mein Problem ist, wenn ich immer die gleiche Taste auf der Hama drücke, sind die angezeigten Codes nicht immer gleich. Unknown wird auch immer angegeben. Bei der hk Fernbedienung steht was von NEC da, der Code pro Taste ist aber auch nicht immer gleich Kann man dagegen etwas machen? Falsche IR Library? Bsp. die OK Taste der HAMA, Ausgabe im IDE Terminal 3AB8B376 Unknown encoding: 3AB8B376 (32 bits) Raw (26): -6534 2100 -850 1050 -900 1100 -900 1050 -450 550 -400 600 -900 1050 -400 600 -400 550 -950 1050 -400 600 -400 550 -900 600 76E02EE9 Unknown encoding: 76E02EE9 (32 bits) Raw (26): 26780 2050 -900 1100 -900 1050 -900 1050 -450 600 -350 600 -900 1100 -350 600 -400 600 -900 1050 -400 600 -400 600 -900 550 3AB8B376 Unknown encoding: 3AB8B376 (32 bits) Raw (26): -6256 2100 -900 1100 -850 1100 -900 1050 -400 600 -400 550 -900 1100 -400 600 -400 600 -850 1100 -400 550 -400 600 -900 550 3AB8B376 Unknown encoding: 3AB8B376 (32 bits) Raw (26): 22316 2000 -950 1050 -900 1050 -950 1050 -400 550 -450 550 -950 1000 -450 550 -450 550 -900 1050 -450 550 -450 550 -900 550 3AB8B376 Unknown encoding: 3AB8B376 (32 bits) Raw (26): -27370 2050 -950 1050 -900 1050 -950 1000 -450 550 -450 550 -950 1000 -450 550 -450 550 -900 1050 -450 550 -450 500 -950 550 3AB8B376 Unknown encoding: 3AB8B376 (32 bits) Raw (26): -31920 2100 -850 1100 -900 1050 -900 1100 -400 550 -450 550 -900 1100 -400 550 -400 600 -900 1100 -350 600 -400 650 -850 600 6757E6B4 Unknown encoding: 6757E6B4 (32 bits) Raw (24): 17536 2100 -850 1050 -950 1050 -900 1100 -850 1100 -900 1100 -350 600 -400 600 -900 600 -350 1100 -400 600 -850 600 3AB8B376 Unknown encoding: 3AB8B376 (32 bits) Raw (26): 13386 2050 -900 1100 -900 1050 -900 1050 -400 600 -400 600 -900 1050 -400 600 -400 550 -950 1050 -400 600 -400 550 -900 600 E1AF4809 Unknown encoding: E1AF4809 (32 bits) Raw (26): -964 2050 -900 1100 -900 1050 -900 1100 -400 550 -450 550 -900 1050 -450 600 -350 600 -900 1050 -400 600 -400 600 -900 550 3AB8B376 Unknown encoding: 3AB8B376 (32 bits) Raw (26): 10836 2050 -900 1050 -900 1050 -950 1050 -400 600 -400 600 -900 1100 -350 600 -400 550 -900 1100 -400 550 -450 550 -900 600
Programmcode /* * IRremote: IRrecvDump - dump details of IR codes with IRrecv * An IR detector/demodulator must be connected to the input RECV_PIN. * Version 0.1 July, 2009 * Copyright 2009 Ken Shirriff * http://arcfn.com * JVC and Panasonic protocol added by Kristian Lauszus (Thanks to zenwheel and other people at the original blog post) */
#include <IRremote.h>
int RECV_PIN = 11; IRrecv irrecv(RECV_PIN); decode_results results;
void setup() { Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver }
// Dumps out the decode_results structure. // Call this after IRrecv::decode() // void * to work around compiler issue //void dump(void *v) { // decode_results *results = (decode_results *)v void dump(decode_results *results) { int count = results->rawlen; if (results->decode_type == UNKNOWN) { Serial.print("Unknown encoding: "); } else if (results->decode_type == NEC) { Serial.print("Decoded NEC: "); } else if (results->decode_type == SONY) { Serial.print("Decoded SONY: "); } else if (results->decode_type == RC5) { Serial.print("Decoded RC5: "); } else if (results->decode_type == RC6) { Serial.print("Decoded RC6: "); } else if (results->decode_type == PANASONIC) { Serial.print("Decoded PANASONIC - Address: "); Serial.print(results->panasonicAddress,HEX); Serial.print(" Value: "); } else if (results->decode_type == JVC) { Serial.print("Decoded JVC: "); } Serial.print(results->value, HEX); Serial.print(" ("); Serial.print(results->bits, DEC); Serial.println(" bits)"); Serial.print("Raw ("); Serial.print(count, DEC); Serial.print("): ");
for (int i = 0; i < count; i++) { if ((i % 2) == 1) { Serial.print(results->rawbuf[i]*USECPERTICK, DEC); } else { Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC); } Serial.print(" "); } Serial.println(""); }
void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); dump(&results); irrecv.resume(); // Receive the next value } }
|
|
|
|
« Last Edit: February 11, 2013, 09:54:56 am by Doc_Arduino »
|
Logged
|
Tschau Doc Arduino
|
|
|
|
Forum Moderator
BZ (I)
Offline
Brattain Member
Karma: 160
Posts: 15641
+39 349 2158303
|
 |
« Reply #1 on: February 11, 2013, 09:57:01 am » |
Normalerweise sind Fernsteuerungen auf 38kHz moduliert. Ein 36kHz Empfänger könnte ein 38kHz Signal schlecht empfangen und darum Arduino nicht sicher den Code decodieren. Grüße Uwe
|
|
|
|
|
Logged
|
|
|
|
|
Germany
Offline
Edison Member
Karma: 33
Posts: 1788
Arduino rocks
|
 |
« Reply #2 on: February 11, 2013, 10:11:12 am » |
Normalerweise sind Fernsteuerungen auf 38kHz moduliert. Ein 36kHz Empfänger könnte ein 38kHz Signal schlecht empfangen und darum Arduino nicht sicher den Code decodieren.
Das wiederum sehe ich nicht so kritisch, meine Erfahrungen haben gezeigt, dass man auch mit unterschiedlichen Frequenzen klarkommt. Ich hoffe ich interpretiere Fig. 5 im Datenblatt dahingehend auch richtig: http://www.produktinfo.conrad.com/datenblaetter/150000-174999/171107-da-01-en-IR_EMPFAENGER_MODUL_TSOP4836__VIS.pdf
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 216
ATmega 2560
|
 |
« Reply #3 on: February 11, 2013, 10:20:40 am » |
Hallo,
ich habe da keine Ahnung wie wichtig die Trägerfrequenz ist. Das Problem für mich ist eh das in allen IR Beispielen entweder 36kHz oder 38kHz Typen verwendet werden. Ob die Autoren das jetzt an ihren Fernbedienungen getestet haben oder allgemein gültig nicht schreibt niemand hin. Ich werde mir auf den Fall noch eine mit 38kHz besorgen. Kostet ja nicht die Welt.
Das der empfangene Code "Unknown" stört später nicht? Ich müßte dann nur im Programm zum Bsp. den "originalen" Tastencode 3AB8B376 für "OK" abfragen?
|
|
|
|
« Last Edit: February 11, 2013, 10:22:40 am by Doc_Arduino »
|
Logged
|
Tschau Doc Arduino
|
|
|
|
Germany
Offline
Edison Member
Karma: 27
Posts: 1486
|
 |
« Reply #4 on: February 11, 2013, 11:20:03 am » |
Die gleiche Taste sendet "normalerweise" (jedenfalls bei meinen Fernbedienungen ) zwei verschiedene Codes, wenn man zweimal drückt, und wiederholt den gleichen, wenn man den Finger länger drauflässt.
Wenn du dir die Codes als HEX-Zahlen anzeigen lässt, siehst du evtl. dass sie sehr ähnlich sind ...
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 216
ATmega 2560
|
 |
« Reply #5 on: February 11, 2013, 12:17:11 pm » |
Hallo,
die Tastencodes sehe ich auch so im Terminal über und neben "Unknown encoding:" Die gleiche Taste immer kurz gedrückt sendet bei mir meistens den gleichen Code und zwischendurch eben einen anderen wie oben dargestellt. Habe jetzt nochmal mit extra Kondensatoren für Ub am IR Empfänger probiert, am Problem ändert sich nichts. Werde das nochmal probieren mit einem 38kHz IR wenn ich den dann habe ... könnte doch länger dauern.
Danke soweit für Eure Hilfe. Falls noch Ideen kommen nur zu ...
|
|
|
|
|
Logged
|
Tschau Doc Arduino
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 216
ATmega 2560
|
 |
« Reply #6 on: February 11, 2013, 12:42:24 pm » |
Hallo,
oder gibt es doch noch irgendwo eine Standard IR-Remote Library von Arduino zum Download? Manche Beispiele lassen sich nämlich nicht kompilieren.
|
|
|
|
|
Logged
|
Tschau Doc Arduino
|
|
|
|
Forum Moderator
BZ (I)
Offline
Brattain Member
Karma: 160
Posts: 15641
+39 349 2158303
|
 |
« Reply #7 on: February 11, 2013, 01:08:40 pm » |
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 216
ATmega 2560
|
 |
« Reply #8 on: February 11, 2013, 01:55:17 pm » |
Hallo, okay, erster Link sagt mir es können noch inkompatible Librarys im Netz herumschwirren. Zweiten Link kenne ich, von dort ist meine verwendete IRremote Library her. Wenn das der Arduino Standard ist, dann ist ja gut. Noch eine Frage zu meinen Sketch Warum kann man in einer Switch Case Anweisung keine vorher definierten Variablennamen verwenden? Ich wollte in Setup an zentraler Stelle Namen für die Tastencodes definieren // HAMA MCE IR Fernbedienung unsigned long Taste_OK = 0x3AB8B376; unsigned long Taste_yellow = 0x40191E30; unsigned long Taste_blue = 0x95CEB686; unsigned long Taste_green = 0xF7E13AC6; unsigned long Taste_red = 0x3CE8AD6 ; unsigned long Taste_VolUp = 0xAB28A4DE; unsigned long Taste_VolDown = 0x5BCF69D0;
und dann abfragen switch(results.value) {
case 0x3AB8B376: Serial.println(" OK "); break;
case 0x40191E30: Serial.println(" yellow "); break; case Taste_blue: Serial.println(" blue "); break;
case Taste_green: Serial.println(" green "); }
Wenn ich hinter case den HEX Code schreibe macht er das. Schreibe ich den Variablennamen hin wird es nicht kompiliert. Fehlermeldung: 'Taste_blue' cannot appear in a constant-expression Und warum darf ich nicht "Taste_Vol+" definieren? "Taste_VolUp" lässt er zu. Kompilier meckert das + Zeichen an.
|
|
|
|
|
Logged
|
Tschau Doc Arduino
|
|
|
|
Forum Moderator
BZ (I)
Offline
Brattain Member
Karma: 160
Posts: 15641
+39 349 2158303
|
 |
« Reply #9 on: February 11, 2013, 02:26:52 pm » |
Du kannst mit #define arbeiten. http://arduino.cc/en/Reference/DefineGrüße Uwe
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 216
ATmega 2560
|
 |
« Reply #10 on: February 11, 2013, 02:55:19 pm » |
Hallo, ich bin jetzt fast abgestorben gewesen. Denn das mit dem # define hatte ich schon probiert, ging nicht, also sein gelassen. Jetzt sagst Du mach es mit #define. Na Prima dachte ich.  Wenn der Uwe das sagt, dachte ich, muß das doch gehen.  Am Ende lag es am falschen Syntax. Jetzt klappt das. Ist eigentlich wie immer, der Typ an der Tastatur macht die Fehler. DANKE.Dazu noch eine Frage. Woher weis dann damit der Compiler das die Zahl eine "unsigned long" ist? Wird ja nirgends mehr deklariert.
|
|
|
|
« Last Edit: February 11, 2013, 02:57:00 pm by Doc_Arduino »
|
Logged
|
Tschau Doc Arduino
|
|
|
|
Forum Moderator
BZ (I)
Offline
Brattain Member
Karma: 160
Posts: 15641
+39 349 2158303
|
 |
« Reply #11 on: February 11, 2013, 04:59:00 pm » |
Referenz lesen, da stehts drin; Hätte auch nicht länger gedauert als die Frage schreiben  #define ersetzt vor dem Komplieren den Text (so wie ersetzen in Word) also aus #define Taste_OK 0x3AB8B376 ... case Taste_OK: Serial.println(" OK "); break; ... wird case 0x3AB8B376: Serial.println(" OK "); break; Dann startet die Kompilierung und ergibt keine Fehler. Grüße Uwe
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 216
ATmega 2560
|
 |
« Reply #12 on: February 11, 2013, 05:23:01 pm » |
Hallo, ich habe komische Effekte. Sobald ich vom IDE den Serial-Monitor öffne, resetet sich mein Arduino Mega2560, sehe ich, weil die RGB-LED dann nochmal 5sec. lang voll leuchtet. Danach reagiert alles richtig auf die Fernbedienung. Wobei ich laut meiner Logik andere PWM Pins nehmen mußte wie ich dachte. Auf dem Mega2560 ist noch das WiFi Shield gesteckt was z.Z. nicht genutzt wird. Bei vorherigen Versuchen konnte ich die PWM Pins 10,11,12 nutzen für die RGB-LED. Das geht seit dem rumgefummel mit der IRremote Library nicht mehr zu 100%. Jetzt bin ich schon auf 7,8,11 ausgwischen. Pin 9 und 10 kann ich nicht nutzen. Sonst wird RGB-BLAU nur am Anfang 5sec angesteuert danach passiert damit nichts mehr. Es wird erst gar nicht in die Case Anweisung von Taste_blue gesprungen. Keine Terminalausgabe "blau". Total tot. Jetzt dachte ich, vielleicht belegt die IRremote Library meine Ausgänge schon. Also habe ich in die Datei IRremoteInt.h geschaut und sehe darin das für den Mega nur Pin 9 verwendet wird für einen Timer. #define IR_USE_TIMER2 // tx = pin 9 Warum funktioniert es dann nicht mit Pin 10 und 12 ?  /* Arduino Mega 2560 */
#include <IRremote.h>
int RECV_PIN = 2; // IR Empfänger an Pin 2 IRrecv irrecv(RECV_PIN); decode_results results;
int Red = 1; int Green = 1; int Blue = 1;
// HAMA MCE IR Fernbedienung #define Taste_OK 0x3AB8B376 #define Taste_yellow 0x40191E30 #define Taste_blue 0x95CEB686 #define Taste_green 0xF7E13AC6 #define Taste_red 0x3CE8AD6 #define Taste_VolUp 0xAB28A4DE #define Taste_VolDown 0x5BCF69D0
void setup() { Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver
pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(11, OUTPUT); digitalWrite(7, HIGH); // von RGB-LED ROT EIN digitalWrite(8, HIGH); // von RGB-LED GRÜN EIN digitalWrite(11, HIGH); // von RGB-LED BLAU EIN delay(5000); // wait for a second digitalWrite(7, LOW); // RGB-LED aus digitalWrite(8, LOW); digitalWrite(11, LOW); }
void loop() { if (irrecv.decode(&results)) { irrecv.resume(); // Receive the next value }
switch(results.value) {
case Taste_blue: Serial.println(" blue "); Blue++; Serial.println(Blue, DEC); break;
case Taste_green: Serial.println(" green "); Green++; Serial.println(Green, DEC); break;
case Taste_red: Serial.println(" red "); Red++; Serial.println(Red, DEC); } analogWrite(7, Red); // RGB-LED Helligkeit laut FB Tastendruck analogWrite(8, Green); analogWrite(11, Blue); }
Edit: das mit dem #define hatte ich eben nicht verstanden. Also gibts im Compiler eine Art Automatikerkennung? Kann man sich das so vorstellen?
|
|
|
|
« Last Edit: February 11, 2013, 05:27:56 pm by Doc_Arduino »
|
Logged
|
Tschau Doc Arduino
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 216
ATmega 2560
|
 |
« Reply #13 on: February 12, 2013, 01:38:44 pm » |
Hallo,
muß nochmal fragen wegen der generellen Pinbelegung vom Mega2560 + WiFi-Shield, was benutzt ist und was man selbst frei verwenden kann.
Also, ist es richtig das ich folgende Pin selbst nicht mehr nutzen darf? Arduino Pin Bezeichnung: 0, 1, wegen Serial zu USB 4 wegen Select SD Card auf WiFi Shield 7 wegen Handshake mit WiFi Shield 10 wegen Select WiFi auf WiFi Shield 20, 21 wegen I2C Bus 50, 51, 52, 53 wegen ICSP Header, auch wegen WiFi Shield
Wenn ich jetzt noch die IRremote Library verwende, dann ist damit zusätzlich Pin 9 wegen der Timer 2 Nutzung für mich nicht nutzbar? In die Datei IRremoteInt.h steht folgende Zeile #define IR_USE_TIMER2 // tx = pin 9
Bedeutet Arduino Pin 2 ,3, 5, 6, 8, 11, 12, 13 kann ich selbst frei belegen? Ich benötige nämlich paar PWM fähige Ausgänge.
|
|
|
|
|
Logged
|
Tschau Doc Arduino
|
|
|
|
Germany
Offline
Edison Member
Karma: 27
Posts: 1486
|
 |
« Reply #14 on: February 13, 2013, 04:51:18 am » |
Fehlermeldung: 'Taste_blue' cannot appear in a constant-expression Schon etwas spät, aber: Ein long ist eben kein const longUnd eigentlich wolltest du doch ein const unsigned long definieren, oder ? #define geht natürlich auch...
|
|
|
|
|
Logged
|
|
|
|
|
|