Инструкция по работе с ИК-приёмопередатчиком в устройствах WB-MSW, WB-MIR
Назначение
Инфракрасный приёмопередатчик, установленный в устройствах WB-MSW модификации I и WB-MIR, предназначен для записи сигналов с ИК-пультов ДУ бытовых устройств и дальнейшего управления бытовой техникой: кондиционерами, телевизорами и т.д. Модули WB-MIR v.2 (WB-MIR v.3) и WB-MSW v.3 (WB-MSW v.4) поддерживают около 80 ИК-команд (зависит от объема занимаемой в памяти).
Внимание! Все модули, кроме WB-MSW v.3 (WB-MSW v.4), обеспечивают управление только с небольшого расстояния (< 1 метра).
Принцип работы
Описание
С помощью модуля вы можете управлять любой техникой, которая принимает команды по ИК. Модуль записывает в свою память команды пульта дистанционного управления и потом воспроизводит их. Перед записью необходимо выяснить, передаёт ли пульт одиночные команды для каждой нажатой клавиши (как в телевизорах) или целые режимы (несколько команд, как в климатической технике).
Управление телевизором
Обычно пульт телевизора работает в одиночном режиме — передаёт на устройство код нажатой клавиши. Поэтому, достаточно записать сигналы используемых кнопок пульта и вы сможете полностью управлять устройством. Для записи сигнала в модуль направьте пульт на ИК-приёмник и нажмите нужную кнопку на пульте.
В итоге в памяти модуля сохранится набор команд, соответствующих клавишам на пульте ДУ:
- Включить / выключить
- Прибавить громкость
- Убавить громкость
- Переключить канал вперёд
- Переключить канал назад
- Нажата кнопка 1
Но можно записывать и небольшие режимы, например, включить 13-ю программу.
Управление климатической техникой
Обычно пульт климатической техники передаёт на устройство набор команд, соответствующий выбранному на пульте режиму. При этом состояние устройства (включено или выключено) может передаваться отдельно.
Например, чтобы управлять кондиционером, нужно сначала выставить нужный режим на пульте, а потом записать его в модуль. Для записи сигнала в модуль направьте пульт на ИК-приёмник и измените один из параметров, например, температуру.
В итоге получится в памяти модуля набор готовых режимов:
- Выключен
- Включён, вентилятор на максимальную скорость, охлаждаем до 22 °C
- вентилятор на максимальную скорость, охлаждаем до 20 °C
- вентилятор на малую скорость, охлаждаем до 20 °C
- вентилятор на среднюю скорость, нагреваем до 27 °C
Подробнее о записи и воспроизведении сигналов читайте в разделах Запись и воспроизведение ИК-команд в веб-интерфейсе и Управление модулем по Modbus.
При записи команды расходуется ресурс ROM, каждую ячейку можно перезаписать не более 1000 раз.
Запись и воспроизведение ИК-команд в веб-интерфейсе
Для записи и воспроизведения ИК-команд необходимо перейти к виджету устройства, в разделе Devices.
Запись команд
MSW (MIR)
- Для записи переключатель Learn to ROMx (Command x recording) перевести в положение ON.
- Направьте пульт ДУ на ИК-приёмник устройства и нажмите коротко один раз кнопку на пульте. Записывать сигнал производить с близкого расстояния. При ошибках записи отключить устройства, которые могут вносить помехи: лампы дневного света, дисплеи телефонов, компьютерные мониторы и телевизоры.
- Для окончания записи переключатель Learn to ROMx (Command x recording) перевести в положение OFF.
Воспроизведение команд
MSW (MIR)
- Для воспроизведения нажать на кнопку Play from ROMx (Play command x).
Для правильной работы внешний ИК-передатчик WB-MIR должен быть размещен на ИК-приёмнике управляемого устройства.
Если в вашем веб-интерфейсе отсутствуют некоторые кнопки или переключатели, включите их в настройках устройства в разделе IR Commands.
Про настройку ИК-команд через консоль читайте в разделах Постоянный режим и Оперативный режим.
Способ представления и хранения сигнала
Сигнал хранится в памяти устройства виде последовательности натуральных чисел (каждое от 0 до 65535), где каждое число - продолжительность логического 0 или 1 в сигнале в квантах по 10 микросекунд. Следовательно, максимальная продолжительность каждого нуля или единицы должна быть не более 65535 * 10 мкс = 655350 мкс = 0,655 секунд
. Первое число последовательности — длительность первой логической единицы. Конец последовательности маркируется двумя периодами продолжительностью 0.
Начиная с версии прошивки 4.22.0 последовательности команд сжимаются по специальному алгоритму, чтобы обеспечить более высокую плотность хранения. Перед воспроизведением последовательности разархивируются. Максимальная длина команды увеличена до 1000 символов (2000 байт). Сжатие данных использует "словарь": длительности сигнала, которые близки друг к другу, заносятся в словарь как один элемент. Команда хранит индексы на элементы словаря. Максимальная длина словаря - 64 слова, то есть в ROM не получится записать произвольные данные. Также следует учитывать, что при редактировании банка команд записанные данные после сохранения в ROM будут сжаты и будут отличаться от оригинала при чтении из банка. При этом остается возможность записывать и воспроизводить произвольные данные из RAM - там алгоритм сжатия не применяется.
Управление модулем по Modbus
Внимание! Номера используемых Modbus регистров менялись, начиная с версии прошивки 3.2.0. В инструкции указаны новые номера регистров. Если вы пользуетесь устройством со старой прошивкой, общий принцип остаётся прежним, но номера регистров сдвигаются. Полное описание регистров ИК-устройств в разделе Карта регистров.
Обмен данными
На физическом уровне модуль подключается через интерфейс RS-485. Для управления модулем используется протокол Modbus RTU. В устройствах Wirenboard данные Modbus передаются по линиям связи RS-485. Подробнее смотрите страницу Протокол Modbus. Modbus-адрес модуля задается на заводе и нанесен на наклейке на его боковой стороне. Адрес может быть изменен программно.
В устройствах с версией прошивки 3.1.0 и позднее также можно изменить настройки параметров обмена данными — смотрите таблицу регистров Modbus.
Управление ИК-приёмопередатчиком производится через регистры флагов Modbus; полный список можно найти в описании карты регистров. Есть 3 типа операций с сигналами:
- запись сигнала в память с пульта ДУ,
- воспроизведение сигнала из памяти,
- редактирование сигнала в памяти.
В каждый момент времени можно выполнять только одну операцию только над одним сигналом. Так как во время выполнения любой операции в один из регистров флагов ставится 1, а после завершения операции туда же ставится 0, в каждый момент времени среди всех регистров флагов, относящихся к ИК-приёмопередатчику, только один регистр может быть установлен в единицу. Попытка записи 1 в регистры флагов, связанных с ИК, при уже имеющейся единице приведёт к ошибке BUSY
.
При записи в ROM ИК-команды сохраняются в памяти устройства и доступны после перезагрузки по питанию. Каждая команда хранится в отдельном "банке" памяти. Количество банков памяти зависит отпрошивки устройства. До прошивки 3.7.2 включительно устройства имели 7 банков памяти ИК-команд. Начиная с версии 4.4.0 поддерживается 32 банка. Промежуточные версии позволяли записывать до 80 команд, но в ряде случаев делали это некорректно. Начиная с версии прошивки 4.22.0 снова поддерживается до 80 команд.
Запись сигнала в постоянную память с пульта ДУ
Чтобы записать сигнал под номером i
с пульта ДУ в память, запишите 1 в регистр флагов по адресу 5300 + i
. Затем направьте пульт ДУ на ИК-приёмник и нажмите коротко один раз кнопку на пульте. Сразу после этого, завершите запись сигнала, записав 0 в регистр флагов по адресу 5300 + i
.
#Начинаем запись сигнала с номером 1. Устройство подключено к порту /dev/ttyRS485-1 и имеет Modbus-адрес 16
root@wirenboard:~# modbus_client --debug -mrtu -b9600 -s2 -pnone /dev/ttyRS485-1 -a16 -t5 -r5301 1
#Направляем пульт на окно приемника и нажимаем кнопку на пульте ДУ
root@wirenboard:~# modbus_client --debug -mrtu -b9600 -s2 -pnone /dev/ttyRS485-1 -a16 -t5 -r5301 0
#Завершаем запись сигнала с номером 1
Воспроизведение сигнала из постоянной памяти
Чтобы воспроизвести сигнал под номером i
из памяти, запишите 1 в регистр флага по адресу 5100 + i
. Пока идёт воспроизведение сигнала, регистр флага по адресу 5100 + i
будет установлен в 1, а затем сам установится в 0. Пока идёт воспроизведение сигнала, никакие другие операции с ИК-приёмопередатчиком по Modbus не будут доступны.
#Отдаём команду воспроизвести сигнал с номером 1. Устройство подключено к порту /dev/ttyRS485-1 и имеет Modbus-адрес 16
root@wirenboard:~# modbus_client --debug -mrtu -b9600 -s2 -pnone /dev/ttyRS485-1 -a16 -t5 -r5101 1
Редактирование сигнала в постоянной памяти
Чтобы отредактировать сигнал под номером i
или записать его по Modbus (без пульта ДУ), запишите 1 в регистр флага по адресу 5200 + i
. После этого сигнал в виде последовательности натуральных чисел (смотрите рисунок "Пример содержимого оперативного буфера WB-MIR") будет записан в подряд идущие регистры хранения, начиная с регистра 2000
. В конце последовательности будут два подряд идущих регистра хранения, содержащих 0. Если сигнал под номером i
не был записан ранее, в регистрах хранения 2000
и 2001
будут находиться 0. Для внесения изменений в последовательность (в том числе для записи команды по Modbus) нужно записать правильную последовательность в данные регистры хранения с помощью команд WRITE_SINGLE_REGISTER
и WRITE_MULTI_REGISTERS
. В конце изменённой последовательности всё также должен быть маркер конца последовательности - два подряд идущих регистра хранения, содержащих 0. Чтобы удалить сигнал, запишите в первые два регистра хранения (2000
и 2001
) 0. После окончания редактирования запишите 0 в регистр флагов по адресу 5200 + i
. До тех пор пока в регистре флагов по адресу 5200 + i
не будет стоять 0, никакие другие операции, в том числе и над другими сигналами, не будут доступны.
Удаление всех сигналов из постоянной памяти
Чтобы удалить все записанные сигналы, запишите 1 в регистр флагов по адресу 5000
.
Особенности при работе из Codesys
Читайте статью Работа с ИК-командами в Codesys.
Работа с сигналами через holding регистры
Начиная с версии прошивки 4.18.0 доступны holding регистры для работы с сигналами:
- 5500 — воспроизведение
- 5501 — редактирование
- 5502 — запись
Регистры доступны как для чтения, так и для записи. Изначально в регистрах записан 0, что говорит о готовности к работе.
Для воспроизведения сигнала с номером i
в регистр 5500 нужно записать число i + 1
. Пока идет воспроизведение, при чтении регистра будет возвращаться номер воспроизводимого сигнала. После окончания воспроизведения регистр будет сброшен в 0. Если запрошенного сигнала не существует — в регистр будет записан код ошибки 0xFFFF
.
Редактирование и запись сигналов производятся аналогичным образом. Для того, чтобы завершить редактирование (запись) сигнала, в регистр нужно записать 0 или номер следующего сигнала для редактирования (записи).
Запись сигнала в оперативную память с пульта ДУ
Чтобы записать сигнал (только один) с пульта в RAM, не помещая при этом в ROM - запишите 1 в регистр флага по адресу 5001
. Далее действия происходят так же, как описано выше для записи сигнала в ROM. После прекращения записи в регистрах хранения по адресу 2000
и дальше будет храниться сигнал в виде последовательности чисел. Эту последовательность можно редактировать, как описано выше. Внимание: содержимое этих регистров хранения не сохраняется при отключении питания устройства!
Воспроизведение сигнала из оперативной памяти
Чтобы воспроизвести сигнал из RAM, запишите 1 в регистр флага по адресу 5002
. Будет воспроизведён сигнал, записанный в регистрах хранения, начиная с 2000
. Пока идёт воспроизведение сигнала, регистр флага по адресу 5002
будет установлен в 1, а затем сам установится в 0. Пока идёт воспроизведение сигнала, никакие другие операции с ИК-приёмопередатчиком по Modbus не будут доступны.
При отключении питания сигнал в RAM не сохраняется.
Удаление всех сигналов из постоянной памяти
Чтобы удалить все записанные сигналы, запишите 1 в регистр флагов по адресу 5000
.
Чтение/запись банков команд
Пользователь pivcheg написал скрипты чтения и записи IR-команд, которые опубликовал на портале поддержки.
Мы немного поправили им имена и опубликовали в архиве: ir_backup.tgz
Подготовка
Содержимое архива:
- read_roms.pl — скрипт сохранения ИК-команд в файлы
- write_roms.pl — скрипт записи ИК-команд из файлов в регистры датчика
- compare_bufs.pl, getbuffer.pl, putbuffer.pl — вспомогательные скрипты, запускаются автоматически.
Перед тем, как приступить к чтению и записи команд:
- Зайдите в консоль контроллера по SSH.
- Перейдите в папку
/home
- Загрузите скрипт на контроллер и распакуйте его:
# wget -qO- https://wirenboard.com/wiki/images/1/19/Ir_backup.tgz | tar -xvz -C ./ ir_backup/ ir_backup/getbuffer.pl ir_backup/write_roms.pl ir_backup/putbuffer.pl ir_backup/read_roms.pl ir_backup/readme.txt ir_backup/compare_bufs.pl
- Перейдите в папку с распакованными файлами:
cd ir_backup
Настройки скриптов read_roms.pl и write_roms.pl:
- Скрипт читает/записывает только первые пять банков памяти: 0 — 4, если вам нужно считать/записать больше банков, то измените в скрипте значения
0..4
. - Скорость подключения и serial-порту можно указать в строке
modbus_client…
.
Чтение команд в файлы
Для чтения ИК-команд используется скрипт read_roms.pl
.
Формат запуска скрипта:
./read_roms.pl directory modbus-address
Пример, в котором ИК-команды из устройства с адресом 22
сохраняются в папку ./roms
:
# ./read_roms.pl ./roms 22
Stoping wb-mqtt-serial
->1<-->2<-->3<-->4<-->5<-
Starting wb-mqtt-serial
Запись команд из файлов
Для записи ИК-команд используется скрипт write_roms.pl
.
Формат запуска скрипта:
./write_roms.pl directory modbus-address
Пример, в котором ИК-команды из папки ./roms
записываются в устройство с адресом 22
:
# ./write_roms.pl ./roms/ 22
Stoping wb-mqtt-serial
->1<-->2<-->3<-->4<-->5<-
Starting wb-mqtt-serial
Карта регистров
Начальный адрес | Тип | Количество | Назначение | В модификациях |
---|---|---|---|---|
5000 | coil | 1 | Очистка всех банков ИК-команд | I |
5001 | coil | 1 | Запись ИК-команды с ИК-приёмника в Modbus регистры хранения (2000-2509 до версии 4.22.0 и 2000-3001 после) (RAM), без сохранения в банк команд | I |
5002 | coil | 1 | Воспроизведение ИК-команды из Modbus регистров хранения (2000-2509 до версии 4.22.0 и 2000-3001 после) (RAM) | I |
5100 (в прошивке 3.1.0 и ранее - 0) | coil | number_of_banks | Воспроизведение ИК-команды из соответствующего банка ROM (Play) | I |
5200 (в прошивке 3.1.0 и ранее - 1000) | coil | number_of_banks | Редактирование ИК-команд (ROM) с копированием в RAM (ROM -> RAM) | I |
5300 (в прошивке 3.1.0 и ранее - 2000) | coil | number_of_banks | Запись в банк ИК-команд с использованием IR-приёмника (Learn) | I |
5400 | input | number_of_banks | Размер данных IR-команды в байтах | I |
5500 | holding | 1 | Воспроизведение ИК-команды из соответствующего банка ROM (Play) | FW 4.18.0 |
5501 | holding | 1 | Редактирование ИК-команд (ROM) с копированием в RAM (ROM -> RAM) | FW 4.18.0 |
5502 | holding | 1 | Запись в банк ИК-команд с использованием IR-приёмника (Learn) | FW 4.18.0 |
5520 | input | 1 | Размер данных IR-команды в RAM в байтах | FW 4.32.0 (только WB-MIR) |
Значения number_of_banks для различных устройств:
- WB-MSW v.3 - 32
- WB-MIR v.2 - 40
- WB-MIR v.3 - 80
Начиная с версии прошивки 4.22.0 number_of_banks = 80