Go Down

Topic: IR Empfänger - kein stabiler Emfangscode (Read 2722 times) previous topic - next topic

Doc_Arduino

Feb 11, 2013, 03:52 pm Last Edit: Feb 11, 2013, 03:54 pm by Doc_Arduino Reason: 1
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
Code: [Select]

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
Code: [Select]

/*
* 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
 }
}
Tschau
Doc Arduino

uwefed

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

sth77


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

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Doc_Arduino

#3
Feb 11, 2013, 04:20 pm Last Edit: Feb 11, 2013, 04:22 pm by Doc_Arduino Reason: 1
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?
Tschau
Doc Arduino

michael_x

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 ... 

Doc_Arduino

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 ...

Tschau
Doc Arduino

Doc_Arduino

Hallo,

oder gibt es doch noch irgendwo eine Standard IR-Remote Library von Arduino zum Download? Manche Beispiele lassen sich nämlich nicht kompilieren.
Tschau
Doc Arduino

uwefed

http://arduino.cc/forum/index.php/topic,127552.msg959328.html#msg959328
und http://www.righto.com/2009/08/multi-protocol-infrared-remote-library.html
Grüße Uwe

Doc_Arduino

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
Code: [Select]

// 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
Code: [Select]

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.

Tschau
Doc Arduino

uwefed

Du kannst mit #define arbeiten.
http://arduino.cc/en/Reference/Define
Grüße Uwe

Doc_Arduino

#10
Feb 11, 2013, 08:55 pm Last Edit: Feb 11, 2013, 08:57 pm by Doc_Arduino Reason: 1
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.
Tschau
Doc Arduino

uwefed

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

Code: [Select]
#define Taste_OK 0x3AB8B376
...
    case Taste_OK: 
    Serial.println(" OK            ");
    break;
...

wird
Code: [Select]
    case 0x3AB8B376: 
    Serial.println(" OK            ");
    break;

Dann startet die Kompilierung und ergibt keine Fehler.

Grüße Uwe

Doc_Arduino

#12
Feb 11, 2013, 11:23 pm Last Edit: Feb 11, 2013, 11:27 pm by Doc_Arduino Reason: 1
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 ?  :~

Code: [Select]

/*
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?
Tschau
Doc Arduino

Doc_Arduino

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.


Tschau
Doc Arduino

michael_x

Quote
Fehlermeldung:  'Taste_blue' cannot appear in a constant-expression

Schon etwas spät, aber:

Ein long ist eben kein const long
Und eigentlich wolltest du doch ein const unsigned long definieren, oder ?

#define geht natürlich auch...


Go Up