PROGCONT.RU

Форма входа







Регистрация Вход/

Пример Пример Пример


STM8S Управление устройствами с помощью пульта ИК.

Ссылка на видео в YouTube Что меня привело к изучению данной темы?
Коллега на работе спросил можно ли, управлять телевизором с помощью телефона по WiFi, немного подумав и возникла идея скрестить телефон на android, esp-12(esp8266) и stm8s903k3. Но как говорится все по порядку, с начало надо разобраться с ИК управлением и как выглядят команды пульта. В интернете нашёл несколько статей, они были на stm32(почему у меня stm8 а не stm32, слишком круто ездить на БЕЛАЗЕ за хлебом) или на других контролерах, в принципе данной информации мне хватило, вот вам демонстрация.

 Так как Discovery у меня была, осталось достать ИК приемник. Не много погуглив я узнал что внет рисунка основном ИК устройства работают на частоте несущей 38кгц(основной параметр) и приобрел приемник вот такой как справа VS1838B, кто захочет повторить рекомендую обратиться к Алиэкспрес полно типанет рисунка таких наборов(пуль и приемник 38кгц искать как пульт ардуино).
  Коротко, что такое несущая частота и для чего она. Так как нас окружают световые излучатели, такие как лампы, солнечный свет, те же светодиоды все они излучают немного ИК поэтому нашему приемнику надо как то отделить нужный сигнал от помех для этого излучатель(пульт) формирует ИК импульсы определенной продолжительности, 26.3 микросекунд период в котором 8.77 микросекунд сигнал, вот и получается 1сикунда деленая на 26.3 микросекунд = 38кгц, именно на эту последовательность сигналов реагирует наш приемник. Ниже рисунок.

нет рисунка

 Вот так выглядят в кодировке 0 и 1, где показаны черточки это и есть наша несущая там, где пустота излучатель не активен.

нет рисунка

 Ниже весь код сигнала, 9млс несущая далее 4.5млс тишина(стартовая комбинация) и вот потом наши четыре байта в виде закодированных ноликов и единиц, первые два байта код устройства, вторые два команда. В конце дорисован код повторений команды, он нам не нужен.

нет рисунка

 Теперь как воспринимает vs1838b сигнал пульта. Все очень просто, отсутствие сигнала от пульта будет высокий уровень на выходе vs1838b, как только излучатель начнет отправлять несущую, выход переходит в низкое состояние до ее окончания, нас интересует высокие состояния после стартовой комбинации их должно быть 32( 8+8 бит адрес устройства и 8+8 бит команда) смотрите на рисунке.

нет рисунка

 Перейдем к практике, подключаем vs1838b к нашей плате, vs1838b OUT необходимо подключить к TIM1_CHANNEL_1, GPIOC_PIN_1 и давайте подключим наш контролер к компьютеру через COM или USB_COM переходник, что бы видеть код отправляемый пультом. Программу терминал я использую Qt_comport, она бесплатна.

нет рисунка

 Пишем простую программу, которая будет принимать, обрабатывать и отправлять нам на компьютер код. В программе я вставил короткое описание настройки контролера, если интересно тогда скачайте документ en.CD00190271.pdf, в нем на странице 168 есть полное описание работы таймера в режиме Input capture mode (PWM input signal measurement).

#include "stm8s.h"

INTERRUPT void TIM1_CAP_COM_IRQHandler(void); /* TIM1 CAP/COM */
void configTim1AsCapture(void);

uint8_t countBit=0;
uint8_t countByte=0;
uint8_t handleByte=0;
uint8_t receiveDataPult[4];

      int main( void )
{
 CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);

 configTim1AsCapture();

UART1_Init((uint32_t)115200, UART1_WORDLENGTH_8D,UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
UART1_Cmd(ENABLE);

while (1){
//Основная программа, ваш код здесь
      }
}
void configTim1AsCapture(void){
// Устанавливаем пред делитель 6, таймер считает вверх до 0xffff, потом сбрасывается и все заново
TIM1_TimeBaseInit(6, TIM1_COUNTERMODE_UP, 0xFFFF, TIM1_OPMODE_REPETITIVE);
/*TIM1_CHANNEL_1 срабатывает от нарастания сигнала, включаем выход для сопряжения с TIM1_CHANNEL_2, пред делитель в 0 и входной фильтр отключаем.*/
TIM1_ICInit(TIM1_CHANNEL_1, TIM1_ICPOLARITY_RISING , TIM1_ICSELECTION_DIRECTTI, TIM1_ICPSC_DIV1, 0);
/*TIM1_CHANNEL_2 срабатывает от спада сигнала, включаем вход для сопряжения с TIM1_CHANNEL_1, пред делитель в 0 и входной фильтр отключаем*/
TIM1_ICInit(TIM1_CHANNEL_2, TIM1_ICPOLARITY_FALLING , TIM1_ICSELECTION_INDIRECTTI, TIM1_ICPSC_DIV1, 0);
//Подключаем TIM1 к тактированию
TIM1_SelectSlaveMode(TIM1_SLAVEMODE_RESET);
//Сброс счетчика таймера от спада сигнала на TIM1_CHANNEL_1
TIM1_SelectInputTrigger(TIM1_TS_TI1FP1);
//Сброс флага прерывания от TIM1_CHANNEL_2
TIM1_ClearFlag(TIM1_FLAG_CC2);
//Прерывание от нарастания сигнала TIM1_IT_CC2
TIM1_ITConfig(TIM1_IT_CC2, ENABLE);
//Включаем таймер
TIM1_Cmd(ENABLE);
//Включаем прерывание
enableInterrupts();
}

INTERRUPT_HANDLER(TIM1_CAP_COM_IRQHandler, 12)
{
uint8_t h=TIM1->CCR2H;
uint8_t l=TIM1->CCR2L;
  if(38 <h && h<41){countBit=0;countByte=0;handleByte=0;
  }else{
     handleByte <<=1;
     if(13 <h && h <16){handleByte|=1;}
     countBit++;
    if(countBit==8){
    countBit=0;
     receiveDataPult[countByte]=handleByte;
    countByte++;
     if(countByte==4){
     countByte=0;
//Тут вставляйте свой обработчик команд пульта.
    UART1_SendData8(receiveDataPult[0]);//Отправляем в UART 1байт
     while (UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET);
    UART1_SendData8(receiveDataPult[1]);//Отправляем в UART 2байт
     while (UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET);
    UART1_SendData8(receiveDataPult[2]);//Отправляем в UART 3байт
    while (UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET);
    UART1_SendData8(receiveDataPult[3]);//Отправляем в UART 4байт
     while (UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET);

    }
  }
}
TIM1_ClearFlag(TIM1_FLAG_CC2);
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
while (1){}
}
#endif

 Вот так должен выглядеть наш COM терминал, принимая код от контролера.

нет рисунка

 Писал коротко, надеюсь, вам пригодится моя статья.


Комментариев нет  Только зарегистрированные пользователи могут оставлять комментарии!