Nicht alle Tasten auslesbar, IR Fernbedienung

Hallo Leute

Ich versuche eine alte IR Fernbedienung von einer Maschinensteuerung auszulesen. Mit einer programmierbaren Fernbedienung (Marke ONE FOR All TV Zapper URC6810) konnte ich die Signale übernehmen und speichern. Jedoch klappt es mit dem Arduino Uno mit KY-022 nicht. Beim untenstehenden Standardcode von Ken Shirriff kann ich die Signale von 'normalen' Fernbedienungen dekodieren. Auch die unbenutzten Tasten der ONE FOR All Fernbedienung kann ich damit auslesen. Jedoch beim Senden der programmierten Signale der ONE FOR All oder der original Fernbedienung blinkt die LED auf dem IR Modul nicht und die Konsole gibt keinen Text aus. Die Maschinensteuerung jedoch reagiert auf die Signale beider Fernbedienungen.

Die Originalfernbedienung stammt aus den 90er Jahren und hat violette Sendedioden.

Hat jemand von euch eine Idee, wie ich dieses, scheinbar anders aufgebaute Signal, mit dem Arduino lesen, dekodieren und wieder senden kann? Irgendwie sollte es doch möglich sein, da die TV-Universalfernbedienung auch angelernt werden konnte.

Vielen Dank für eure Hilfe!

Benutzter Code von Ken Shirriff:

/*
   IRremote: IRrecvDemo - demonstrates receiving 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
*/

#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  // In case the interrupt driver crashes on setup, give a clue
  // to the user what's going on.
  Serial.println("Enabling IRin");
  irrecv.enableIRIn(); // Start the receiver
  Serial.println("Enabled IRin");
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
  delay(100);
}

Ist für Fernbedienung mit 38KHz Trägersignal, nicht das Deine arbeitet mit 36KHz
Und nimm den Beispiel aus der IR Bibliothek.

Bitte diesen Beitrag lesen und den Sketch in Code-Tags setzen.

Danke für den Hinweis!

Hi Fony
Danke für die Info. Ich bin noch nicht so versiert mit dem Arduino. Habe kein explizites Beispiel für 36KHz in der Bibliothek gefunden.
Hast Du mir einen guten Tip, wo ich es finden werde?
Danke und Gruss

So wie ich sehe kann der KY-022 die 36KHz Signale nicht "lesen", also schau nach anderen Empfänger == gezielt nach 36KHz suchen, habe mall mit einer AKI FB Probleme gehabt, nur war der Aufwand für mich zu groß. Weis nicht ob die Libs kommen mit der Kodierung zur Recht

Es geht um die Trägerfrequenz der Hardware. Mit der Bibliothek hat das nichts zu tun, die kümmert sich nur um das Nutzsignal.

OK Danke

Die IR Empfänger haben intern einen Filter der nur eine gewisse Trägerfrequenz durchläßt. Diese Empfänger gibt es für verschiedene Frequenzen.

ZB gibt es die TSOP-Familie in verschiedenen Trägerfrequenzen wobei die ersten 2 bis 3 Zahlen das Modell ist und die letzten 2 die Frequenz darstellt. mögliche Frequenzen sind 25kHz, 30k, 33k,36k ,38k ,40k ,56kHz. Das ist wie Amplitudenmodulation.

Grüße Uwe

Hallo Uwe
Danke für diesen lehrreichen update über die Trägerfrequenz der Empfängerdioden! Spielt diese Frequenz bei den Sendedioden auch eine Rolle (verschiedene Typen) oder wird die Trägerfrequenz mittels Codes programmiert?

Beides.
Die Trägerfrequenz wird mittels Code erzeugt, muss aber auch von der Led genutzt werden können.

Eines ist die "Farbe" der IRLED. Diese muß mit dem Empfänger zusammenpassen. Üblich sind IRLED mit 940nm auf die der Empfänger auch am empfindlichsten ist.

Dieses Licht wird mit 25kHz bis 56kHz gepulst, das heißt der Sender (IR Diode) wird immer ein und ausgeschaltet. Das ist die Trägerfrequenz. Die Empfänger haben einen elektronischen Filter eingebaut, der nur diese Frequenz durchläßt. Die meisten IR Fernsteuerungen nutzten 38kHz.
Wenn ein Schwingungspaket mit 38Khz bei einem 38Khz Empfänger daherkommt, wird für diese Dauer ein HIGH ausgegeben; wenn nichts kommt LOW.

Die Software die den IRCode generiert generiert die 38kHz und auch die Packete die dann vom Empfänger in H und L gewandelt werden und von der Empfangssoftware je nach verwendeten Code decodiert werden.

Grüße Uwe

Wenn Uwe schreibt "der nur diese Frequenz durchläßt", dann werden danebenliegende Frequenzen abgeschwächt auch durchgelassen. Daher werden Codes zufällig erkannt oder auch nicht, das ist Dein Fehlerbild. Möglicherweise wird eine Fernbedienung auch zur Nahbedienung und funktioniert nur auf kurze Entfernung.

Vielen Dank an alle! Einiges ist klarer geworden. Versuche nun vom Hersteller entsprechende Daten zu erhalten.
Wie man die Pulse, Pulslängen, Wiederholungen etc. im binärcode programmieren muss, muss ich noch ein wenig hirnen!
Aber, wie sagt man so schön: Still confused, but on a higher level!

Eigentlich muß man nur den Tastencode im eignen Programm auswerten, so das Protokoll der Bibliothek bekannt ist.

Ich habe beispielsweise eine Panasonic-Fernbedienung, also wähle ich im Beispielprogramm SimpleReceiver.ino #define DECODE_PANASONIC und erhalte diese Ausgabe im seriellen Monitor, wenn ich drei verschiedene Tasten drücke:

START
Using library version 3.6.1
Ready to receive IR signals of protocols: Panasonic/Kaseikyo, at pin 2
Protocol=PANASONIC Address=0xB Command=0xA Extra=0x2002 Raw-Data=0xBA0A00B0 48 bits LSB first

Protocol=PANASONIC Address=0xB Command=0x9B Extra=0x2002 Raw-Data=0x2B9B00B0 48 bits LSB first

Protocol=PANASONIC Address=0x1B Command=0x43 Extra=0x2002 Raw-Data=0xF24301B0 48 bits LSB first

Im Deinem Programm genügt also eine einfache Auswertung:

   if (IrReceiver.decodedIRData.command == 0x0A) {
      // do something
    } else if (IrReceiver.decodedIRData.command == 0x9B) {
      // do something else
    } else if (IrReceiver.decodedIRData.command == 0x43) {
      // do something else
    }

Da Du nicht weißt, welches Protokoll Deine Fernbedienung verwendet, nutzt Du das Bibliotheksbeispiel ReceiveDump.ino zur Analyse. Drei unterschiedliche Fernbedienungen aus meinem Haushalt:

START F:\Arduino\libraries\IRremote\examples\ReceiveDump\ReceiveDump.ino from Apr 20 2022
Using library version 3.6.1
Ready to receive IR signals of protocols: NEC, Panasonic/Kaseikyo, Denon/Sharp, Sony, RC5, RC6, LG, JVC, Samsung, Whynter, Lego Power Functions, Bosewave , MagiQuest, Universal Distance, Hash at pin 2
5000 us is the (minimum) gap, after which the start of a new IR packet is assumed
20 us are subtracted from all marks and added to all spaces for decoding

Protocol=PANASONIC Address=0x1B Command=0x43 Extra=0x2002 Raw-Data=0xF24301B0 48 bits LSB first

Raw result in internal ticks (50 us) - with leading gap
rawData[100]:
-65535
+ 70,- 33 + 10,- 7 + 10,- 25 + 10,- 7
+ 10,- 8 + 9,- 8 + 10,- 7 + 10,- 8
+ 9,- 8 + 10,- 8 + 9,- 8 + 9,- 8
+ 10,- 8 + 9,- 8 + 10,- 25 + 9,- 8
+ 10,- 7 + 10,- 8 + 9,- 8 + 10,- 8
+ 9,- 8 + 9,- 26 + 9,- 25 + 10,- 8
+ 9,- 25 + 10,- 25 + 10,- 7 + 10,- 8
+ 9,- 8 + 10,- 8 + 9,- 8 + 9,- 8
+ 10,- 8 + 9,- 25 + 10,- 25 + 10,- 7
+ 10,- 8 + 9,- 8 + 10,- 8 + 9,- 25
+ 10,- 8 + 9,- 8 + 9,- 26 + 9,- 8
+ 10,- 7 + 10,- 25 + 10,- 25 + 9,- 26
+ 9,- 25 + 10
Raw result in microseconds - with leading gap
rawData[100]:
-3276750
+3500,-1650 + 500,- 350 + 500,-1250 + 500,- 350
+ 500,- 400 + 450,- 400 + 500,- 350 + 500,- 400
+ 450,- 400 + 500,- 400 + 450,- 400 + 450,- 400
+ 500,- 400 + 450,- 400 + 500,-1250 + 450,- 400
+ 500,- 350 + 500,- 400 + 450,- 400 + 500,- 400
+ 450,- 400 + 450,-1300 + 450,-1250 + 500,- 400
+ 450,-1250 + 500,-1250 + 500,- 350 + 500,- 400
+ 450,- 400 + 500,- 400 + 450,- 400 + 450,- 400
+ 500,- 400 + 450,-1250 + 500,-1250 + 500,- 350
+ 500,- 400 + 450,- 400 + 500,- 400 + 450,-1250
+ 500,- 400 + 450,- 400 + 450,-1300 + 450,- 400
+ 500,- 350 + 500,-1250 + 500,-1250 + 450,-1300
+ 450,-1250 + 500

Result as internal ticks (50 us) array - compensated with MARK_EXCESS_MICROS=20
uint8_t rawTicks[99] = {70,33, 10,7, 10,25, 10,7, 10,8, 9,8, 10,7, 10,8, 9,8, 10,8, 9,8, 9,8, 10,8, 9,8, 10,25, 9,8, 10,7, 10,8, 9,8, 10,8, 9,8, 9,26, 9,25, 10,8, 9,25, 10,25, 10,7, 10,8, 9,8, 10,8, 9,8, 9,8, 10,8, 9,25, 10,25, 10,7, 10,8, 9,8, 10,8, 9,25, 10,8, 9,8, 9,26, 9,8, 10,7, 10,25, 10,25, 9,26, 9,25, 10}; // Protocol=PANASONIC Address=0x1B Command=0x43 Extra=0x2002 Raw-Data=0xF24301B0 48 bits LSB first

Result as microseconds array - compensated with MARK_EXCESS_MICROS=20
uint16_t rawData[99] = {3480,1670, 480,370, 480,1270, 480,370, 480,420, 430,420, 480,370, 480,420, 430,420, 480,420, 430,420, 430,420, 480,420, 430,420, 480,1270, 430,420, 480,370, 480,420, 430,420, 480,420, 430,420, 430,1320, 430,1270, 480,420, 430,1270, 480,1270, 480,370, 480,420, 430,420, 480,420, 430,420, 430,420, 480,420, 430,1270, 480,1270, 480,370, 480,420, 430,420, 480,420, 430,1270, 480,420, 430,420, 430,1320, 430,420, 480,370, 480,1270, 480,1270, 430,1320, 430,1270, 480}; // Protocol=PANASONIC Address=0x1B Command=0x43 Extra=0x2002 Raw-Data=0xF24301B0 48 bits LSB first

uint16_t address = 0x1B;
uint16_t command = 0x43;
uint32_t data = 0xF24301B0;

Pronto Hex as string
char prontoData[] = "0000 006D 0032 0000 0087 003F 0014 000D 0014 002F 0014 000D 0014 000F 0012 000F 0014 000D 0014 000F 0012 000F 0014 000F 0012 000F 0012 000F 0014 000F 0012 000F 0014 002F 0012 000F 0014 000D 0014 000F 0012 000F 0014 000F 0012 000F 0012 0031 0012 002F 0014 000F 0012 002F 0014 002F 0014 000D 0014 000F 0012 000F 0014 000F 0012 000F 0012 000F 0014 000F 0012 002F 0014 002F 0014 000D 0014 000F 0012 000F 0014 000F 0012 002F 0014 000F 0012 000F 0012 0031 0012 000F 0014 000D 0014 002F 0014 002F 0012 0031 0012 002F 0014 06C3 ";

Protocol=SAMSUNG Address=0x707 Command=0x11 Raw-Data=0xEE110707 32 bits LSB first

Raw result in internal ticks (50 us) - with leading gap
rawData[68]:
-65535
+ 91,- 87 + 13,- 32 + 13,- 32 + 13,- 32
+ 12,- 10 + 13,- 9 + 13,- 10 + 13,- 9
+ 13,- 10 + 13,- 32 + 13,- 31 + 13,- 32
+ 13,- 10 + 13,- 9 + 13,- 10 + 12,- 10
+ 13,- 10 + 13,- 31 + 13,- 10 + 13,- 9
+ 13,- 10 + 13,- 32 + 12,- 10 + 13,- 10
+ 12,- 10 + 13,- 9 + 13,- 32 + 13,- 32
+ 13,- 32 + 12,- 10 + 13,- 32 + 13,- 32
+ 13,- 32 + 13
Raw result in microseconds - with leading gap
rawData[68]:
-3276750
+4550,-4350 + 650,-1600 + 650,-1600 + 650,-1600
+ 600,- 500 + 650,- 450 + 650,- 500 + 650,- 450
+ 650,- 500 + 650,-1600 + 650,-1550 + 650,-1600
+ 650,- 500 + 650,- 450 + 650,- 500 + 600,- 500
+ 650,- 500 + 650,-1550 + 650,- 500 + 650,- 450
+ 650,- 500 + 650,-1600 + 600,- 500 + 650,- 500
+ 600,- 500 + 650,- 450 + 650,-1600 + 650,-1600
+ 650,-1600 + 600,- 500 + 650,-1600 + 650,-1600
+ 650,-1600 + 650

Result as internal ticks (50 us) array - compensated with MARK_EXCESS_MICROS=20
uint8_t rawTicks[67] = {91,87, 13,32, 13,32, 13,32, 12,10, 13,9, 13,10, 13,9, 13,10, 13,32, 13,31, 13,32, 13,10, 13,9, 13,10, 12,10, 13,10, 13,31, 13,10, 13,9, 13,10, 13,32, 12,10, 13,10, 12,10, 13,9, 13,32, 13,32, 13,32, 12,10, 13,32, 13,32, 13,32, 13}; // Protocol=SAMSUNG Address=0x707 Command=0x11 Raw-Data=0xEE110707 32 bits LSB first

Result as microseconds array - compensated with MARK_EXCESS_MICROS=20
uint16_t rawData[67] = {4530,4370, 630,1620, 630,1620, 630,1620, 580,520, 630,470, 630,520, 630,470, 630,520, 630,1620, 630,1570, 630,1620, 630,520, 630,470, 630,520, 580,520, 630,520, 630,1570, 630,520, 630,470, 630,520, 630,1620, 580,520, 630,520, 580,520, 630,470, 630,1620, 630,1620, 630,1620, 580,520, 630,1620, 630,1620, 630,1620, 630}; // Protocol=SAMSUNG Address=0x707 Command=0x11 Raw-Data=0xEE110707 32 bits LSB first

uint16_t address = 0x707;
uint16_t command = 0x11;
uint32_t data = 0xEE110707;

Pronto Hex as string
char prontoData[] = "0000 006D 0022 0000 00B0 00A7 001A 003D 001A 003D 001A 003D 0018 0012 001A 0011 001A 0012 001A 0011 001A 0012 001A 003D 001A 003B 001A 003D 001A 0012 001A 0011 001A 0012 0018 0012 001A 0012 001A 003B 001A 0012 001A 0011 001A 0012 001A 003D 0018 0012 001A 0012 0018 0012 001A 0011 001A 003D 001A 003D 001A 003D 0018 0012 001A 003D 001A 003D 001A 003D 001A 06C3 ";

Protocol=RC5 Address=0x10 Command=0xC Toggle=1 Raw-Data=0x1C0C 13 bits MSB first

Raw result in internal ticks (50 us) - with leading gap
rawData[24]:
-65535
+ 18,- 17 + 18,- 16 + 18,- 17 + 35,- 17
+ 18,- 16 + 18,- 17 + 18,- 16 + 19,- 16
+ 18,- 34 + 18,- 16 + 36,- 16 + 18
Raw result in microseconds - with leading gap
rawData[24]:
-3276750
+ 900,- 850 + 900,- 800 + 900,- 850 +1750,- 850
+ 900,- 800 + 900,- 850 + 900,- 800 + 950,- 800
+ 900,-1700 + 900,- 800 +1800,- 800 + 900

Result as internal ticks (50 us) array - compensated with MARK_EXCESS_MICROS=20
uint8_t rawTicks[23] = {18,17, 18,16, 18,17, 35,17, 18,16, 18,17, 18,16, 19,16, 18,34, 18,16, 36,16, 18}; // Protocol=RC5 Address=0x10 Command=0xC Toggle=1 Raw-Data=0x1C0C 13 bits MSB first

Result as microseconds array - compensated with MARK_EXCESS_MICROS=20
uint16_t rawData[23] = {880,870, 880,820, 880,870, 1730,870, 880,820, 880,870, 880,820, 930,820, 880,1720, 880,820, 1780,820, 880}; // Protocol=RC5 Address=0x10 Command=0xC Toggle=1 Raw-Data=0x1C0C 13 bits MSB first

uint16_t address = 0x10;
uint16_t command = 0xC;
uint32_t data = 0x1C0C;

Pronto Hex as string
char prontoData[] = "0000 006D 000C 0000 0023 0020 0023 001E 0023 0020 0044 0020 0023 001E 0023 0020 0023 001E 0025 001E 0023 0041 0023 001E 0046 001E 0023 06C3 ";

Hallo agmue
Sehe ich das richtig, dass ReceiveDump.ino im Falle von Protocol=RC5 keine spezifische Zuordnung zu einem Hersteller machen konnte, jedoch aber das Protokoll dekodieren konnte?

Ich kenne mich mit der Historie solcher Protokolle nicht aus, aber RC5 kommt aus einer alten Fernbedienung von Grundig.

Der RC5 Code ist eine Entwicklung von Philips. Quelle

Protokolle müssen ja nicht zwangsläufig einen Firmennamen haben.