PIC32 – Дистанционное управление на ИК (простая реализация)

Views: 474


Дистанционное управление для устройств на микроконтроллерах.

Самый простой вариант это приобрести понравившийся пульт ДУ на ИК и сделать дистанционное управление.

Для этого необходим приемник ИК, желательно выбирать с чтобы совпадала частота несущей, но если даже у вас есть в наличии на 38, а руль с несущей на 38 кГц, все равно работать будет, просто уменьшиться дальность, например при всех идеальных условиях можно управлять с расстоянии более 60 метров, а при всех неблагоприятных не более 10-15.

Для декодирования сигналов мы подключаем приемник на прямую на вход INT1 микроконтроллера

Catcatcat_IK_01

И как только это сделано, надо в программу добавить функции обработки. Для обработки мы будем использовать коды типа NEC

Cat_IK_01

это стандартные коды несущие 32 бита данных.

Принцип работы будет следующий мы используем свойство микроконтроллера для обработки внешних прерываний по входам. Используем вход INT1 и настраиваем, чтобы он формировал прерывания по срезу импульсов. Т.е. в приемниках всегда есть подтяжка (30-50 кОм) и пассивный уровень высокий, при получении модулированного импульса на выходе же формируется низкий уровень. Нам необходимо в момент получения от входа прерывания сосчитать данные с таймера (затем таймер обнулить для подготовки изменения следующего импульса) проверить длительность и по параметрам этой длительности определить это преамбула (начала передачи) или это передача бита ноль, единицы или это код автоповтора (удержание клавиши).

Принцип описан, теперь настройка:

// Настройка прерывания по входу INT1 – External Interrupt 1, вход RD8, ДУ - ИК
    INTCONbits.INT1EP = 0;              // External Interrupt 1 Edge Polarity Control bit 0 = Falling edge
    IPC1bits.INT1IP = 7;                // уровень приоритета
    IPC1bits.INT1IS = 1;                // уровень суб приоритета
    IFS0bits.INT1IF = 0;                // сбросить флаг прерывания по входу INT1
    IEC0bits.INT1IE = 1;                // разрешить прерывание по входу INT1

Далее необходимо настроить таймер, он же измеряет время, хочу уточнить, все параметры приведены для тактовой 80 МГц, она же и поступает на периферийные устройства микроконтроллера, и от нее и тактируется таймер.

Настройка таймера

// Настройка таймера Т4 для измерение длительности
    T4CON = 0x0;                        // 
    PR4 = 0xFFFF;                       // 6250-200 Гц настройка периода - тактирование
    T4CONbits.TCKPS = 0b110;            // 111 = 1:256 prescale value
    T4CONbits.ON = 1;                   // включить
// Настройка для таймера 4 прерывания 
    IPC4bits.T4IP=5;                    // приоритет 5
    IPC4bits.T4IS=3;                    // суб приоритет уровень 3
    IFS0bits.T4IF=0;                    // сбросить флаг прерывания.
    IEC0bits.T4IE=1;                    // разрешить прерывания от Т1

Самое главное по приоритету, прерывания по входу INT1 должны иметь наивысший приоритет!

Далее программе мы должны включить прерывания и включить мультивекторный режим

// настройка прерываний
    INTCONbits.MVEC=1;                  // включить мульти векторный режим
    __builtin_enable_interrupts();      // разрешить прерывания

Теперь вернемся в начало и опишем переменные и флаги управления, это необходимо понимать как функции прерывания будут возвращать в основную программу полученные коды (команды).

// переменные флаги модуля управления с ДУ
// флаги ДУ
volatile struct
{
    unsigned NACH   :   1;  // флаг ожидания ИК команды, устанавливается по переполнению таймера
    unsigned POV    :   1;  // флаг ожидания кодов автоповтора, после приема команды
    unsigned PRIEM  :   1;  // флаг данные готовы, устанавливается когда ИК команда принята
    unsigned AUPOV  :   1;  // флаг автоповтор, удержание клавиши на пульте 
}flagIK;

unsigned long chetchic;     // счетчик полученных бит
unsigned long data_IK;      // код полученной команды, действителен после установки флага PRIEM
unsigned long timeautIK;    // таймер установки времени после которого разрешено подача следующей команды

надеюсь с комментов все понятно.

И сами функции прерываний, обработка построена самой возможной простотой и вариантом некоторой степени помехозащищенности, от ИК помех.

Обработка и получение данных

#define CLOBIT 32 // количество бит в передаче
// обработка прерывания по входу INT1
void __ISR(7,ipl7srs) INT1Interrupt (void)
{
unsigned long pwm_reg;

    pwm_reg = TMR4;                        // загрузить значение длительности
    TMR4=0;                                // обнулить таймер
    
    if(pwm_reg>16750&&pwm_reg<17000&&flagIK.NACH) // передача синхроимпульса должна сопровождаться переполнением таймера     
    {
        chetchic=CLOBIT;                                    //счетчик бит (3 байта 8*3=24)
        flagIK.NACH=0;
    }
    else
    if (pwm_reg>13750&&pwm_reg<15000&&flagIK.POV)           // передача "бита автоповтора"
    { 
        timeautIK=5;                                        // инициализация таймера таймаута
        LATBINV = 0b0001000000000000;                       // мигание светодиода - индикатор для тестирования
        flagIK.AUPOV=1;                                     // флаг получение кода автоповтора
    }
    else
    if (pwm_reg>2625&&pwm_reg<2875&&chetchic>0)             // передача "1"
    {
        data_IK<<=1;                                        // выполнить сдвиг
        data_IK |= 1;                                       // установить единицу 
        chetchic--;                                         // подсчет принятых бит
        if(!chetchic){flagIK.PRIEM=1;flagIK.POV=1;}         // 32 установить флаг команда принята если переданы все 32 бита
    }
    else
    if (pwm_reg>1250&&pwm_reg<1500&&chetchic>0)             // передача "0"
    {
        data_IK<<=1;                                        // выполнить сдвиг (подразумевается запись 0)
        chetchic--;                                         //подсчет принятых бит
        if(!chetchic){flagIK.PRIEM=1;flagIK.POV=1;}         // установить флаг команда принята если переданы все 32 бита
    }
    else                                // помеха
    {
       flagIK.NACH=1;                   // 
       chetchic=0;                      // 

    } 
    IFS0bits.INT1IF = 0;                // сбросить флаг прерывания по входу INT1
}

Вкратце, “получаем” прерывание, считываем значение из таймера и обнуляем его, пусть меряет следующий импульс. Полученную длительность сравниваем с 4-мя вариантами допусков и в зависимости от того куда эта длительность просочилась, делаем соответствующие тело движения.

Обработка прерывания от таймер, тут необходимая функция это помехозащищенность, он дает разрешение на по таймАУТУ на прием следующей команды и также сбрасывает прием если при приеме не поступило 32 бита.

// обработка прерывание от таймера 4
void __ISR(16,ipl5soft) T4Interrupt (void)
{
    if(--timeautIK==0)flagIK.NACH=1;    // установит флаг готовноть приема IK команды
    chetchic=0;                         // обнулить счетчик
    LATBCLR = 0b0001000000000000;       // сбросить флаг индикации
    flagIK.AUPOV=0;                     // флаг получение кода автоповтора
    IFS0bits.T4IF=0;                    // сбросить флаг прерывания.
}

Теперь, что делать в основной программе? В основной программе надо ждать установки флага flagIK.PRIEM=1, если флаг установлен произвести обработка данных помещенных в переменную data_IK. И не забыть сбросить флаг, для приема следующей команды. Также можно использовать флаг flagIK.AUPOV=1, для контроля удержания клавиши ил функции автопостора, например

        if(flagIK.PRIEM)
        {
            flagIK.PRIEM=0;
            OledCursor (0, 50);
            bin_HEX(data_IK);
        }

в этом примере выводим на дисплей код полученной команды.


Информация по ИК – кодам некоторых производителей 

Значок

CCP модуль для декодирования ИК-кодов пультов ДУ - сводная таблица по кодам. 1.95 MB 79 downloads

CCP модуль для декодирования ИК-кодов пультов...


Это может быть интересно


  • MPLAB® Harmony – или как это просто! Часть 1.MPLAB® Harmony – или как это просто! Часть 1.
    Views: 3746 Часть первая – Установка Гармонии. Музыкальная тема к статье, слушаем: В начале запуска нового проекта и выбора микроконтроллера стоит задача правильно его сконфигурировать, прежде чем перейти к реализации …
  • Мультизоновый индикатор-терморегулятор ch-c3010Мультизоновый индикатор-терморегулятор ch-c3010
    Views: 1307 Часто возникает необходимость получить информацию по температуре с множества точек контроля. Вам необходимо знать температуру в комнате, в коридоре,  температуру на улице, а в погребе (или на балконе) …
  • Четырех канальный терморегулятор ch-4000Четырех канальный терморегулятор ch-4000
    Views: 3326  Четыре независимых канала регулирования температуры, одновременно можно подключить 16 датчиков температуры DS18B20 с удалением до трехсот метров. Можно для регулировки выбрать любой датчик, подключенный к устройству. Каждый канал может работать …
  • Инфракрасный датчик движения, PIR-sensorИнфракрасный датчик движения, PIR-sensor
    Views: 3230 Домашняя автоматика предполагает наличие датчиков движения, которые способны контролировать движения человека. Самым простым и доступным устройством позволяющие контролировать изменения ИК-излучения, это ПИР-сенсоры. На текущий момент доступны не дорогие модели D203B, D204B, D205B. Все …
  • CLUBBEST-50-LightCLUBBEST-50-Light
    Views: 384 CLUBBEST-50-LIGHT   Зміст Короткий опис проекту. 1 Опис схемотехніки візуалізатора музики. 2 Аудіо вхід. 3 MCU. 4 Цифровий вихід. 5 Схема живлення MCU. 6 Складання пристрою. 7 Список …
  • CLUBBEST – reasoning on the visualization of music.CLUBBEST – reasoning on the visualization of music.
    Views: 263 ВІД ЗАХОДУ ДО СВІТАНКУ АБО ПОБАЧИТИ МУЗИКУ.     Час доби, коли почуття людини загострюються, – це час від заходу до світанку. В цей час людина відкрита для …
  • The art of DJThe art of DJ
    Views: 175 The art of DJ. The art of DJ has gained wide popularity. Today, a DJ is not just someone whose task is to mix tracks; a DJ is …
  • Moving average – скользящее среднееMoving average – скользящее среднее
    Views: 2336 Скользящая средняя, скользящее среднее (англ. moving average, MA) — общее название для семейства функций, значения которых в каждой точке определения равны среднему значению исходной функции за предыдущий период. Скользящие средние обычно используются с данными временных рядов для сглаживания …
  • Цифровой спидометр для автомобиляЦифровой спидометр для автомобиля
    Views: 10271  Универсальность печатной платы ch-c0030pcb позволяет создавать на её основе разнообразные устройства. Одним из таких устройств является электронный спидометр для автомобиля, в котором можно задать два компаратора скорости, например,  для …
  • Контроллер управления светодиодным освещением с дистанционным управлениемКонтроллер управления светодиодным освещением с дистанционным управлением
    Views: 2037 Все активнее светодиоды входят в нашу жизнь. Всё эффективнее становится светодиодное освещение. Всё ниже опускаются цены. Всё больше появляется возможностей получения сочных цветов, простоты в управлении. Всё чаще …


Поделись этим!