Главная » Статьи » Проекты |
Если встает вопрос дистанционно управлять каким-нибудь девайсом, например ламповым усилителем, сразу видится два решения: применить радиоканал, использовав RF модули, или использовать управление с использованием инфракрасных лучей. Когда требуется управлять устройством на небольшом расстоянии (например, в пространстве одной комнаты) и с минимальными вложениями чаще всего достаточно будет применить управление по инфракрасному каналу, ведь для этого требуется всего-навсего инфракрасный датчик TSOP c обвязкой из пары резисторов, и пульт управления, который дома у каждого найдется и даже не один. А благодаря хорошему свойству IR излучения отражаться от поверхности – прямая видимость между передатчиком и приемником не является жестким требованием. Вот и попробуем поработать с этим видом связи. Связь между пультом и девайсом будет обеспечиваться посредством общепринятого стандарта для пультов – RC5. С этим протоколом Bascom-AVR знаком и прекрасно с ним работает. Для примера собрал модуль управления на мк ATTiny2313 – по сути – приемник команд стандарта RC5 способный запоминать, сохранять в энергонезависимой памяти и обслуживать до 7 команд. Немного про работу с RC5 в Bascom-AVR: Первым, что нужно знать – это то, что для стандарта RC5
несущая частота составляет 36 кГц. Поэтому необходимо использовать приемник,
улавливающий такую же частоту – TSOPхх36, цифры в маркировке должны
оканчиваться на 36. О принципе работы таких датчиков хорошо написано здесь. Конфигурация ноги микроконтроллера для подключения датчика в
Bascom выглядит следующим образом: Config Rc5 = Pind.2 'конфигурируем ногу для подключения датчика на Pind.2 Для организации работы стандарта RC5 микроконтроллеру
необходимо точно считать время между импульсами, по умолчанию этим занимается Timer0,
поэтому его использовать не получится. Если по каким-то причинам нам нужно
перебросить эту работу на другой таймер, то просто дописываем это в строке
конфигурации: Config Rc5 = Pind.2 , Timer = 2 'в качестве таймера выбран Timer2 В новых версиях Bascom (с версии 2.0.0.0 и выше) добавлена
возможность настраивать временные задержки, на случай если тайминги пульта
немного отличаются от стандарта. Еще один важный момент, который необходимо знать про RC5,
это то что любая командная посылка состоит из 5-ти битного адреса устройства и
6-ти битной команды. Пять адресных бит предназначены для идентификации 32
различных типов устройств. Шесть командных бит предназначены для передачи 64
команд управления. Прием команды в Bascom-AVR выглядит следующим образом: Getrc5(address , Command) 'принимаем адрес и команду с пульта Каждому типу устройств соответствует свой адрес, чтобы скажем,
пульт от телевизора не вмешивался в работу музыкального центра или наоборот. Производителем
определен стандарт для адресации каждого типа устройств следующим образом: 0 - Телевизор 1 (TV1);
1 - Телевизор 2 (TV2);
2 - Телетекст;
3 - Видео;
4 - Видеопроигрыватель1 (VLP1);
5 - Видеомагнитофон 1 (VCR1);
6 - Видеомагнитофон 2 (VCR2);
8 - Спутниковый тюнер1 (Sat1)
9 - Видеокамера;
10 - Спутниковый тюнер2 (Sat2);
16 - Предварительный усилитель 1;
17 - Тюнер 1;
18 - Магнитофон 1;
19 - Предварительный усилитель 2;
20 - Компакт-проигрыватель (CD);
21 - Проигрыватель (Phono)
26 - CD рекордер;
29 - Освещение1;
30 - Освещение 2;
31 - Телефон. Обучение командам: Для того чтобы записать необходимые команды в память микроконтроллера
(напомню, модуль сохраняет до 7 команд), предусмотрена одна кнопка, нажатием на
которую последовательно выбирается канал для которого будет записана команда.
Нажимаем на нее один раз, команда будет записана для первого канала, нажмем еще
раз – для второго и так далее. После выбора нужного канала нажимаем кнопку на
пульте управления и команда для этого канала запишется в память мк. После этого можно записать оставшиеся команды, но если количество
нажатий на кнопку достигнет 8, команда
не будет записана. Чтобы все это контролировать, порты для которых будет
записываться команда, будут находиться в высоком уровне, то есть на них будет
единица. Можно повесить на них светодиоды и проконтролировать процесс записи. Реализация: Как писал выше, для нашего дела подойдут только датчики с окончанием в маркировке 36. Я использовал приемник TSOP31236 (назначение выводов ниже):
Кнопка, которой будем выбирать для какого канала записать команду, висит на ноге PD.3 и использует прерывание INT1. В обработчике прерывания балом правит переменная Flag, которая следит за тем, сколько раз была нажата кнопка и в зависимости от ее значения будет выводиться высокий уровень на один из каналов выхода. Заодно добавил общий светодиод индикации (Red) который будет гореть пока переменная Flag не равна 0, тем самым показывая, что модуль готов к записи команды: Button: 'обработчик прерывания INT1 Red = 1 'зажгли красный светодиод Incr Flag If Flag = 8 Then 'если нажали кнопку 8 раз Flag = 0 'записывать команды не будем Red = 0 'погасим светодиод End If Select Case Flag 'от значения переменной зависит на какой ноге будет 1 Case 1 : PortB = &B10000000 Case 2 : PortB = &B01000000 Case 3 : PortB = &B00100000 Case 4 : PortB = &B00010000 Case 5 : PortB = &B00001000 Case 6 : PortB = &B00000100 Case 7 : PortB = &B00000010 Case 0 : PortB = &B00000000 End Select Return
От значения этой же переменной будет зависеть, будет ли записываться команда в память МК или нет.
Чтобы повысить нагрузочную способность модуля, я применил
микросхему ULN2004, она представляет собой сборку из 7 буферных элементов
способных коммутировать токи до 500 мА и напряжением до 50 В. Собственно говоря,
именно этим и обусловлен выбор максимального количества управляемых каналов. Подключается эта микросхема напрямую в выходам
микроконтроллера и имеет удобное расположении выводов: каждый выход находится
напротив входа, так что с разводкой мудрить не придется. Схема устройства: Зеленый светодиод кратковременно загорается при приеме
команды. В заначке у меня оказался сдвоенный светодиод – красный и зеленый в
одном корпусе с общим катодом, его я и применил в своем проекте. При разводке печатной платы я вывел выводы Tx и Rx микроконтроллера на контактные площадки (см. левый нижний угол), на случай если потребуется подключится к компьютеру: Ну и несколько фоток готового модуля: Обозначение выводов для подключения питания и нагрузки: Полный листинг программы, для желающих покопаться в коде, представлен ниже: $regfile = "2313def.dat" $crystal = 4000000 $baud = 9600 $lib "mcsbyte.lbx" 'подключаем библиотеку для оптимизации битовых операций Dim Address As Byte Dim Command As Byte Dim Flag As Byte 'команды хранящиеся в EEPROM Dim Ee1 As Eram Byte Dim Ee2 As Eram Byte Dim Ee3 As Eram Byte Dim Ee4 As Eram Byte Dim Ee5 As Eram Byte Dim Ee6 As Eram Byte Dim Ee7 As Eram Byte 'команды для сравнения с командами с пульта Dim Aa1 As Byte Dim Aa2 As Byte Dim Aa3 As Byte Dim Aa4 As Byte Dim Aa5 As Byte Dim Aa6 As Byte Dim Aa7 As Byte 'конфигурируем порт для подлкючения внешней нагрузки Config Portb = Output 'даем имена ногам предназначенным для подключения нагрузки St1 Alias Portb.7 St2 Alias Portb.6 St3 Alias Portb.5 St4 Alias Portb.4 St5 Alias Portb.3 St6 Alias Portb.2 St7 Alias Portb.1 'конфигурируем ноги для светодиодов индикации Config Portd.4 = Output Config Portd.5 = Output Red Alias Portd.4 'красный светодиод Green Alias Portd.5 'зеленый светодиод Config Rc5 = Pind.2 'конфигурируем ногу для подключения датчика On Int1 Button 'подключаем кнопку Config Int1 = Falling 'прерывание от кнопки срабатывает по нисходящему фронту Enable Interrupts 'разрешаем работу прерываний Enable Int1 'разрешаем внешнее прерывание 'вытаскиваем значения команд из энергонезависимой памяти и присваиваем рабочим переменным Aa1 = Ee1 Aa2 = Ee2 Aa3 = Ee3 Aa4 = Ee4 Aa5 = Ee5 Aa6 = Ee6 Aa7 = Ee7 Do Getrc5(address , Command) 'принимаем адресс и команду с пульта If Address >= 0 And Address < 32 Then 'работаем с любым пультом Green = 1 'зажгли зеленый светодиод Command = Command And &B01111111 If Flag = 0 Then Select Case Command 'если не стоит флаг записи выбираем какой порт переключить Case Aa1 : Toggle St1 Case Aa2 : Toggle St2 Case Aa3 : Toggle St3 Case Aa4 : Toggle St4 Case Aa5 : Toggle St5 Case Aa6 : Toggle St6 Case Aa7 : Toggle St7 End Select Else 'иначе, если стоит флаг записи, запишем команду в EEPROM Select Case Flag 'в зависимости от номера флага запишем команду в свою ячейку памяти Case 1 : Ee1 = Command 'записываем номер команды в EEPROM Case 2 : Ee2 = Command Case 3 : Ee3 = Command Case 4 : Ee4 = Command Case 5 : Ee5 = Command Case 6 : Ee6 = Command Case 7 : Ee7 = Command End Select Flag = 0 'сбрасываем флаг записи Red = 0 'гасим красный светодиод Aa1 = Ee1 'вытаскиваем все из энергонезависимой памяти Aa2 = Ee2 Aa3 = Ee3 Aa4 = Ee4 Aa5 = Ee5 Aa6 = Ee6 Aa7 = Ee7 End If Waitms 200 Green = 0 'гасим зеленый светодиод Wait 1 End If Loop 'прерывание по нажатию кнопки Button: Red = 1 'зажгли красный светодиод Incr Flag If Flag = 8 Then 'если нажали кнопку 8 раз Flag = 0 'записывать команды не будем Red = 0 'погасим светодиод End If Select Case Flag 'от значения переменной зависит на какой ноге будет 1 Case 1 : Portb = &B10000000 Case 2 : Portb = &B01000000 Case 3 : Portb = &B00100000 Case 4 : Portb = &B00010000 Case 5 : Portb = &B00001000 Case 6 : Portb = &B00000100 Case 7 : Portb = &B00000010 Case 0 : Portb = &B00000000 End Select Waitms 400 'избавляемся от дребезга кнопки Gifr = 128 'сбрасываем бит прерывания INT1 Return End
Скачать файлы к проекту | |
Просмотров: 70579 | Комментарии: 129
| Теги: |
Всего комментариев: 129 | 1 2 3 4 5 » | ||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||
1-30 31-60 61-90 91-120 121-129 | |||||||||||||||||||||||||||||
Проекты [46] |
Как подключить [32] |
Инструменты [3] |
Полезная информация [18] |
Объявления [3] |