Главная » Статьи » Проекты

Протокол RC5. Модуль дистанционного управления.

  Если встает вопрос дистанционно управлять каким-нибудь девайсом, например ламповым усилителем, сразу видится два решения: применить радиоканал, использовав 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 микроконтроллера на контактные площадки (см. левый нижний угол), на случай если потребуется подключится к компьютеру: 

печатная плата RC5

 
Ну и несколько фоток готового модуля:






Обозначение выводов для подключения питания и нагрузки:


 

Полный листинг программы, для желающих покопаться в коде, представлен ниже:


$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



А вот так выглядит работа устройства, на выходы повесил светодиоды (мое видео похерилось, но спасибо комраду LEX за который собрал сей девайс и записал видео):




Скачать файлы к проекту

Категория: Проекты | Добавлено: 11.06.2011
Просмотров: 70579 | Комментарии: 129 | Теги: TSOP, модуль, RC5, ATtiny2313 | Рейтинг: 4.9/31
Всего комментариев: 1291 2 3 4 5 »
0  
129 exersizze   (12.04.2016 20:38) [Материал]
zur, фьюзы настраиваются на 4 МГц внутреннего генератора, как это в дудке будет подсказать не смогу. Гляньте здесь http://payalo.at.ua/c_fuse/calc.html?part=ATtiny2313

128 zur   (12.04.2016 09:56) [Материал]
доброго времени суток...
если можно переделат программу так что при нажатии кнопки на пулте загрелос светодиод и еше при нажатии погас тригернии режим... можно еше добавит один канал всего нужно восем каналов тригерном режиме... не смог наидти фюзы конфигурации... програмирую аврдуде.... заранее благодарен...

+1   Спам
127 GSV   (28.08.2014 19:22) [Материал]
"Отличная схема. Ещё бы пульт к ней тоже на tiny2313."
В хелпе Bascom по запросу RC5SEND почти готовый пульт именно на tiny2313.

126 VoronovMaksim   (28.08.2014 08:39) [Материал]
Отличная схема. Ещё бы пульт к ней тоже на tiny2313.

125 Sp1ker   (29.07.2014 19:00) [Материал]
Ув. vakulyuk поделитесь пожалуйста схемой и программой пульта, буду очень признателен

124 lionp   (25.05.2014 18:20) [Материал]
А что нужно подшаманить в коде чтоб добавить функцию "включить всё" и "выключить всё"?

123 AlekseyV   (04.05.2014 22:45) [Материал]
Все работает, спасибо!

122 KABANiz90   (29.03.2014 14:32) [Материал]
Конечно правильней
для AT90S2313 это "2313def.dat"
для Аttiny2313 это "attiny2313.dat"
Эти файлы нужны для данных компилятору.
Внешняя оболочка не различает прошивки между двумя ими
(ATMEL гарантировал совместимость кода, кроме фузов),
а своя собственная Bascom AVR вполне возможно:
мой программатор не поддерживает Bascom AVR не могу попробывать
на SinaProg не возникало проблем разницей между двумя .dat.
125 vakulyuk смело замените на "attiny2313.dat".
Вот разница между "attiny2313.dat" и "attiny2313а.dat" хотелось узнать.

121 sany2   (29.03.2014 07:40) [Материал]
AT90S2313 -это старый контролёр.Аttiny2313 -прямой потомок

120 KABANiz90   (28.03.2014 18:59) [Материал]
Из 6 пультов которые у меня сейчас под рукой
5 работают, лишь один не работает от телевизора Горизонт (протокол RC5)
Причём довольно популярны
от приставки для интернетивного телевидения "Промсвязь" аналог ZTE (довольно популярен в Белоруссии как телевидения ZALA)
-СТВ тюнер Humax
-немецкий муз. центр Soundmaster
-DVD JVC
-пульт от китайского автомобильного модулятора под Флешку.
Причём последний сейчас чуть не у каждого автомобиля,
я уверен мог пополнить список

119 KABANiz90   (28.03.2014 11:09) [Материал]
Код NEC
Не нашёл куда вложить на сайте
Вчера проверил код на макетке всё работает
если не получается пиши я постараюсь ответить
chernyak.valery@gmail.com

118 alex182   (28.03.2014 09:46) [Материал]
KABANiz90 Выкладывай сюда прошивку. Чтоб не лазить по файлообменникам.

+1   Спам
117 KABANiz90   (24.03.2014 16:46) [Материал]
По просьбе множество радиолюбителей дам код пультов NEC
не изменяя схему
готовый код можно скачать
http://yadi.sk/d/YKQEqmSDL87UZ
или
http://my-files.ru/s2421v
только не забудьте изменить фузы
тактовую частоту выставить на 8 МГц
отключить предварительный делитель на 8
остальное всё по умолчанию.
Для SinaProg есть фото
Можно было сделать универсальный для обоих пультов (совмещать коды),
но ATtiny2313 не хватит памяти на Меги8 пробывал причём задействовал третий таймер (новые версии Васика стали поддерживать).
Точную копию автора не повторял больше сторонник Мег, но уверен код рабочий.

116 exersizze   (24.03.2014 14:08) [Материал]
Привет, по поводу частоты тсопа. Она не зависит от частоты микроконтроллера, это несущая частота между приемником (наш tsop) и передатчиком (пульт управления).
По поводу протокола nec, есть проекты на bascom'e http://bascomavr.3bb.ru/viewtopic.php?id=573

115 LIA060   (26.01.2014 22:27) [Материал]
Может порт на ввод не настроен? TSOP до нуля просаживает.

+1   Спам
114 sany2   (26.01.2014 08:54) [Материал]
А... вы по просадку на выходе.В своё время,когда не было осцилографа подключал наушники на выход - тоже неплохо проверяется

113 exersizze   (25.01.2014 20:59) [Материал]
>>Мерял как всегда тестером 
В этом то все и дело, сигналы быстродействующие, простой вольтметр слишком инертный чтобы быстро реагировать на просадку напряжения. Нужно смотреть осциллографом или лог.анализатором.

112 sany2   (23.01.2014 23:40) [Материал]
Всегда подключал TSOP через резистор на 100 ом на VCC,ну и кондер 100 мк.Вроде никогда не было проблем...Может просто питания не хватает - просадить питание на полвольта это тоже надо постараться-максимальное потребление тока TSOP 5мА

111 alexey81537   (23.01.2014 21:04) [Материал]
Мерял как всегда тестером. И по прерыванию вывод на LCD. И тишина.

110 exersizze   (20.01.2014 23:18) [Материал]
а чем смотрели сигнал с TSOP'a ?

109 alexey81537   (20.01.2014 22:25) [Материал]
Хочу считывать сигнал от любого пульта. Для этого пытаюсь сделать что-то типа как писал KABANiz90 в п. 108. Но столкнулся с тем, что при получении посылки tsop31236 просаживает напругу на 0,5в. Естественно никаких прерываний не происходит. Хотя все пишут, что tsop просаживает напругу практически до 0. Что подскажете?
P.S. По данной в статье схеме все работает супер, хотя напруга тоже просаживается на 0,5в.

+1   Спам
108 KABANiz90   (17.12.2013 12:39) [Материал]
Я больше предпочитаю пульты с протоколом NEC.
Кучу пультов подбирал и даже пульт китайского авто-модулятора использовал для включения уличного освещения возле гаража.
Если кому надо могу написать код по протоколу NEC не меняя схемы
для этого заменю библиотеку "mcsbyte.lbx" на дополнительный код
(датчик на прерывание INT0 и таймер Timer0 для подсчёта длительности импульсов)
и изменю частоту на 8 МГц и всё.
Кстате о протоколе RC5
библиотека "mcsbyte.lbx" в второй версии БАРСИКА на железе у меня не работала, менял на библиотеку на mcsbyteint.LBX
Спасибо автору за идею.

107 KABANiz90   (17.12.2013 11:26) [Материал]
Устаревшие пульты с времён телевизоров Горизонт и Витязь
И всё же идея интересная.
Спасибо автору за тему.

106 Sp1ker   (24.11.2013 13:30) [Материал]
Я удалял строку waitms 200, и менял значения waitms от 0 до 2000, теперь работает как единичное нажатие (двигатель срабатывает но на долю секунды) В чем же там дело может быть?

105 exersizze   (22.11.2013 14:15) [Материал]
Так исходники все есть: выше в статье с фиксацией, где-то здесь в комментах давал ссылку на код без фиксации (вот оно). Дальше все в ваших руках, разбирайтесь.

104 Sp1ker   (21.11.2013 22:18) [Материал]
Спасибо, а можно исхосдник, или код нефиксирующей кнопки я его в прошивку из статьи вставлю

103 exersizze   (21.11.2013 20:59) [Материал]
Надо убрать задержку в  программе (строку waitms 200)
она как раз и вводит задержку и опрос происходит с частотой 5 Гц smile

102 Sp1ker   (21.11.2013 20:46) [Материал]
Я сделал робота: этот IR приемник управляет драйвером L293D, который управляет 2 моторами...
В приемник закинул прошивку 4 фикс, 4 не фиксированные кнопки, которую вы давали для igumich
Все работает, но сигнал на моторы (на не фикс. кнопках) подается с частотой герц 5 наверно, так же светодиод мигает при приеме и робот едет со скоростью 1мм в час )))
Как можно исправить? Я в програмировании не силен

101 exersizze   (07.11.2013 00:39) [Материал]
Нет, я шел по пути наименьшего сопротивления - работа с RC5 в Bascom очень простое занятие, вот и использовал готовое решение для своей задачи. Сейчас уже ушел от этого, поэтому не интересно продолжение.
Как вариант можно сделать свой пульт, работающий также по RC5.

100 GSV   (06.11.2013 15:58) [Материал]
А не было ли желания сварганить ик приемник,который принимает всю посылку с пульта целиком и заносит ее в память? Ведь так можно принять посылку от пультов нескольких наиболее распространенных протоколов,например NEC,которыми забиты ебей и алиэкспресс,или JVC и не разбирать ее на адреса и команды.Записать и при нажатии той же клавиши вытащить из памяти и управлять портом.В общем все как в вашем устройстве.Порылся тут в загашниках и не обнаружил ни одного пульта RC5...Вот такая неприятность.А похожие устройства,которые работают с NEC я видел здесь:
http://bezkz.su/publ/shemy/vyklyuchateli-pereklyuchateliik-f/300113-41-1-0-113.html
и здесь:
http://www.getchip.net/posts/076-upravlenie-nagruzkami-pri-pomoshhi-ir-pulta-attiny13/ вот только написано все не на Bascom.А такой приемник на 4-6,или больше команд наверняка многим бы пригодился.

1-30 31-60 61-90 91-120 121-129
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]






авторизация