Controle remoto IR em stm32



Olá.

Descrição da biblioteca para leitura, decodificação e envio subsequente de sinais infravermelhos de vários controles remotos domésticos usando o microcontrolador stm32. Baseado na biblioteca IRremote para arduino e adaptado para stm32.

A biblioteca usa um cronômetro, tanto para receber quanto para enviar um sinal. O receptor está conectado a qualquer pino (GPIO_Input) e o transmissor está conectado a um dos canais do timer trabalhando no modo de geração PWM (PWM). No exemplo, o primeiro canal do temporizador nº 4 é usado - PB6 (transmissor) e pino PB5 (receptor).

Para receber um sinal, o timer opera no modo de interrupção - a cada 50 μs, ele verifica o status do pino de entrada e, durante a transmissão, alterna para o modo de geração PWM, envia um sinal e volta ao modo de interrupção.

As configurações estão no arquivo 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)) 

Se você configurar outro cronômetro, precisará especificar o nome da estrutura correspondente - htim4 e fazer o mesmo nos arquivos IRremote. e irSend.. Eu estava com preguiça de definir toda essa economia. Ao escolher outro timer em Cuba, você precisa especificar apenas o canal e a fonte do relógio interno ...



O programa irá configurar tudo o resto. Se você selecionar um número de canal diferente, também precisará renomeá-lo no arquivo irSend.s.

Com o restante das configurações, acho que tudo está claro - com base na frequência do sistema (no exemplo de 72 MHz), os valores do pré-divisor e do transbordamento substituem a interrupção a cada 50 μs. A seguir, indica a frequência e a leitura do pino.

Abaixo estão as definições que definem os protocolos envolvidos ...

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

Desativar protocolos desnecessários reduz o tamanho do programa. Em princípio, você geralmente pode cortar as funções de protocolos não utilizados e os arquivos correspondentes (os arquivos têm nomes de características).

O programa é extremamente simples, a função my_decode (& results) decodifica o sinal recebido e exibe o código do botão, tipo de protocolo e tamanho do pacote ...



Não tenho outros controles remotos.

Para enviar o sinal decodificado, use a função com o nome correspondente ...

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

A função my_enableIRIn () é necessária, desativa o PWM e coloca o timer no modo de recebimento. A mesma função é usada para inicialização (antes de um loop infinito). Devido a essa função, você não poderá captar seu próprio sinal - isso pode ser resolvido, mas não vejo sentido nisso.

Se você não pode determinar o tipo de protocolo ...


... então não há nada com que se preocupar, o código do botão é recebido de qualquer maneira.

Se você precisar não apenas receber um sinal desconhecido, mas também enviá-lo, será necessário descomentar as linhas de "saída de dados brutos" ...



... e envie os dados lidos usando a função 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(); //   ( ) 

Enviar-me "bruto" não funciona para mim.

A biblioteca usa um contador DWT para atrasos de microssegundos. Até onde eu sei, nem todos os stm32 o possuem, e é possível que nem todos os lugares estejam igualmente configurados. Se a sua pedra não possui DWT, é necessário criar algo para substituir na função custom_delay_usec (não assinada há muito tempo) no final do arquivo irSend.s, a configuração está no início.

Isso é tudo.

A biblioteca

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


All Articles