IR Empfänger - kein stabiler Emfangscode

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: GitHub - Arduino-IRremote/Arduino-IRremote: Infrared remote library for Arduino: send and receive infrared signals with multiple protocols 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
  }
}

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

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.

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

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?

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

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

Hallo,

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

und A Multi-Protocol Infrared Remote Library for the Arduino
Grüße Uwe

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.

Du kannst mit #define arbeiten.

Grüße Uwe

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. :slight_smile:
Am Ende lag es am falschen Syntax. Jetzt klappt das.
Ist eigentlich wie immer, der Typ an der Tastatur macht die Fehler. :wink:
DANKE.

Dazu noch eine Frage. Woher weis dann damit der Compiler das die Zahl eine "unsigned long" ist? Wird ja nirgends mehr deklariert.

Referenz lesen, da stehts drin; Hätte auch nicht länger gedauert als die Frage schreiben :wink: :wink: :wink: :wink:

#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

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?

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.

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 [b]const[/b] unsigned long definieren, oder ?

#define geht natürlich auch...

Hallo,

ich kann lesen wie ich will, ich raffe es einfach nicht. Warum benötigt #define keine Datentyp Deklaration? #define ist eigentlich nur ein Label. Wenn ich aber etwas in meiner switch case Anweisung abfrage, dann ist doch der Vergleichswert eine unsigned long Variable. Ich hätte ein Compilerfehler in Form von Datatyp Mismatch erwartet oder sowas. Es kommt aber keine Fehler, es funktioniert einfach. Genau das verstehe ich nicht.

Das hier ist schon so das ich es fast verstehe, das letzte Bit kippt aber leider nicht um. http://arduino.cc/forum/index.php/topic,44023.0.html
Könnte das jemand bitte noch anders formulieren?

Nochwas. Vielleicht lese ich auch manchmal zu viel :slight_smile: Bei der Arduino Reference lese ich das der int Wertebereich von -32,768 to 32,767 beträgt. In meinem allgemeinen C Programmier Buch Markt + Technik wäre das allerdings short. Genauso gibts noch andere Überlappungen, wobei im Buch die Wertebereiche auch von 2 verschiedenen Datantypen abgedeckt werden. unsigned int mit unsigned long oder int mit long decken den gleichen Wertebereich ab. Ist das in C nicht eindeutig festgelegt? Kann das jeder Compilerprogrammierer selbst festlegen?

Doc_Arduino:
Hallo,

ich kann lesen wie ich will, ich raffe es einfach nicht. Warum benötigt #define keine Datentyp Deklaration? #define ist eigentlich nur ein Label. Wenn ich aber etwas in meiner switch case Anweisung abfrage, dann ist doch der Vergleichswert eine unsigned long Variable. Ich hätte ein Compilerfehler in Form von Datatyp Mismatch erwartet oder sowas. Es kommt aber keine Fehler, es funktioniert einfach. Genau das verstehe ich nicht.

Du bringst das etwas durcheinender. #define ist kein Label und definiert kein Label, ist auch keine Variable (Speicher wo ein Wert hineingeschrieben wird).
#define aaaa bbbb
bedeutet
ersetze "aaaa" mit "bbbb"
und zwar als erstes vor dem kompilieren oder sonstwas was der Kompiler so macht. Ganz einfaches Text ersetzen. Da braucht es keinen Datentyp oder sonstwas.

Doc_Arduino:
Das hier ist schon so das ich es fast verstehe, das letzte Bit kippt aber leider nicht um. http://arduino.cc/forum/index.php/topic,44023.0.html
Könnte das jemand bitte noch anders formulieren?

Mit dem gerade gesagten ist es Dir vieleicht klar.

Doc_Arduino:
Nochwas. Vielleicht lese ich auch manchmal zu viel :slight_smile: Bei der Arduino Reference lese ich das der int Wertebereich von -32,768 to 32,767 beträgt. In meinem allgemeinen C Programmier Buch Markt + Technik wäre das allerdings short. Genauso gibts noch andere Überlappungen, wobei im Buch die Wertebereiche auch von 2 verschiedenen Datantypen abgedeckt werden. unsigned int mit unsigned long oder int mit long decken den gleichen Wertebereich ab. Ist das in C nicht eindeutig festgelegt? Kann das jeder Compilerprogrammierer selbst festlegen?

Die Größe der Datentypen (wieviel Byte dafür verwendet werden und somit die größte darstellbare zahl bzw dei genauigkeit bei Float) hängt von Datenbus des Prozessors ab. Arduino hat einen 8Bit Controller. Das ist etwas anderes als eine 32 oder 64 Bit CPU des PCs. Es gibt auch Datentypen die in bestimmten systemen gleich groß sind. Das ist einfach so. Nimm es einfach als gegeben.

Grüße Uwe

Hallo Uwe,

jetzt ist das letzte Bit umgekippt. Der Präprocessor ändert quasi meinen Code so ab, als wenn ich gar kein #define verwendet hätte. Sondern alles direkt an Ort und Stelle quer Beet im Code getippt hätte. Und switch case vergleicht sturr was da steht ohne Rücksicht auf Verluste. Richtig**?**

Das mit den Datentypen ist jetzt klar wie Klosbrühe. :slight_smile:

Doc_Arduino:
Hallo Uwe,

jetzt ist das letzte Bit umgekippt. Der Präprocessor ändert quasi meinen Code so ab, als wenn ich gar kein #define verwendet hätte. Sondern alles direkt an Ort und Stelle quer Beet im Code getippt hätte. Und switch case vergleicht sturr was da steht ohne Rücksicht auf Verluste. Richtig**?**

Das mit den Datentypen ist jetzt klar wie Klosbrühe. :slight_smile:

Richtig !

Hallo,

muß mich nochmal richtig bedanken für die prima Erklärungen. Meine Leitung ist einfach länger. :slight_smile: