Инструкция по работе с ИК-приёмопередатчиком в устройствах WB-MSW, WB-MIR

Материал из Wiren Board
Это утверждённая версия страницы. Она же — наиболее свежая версия.
Другие языки:


Назначение

Инфракрасный приёмопередатчик, установленный в устройствах WB-MSW модификации I и WB-MIR, предназначен для записи сигналов с ИК-пультов ДУ бытовых устройств и дальнейшего управления бытовой техникой: кондиционерами, телевизорами и т.д. Модули WB-MIR v.2 и WB-MSW v.3 (WB-MSW v.4) поддерживают около 80 ИК-команд (зависит от объема занимаемой в памяти).

Внимание! Все модули, кроме WB-MSW v.3 (WB-MSW v.4), обеспечивают управление возможно только с небольшого расстояния (< 1 метра).

Принцип работы

Описание

Записываете управляющий сигнал с пульта дистанционного управления устройством в память модуля и потом воспроизводите его.

Вы можете записать сигнал в одну из двух видов памяти:

  • Постоянную — записанные команды хранятся в ROM-буферах, которые записываются в ПЗУ модуля и сохраняются при отключении питания.
  • Оперативную — это RAM-буфер модуля, данные теряются при отключении питания.

Помните, что при использовании постоянной памяти вы расходуете ресурс ПЗУ, каждую ячейку можно перезаписать не более 1000 раз.

Подробнее о записи и воспроизведении сигналов читайте в разделах Постоянный режим и Оперативный режим.

Управление телевизором

Обычно пульт телевизора работает в одиночном режиме — передаёт на устройство код нажатой клавиши. Поэтому, достаточно записать сигналы используемых кнопок пульта и вы сможете полностью управлять устройством. Для записи сигнала в модуль, направьте пульт на ИК-приёмник и нажмите нужную кнопку на пульте.

В итоге у вас получится в памяти модуля набор команд, которые соответствуют клавишам на пульте ДУ:

  • Включить / выключить
  • Прибавить громкость
  • Убавить громкость
  • Листать каналы вперёд
  • Листать каналы назад
  • Нажата кнопка 1

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

Управление климатической техникой

Обычно пульт климатической техники передаёт на устройство набор команд, который соответствует выбранному на пульте режиму. Притом, состояние устройства (включено или выключено) может передаваться отдельно.

Например, чтобы управлять кондиционером, нужно сперва выставить нужный режим на пульте, а потом записать его в модуль. Для записи сигнала в модуль, направьте пульт на ИК-приёмник и измените один из параметров, например, температуру.

В итоге получится в памяти модуля набор готовых режимов:

  • Выключен
  • Включён, вентилятор на максимальную скорость, охлаждаем до 22 °C
  • вентилятор на максимальную скорость, охлаждаем до 20 °C
  • вентилятор на малую скорость, охлаждаем до 20 °C
  • вентилятор на среднюю скорость, нагреваем до 27 °C

Управление другой техникой по ИК

С помощью модуля вы можете управлять любой техникой, которая принимает команды по ИК. Для этого нужно выяснить: передаёт пульт одиночные сигналы на каждую нажатую клавишу или целиком режим и выбрать одну из описанных выше стратегий.

Способ представления и хранения сигнала

Пример содержимого оперативного буфера WB-MIR

Сигнал хранится в памяти устройства виде последовательности натуральных чисел (каждое от 0 до 65535), где каждое число - продолжительность логического 0 или 1 в сигнале в квантах по 10 микросекунд. Следовательно, максимальная продолжительность каждого нуля или единицы должна быть не более 65535 * 10 мкс = 655350 мкс = 0,655 секунд. Первое число последовательности — длительность первой логической единицы. Конец последовательности маркируется двумя периодами продолжительностью 0.

В оперативном режиме IR-сигнал (только один) находится в оперативной памяти устройства. Он записывается туда с пульта управления при подаче соответствующей Modbus-команды или путем записи значений в соответствующие регистры с внешнего устройства по Modbus (например, с контроллера Wiren Board), также IR-сигнал может быть скопирован из Flash-ПЗУ. IR-сигнал может быть воспроизведён из оперативной памяти и затем перезаписан; ресурс ПЗУ при этом не расходуется. При отключении питания сигнал в оперативной памяти не сохраняется.

Сжатие ИК-команд

Начиная с версии прошивки 4.22.0 в WB-MIR v.2 и WB-MSW v.3 последовательности команд сжимаются по специальному алгоритму, чтобы обеспечить более высокую плотность хранения. Перед воспроизведением последовательности разархивируются. Максимальная длина команды увеличена до 1000 символов (2000 байт). Сжатие данных использует "словарь": длительности сигнала, которые близки друг к другу, заносятся в словарь как один элемент. Команда хранит индексы на элементы словаря. Максимальная длина словаря - 64 слова, то есть в ROM не получится записать произвольные данные. Также следует учитывать, что при редактировании банка команд записанные данные после сохранения в ROM будут сжаты и будут отличаться от оригинала при чтении из банка. При этом остается возможность записывать и воспроизводить произвольные данные из RAM - там алгоритм сжатия не применяется.

Управление модулем по Modbus

Внимание! Номера используемых Modbus регистров менялись, начиная с версии прошивки 3.2.0. В инструкции указаны новые номера регистров. Если вы пользуетесь устройством со старой прошивкой, общий принцип остаётся прежним, но номера регистров сдвигаются; как именно — смотрите в Карта регистров флагов и входов (Coils и Inputs). Полное описание регистров ИК-устройств можно найти в этой статье в разделе Карта регистров.

Обмен данными

На физическом уровне модуль подключается через интерфейс RS-485. Для управления модулем используется протокол Modbus RTU. В устройствах Wirenboard данные Modbus передаются по линиям связи RS-485. Подробнее смотрите страницу Протокол Modbus. Modbus-адрес модуля задается на заводе и нанесен на наклейке на его боковой стороне. Адрес может быть изменен программно.

В устройствах с версией прошивки 3.1.0 и позднее также можно изменить настройки параметров обмена данными — смотрите таблицу регистров Modbus.

Управление ИК-приёмопередатчиком производится через регистры флагов Modbus; полный список можно найти в описании карты регистров. Есть 3 типа операций с сигналами:

  • запись сигнала в память с пульта ДУ,
  • воспроизведение сигнала из памяти,
  • редактирование сигнала в оперативной памяти.

В каждый момент времени можно выполнять только одну операцию только над одним сигналом. Так как во время выполнения любой операции в один из регистров флагов ставится 1, а после завершения операции туда же ставится 0, в каждый момент времени среди всех регистров флагов, относящихся к ИК-приёмопередатчику, только один регистр может быть установлен в единицу. Попытка записи 1 в регистры флагов, связанных с ИК, при уже имеющейся единице приведёт к ошибке BUSY.

Особенности при работе из Codesys

Читайте статью Работа с ИК-командами в Codesys.

Постоянный режим

В постоянном режиме ИК-команды сохраняются в памяти устройства и доступны после перезагрузки по питанию. Каждая команда хранится в отдельном "банке" памяти. Количество банков памяти зависит отпрошивки устройства. До прошивки 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. Если сигнал под номером 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.

Работа с сигналами через holding регистры

Начиная с версии прошивки 4.18.0 доступны holding регистры для работы с сигналами:

  • 5500 — воспроизведение
  • 5501 — редактирование
  • 5502 — запись

Регистры доступны как для чтения, так и для записи. Изначально в регистрах записан 0, что говорит о готовности к работе.

Для воспроизведения сигнала с номером i в регистр 5500 нужно записать число i + 1. Пока идет воспроизведение, при чтении регистра будет возвращаться номер воспроизводимого сигнала. После окончания воспроизведения регистр будет сброшен в 0. Если запрошенного сигнала не существует — в регистр будет записан код ошибки 0xFFFF.

Редактирование и запись сигналов производятся аналогичным образом. Для того, чтобы завершить редактирование (запись) сигнала, в регистр нужно записать 0 или номер следующего сигнала для редактирования (записи).

Оперативный режим

Запись сигнала в оперативную память с пульта ДУ

Чтобы записать сигнал (только один) с пульта в оперативную память, не помещая при этом в ПЗУ - запишите 1 в регистр флага по адресу 5001. Далее действия происходят так же, как описано выше для записи сигнала в ПЗУ. После прекращения записи в регистрах хранения по адресу 2000 и дальше будет храниться сигнал в виде последовательности чисел. Эту последовательность можно редактировать, как описано выше. Внимание: содержимое этих регистров хранения не сохраняется при отключении питания устройства!

Воспроизведение сигнала из оперативной памяти

Чтобы воспроизвести сигнал из оперативной памяти, запишите 1 в регистр флага по адресу 5002. Будет воспроизведён сигнал, записанный в регистрах хранения, начиная с 2000. В случае отсутствия маркера конца команды будет возвращена ошибка. Пока идёт воспроизведение сигнала, регистр флага по адресу 5002 будет установлен в 1, а затем сам установится в 0. Пока идёт воспроизведение сигнала, никакие другие операции с ИК-приёмопередатчиком по Modbus не будут доступны.

Управление ИК-приёмопередатчиком производится через регистры флагов Modbus (полный список можно найти в #Карта регистров флагов и входов (Coils и Inputs)). Есть 3 типа операций с сигналами:

  • запись сигнала в память с пульта ДУ,
  • воспроизведение сигнала из памяти,
  • редактирование сигнала в памяти.
  • в следующих версиях предполагается реализовать непосредственную запись из оперативного буфера в ПЗУ.

Как и в случае работы с регистрами постоянного хранения, в каждый момент времени можно выполнять только одну операцию только над одним сигналом. Так как во время выполнения любой операции в один из регистров флагов ставится 1, а после завершения операции туда же ставится 0, в каждый момент времени среди всех регистров флагов, относящихся к ИК-приёмопередатчику, только один регистр может быть установлен в единицу. Попытка записи 1 в регистры флагов, связанных с ИК, при уже имеющейся единице приведёт к ошибке BUSY.

Удаление всех сигналов из постоянной памяти

Чтобы удалить все записанные сигналы, запишите 1 в регистр флагов по адресу 5000.

Чтение/запись банков команд

Пользователь pivcheg написал скрипты чтения и записи IR-команд, которые опубликовал на портале поддержки.

Мы немного поправили им имена и опубликовали в архиве: ir_backup.tgz

Подготовка

Содержимое архива:

  • read_roms.pl — скрипт сохранения ИК-команд в файлы
  • write_roms.pl — скрипт записи ИК-команд из файлов в регистры датчика
  • compare_bufs.pl, getbuffer.pl, putbuffer.pl — вспомогательные скрипты, запускаются автоматически.

Перед тем, как приступить к чтению и записи команд:

  1. Зайдите в консоль контроллера по SSH.
  2. Перейдите в папку /home
  3. Загрузите скрипт на контроллер и распакуйте его:
    # 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
    
  4. Перейдите в папку с распакованными файлами:
    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


Карта регистров

Карта регистров флагов и входов (Coils и Inputs)

Начальный адрес Тип Количество Назначение В модификациях
5000 coil 1 Очистка всех банков ИК-команд I
5001 coil 1 Запись ИК-команды с ИК-приёмника в Modbus регистры хранения (2000-2509) (RAM), без сохранения в банк команд I
5002 coil 1 Воспроизведение ИК-команды из Modbus регистров хранения (2000-2509) (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

Значения number_of_banks для различных устройств:

  • WB-MSW v.3 - 32
  • WB-MIR v.2 - 40

Начиная с версии прошивки 4.22.0 number_of_banks = 80