Decoder für IR-Signale von Fernbedienungen

Antworten
[MCP]
Beiträge: 109
Registriert: Sa 28. Mai 2016, 15:42
Wohnort: LE
Box: Zee², Trinity DUO , ZGEMMA H7C

Decoder für IR-Signale von Fernbedienungen

Beitrag 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.
Benutzeravatar
Gorcon
NI - VIP
Beiträge: 2758
Registriert: Mi 13. Apr 2016, 10:55
Box: E2HD, VU+ Uno4kSE, VU+ Ultimate4k
Has thanked: 20 times
Been thanked: 5 times

Re: Decoder für IR-Signale von Fernbedienungen

Beitrag 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
[MCP]
Beiträge: 109
Registriert: Sa 28. Mai 2016, 15:42
Wohnort: LE
Box: Zee², Trinity DUO , ZGEMMA H7C

Re: Decoder für IR-Signale von Fernbedienungen

Beitrag 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.
Benutzeravatar
Gorcon
NI - VIP
Beiträge: 2758
Registriert: Mi 13. Apr 2016, 10:55
Box: E2HD, VU+ Uno4kSE, VU+ Ultimate4k
Has thanked: 20 times
Been thanked: 5 times

Re: Decoder für IR-Signale von Fernbedienungen

Beitrag von Gorcon »

[MCP] hat geschrieben: So 2. Jul 2023, 18:33
EOlL,
? Sagt mir jetzt nichts.
[MCP]
Beiträge: 109
Registriert: Sa 28. Mai 2016, 15:42
Wohnort: LE
Box: Zee², Trinity DUO , ZGEMMA H7C

Re: Decoder für IR-Signale von Fernbedienungen

Beitrag 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/
Benutzeravatar
Don de Deckelwech
NI - Team
Beiträge: 1592
Registriert: Di 12. Apr 2016, 17:13
Wohnort: Wuppertal
Box: Tank / HD51 / Protek 4K für Kabel
Has thanked: 1 time
Been thanked: 10 times
Kontaktdaten:

Re: Decoder für IR-Signale von Fernbedienungen

Beitrag 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.
"Ein Log, ist besser als kein Log!"
[MCP]
Beiträge: 109
Registriert: Sa 28. Mai 2016, 15:42
Wohnort: LE
Box: Zee², Trinity DUO , ZGEMMA H7C

Re: Decoder für IR-Signale von Fernbedienungen

Beitrag 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).
seife
Beiträge: 130
Registriert: Mi 20. Okt 2021, 15:20
Been thanked: 2 times

Re: Decoder für IR-Signale von Fernbedienungen

Beitrag 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.
[MCP]
Beiträge: 109
Registriert: Sa 28. Mai 2016, 15:42
Wohnort: LE
Box: Zee², Trinity DUO , ZGEMMA H7C

Re: Decoder für IR-Signale von Fernbedienungen

Beitrag 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.
Benutzeravatar
Gorcon
NI - VIP
Beiträge: 2758
Registriert: Mi 13. Apr 2016, 10:55
Box: E2HD, VU+ Uno4kSE, VU+ Ultimate4k
Has thanked: 20 times
Been thanked: 5 times

Re: Decoder für IR-Signale von Fernbedienungen

Beitrag 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 ?)
[MCP]
Beiträge: 109
Registriert: Sa 28. Mai 2016, 15:42
Wohnort: LE
Box: Zee², Trinity DUO , ZGEMMA H7C

Re: Decoder für IR-Signale von Fernbedienungen

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

Zurück zu „Hardware“