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

Views: 498


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

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

Для этого необходим приемник ИК, желательно выбирать с чтобы совпадала частота несущей, но если даже у вас есть в наличии на 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 82 downloads

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


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


  • CAN – Controller Area NetworkCAN – Controller Area Network
    Views: 1267 Controller Area Network (CAN) первоначально был создан немецким поставщиком автомобильных систем Робертом Бош в середины 1980-х для автомобильной промышленности как метод для обеспечения возможности надежной последовательной связи. Целью было сделать автомобили более надежными, …
  • ch-4050 – дифференциальный терморегуляторch-4050 – дифференциальный терморегулятор
    Views: 2087 ch-4050 – это не новая модель, это расширенная версия универсального терморегулятора ch-4000. Различия коснулись в появлении новой функции дифференциального регулирования. Это вид регулирования по разности температур измеренного двумя …
  • Acquaintance with audio-bluetooth modules F-6888 (BK3254).Acquaintance with audio-bluetooth modules F-6888 (BK3254).
    Views: 2442 Для проектов появилось необходимость познакомиться с недорогими модулями китайского производства, которые можно приобрести у нас в Украине и у китацев, на алиэкспрессе. Так как меня интересует не просто, …
  • Customs codes for exportCustoms codes for export
    Views: 388   Митні коди (HS Code) для надсилання посилок за кордон. Для відправки товару за кордон на сьогодні необхідно зазначати митні коди. Часто визначення коду займає багато часу. Для …
  • Проект с использованием MCC часть 12-1Проект с использованием MCC часть 12-1
    Views: 1145 В настоящее время без визуализации информации уже не интересно. Поэтому научимся выводить информацию на дисплей. Для это возьмет простенький OLED RET012864E/REX012864J я такой приобретал в фирме “Гамма-Украина”, описание можно …
  • MCC PIC24 – модуль OUTPUT COMPARE – режиме ШИМMCC PIC24 – модуль OUTPUT COMPARE – режиме ШИМ
    Views: 1312 Во многих системах управления, для формирования управляющих сигналов требуется модуль ШИМ, он позволяет не только формировать импульсы заданной длительности, но и с применением обычного RC фильтра строить простые …
  • Светодиоды со встроенным драйвером WS2812BСветодиоды со встроенным драйвером WS2812B
    Views: 1091 Производитель http://www.world-semi.com Краткое описание продукции фирмы Каталог продукции” catcatcat_ws_19 catcatcat_ws_15 catcatcat_ws_11 catcatcat_ws_07 catcatcat_ws_03 catcatcat_ws_18 catcatcat_ws_14 catcatcat_ws_10 catcatcat_ws_06 catcatcat_ws_02 catcatcat_ws_05 catcatcat_ws_09 catcatcat_ws_13 catcatcat_ws_17 catcatcat_ws_16 catcatcat_ws_12 catcatcat_ws_08 catcatcat_ws_04 catcatcat_ws_01 This jQuery …
  • OLED RET012864E/REX012864JOLED RET012864E/REX012864J
    Views: 1611 RET012864E/REX012864J ОЛЕД индикатор производитель Raystar-Optronics приобретался в http://www.microchip.ua/ к сожалению никакой информации на сайте поставщика нет. Поэтому решил работу с этой версией индикатора на драйвере SSD1305 предоставить на своем сайте. Так как …
  • Емкостной сенсорЕмкостной сенсор
    Views: 3249 Изучаем изготовление емкостных сенсоров на PIC-микроконтроллере. Конструкция емкостных сенсоров имеет вид: Емкостные сенсоры строятся по схеме высокочастотного генератора, сам принцип основан на измерение частоты этого генератора. Частота зависит …
  • MTouch® Модуль Емкостной Библиотеки для MPLAB®X Code Configurator (MCC)MTouch® Модуль Емкостной Библиотеки для MPLAB®X Code Configurator (MCC)
    Views: 1448 Введение MTouch ® Модуль Емкостной Библиотеки для MPLAB ® X Code Configurator (MCC) позволяет быстро и легко генерировать решение кода на  Cи для емкостной сенсорной кнопки, датчика приближения и слайдера.


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