Опрос


Что для Вас Умный Дом?


Результаты

Управление техникой по ИК каналу с помощью MegaD-2561

25/03/2017 13:25:15

Контроллер MegaD-2561 можно использовать для управления техникой по ИК каналу. Любой техникой, работающей по стандартным протоколам. Это не только телевизоры, плееры и другие бытовые приборы, но и, что наиболее важно, кондиционеры. По сути MegaD-2561 способен работать в роли Ethernet-ИК шлюза (Ethernet-IR gate), когда команды, отправляемые сервером, транслируются по сети Ethernet, кодируются контроллером и передаются по ИК-каналу. В этой статье я расскажу, как это работает.

В версиях прошивки до 4.16b6 функция "ИК" доступна только для порта P12 (разъем XP1 контроллера MegaD-2561).
Начиная с прошивки 4.16b6 функция "ИК" доступна для шести портов: P10, P12, P13, P25, P27, P28
Для удобства подключения можно использовать исполнительный модуль MegaD-14-IN. Для того, чтобы попробовать ИК-управление достаточно взять простейший ИК-диод стоимостью 3-5 рублей, подключив его через токоограничивающий резистор непосредственно к порту P12 без какого-либо дополнительного питания. Но в этом режиме максимальное расстояние от приемника до ИК-диода составит не более метра. Не слишком удобно, правда? Поэтому лучше использовать ИК-передатчик, который был разработан специально для подключения к модулям MegaD.


ИК передатчик для MegaD

ИК-передатчик представляет собой плату с клеммами XT1 и XT2.
Клеммы XT1 (синие) предназначены для подключения передатчика к контроллеру: +3,3В (питание), вход (например, порт P12) и земля.
Клеммы XT2 (зеленые) предназначены для подключения ИК-диодов. Всего можно подключить 3 диода.
Красный светодиод, смонтированный на плате, дублирует ИК-диод, поэтому, в том числе и в отладочных целях, можно в видимом диапазоне наблюдать работу передатчика.

Подключение нескольких ИК-диодов необходимо в следующих случаях:
1. Увеличение мощности сигнала. Два или три одинаковых ИК-диода значительно увеличивают дальность действия.
2. ИК диоды можно направить в разные стороны, когда ИК-передатчик смонтирован, например, на потолке, а необходимо управлять приборами, находящимися в разных углах помещения.
3. В отдельных случаях может потребоваться установка ИК-диодов с разной длиной волны.

Но даже с одним ИК-диодом импульсная мощность излучения такова, что сигнал легко преодолевает любые расстояния, с которыми приходится иметь дело дома или в небольшом офисе. Я смог протестировать работу ИК-передатчика с одним диодом для управления телевизором на расстоянии 11 метров. Определению же максимального расстояния помешали стены... Родной пульт со свежими батарейками, к слову, сдался уже на 7 метрах.

При подключении передатчика к модулю MegaD-14-IN, необходимо установить конфигурационный джампер порта в нижнее положение (как показано на фото).
Настройка порта, к которому подключен датчик, должна быть выполнена следующим образом: тип порта - OUT, режим - PWM.


Важно! Настройку порта необходимо выполнить ДО подключения ИК-передатчика. Схемохеника передатчика предполагает передачу ИК сигналов короткими импульсами высокой мощности. Поэтому никогда не устанавливайте значение PWM вручную и не включайте порт в режиме SW. Это может привести к выходу ИК-диода из строя!
Но даже если это произойдет, применение клемм для монтажа диодов позволяет легко заменить вышедший из строя ИК-диод.


Передача ИК-команд

Передача команд контроллеру выглядит следующим образом (пример):

http://192.168.0.14/sec/?pt=12&ir=BFFBFEFF7776&irp0=3450&irp1=1740&irp2=400&irp3=470&irp4=1300

На первый взгляд, выглядит страшно, но на самом деле все не так уж и сложно.
ИК протоколы достаточно незамысловатые. Работают они как правило так:
Сначала посылается длинный импульс, после которого идет длинная пауза (приемник понимает, что сейчас начнется передача данных).
Далее посылаются биты данных. 0 от 1 отличается только паузой.
Пример: Светодиод моргнул, пауза 400 микросекунд - это "1". Светодиод моргнул, пауза 1300 микросекунд - это ноль.
Все эти задержки индивидуальны не только для разных марок техники, но и для разных моделей одной марки.
А теперь несколько слов о передаваемых параметрах:

irp0 - длительность первого импульса для инициализации
irp1 - длительность паузы после первого импульса
irp2 - длительность свечения диода, после которого пойдет пауза, определяющая 0 или 1
irp3 - длительность паузы для 1
irp4 - длительность паузы для 0
irp5 - количество повторов посылки (часто используется для управления кондиционерами)

Параметр ir - это, собственно, сама команда.
А еще проще и понятнее станет, если зайти на сайт lirc в базу, где собрана вся информация по протоколам (паузам, длительностям) различных пультов.
http://lirc-remotes.sourceforge.net/remotes-table.html

Показанная в примере выше по тексту команда - переключение канала в старом телевизоре Panasonic.

 

Считывание команд с имеющихся пультов

Но что, если в базе данных lirc нет информации о конкретном оборудовании? Что делать в этом случае?

В этом случае можно воспользоваться программой LIRC (для пользователей Linux) или WinLIRC (для пользователей Windows) и любым ИК-приемником, поддерживаемым LIRC. Это могут быть простейшие приемники для USB (о них ниже) или COM-порта. Для эксперимента был собран простой Serial Port Reciever. Приемник необходим для того, чтобы "считать" команды с родного пульта.

Установка и использование lirc или как я считывал команду с пульта кондиционера General Climate

apt-get install lirc
setserial /dev/ttyS0 uart none
modprobe lirc_serial
lircd
mode2 -d /dev/lirc0

Теперь, если нажать кнопку включения на пульте кондиционера, направив его на приемник, подключенный к компьютеру, мы увидим следующую картину.

pinguine@srv:~# mode2 -d /dev/lirc0
space 4255920
pulse 4375
space 4379
pulse 529
space 1638
pulse 534
space 555
pulse 528
space 1639
pulse 533
space 1637
pulse 533
space 555
pulse 531
space 555
pulse 533
... (и так далее)

Программа mode фиксирует все, что происходит в ИК-канале: длительность вспышек ИК-диода и длительность пауз между вспышками.
Для преобразования этой информации в команду для контроллера MegaD-2561 я написал простенький скрипт ir-decode.php
Если "скормить" ему вывод программы mode2, то мы получим приблизительно такой результат:

Init pulse: 4426
Init space: 4306
01001101[4d]10110010[b2]01100000[60]10011111[9f]01000011[43]10111100[bc]
block 0
total bits: 48
ir: 4db2609f43bc
avr pulse: 516
avr space1: 573
avr space0: 1653
url: ir=4db2609f43bc&irp0=4426&irp1=4306&irp2=516&irp3=573&irp4=1653
Init pulse: 4449
Init space: 4280
01001101[4d]10110010[b2]01100000[60]10011111[9f]01000011[43]10111100[bc]
block 1
total bits: 48
ir: 4db2609f43bc
avr pulse: 513
avr space1: 575
avr space0: 1654
url: ir=4db2609f43bc&irp0=4449&irp1=4280&irp2=513&irp3=575&irp4=1654
URL (irp5): ir=4db2609f43bc&irp0=4449&irp1=4280&irp2=513&irp3=575&irp4=1654&irp5=2

Здесь мы видим, что пульт кондиционера использует стандартный протокол, как и старый телевизор Panasonic, но единственная разница заключается в том, что пульт дублирует команду два раза. Вот, для чего необходим параметр irp5. С помощью этого параметра задается сколько раз необходимо повторить посылку.

В результате команда включения кондиционера через MegaD-2561 будет выглядеть так:

http://192.168.0.14/sec/?pt=12&ir=4db2609f43bc&irp0=4449&irp1=4280&irp2=513&irp3=575&irp4=1654&irp5=2

Точно также можно считать любые другие команды с пульта и определить, какие конкретно байты ответственны за изменение температуры, режима, скорости вентилятора.

Несколько слов об используемых мною ИК-диодах. В целом подойдут любые. Я использовал у себя самые дешевые диоды, купленные в ближайшем магазине: GNL-5013IRAB-1, FYL-5013IRAB. Работают отлично.

 

USB-приемник для считывания команд

Стоит сказать, что в современном мире не каждый сможет, а если даже и сможет, то вряд ли захочет собирать свой собственный ИК-приемник. Возникает вопрос - нет ли чего-то готового? К сожалению для нас и к счастью для конечных пользователей технология передачи данных по ИК в компьютерном мире быстро уступила место более современным радио-технологиям, таким как Bluetooth, Wi-Fi и прочим, а потому найти приемник с интерфейсом USB не так-то просто. Мало того, большинство даже имеющихся ИК-приемников невозможно использовать с программой lirc. Либо элементарно поддержка не реализована в lirc, либо само устройство является HID-девайсом, которое прикидывается клавиатурой, мышью и считать RAW-данные с помощью приемника с произвольного пульта попросту нельзя. Я потратил немало сил, чтобы найти приемник (доступен в разделе "купить"), который без костылей поддерживается lirc'ом из коробки.

Такой приемник определяется в Linux следующим образом.

Oct 30 12:23:09 srv kernel: [1180578.424014] usb 3-1: new full-speed USB device number 2 using uhci_hcd
Oct 30 12:23:09 srv kernel: [1180578.624034] usb 3-1: New USB device found, idVendor=1784, idProduct=0011
Oct 30 12:23:09 srv kernel: [1180578.624039] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Oct 30 12:23:09 srv kernel: [1180578.624043] usb 3-1: Product: eHome Infrared Transceiver
Oct 30 12:23:09 srv kernel: [1180578.624046] usb 3-1: Manufacturer: Topseed Technology Corp.
Oct 30 12:23:09 srv kernel: [1180578.624049] usb 3-1: SerialNumber: EID0137AG-8-0000048418
Oct 30 12:23:09 srv kernel: [1180578.716013] Registered IR keymap rc-rc6-mce
Oct 30 12:23:09 srv kernel: [1180578.729339] lirc_dev: IR Remote Control driver registered, major 251
Oct 30 12:23:09 srv kernel: [1180578.730037] rc rc0: lirc_dev: driver ir-lirc-codec (mceusb) registered at minor = 0
Oct 30 12:23:09 srv kernel: [1180578.730041] IR LIRC bridge handler initialized
Oct 30 12:23:09 srv kernel: [1180578.731015] input: MCE IR Keyboard/Mouse (mceusb) as /devices/virtual/input/input13
Oct 30 12:23:09 srv kernel: [1180578.732713] IR MCE Keyboard/mouse protocol handler initialized
Oct 30 12:23:09 srv kernel: [1180578.864032] mceusb 3-1:1.0: Registered Topseed Technology Corp. eHome Infrared Transceiver with mce emulator interface version 2
Oct 30 12:23:09 srv kernel: [1180578.864037] mceusb 3-1:1.0: 2 tx ports (0x0 cabled) and 2 rx sensors (0x1 active)
Oct 30 12:23:09 srv kernel: [1180578.864075] usbcore: registered new interface driver mceusb

Сразу после подключения к порту USB в системе появляется устройство /dev/lirc0, и запустив программу mode2 из пакета lirc

mode2 -d /dev/lirc0

мы можем считывать команды с имеющихся у нас пультов.

 

 

Автор: Andrey_B
Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.



Добавить комментарий:



Сортировка комментариев: Последние сверху | Первые сверху

2017-11-19 11:53:54 | Oleg
Андрей, стоило бы в Ваш скрипт добавить что-то типа этого
$count_values_arr = array_count_values($data_hex_a);
$data_hex = array_filter($count_values_arr, function ($elem) { return($elem > 1); });
$data_hex = $data_hex[0];
Т.к. чаще всего последняя ir пустая исходя из практики.


2017-09-16 10:39:46 | Andrey_B
Игорь, выложил на форуме прошивку с поддержкой подключения ИК-передатчика к 3 портам: P10, P12, P13.


2017-09-15 22:15:39 | Игорь
Для меня реализация ИК на других портах была бы очень полезной: нужно управлять 7 блоками кондиционеров (тоже планировал выкручиваться через 1-2 шим-ик порта с выбором конкретного ик-передатчика подачей на него питания), но еще мне нужны ик-порты для управления сервоприводами спуска унитазов ;) где возможные задержки одновременног использовпния одного ик-порта нежелательны...


2017-09-15 16:39:35 | Andrey_B
Vadim, есть только нюанс. ШИМ порты распределены по разъемам XP1/XP2.
На XP1 - 4 порта, на XP2 - 3 порта. То есть, чтобы задействовать все 7 каналов, нужно два модуля MegaD-14-IN. Ну или подключать непосредственно к 34-контактному разъему.


2017-09-15 13:43:01 | Vadim
Андрей,
"Но также возможно реализовать поддержку подключения ИК-передатчика к другим ШИМ-портам, а их в контроллере всего доступно 7."
Если увеличите количество портов для 14-IN для возможности подключения IR-передатчиков, будет замечательно (можно все 7).
Спасибо.


2017-09-15 11:13:24 | Andrey_B
Vadim, конечно, можно коммутировать питание. Это должно работать. Но также возможно реализовать поддержку подключения ИК-передатчика к другим ШИМ-портам, а их в контроллере всего доступно 7.


2017-09-14 16:09:15 | Vadim
Андрей,
1.Можно ли параллельно подключить несколько ИК-передатчиков к 12 порту 14-IN, выбор передатчика (через какойкакие слать комманду) производить через подачу на негоних напряжения +3,3В (питание)?
Задача управлять 5 кондиционерами. 5 отдельных блоков 14-IN - не очень бюджетное решение.
2. Есть ли ограничения на удаленность ИК-Передатчика от контроллера?
Образно, на витой паре ~20-30м предположительно работать будет?
Спасибо.


2017-05-24 16:56:28 | Andrey_B
mp0wer, в текущий момент размер буфера 32 байта, но его теоретически можно увеличить. Кстати, как описано в статье, в моем кондиционере команда повторяется два раза, поэтому общая длина пакета вдвое меньше, а для дублирования используется параметр irp5.


2017-05-24 16:12:50 | mp0wer
Есть задача - управлять кондиционером хитачи - длина пакета там 595 бит. Исследовал пакеты других брэндов - panasonic 439 бит, mitsubishi - 583. Так что увеличение размера буфера, я думаю, актуально.


2017-05-24 15:35:32 | mp0wer
Какой максимальной длины можно отправить ИК пакет в Mega2561? В Mega328 я так понял это 259 бит - для управления кондиционерами мало.


2017-05-21 08:49:33 | captain
Было бы интересно использовать это совместно с IK приемником чтобы можно было отдавать комманды с обычного пульта управления.


2017-04-07 08:16:58 | Евгений
Андрей, могли бы вы посоветовать какой-нибудь уже готовый LIRC ИК-приемник для считывания команд, который доступен на рынке?


2017-03-30 20:23:47 | Ivan
Андрей, огромное вам спасибо! Давно хотел реализовать эту функцию, а теперь это можно воплотить с мегой! Отличная новость!