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 69 downloads

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


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


  • Проект с использованием MCC часть 15Проект с использованием MCC часть 15
    Visits: 1490 EUSART – Универсальный асинхронный приёмопередатчик (УАПП, англ. Universal Asynchronous Receiver-Transmitter, UART) — узел вычислительных устройств, предназначенный для организации связи с другими цифровыми устройствами. … читать на вики. Внесем изменения в нашу схему, …
  • MPLAB® Harmony – или как это просто! Часть 3.MPLAB® Harmony – или как это просто! Часть 3.
    Visits: 2059 Часть третья – копнём немного глубже. Вы наверное заметили, что во второй главе, вроде сначала все шло как по маслу, а потом, что бы заморгали светики, я вставил …
  • ESP8266 применение в проектахESP8266 применение в проектах
    Visits: 3513 (Актуально только для версий прошивки 1.хх) ESP8266 показала себя как надежное и безотказное устройство для обмена данными с применением WIFI. Я использую ESP8266 исключительно через UART, с применением AT …
  • Индикатор кода – RC-5 Protocol PhilipsИндикатор кода – RC-5 Protocol Philips
    Visits: 976 Индикатор кода – RC-5 Protocol Philips При конструировании дистанционного управления на инфракрасных лучах для контроля удобно иметь индикатор кодов передаваемых пультом. Плата ch-c3000 позволяет изготавливать устройства с возможностью …
  • Проект с использованием MCC часть 02Проект с использованием MCC часть 02
    Visits: 2251 Когда мы запустили конфигуратор, самое главное понять, что с этим делать и как проверить, то что мы делаем работает или нет. Для начала настроим регистры конфигурации микроконтроллера и настроем …
  • Ссылки на интересные источникиСсылки на интересные источники
    Visits: 816 Сбор 3D моделей от André L’Hérault конденсаторы, резисторы, индуктивности dropbox IPC-SM-782 Surface Mount Design and Land Pattern Standard Видео уроки по Altium designer Alexey Sabunin https://www.youtube.com/channel/UCG7N5CqXpyK8nQjr1EmMgng Сергей Булавинов https://www.youtube.com/channel/UCISAMXRnN_Qw9UTjUwZI1Jw Robert Feranec https://www.youtube.com/user/matarofe …
  • PIC18F25K42 – v. A001 – выявленные баги.PIC18F25K42 – v. A001 – выявленные баги.
    Visits: 591 Модуль I2C Не работает при использовании в стандартной конфигурации MCC. Требует особой нестандартной конфигурации и управления для нормальной работы. Обойти Обход проблемы возможен библиотека см статью. Модуль ADC2 На …
  • Проект с использованием MCC часть 14Проект с использованием MCC часть 14
    Visits: 799 С выводом данных на дисплей мы справились (но могу сразу сказать библиотеку графики к этой статьи пришлось доработать, поэтому в этом проекте она обновлена). У нас на текущем …
  • Проект с использованием MCC часть 13Проект с использованием MCC часть 13
    Visits: 1020 Так как используя MCC мы можем его использовать со своими библиотеками, поэтому настало время и свое создать. Для начала откроем наш заголовочный файл в нем очень много букв: По …
  • Регулятор влажности ch-3800Регулятор влажности ch-3800
    Visits: 1404   И еще один проект на плате ch-c3xxx –  универсальный регулятор влажности ch-3800. Регулятор позволяет работать как в режиме индикатора влажности, так и в режиме регулятора. Рабочий диапазон …


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