Views: 489
Дистанционное управление для устройств на микроконтроллерах.
Самый простой вариант это приобрести понравившийся пульт ДУ на ИК и сделать дистанционное управление.
Для этого необходим приемник ИК, желательно выбирать с чтобы совпадала частота несущей, но если даже у вас есть в наличии на 38, а руль с несущей на 38 кГц, все равно работать будет, просто уменьшиться дальность, например при всех идеальных условиях можно управлять с расстоянии более 60 метров, а при всех неблагоприятных не более 10-15.
Для декодирования сигналов мы подключаем приемник на прямую на вход INT1 микроконтроллера
И как только это сделано, надо в программу добавить функции обработки. Для обработки мы будем использовать коды типа NEC
это стандартные коды несущие 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 модуль для декодирования ИК-кодов пультов...Это может быть интересно
Проект с использованием MCC часть 10Views: 1064 Алгоритм управления освещением от нажатия кнопки. Обработка удержания кнопки: Мы должны проверить кнопка в настоящий момент нажата и флаг удержания установлен, если да Проверить таймер удержания “отработал” – …
MTouch® Модуль Емкостной Библиотеки для MPLAB®X Code Configurator (MCC)Views: 1401 Введение MTouch ® Модуль Емкостной Библиотеки для MPLAB ® X Code Configurator (MCC) позволяет быстро и легко генерировать решение кода на Cи для емкостной сенсорной кнопки, датчика приближения и слайдера.
Четырех канальный терморегулятор ch-4000Views: 3413 Четыре независимых канала регулирования температуры, одновременно можно подключить 16 датчиков температуры DS18B20 с удалением до трехсот метров. Можно для регулировки выбрать любой датчик, подключенный к устройству. Каждый канал может работать …
ch-4060 – регулятор температуры и влажности на датчике DHT11/DHT22/AM2302Views: 2499 На плате ch-4000 очень легко собрать устройство регулятора температуры и влажности. Датчик DHT11 самый недорогой вариант для создания такого устройства, правда точность его не велика, но для бытовых устройств …
MPLAB® Code ConfiguratorViews: 1818 MPLAB ® Code конфигуратор (MCC) является свободно распространяемым плагином, это графическая среда программирования, которая генерирует бесшовный, легкий для понимания кода на Cи, чтобы вставить его в свой проект.
Сумеречное релеViews: 1642 Реле управления освещением, датчик день-ночь – одним словом фотореле для управления освещением или формирования сигнала для системы умный дом о понижении или повышении освещенности относительно заданного уровня. Реле выполнено по классической схеме, конденсаторный блок питания, от сети переменного тока …
Часы-кухонный таймерViews: 2901 Каждая кухня должна иметь кухонный таймер, который позволяет напоминать хозяйке когда проходить определенный промежуток времени. Например, печем пирог, варим яйца… , чтобы не смотреть постоянно на часы, установим таймер и …
Дисплей KD035C-3A подключение и управлениеViews: 842 Дисплей KD035C-3A производиться компанией SHENZHEN STARTEK ELECTRONIC TECHNOLOGY CO.,LTD Характеристики Параметр Спецификация Единицы измерения Размер дисплея 70.08(H)*52.56(V) (3.5inch) mm Тип дисплея TFT active matrix Цветовая гамма 65K/262K colors Разрешение …
Ссылки на интересные источникиViews: 980 Сбор 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 …
APA102 – светодиоды со встроенным драйвером и SPI интерфейсомViews: 3529 APA102 В 2014 году фирма Shenzhen Led Color Optoelectronic Co., Ltd http://www.szledcolor.com/ начала производство светодиодов на драйвере APA102. Это серия так называемых светодиодов со встроенным драйвером. Основной особенностью этих …

