Diese Library bindet den IRMP zum Empfang von Infrarot-Signalen (z.B. von einer IR-Fernbedienung) für den STM32F4 ein. Als Empfangs-IC kann z.B. ein SFH-5110 benutzt werden.
IRMP : “Infrarot-Multiprotokoll-Decoder” ist Opensource, die Quellfiles und ein ausführlicher Artikel findet sich im Mikrocontroller Forum.
http://www.mikrocontroller.net/articles/IRMP
IRMP ist sehr Umfangreich und erkennt sehr viele IR-Protokolle automatisch. Welche Protokolle benutzt werden sollen, kann in einem H-File eingestellt werden. Damit kann der Codeumfang verkleinert werden.
Es wird ein Timer benötigt und ein GPIO Pin. (im Beispiel TIM2 und PC13)
Falls ein noch nicht unterstütztes Protokoll eingebunden werden soll, kann die Logging-Funktion eingeschaltet werden, dann wird das Empfangene Signal per UART (an PA2, 115200 Baud) ausgegeben. (im File : “irmpconfig.h” den Define : “IRMP_LOGGING”)
Die empfangenen Daten werden in einer Struktur übergeben. Darin enthalten ist der IR-Codetyp, eine Adressnummer und eine Kommandonummer.
Welche Werte die benutzte Fernbedienung zurückliefert muss ausprobiert werden. Am einfachsten per Debugger einen Breakpoint setzen und die Werte beim drücken einer Taste auslesen. Meine Test Fernbedienung liefert als Adresse den Wert “65280″ und z.B. beim drücken der Taste “1″ den Wert “137″ zurück.
Beispielbild :
Benutzte Pins :
1 2 | PC13 -> IR-Empfänger PA2 -> TX vom UART (falls Logging enable) |
Voraussetzungen :
1 2 | Benutzte Module der CooCox-IDE : GPIO, TIM, MISC Benutzte Librarys : IRMP |
Struktur :
1 2 3 4 5 6 | typedef struct { uint8_t protocol; uint16_t address; uint16_t command; uint8_t flags; }IRMP_DATA; |
Funktionen :
1 2 | void UB_IRMP_Init(void); // zum initialisieren von IRMP uint8_t UB_IRMP_Read(IRMP_DATA * irmp_data_p); // zum auslesen der IR-Daten |
Beispiel :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | //-------------------------------------------------------------- // File : main.c // Datum : 09.05.2013 // Version : 1.0 // Autor : UB // EMail : mc-4u(@)t-online.de // Web : www.mikrocontroller-4u.de // CPU : STM32F4 // IDE : CooCox CoIDE 1.7.0 // Module : CMSIS_BOOT, M4_CMSIS_CORE // Funktion : Demo der IRMP-Library // Hinweis : Diese zwei Files muessen auf 8MHz stehen // "cmsis_boot/stm32f4xx.h" // "cmsis_boot/system_stm32f4xx.c" //-------------------------------------------------------------- #include "main.h" #include "stm32_ub_irmp.h" #include "stm32_ub_led.h" int main(void) { IRMP_DATA myIRData; // Variable für IR-Daten SystemInit(); // Quarz Einstellungen aktivieren // init aller LEDs UB_Led_Init(); // init vom IRMP UB_IRMP_Init(); while(1) { // IR-Daten pollen if(UB_IRMP_Read(&myIRData)==TRUE) { // wenn IR-Daten empfangen wurden if(myIRData.address==65280) { // wenn Adresse vom IR-Device stimmt // Test ob Taste "1" gedrueckt wurde if(myIRData.command==137) UB_Led_On(LED_GREEN); else UB_Led_Off(LED_GREEN); // Test ob Taste "2" gedrueckt wurde if(myIRData.command==157) UB_Led_On(LED_ORANGE); else UB_Led_Off(LED_ORANGE); // Test ob Taste "3" gedrueckt wurde if(myIRData.command==159) UB_Led_On(LED_RED); else UB_Led_Off(LED_RED); // Test ob Taste "4" gedrueckt wurde if(myIRData.command==141) UB_Led_On(LED_BLUE); else UB_Led_Off(LED_BLUE); } } } } |
Hier die Library zum Download :
Hier der komplette CooCox-Projektordner zum Download :
Bitte füge oben noch einen Link zum entsprechenden Wiki-Artikel im µC.net hinzu:
http://www.mikrocontroller.net/articles/IRMP
kein Problem
Hallo Uwe, ich finde da irgendwie keine Funktion um das logging ein zu schalten?
Der define steht im File “irmpconfig.h” bei “IRMP_LOGGING”
Hier sollte das hin..
Ist das getestet? Stm32f4xx_uart.h / .c sind im Projekt nicht enthalten gewesen.
jetzt kommen Einsen und Nullen über den uart. Neonlicht scheint eine Menge Störungen zu produzieren… per Debug habe ich mal die von meiner Fernbedienung gesendeten Codes ausgelesen. Das Funktioniert zumindest. Die LEDs schalten.
Aber auch da kommen nur 1 und 0en heraus. (Bei gedrückter Taste)
die UART-Lib von STM ist nicht im Projekt enthalten (hab ich vergessen)
Die Debug ausgabe ist nicht von mir, sondern vermutlich von Frank (dem Autor von IRMP). ich denke die Ziffern sollen das gescannte Signal darstellen, also die Impulsfolge und Länge um daraus z.B. ein noch unbekanntes Protokoll ermitteln zu können. (als Oszi ersatz sozusagen)
Ist dein Empfänger auch so empfindlich gegen Neonlicht?
hab ich nicht geprüft.
Naja bei ca 100o Zeichen für ein Tastendruck braucht man dann wohl schon ein Programm zur Auswertung
Das Programm zum Auswerten ist IRMP selbst. Das ist auch unter Windows und Linux lauffähig. Wie das geht, steht im Artikel:
http://www.mikrocontroller.net/articles/IRMP
(Suche nach Windows, Linux und IRMP_LOGGING)
Wenn Du ein unbekanntes Protokoll hast, was von IRMP nicht unterstützt wird (es “versteht” mittlerweile ca. 40), kannst Du mir die Logs (1en und 0en) schicken. Dann baue ich es in IRMP ein.