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

Visits: 360


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

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

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

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


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


  • I2C MODULE – PIC18F25K42 Device ID Revision = A001I2C MODULE – PIC18F25K42 Device ID Revision = A001
    Visits: 1059 I2C MODULE Обход ошибок в версии I2C MODULE – PIC18F25K42 Device ID Revision = A001 В Серии K42 применен совершенно новый модуль шины I2C, который позволяет поддерживать все …
  • ESP8266 применение в проектахESP8266 применение в проектах
    Visits: 3513 (Актуально только для версий прошивки 1.хх) ESP8266 показала себя как надежное и безотказное устройство для обмена данными с применением WIFI. Я использую ESP8266 исключительно через UART, с применением AT …
  • 12-BIT A/D CONVERTER WITH THRESHOLD DETECT на примере PIC24FJ128GA20412-BIT A/D CONVERTER WITH THRESHOLD DETECT на примере PIC24FJ128GA204
    Visits: 805 Введение. 12-битный модуль A/D Converter является усовершенствованной версией 10-битного модуля, предлагаемого на некоторых устройствах PIC24. Оба модуля являются преобразователями, в своих ядрах, с последовательным приближением (SAR), в окружении …
  • MPLAB® Code ConfiguratorMPLAB® Code Configurator
    Visits: 1768 MPLAB ® Code конфигуратор (MCC) является свободно распространяемым плагином, это графическая среда программирования, которая генерирует бесшовный, легкий для понимания кода на Cи, чтобы вставить его в свой проект.
  • TDA7294 part 1TDA7294 part 1
    Visits: 215 TDA7294 має унікальні дані для створення підсилювачів звукової частоти HI-FI класу. Варіант застосування є конфігурація BRIDGE (мостова схема включення), де використовуються два TDA7294, як показано на схематичній діаграмі …
  • Часы-кухонный таймерЧасы-кухонный таймер
    Visits: 3924 Каждая кухня должна иметь кухонный таймер, который позволяет напоминать хозяйке когда проходить определенный промежуток времени. Например, печем пирог, варим яйца… , чтобы не смотреть постоянно на часы, установим таймер и …
  • Стабилизатор тока на SN3350, часть 2Стабилизатор тока на SN3350, часть 2
    Visits: 1146 Если вам необходимо разработать устройство с применением мощных светодиодов, то никак не обойтись без применения стабилизатора тока. На настоящий момент стабилизаторы тока являются самым эффективным механизмом, для питания светодиода в течение всего …
  • LED драйвер TM1639LED драйвер TM1639
    Visits: 2153 TМ1639 позволяет работать на матрицу 8*8 или 8 семисегметных индикаторов. Может работать как на индикаторы с общим катодом, но и есть возможность подключать общим анодом. Для управления драйвером …
  • Development of temperature control and management systemsDevelopment of temperature control and management systems
    Visits: 56 Catcatcat Electronics Пошта для контакту e-mail: catcatcat.electronics@gmail.com
  • Проект с использованием MCC часть 12-1Проект с использованием MCC часть 12-1
    Visits: 912 В настоящее время без визуализации информации уже не интересно. Поэтому научимся выводить информацию на дисплей. Для это возьмет простенький OLED RET012864E/REX012864J я такой приобретал в фирме “Гамма-Украина”, описание можно …


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