Télécommande IR sur stm32



Bonjour

Description de la bibliothèque pour la lecture, le décodage et l'envoi ultérieur de signaux infrarouges à partir de diverses télécommandes domestiques à l'aide du microcontrôleur stm32. Basé sur la bibliothèque IRremote pour arduino, et adapté pour stm32.

La bibliothèque utilise une minuterie, à la fois pour recevoir et envoyer un signal. Le récepteur est connecté à n'importe quelle broche (GPIO_Input) et l'émetteur est connecté à l'un des canaux du temporisateur fonctionnant en mode PWM Generation (PWM). Dans l'exemple, le premier canal du temporisateur n ° 4 est utilisé - PB6 (émetteur) et broche PB5 (récepteur).

Pour recevoir un signal, le temporisateur fonctionne en mode d'interruption - toutes les 50 μs, il vérifie l'état de la broche d'entrée, et pendant la transmission, il passe en mode de génération PWM, envoie un signal et repasse en mode d'interruption.

Les paramètres sont dans le fichier 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)) 

Si vous configurez un autre temporisateur, vous devez spécifier le nom de structure correspondant - htim4, et faire de même dans les fichiers IRremote. et irSend.. J'étais trop paresseux pour définir toute cette économie. Lorsque vous choisissez une autre minuterie à Cuba, vous devez spécifier uniquement le canal et la source d'horloge interne ...



Le programme configurera tout le reste. Si vous sélectionnez un autre numéro de chaîne, vous devez également le renommer dans le fichier irSend.s.

Avec le reste des réglages, je pense que tout est clair - en fonction de la fréquence du système (dans l'exemple de 72 MHz), les valeurs du pré-répartiteur et du débordement sont substituées à une interruption toutes les 50 μs. Ce qui suit indique la fréquence et la lecture de la broche.

Voici les définitions qui définissent les protocoles impliqués ...

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

La désactivation des protocoles inutiles réduit la taille du programme. En principe, vous pouvez généralement supprimer les fonctions des protocoles inutilisés et les fichiers correspondants (les fichiers ont des noms caractéristiques).

Le programme est extrêmement simple, la fonction my_decode (& results) décode le signal reçu et affiche le code du bouton, le type de protocole et la longueur du paquet ...



Je n'ai pas d'autre télécommande.

Pour envoyer le signal décodé, utilisez la fonction avec le nom correspondant ...

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

La fonction my_enableIRIn () est nécessaire, elle désactive le PWM et met le temporisateur en mode réception. La même fonction est utilisée pour l'initialisation (avant une boucle infinie). En raison de cette fonction, vous ne pourrez pas capter votre propre signal - cela peut être résolu, mais je n'y vois aucun intérêt.

Si vous ne pouvez pas déterminer le type de protocole ...


... alors il n'y a rien à craindre, le code du bouton est quand même reçu.

Si vous devez non seulement recevoir un signal inconnu, mais aussi l'envoyer, vous devez décommenter les lignes pour la "sortie de données brutes" ...



... et envoyer les données lues à l'aide de la fonction 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(); //   ( ) 

L'envoi «brut» ne fonctionne pas pour moi.

La bibliothèque utilise un compteur DWT pour les retards en microsecondes. Pour autant que je sache, tous les stm32 ne l'ont pas, et il est possible que pas partout, il soit également configuré. Si votre pierre n'a pas de DWT, vous devez trouver quelque chose à remplacer dans la fonction custom_delay_usec (unsigned long us) à la fin du fichier irSend.s, le paramètre est au début.

C’est tout.

La bibliothèque

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


All Articles