Seite 1 von 1

Decoder für IR-Signale von Fernbedienungen

Verfasst: Sa 1. Jul 2023, 10:02
von [MCP]
Hiermit möchte ich einen Weg vorstellen, um IR-Signale von Fernbedienungen zu decodieren.

Als Softwaregrundlage habe ich mich für das IRMP-Projekt entschieden:

https://www.mikrocontroller.net/articles/IRMP

Die dazugehörigen Quellcodes:

https://github.com/IRMP-org/IRMP/

Dort steckt Jahrelange Entwicklungsarbeit drin und es werden eine Menge von Hardware-Plattformen unterstützt.

Ich selber habe einen Arduino Nano V3 (mit altem Bootloader) verwendet und dazu passend den
IR-Empfänger KY-022 (Infrarot Receiver CHQ1838 Sensor Modul).

Die Beschaltung des IR-Empfänger ist folgende:

Bild

Der Pin 3 vom IR-Empfänger KY-022 wird dann mit Pin 2 vom Arduino Nano V3 verbunden.
Die Spannungsversorgung für Pin 1 und Pin 2 vom KY-022 muss dann noch passend vorgenommen werden (+5Volt, GND).

Zum Schluss noch ein passendes USB-Kabel für den Arduino Nano V3 und die Software ist dran.

Als Programmierumgebung verwende ich unter Linux (Debian) VSCodium / Platformio (Core 6.1.7·Home 3.4.4) / Arduino-Framework
IRMP wird in der Version 3.6.3 benutzt.

Meine Einträge in der platfomio.ini sind folgende:
[+] Spoiler


PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html

[platformio]
build_cache_dir = .cache

[env:nanoatmega328]
platform = atmelavr
board = nanoatmega328
framework = arduino
upload_port = /dev/ttyUSB0
monitor_port = /dev/ttyUSB0
monitor_speed = 115200

; lib_deps = ukw100/IRMP@^3.6.3
lib_deps = https://github.com/ukw100/IRMP.git
Das Hauptprogramm ist dem Programmier-Beispiel von IRMP/examples/SimpleReceiver entsprechend von mir angepasst.

main.cpp
[+] Spoiler


/*
* SimpleReceiver.cpp
*
* Receives IR protocol data of 15 main protocols.
*
* *****************************************************************************************************************************
* To access the library files from your sketch, you have to first use `Sketch > Show Sketch Folder (Ctrl+K)` in the Arduino IDE.
* Then navigate to the parallel `libraries` folder and select the library you want to access.
* The library files itself are located in the `src` sub-directory.
* If you did not yet store the example as your own sketch, then with Ctrl+K you are instantly in the right library folder.
* *****************************************************************************************************************************
*
*
* The following IR protocols are enabled by default:
* Sony SIRCS
* NEC + APPLE
* Samsung + Samsg32
* Kaseikyo
*
* Plus 11 other main protocols by including irmpMain15.h instead of irmp.h
* JVC, NEC16, NEC42, Matsushita, DENON, Sharp, RC5, RC6 & RC6A, IR60 (SDA2008) Grundig, Siemens Gigaset, Nokia
*
* To disable one of them or to enable other protocols, specify this before the "#include <irmp.h>" line.
* If you get warnings of redefining symbols, just ignore them or undefine them first (see Interrupt example).
* The exact names can be found in the library file irmpSelectAllProtocols.h (see Callback example).
*
* Copyright (C) 2019 Armin Joachimsmeyer
* armin.joachimsmeyer@gmail.com
*
* This file is part of IRMP https://github.com/IRMP-org/IRMP.
*
* IRMP is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/gpl.html>.
*
*/

#include <Arduino.h>

/*
* Set input pin and output pin definitions etc.
*/
#include "PinDefinitionsAndMore.h"

#define IRMP_PROTOCOL_NAMES 1 // Enable protocol number mapping to protocol strings - requires some FLASH.
// Must before #include <irmp*>

#include <irmpSelectAllProtocols.h> // This enables all possible protocols
// #include <irmpSelectMain15Protocols.h> // This enables 15 main protocols
// #define IRMP_SUPPORT_NEC_PROTOCOL 1 // this enables only one protocol
// #define IRMP_SUPPORT_SIRCS_PROTOCOL 1 // this enables only one protocol

/*
* We use LED_BUILTIN as feedback for commands and cannot use it as feedback LED for receiving
*/
#if defined(ALTERNATIVE_IR_FEEDBACK_LED_PIN)
#define IRMP_FEEDBACK_LED_PIN ALTERNATIVE_IR_FEEDBACK_LED_PIN
#endif
/*
* After setting the definitions we can include the code and compile it.
*/
#include <irmp.hpp>

IRMP_DATA irmp_data;

uint8_t _ButtonDebounceCounter = 0;

uint16_t IRMP_KEY = 0;
uint16_t IRMP_LASTKEY = 0;

uint32_t IRMP_COUNTER = 1;

#define BUTTON_DEBOUNCE_COUNTER_MAX 2;

void setup()
{
pinMode(LED_BUILTIN, OUTPUT);

Serial.begin(115200);

#if defined(__AVR_ATmega32U4__) || defined(SERIAL_USB) || defined(SERIAL_PORT_USBVIRTUAL) || \
defined(ARDUINO_attiny3217) || defined(ARDUINO_AVR_NANO)
delay(4000); // To be able to connect Serial monitor after reset or power up and before first print out.
// Do not wait for an attached Serial Monitor!
#endif

#if defined(ESP8266) || defined(ESP32)
Serial.println(); // to separate it from the internal boot output
#endif

// Just to know which program is running on my Arduino
Serial.println(F("\r\nSTART " __FILE__ " from " __DATE__ "\r\n\r\nUsing library version " VERSION_IRMP));

irmp_init();

Serial.print(F("\r\nReady to receive IR signals "));

#if defined(ARDUINO_ARCH_STM32)
Serial.print(F("at pin " IRMP_INPUT_PIN_STRING));
#else
Serial.print(F("at pin " STR(IRMP_INPUT_PIN)));
#endif

Serial.println(F(" of protocols:\r\n"));
irmp_print_active_protocols(&Serial);

#ifdef ALTERNATIVE_IR_FEEDBACK_LED_PIN
irmp_irsnd_LEDFeedback(true); // Enable receive signal feedback at ALTERNATIVE_IR_FEEDBACK_LED_PIN
Serial.println(F("\r\n"));
Serial.println(F("IR feedback pin is " STR(ALTERNATIVE_IR_FEEDBACK_LED_PIN)));
#endif
Serial.println(F("\r\n"));
}

void loop()
{
/*
* Check if new data available and get them
*/
if (irmp_get_data(&irmp_data))
{
if ((irmp_data.flags & IRMP_FLAG_REPETITION) && (irmp_data.command == IRMP_LASTKEY))
{
if (_ButtonDebounceCounter > 0)
{
_ButtonDebounceCounter--;
}
else
{
Serial.print(F("IRMP_COUNTER: "));
Serial.print(IRMP_COUNTER++);
Serial.print(F(" -> "));
irmp_result_print(&irmp_data);
}
}
else
{
IRMP_KEY = irmp_data.command;
IRMP_LASTKEY = IRMP_KEY;
_ButtonDebounceCounter = BUTTON_DEBOUNCE_COUNTER_MAX;

Serial.print(F("IRMP_COUNTER: "));
Serial.print(IRMP_COUNTER++);
Serial.print(F(" -> "));
irmp_result_print(&irmp_data);
}
}
}
Im Projektordner in welchem sich die main.cpp befindet (... /src/) müssen nur noch 2 Dateien hinzugefügt werden.

PinDefinitionsAndMore.h und irmpArduinoExt.hpp

Diese befinden sich nach dem ersten Buildversuch im Projektordner (... /.pio/libdeps/nanoatmega328/IRMP/src/).

Das sieht dann im Ergebnis folgend aus:

ls -g -o
[+] Spoiler


insgesamt 40
-rw-r--r-- 1 16647 1. Jul 07:02 irmpArduinoExt.hpp
-rw-r--r-- 1 5602 1. Jul 08:36 main.cpp
-rw-r--r-- 1 8823 1. Jul 07:02 PinDefinitionsAndMore.h
Das Programm ist damit fertig und kann auf den Arduino Nano V3 geflasht werden.

Bei Programmstart sollte am Seriellen-Monitor (115200 Baud) folgende Ausgaben erscheinen:
[+] Spoiler


START src/main.cpp from Jul 1 2023

Using library version 3.6.3

Ready to receive IR signals at pin 2 of protocols:

SIRCS, NEC, SAMSUNG, MATSUSH, KASEIKYO, RECS80, RC5, DENON, RC6, SAMSG32, APPLE, RECS80EX, NUBERT, BANG OLU, GRUNDIG, NOKIA, SIEMENS, FDC, RCCAR, JVC, RC6A, NIKON, IR60, KATHREIN, NETBOX, NEC16, NEC42, THOMSON, BOSE, A1TVBOX, TELEFUNKEN, SPEAKER, LGAIR, SAMSG48, PENTAX, TECHNICS, PANASONIC, VINCENT, SAMSUNGAH, GREE, METZ, ONKYO, MELINERA,

IR feedback pin is 6
Das obige Datum entspricht dem Build-Date.

Jetzt kann das experimentieren mit den Fernbedienungen erfolgen:
[+] Spoiler


IRMP_COUNTER: 1 -> P=NEC A=0xFF80 C=0x11
IRMP_COUNTER: 2 -> P=NEC A=0xFF80 C=0x12
IRMP_COUNTER: 3 -> P=NEC A=0xFF80 C=0x13
IRMP_COUNTER: 4 -> P=NEC A=0xFF80 C=0x14
IRMP_COUNTER: 5 -> P=NEC A=0xFF80 C=0x15
IRMP_COUNTER: 6 -> P=NEC A=0xFF80 C=0x16
IRMP_COUNTER: 7 -> P=NEC A=0xCD27 C=0x11
IRMP_COUNTER: 8 -> P=NEC A=0xCD27 C=0x12
IRMP_COUNTER: 9 -> P=NEC A=0xCD27 C=0x13
IRMP_COUNTER: 10 -> P=NEC A=0xCD27 C=0x14
IRMP_COUNTER: 11 -> P=NEC A=0xCD27 C=0x15
IRMP_COUNTER: 12 -> P=NEC A=0xCD27 C=0x16
Das obige Beispiel zeigt die Ausgabe für die Fernbedienung der
Coolstream HD2,
mit Protokoll=NEC, Geräteadresse=0xFF80 und Code= Zifferntasten für 1 bis 6

danach
Zgemma H7C,
mit Protokoll=NEC, Geräteadresse=0xCD27 und Code= Zifferntasten für 1 bis 6

Damit sollte dem eigenen Forscherdrang nichts mehr im Wege stehen.

Wie die gewonnen Erkenntnisse dann weiter genutzt werden können, zeige ich in einem weiteren Beitrag.

Re: Decoder für IR-Signale von Fernbedienungen

Verfasst: So 2. Jul 2023, 09:20
von Gorcon
Lassen sich mit der Hardware auch Lirc conf Dateien erstellen (z.B. über Winlirc)?

Nachtrag: Habe hier etwas dazu gefunden:
https://github.com/AdvancedNewbie/IRNanoLIRC

Re: Decoder für IR-Signale von Fernbedienungen

Verfasst: So 2. Jul 2023, 18:33
von [MCP]
Gorcon hat geschrieben: So 2. Jul 2023, 09:20 Lassen sich mit der Hardware auch Lirc conf Dateien erstellen (z.B. über Winlirc)?

Nachtrag: Habe hier etwas dazu gefunden:
https://github.com/AdvancedNewbie/IRNanoLIRC
Da der Empfänger auch über Pin 2 das IR-Signal empfängt, sollte das klappen.

Der TSMP1138 ist nur EOlL, der im KY-022 verwendete IR-Sensor ( CHQ1838 ) tuts aber auch.

Re: Decoder für IR-Signale von Fernbedienungen

Verfasst: So 2. Jul 2023, 18:47
von Gorcon
[MCP] hat geschrieben: So 2. Jul 2023, 18:33
EOlL,
? Sagt mir jetzt nichts.

Re: Decoder für IR-Signale von Fernbedienungen

Verfasst: So 2. Jul 2023, 20:43
von [MCP]
Gorcon hat geschrieben: So 2. Jul 2023, 18:47
[MCP] hat geschrieben: So 2. Jul 2023, 18:33
EOlL,
? Sagt mir jetzt nichts.
Tippfehler meinerseits Sorry.

Gemeint ist EOL = End Of Live

Digikey -> TSMP1138 ist obsolet und wird nicht mehr hergestellt.

https://media.digikey.com/pdf/PCNs/Vish ... REV-0.pdf/

Re: Decoder für IR-Signale von Fernbedienungen

Verfasst: So 2. Jul 2023, 20:57
von Don de Deckelwech
Hi,
ich habe von dem ganzen Microcontrollerzeugs keine Ahnung, aber am WE mal ein wenig dazu gegooglet.
Mir ist das hier aufgefallen:
der "grössere" Uno kostet scheinbar nur ein paar Euro mehr als der Nano.
Aber für den Uno gibt es ein fertiges IR-Shield: https://irdroid.eu/product/irdroino-inf ... d-arduino/

Da ich persönlich leider mit dem Lötkolben ne Niete bin, wäre das mit sowas auch umsetzbar???
Klar, muss da wohl ne Menge an der Software angepasst werden, aber schlussendlich wäre das dann ja fast Plug-and-Play.

Ciao,
DdD.

Re: Decoder für IR-Signale von Fernbedienungen

Verfasst: So 2. Jul 2023, 21:38
von [MCP]
Don de Deckelwech hat geschrieben: So 2. Jul 2023, 20:57 Hi,
ich habe von dem ganzen Microcontrollerzeugs keine Ahnung, aber am WE mal ein wenig dazu gegooglet.
Mir ist das hier aufgefallen:
der "grössere" Uno kostet scheinbar nur ein paar Euro mehr als der Nano.
Aber für den Uno gibt es ein fertiges IR-Shield: https://irdroid.eu/product/irdroino-inf ... d-arduino/

Da ich persönlich leider mit dem Lötkolben ne Niete bin, wäre das mit sowas auch umsetzbar???
Klar, muss da wohl ne Menge an der Software angepasst werden, aber schlussendlich wäre das dann ja fast Plug-and-Play.

Ciao,
DdD.
Ich habe mal kurz geschaut.

UNO R3 oder NANO R3 / V3 ist nach eigenem Geschmack zu wählen.
Bleibt beides AVR ATmega328P. Die Pinbelegung beim IR-Shield ist laut deren Git auch
Pin 2 für IR- Receiver und Pin 3 für IR-Send.

Damit ist an der Software nichts zu ändern (max. Benutzung der eigenen LED für den NANO V3 könnte
auskommentiert werden, wenn UNO R3 keine hat, stört aber nicht wirklich).

Re: Decoder für IR-Signale von Fernbedienungen

Verfasst: Mo 3. Jul 2023, 08:37
von seife
Das irdroino dings sieht gut aus, ich würde trotzdem gleich einen Leonardo klon holen, denn dann hält man sich die Option einer Tastaturemulation offen und vom Preis her macht es jetzt keinen echten Unterschied.

Re: Decoder für IR-Signale von Fernbedienungen

Verfasst: Mo 3. Jul 2023, 11:21
von [MCP]
seife hat geschrieben: Mo 3. Jul 2023, 08:37 Das irdroino dings sieht gut aus, ich würde trotzdem gleich einen Leonardo klon holen, denn dann hält man sich die Option einer Tastaturemulation offen und vom Preis her macht es jetzt keinen echten Unterschied.
Habe mal kurz die PINOUTS vom UNO REV3, UNO REV3 SMD und LEONARDO verglichen.
Die Pins D2 bis Pin D7 sind auf den Boards identisch.
Nur die tatsächlichen Hardwarepins der Mikrocontroller weichen halt ab.
Wegen ATmega328p <=> ATmega32u4.
Muss dann bei der Pindefinition im Source beachtet werden (ATmega328p D2=PD2 D3=PD3, ATmega32u4 D2=PD1 D3=PD0).
IRMP unterstützt glücklicherweise beide AVR.

Re: Decoder für IR-Signale von Fernbedienungen

Verfasst: Sa 8. Jul 2023, 10:48
von Gorcon
Ich habe hier noch ein Arudino Uno R3 Board und ein dazu passendes LCD KeyPad Shield Link

Ich gehe davon aus das ich da andere LCD Treiber/Einstellungen brauche. (SPI.h und LiquidCrystal.h ?)

Re: Decoder für IR-Signale von Fernbedienungen

Verfasst: Sa 8. Jul 2023, 18:21
von [MCP]
Gorcon hat geschrieben: Sa 8. Jul 2023, 10:48 Ich habe hier noch ein Arudino Uno R3 Board und ein dazu passendes LCD KeyPad Shield Link

Ich gehe davon aus das ich da andere LCD Treiber/Einstellungen brauche. (SPI.h und LiquidCrystal.h ?)
Das LCD KeyPad Shield hat schon D2 und D3 in beschlag. Du müsstest also andere Pins für die
IR-Signale wählen.

Re: Decoder für IR-Signale von Fernbedienungen

Verfasst: Do 15. Aug 2024, 12:07
von Gorcon
Ist zwar jetzt schon "verjährt" aber ich will das Projekt nochmal mit einem Arduino Nano V3 nachbauen. (ich hatte es damals schon probiert aber nicht zum laufen bekommen)
Ich bin gerade dabei einen Schaltplan zu zeichnen und habe mit der Pinbelegung ein "kleines" Problem.
Du schreibst oben
Der Pin 3 vom IR-Empfänger KY-022 wird dann mit Pin 2 vom Arduino Nano V3 verbunden.
Pin 2 ist laut https://europe1.discourse-cdn.com/ardui ... ca513d.png
RX(0) Soweit OK.
Aber hier https://neutrino-images.de/board/viewtopic.php?t=7398 schreibst Du:
Die SFH409-2 ist dabei nur durch die KY-005 zu ersetzen. IROUT wird mit Pin 3 vom Arduino Nano V3 verbunden.
Pin 3? Das ist Reset.
Wenn ich mir die Bilder im Git anschaue scheint der IR Empfänger an D3 angeschlossen zu sein.
Im Code muss doch (meines "Wissens") der Pin definiert werden aber da finde ich nichts (oder bin zu blöd dazu).

Wie ich das dann am Receiver eingebunden bekomme, werde ich dann u.U. noch nachfragen.

PS: irgendwie sind meine Gehirnwindungen etwas verknotet und im Alter bekomme ich die Knoten immer schlechter raus... :thinking:

Re: Decoder für IR-Signale von Fernbedienungen

Verfasst: Mo 23. Sep 2024, 10:01
von [MCP]
Sorry für die späte Antwort und ja, es war etwas unglücklich formuliert.

Gemeint waren für den Arduino Nano V3:

Pin 2 = D2 = PD2
Pin 3 = D3 = PD3

Die Bezeichnung der Pins findet sich in der Datei PinDefinitionsAndMore.h für __AVR__ wieder.

Dort steht dann eben nur 2 und 3 drin, auf die ich mich bezogen hatte.

Code: Alles auswählen

#elif defined(__AVR__) // Standard AVR Boards like Uno, Nano
#define IRMP_INPUT_PIN      2 // To be compatible with interrupt example, pin 2 is chosen here.
#define IRSND_OUTPUT_PIN    3
#define TONE_PIN            4
#if !defined(ALTERNATIVE_IR_FEEDBACK_LED_PIN)
#define ALTERNATIVE_IR_FEEDBACK_LED_PIN 6 // E.g. used for examples which use LED_BUILDIN for example output.
#endif

Re: Decoder für IR-Signale von Fernbedienungen

Verfasst: Mo 23. Sep 2024, 18:13
von Gorcon
Aber Pin 3 ist doch Reset.
D3 ist nach dem Pinout Pin 6.
Arudino Nano V3.png
Mit den unterschiedlichen Bezeichnungen der Belegungen habe ich immer ein Problem.

Re: Decoder für IR-Signale von Fernbedienungen

Verfasst: Mo 23. Sep 2024, 20:44
von seife
Ja, Pin3 == D3. Kann beim Programmieren doch keiner Wissen Wie dein Board die Pins nach außen gelegt hat und in welcher Richtung die gezählt werden :face_palm:

Re: Decoder für IR-Signale von Fernbedienungen

Verfasst: Mo 23. Sep 2024, 21:49
von Gorcon
Wieso mein Board, es ist doch exakt das gleiche.
Wie soll man das anders zählen?!

Re: Decoder für IR-Signale von Fernbedienungen

Verfasst: Di 24. Sep 2024, 08:04
von [MCP]
Wie soll man das anders zählen?!
Du hast ja Recht. Der "Fehler" kommt ja von mir. Ich hätte nur den Begriff Pin weglassen sollen.

Der Rest der Unklarheiten kommt durch die Verwendung von Arduino als Programmierumgebung.
Board/chip numbers are not used as pin numbers by Arduino.
@Gorcon: Für dich hätte ich schreiben müssen D2 = Pin 5 und D3 = Pin 6 (wenn du ab D1/TX PD1 = Pin 1 zählst).

Beim programmieren wird aber dann wieder nur mit 2 und 3 gearbeitet, wegen D2 und D3 (und nicht Pin 2 und Pin 3 des Boards).

Re: Decoder für IR-Signale von Fernbedienungen

Verfasst: Di 24. Sep 2024, 09:55
von Gorcon
D2 hätte mir schon gereicht. Nur die Angabe zum Pin hatte mich verwirrt da sie nicht zusammenpasste. ;)
Aber Danke für die Aufklärung. :thumbsup:

Wie verwirrend die Angaben der Anschlüsse sein können hatte ich erst letztens bei einem Board gesehen. Mein altes hatte u.a. die Bezeichnungen AD D3, D4,D8,D9,10 usw. Das neue AD, I00,I02,I015,RX,TX. Ich wollte das Board dann schon zurückschicken weil ich dachte das sind ganz andere Pins herausgeführt, aber nach dem durchklingeln waren es exakt die gleichen. Nur vollkommen falsch beschriftet, denn I015 hat nichts mit D8 zu tun.