IR-Fernbedienung auf stm32



Guten Tag.

Beschreibung der Bibliothek zum Lesen, Decodieren und anschließenden Senden von Infrarotsignalen von verschiedenen Haushaltsfernbedienungen mit dem Mikrocontroller stm32. Basierend auf der IRremote- Bibliothek für Arduino und angepasst für stm32.

Die Bibliothek verwendet einen Timer sowohl zum Empfangen als auch zum Senden eines Signals. Der Empfänger ist mit einem beliebigen Pin (GPIO_Input) verbunden, und der Sender ist mit einem der Kanäle des Timers verbunden, der im PWM-Generierungsmodus (PWM-Modus) arbeitet. Im Beispiel wird der erste Kanal des Timers Nr. 4 verwendet - PB6 (Sender) und Pin PB5 (Empfänger).

Um ein Signal zu empfangen, arbeitet der Timer im Interrupt-Modus - alle 50 μs überprüft er den Status des Eingangspins und schaltet während der Übertragung in den PWM-Generierungsmodus, sendet ein Signal und schaltet zurück in den Interrupt-Modus.

Die Einstellungen befinden sich in der Datei IRremote.h

extern TIM_HandleTypeDef htim4; //     -   50  (     72) #define MYPRESCALER 71 //   1 #define MYPERIOD 49 // 50  //     -     #define MYSYSCLOCK 72000000 //     recive_IR #define RECIV_PIN (HAL_GPIO_ReadPin(recive_IR_GPIO_Port, recive_IR_Pin)) 

Wenn Sie einen anderen Timer konfigurieren, müssen Sie den entsprechenden Strukturnamen - htim4 - angeben und dies auch in den Dateien IRremote. und irSend. tun. Ich war zu faul, um all diese Wirtschaft zu definieren. Wenn Sie einen anderen Timer in Kuba auswählen, müssen Sie nur den Kanal und die interne Taktquelle angeben ...



Das Programm konfiguriert alles andere. Wenn Sie eine andere Kanalnummer auswählen, müssen Sie diese auch in der Datei irSend.s umbenennen.

Bei den restlichen Einstellungen denke ich, dass alles klar ist - basierend auf der Systemfrequenz (im Beispiel von 72 MHz) werden die Werte des Vorsplitters und des Überlaufs alle 50 μs durch eine Unterbrechung ersetzt. Das Folgende zeigt die Frequenz und den Messwert des Pins an.

Nachfolgend sind die Definitionen aufgeführt, die die beteiligten Protokolle definieren ...

 ////////////////////////////////////   //////////////////////////////////////// #define DECODE_RC5 1 //     RC5   0 #define SEND_RC5 1 //       RC5   0 #define DECODE_RC6 1 #define SEND_RC6 1 ... 

Durch Deaktivieren unnötiger Protokolle wird die Größe des Programms verringert. Grundsätzlich können Sie die Funktionen nicht verwendeter Protokolle und der entsprechenden Dateien generell ausschneiden (Dateien haben charakteristische Namen).

Das Programm ist extrem einfach, die Funktion my_decode (& results) decodiert das empfangene Signal und zeigt den Tastencode, den Protokolltyp und die Paketlänge an ...



Ich habe keine anderen Fernbedienungen.

Verwenden Sie zum Senden des decodierten Signals die Funktion mit dem entsprechenden Namen ...

 sendSAMSUNG(0x707048b7, 32); my_enableIRIn(); 

Die Funktion my_enableIRIn () ist erforderlich, deaktiviert die PWM und versetzt den Timer in den Empfangsmodus. Die gleiche Funktion wird für die Initialisierung verwendet (vor einer Endlosschleife). Aufgrund dieser Funktion können Sie Ihr eigenes Signal nicht empfangen - dies kann gelöst werden, aber ich sehe darin keinen Sinn.

Wenn Sie den Protokolltyp nicht bestimmen können ...


... dann gibt es keinen Grund zur Sorge, der Tastencode wird trotzdem empfangen.

Wenn Sie ein unbekanntes Signal nicht nur empfangen, sondern auch senden möchten, müssen Sie die Zeilen für "Rohdatenausgabe" auskommentieren ...



... und senden Sie die gelesenen Daten mit der Funktion sendRaw () ...

 uint8_t khz = 38; //    ,    36  40  unsigned int raw_signal[] = {1300, 400, 1300, 400, 450, 1200, 1300, 400, 1300, 400, 450, 1200, 500, 1200, 450, 1250, 450, 1200, 500, 1200, 450, 1250, 1300}; sendRaw(raw_signal, sizeof(raw_signal) / sizeof(raw_signal[0]), khz); my_enableIRIn(); //   ( ) 

Mich "roh" zu schicken, funktioniert bei mir nicht.

Die Bibliothek verwendet einen DWT-Zähler für Mikrosekundenverzögerungen. Soweit ich weiß, haben es nicht alle stm32, und es ist möglich, dass es nicht überall gleich konfiguriert ist. Wenn Ihr Stein kein DWT hat, müssen Sie sich etwas einfallen lassen, das Sie in der Funktion custom_delay_usec (unsigned long us) am Ende der Datei irSend.s ersetzen können. Die Einstellung befindet sich am Anfang.

Das ist alles.

Die Bibliothek

Source: https://habr.com/ru/post/de456890/


All Articles