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

Views: 366


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

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

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

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


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


  • Проект с использованием MCC часть 16Проект с использованием MCC часть 16
    Views: 1089 Продолжим изучение EUSART. На этом этапе отработает передачи данных с ПК и получения эха. Для этого в основной цикл программы добавим код if(EUSART_DataReady) // проверим флаг готовности данных …
  • Проект с использованием MCC часть 02Проект с использованием MCC часть 02
    Views: 2295 Когда мы запустили конфигуратор, самое главное понять, что с этим делать и как проверить, то что мы делаем работает или нет. Для начала настроим регистры конфигурации микроконтроллера и настроем …
  • Четырех канальный терморегулятор ch-4000Четырех канальный терморегулятор ch-4000
    Views: 3198  Четыре независимых канала регулирования температуры, одновременно можно подключить 16 датчиков температуры DS18B20 с удалением до трехсот метров. Можно для регулировки выбрать любой датчик, подключенный к устройству. Каждый канал может работать …
  • ch-светомузыка от теории до реализацииch-светомузыка от теории до реализации
    Views: 700 Сразу оговоримся технология или теория ch-светомузыки, это постоянно развивающийся процесс и то что будет сказано сегодня завтра может быть опровергнуто и считаться ошибочным. Назовем само решение проблемы автоматического …
  • Дифференциальный терморегуляторДифференциальный терморегулятор
    Views: 4004 Дифференциальный терморегулятор ch-3020 Назначение. Ch-c3020 представляет собой дифференциальный терморегулятор. Основное назначение солнечные системы горячего водоснабжения, а также вентиляционные системы управление притоком свежего воздуха. Контроллер позволяет работать пяти режимах. …
  • Одноканальный емкостной сенсор – AT42QT1012Одноканальный емкостной сенсор – AT42QT1012
    Views: 2336 Описание сенсора [wpdm_file id=242] Незаконченный проект, так-как сенсор не оправдал своего назначения, не рекомендую, просто выброшенные деньги. Особенности. • Количество сенсоров – один, режим переключения ( touch-on/touch-off ), а также программируемая …
  • MPLAB® Harmony – или как это просто! Часть 4.MPLAB® Harmony – или как это просто! Часть 4.
    Views: 2050 Часть четвертая – это может показаться немного сложно. Структура проекта. Для облегчения конфигурирования проекты MPLAB Harmony обычно структурированы таким образом, чтобы изолировать код, необходимый для настройки «системы», от …
  • Гаджеты для домашней автоматики – Емкостной сенсорГаджеты для домашней автоматики – Емкостной сенсор
    Views: 1609 Управление светодиодным освещением – Сенсор емкостной. Данный гаджет предназначен для управления освещением где необходимо включением освещение сенсорным прикосновением. Датчик позволяет управлять светодиодной нагрузкой в виде модулей или светодиодных лент …
  • LCD драйвер – UC1601sLCD драйвер – UC1601s
    Views: 1621 http://svetomuzyka.narod.ru/project/UC1601s.html Читайте обновление на http://catcatcat.d-lan.dp.ua/?page_id=178 В данный момент можно приобрести в ООО “Гамма” несколько типов индикаторов на драйвере UC1601s. RDX0048-GC, RDX0077-GS, RDX0154-GC и RDX0120-GC выполнены по технологии COG.
  • Altium Designer my Libraries, Project templates, System settings by Catcatcat V24.0 PROAltium Designer my Libraries, Project templates, System settings by Catcatcat V24.0 PRO
    Views: 258 Назвемо цей варіант поновлення для професіоналів і не тільки. Що нового? 1. Повністю змінено структуру параметрів бази даних компонента. Це дозволило повноцінної роботи Актив ВОМ. Ви відразу отримуєте …


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