Global cache itach flex
В данном материале мы использовали устройство iTach Flex из последнего поколения компактных адаптеров Global Cache. Модель существует в версиях для подключения к проводной сети и Wi-Fi.
Устройство для варианта Wi-Fi, который мы тестировали, имеет корпус с размерами всего 31×65×13 мм (не считая разъемов кабелей), что позволяет установить его где угодно. Модификация с RJ-45 будет немного крупнее из-за разъема.
Корпус изготовлен из черного пластика. Беспроводная антенна встроенная. Присутствует специальная металлическая рамка для крепления. Она устанавливается на одном или двух шурупах, а адаптер просто защелкивается на ней.
На корпусе есть светодиодный индикатор статуса, кнопка для подключения к беспроводной сети по WPS и сброса настроек, а также окошко ИК-приемника для обучения. С одного из торцов установлен вход питания (стандартный microUSB) и многофункциональный миниджек 3,5 мм для подключения кабелей Flex Link.
Благодаря последнему элементу, модель получилась уникально универсальной. На настоящий момент поддерживаются следующие варианты: последовательный порт, один ИК-передатчик, один ИК-бластер, три ИК-передатчика (один может быть бластером).
Как и ранее рассмотренного семейства iTach, ИК-бластер предназначен для использования на большом расстоянии (в комнате) и может оправлять команды на разные устройства. А обычный ИК-передатчик предназначен для крепления на окошке приемника конкретного устройства.
В этом уроке
- Как работает передача данных с помощью инфракрасного света
- Установка ИК-приёмника на машинку
- Определение кодов, отправляемых пультом
- Дистанционное управление машинкой с помощью ИК-пульта
Использование команд в iriduim
После нахождения требуемых кодов, попробуем использовать их в проекте автоматизации. В первом примере мы взяли продукт iRidium. Несмотря на то, что он имеет встроенную базу кодов Global Cache, по описанным выше причинам рекомендуется использовать именно новые найденные и проверенные коды.
Комплект домашнего кинотеатра onkyo htx-22hd
Эта задача явно будет посложнее — модель достаточно старая и не очень популярная, особенно в «серьезных» инсталляциях. Однако со своей задачей многоканального ресивера для медиаплеера вполне справляется и сегодня. Как и с описанным выше телевизором здесь есть несколько задач — отдельные команды для включения и выключения питания, выбор конкретного входа и регулировка громкости.
С последним проблемы нет — можно просто скопировать коды для этих кнопок. Но для управления питанием используется одна кнопка пульта, а для выбора входа — две кнопки для перехода к следующему и предыдущему входу. Также могут быть потенциально интересны функции выбора режима обработки многоканального звука.
Сначала стоит прояснить ситуацию со входами. В этом устройстве, как и на многих других в данном классе, физическому входу в настройках ресивера устанавливается соответствие подключенному оборудованию. Заводское состояние выглядит следующим образом:
Теперь, как и с телевизором, запишем некоторые или все команды существующего пульта через приемник в iTach Flex. Здесь мы тоже видим характерное начало в строках — «sendir,1:1,1,38095,1,1,» как параметры отправки пакета и «341,171,» как префикс. Далее идут знакомые тридцать две пары чисел протокола NEC, а вот суффиксы встречаются разные. Сложно понять, насколько это существенно, но, на всякий случай запишем и их в рабочую таблицу.
В случае Onkyo мы имеем два байта адреса и один байт команды, который повторяется в инвертированном виде четвертым байтом пакета. Адрес, вероятно, как-то связан с суффиксом, а всего на основных кнопках пульта мы смогли насчитать три адреса — D2 06, D2 07 и D2 08.
Вариант прямого перебора в подобных условиях явно требует слишком много времени. Так что попробуем снова обратиться к упомянутому выше сайту с информацией о кодах разных производителей, для телевизора это очень помогло. К сожалению, в найденных на этом ресурсе файлах не удалось найти упоминания именно нашей модели ресивера, да и похожих адресов в таблице на первый взгляд не было.
Анализ данных показал, что если сравнивать только команды и не учитывать адрес, то можно найти сходство. Например, для увеличения громкости используется команда 02, для уменьшения — 03, а для отключения звука — 05. В таблице с теми же адресами, что и управление громкостью нашлась команда включения питания (04).
Модификация оцифрованной строки [VOLUP] с адресом D2 06 на эту команду (нужно исправить всего пару чисел) показала, что мы на правильном пути — ресивер включался и не менял своего состояния при повторной отправке, будучи уже включенным. Команда выключения питания в документе имела другой адрес. Так что мы подставили команду 47 в строку команды [SETUP], имеющую адрес D2 07 и отличающийся суффикс. Это тоже сработало.
Медиаплеер dune hd
С учетом того, что данная серия плееров поддерживает управление по сети (на сайте производителя приводится информация о API), от ИК-пульта в данном случае могут потребоваться только функции раздельного включения и выключения. Здесь производитель сделал подарок, опубликовав с разделе поддержки соответствующий документ, добавив в него необходимые команды включения и выключения с кодами 00 BF 5F A0 и 00 BF 5F A1 соответственно.
После оцифровки нескольких кнопок пульта в iTach Flex можно получить требуемое «окружение» для наших кодов — приставку «sendir,1:1,1,38186,1,1,342,170,» и суффикс «22,1547,342,85,22,3800». Результат после добавления непосредственных команд можно посмотреть в отдельном текстовом файле.
Принцип работы инфракрасных пультов
Модули, работающие в инфракрасном диапазоне, давно и активно используются для беспроводного управления различной техникой (телевизоры, кондиционеры и т.д.) Их же можно использовать для управления машинкой.
Передача информации производится с помощью инфракрасного света. Он не виден глазу человека, однако ведёт себя точно так же, как и любой другой свет: рассеивается, отражается от зеркал, поглощается черными предметами. Отсюда следует правило: пульт должен быть направлен в сторону приёмника — только так сигнал может быть передан.
ИК-пульт (пульт дистанционного управления, инфракрасный пульт) — отправляет сигнал.
ИК-приёмник (инфракрасный приёмник) — принимает сигнал.
Каждая кнопка на пульте имеет свой уникальный номер — код вида 0xFFxxxx (например, 0xFFA25D). Когда пульт отправляет это номер, приёмник получает его и направляет в контроллер, где мы сравниваем этот код со всеми возможными кодами кнопок пульта.
Телевизор lg серии lm66x 2023 года выпуска
Модель оборудована большим количеством видеовходов, поддерживает 3D и подключение к сети, имеет порты USB. На штатном пульте управления присутствует одна кнопка для включения/выключения питания и одна кнопка открытия меню для переключения источников.
Минимальный набор требований к телевизору в составе домашнего кинотеатра — включение и выключение питания разными командами и установка на определенный вход. Дополнительно можно говорить о реализации просмотра эфирного телевидения, где будут нужны выбор канала и регулировка громкости.
Для начала используем встроенный в iTach Flex датчик для записи кодов штатного пульта. Все кнопки нам сейчас не потребуются, достаточно определиться только с основными. После запуска программы iLearn и подключения к адаптеру необходимо поднести пульт к приемнику и нажимать кнопки
Теперь можно проанализировать результаты. Как мы видим, каждая команда, если не учитывать необходимой для самого адаптера части «sendir,1:1,1,37914,1,1,», имеет префикс «341,170,», далее идут тридцать две пары чисел и замыкает команду суффикс «22,1520,341,85,22,3700».
В данном случае, нас будут интересовать как раз данные пары чисел. Они кодируют команду в двоичном формате, где «22,21,» обозначает «0», а «22,63,» обозначает «1», причем первым идет младший бит. Заметим, что из-за особенностей оцифровки некоторые числа могут немного отличаться, например «20» вместо «21» или «65» вместо «63». Но сути это не меняет и удобнее сразу привести все к одинаковому виду поиском и заменой.
Декодирование команды дает нам четыре байта. Подобный вариант, называемый обычно «протоколом NEC», используется достаточно часто и представляет собой сочетание двух байт адреса, одного байта команды и его повтора в инверсном виде («0» заменяются на «1» и наоборот).
В частности для нашего примера мы получаем: [OK] 04 FB 44 BB, [VOLUP] 04 FB 02 FD, [VOLDN] 04 FB 03 FC. Интересно, что здесь второй байт адреса является инверсным для первого. Далее есть два варианта: зная адрес, составить строки для каждого из возможных значений команды и проверить их на устройстве — или поискать готовые команды в сети.
Второй подход приводит нас на сайт Remote Central, где мы можем обнаружить документ производителя с подробным описанием команд управления телевизорами близких по году выпуска серий. Сравнение таблицы в нем с нашими записями показывает идеальное совпадение по записанным командам.
Теперь нужно найти коды для требуемых нам операций и перекодировать их в обратном направлении в команды для iTach Flex. Например, из [POWERON] 04 FB C4 3B и [POWEROFF] 04 FB C5 3A мы получаем соответственно «sendir,1:1,1,38004,1,1,341,171,22,21,22,21,22,65,22,21,22,21,22,21,22, 21,22,21,22,65,22,65,22,21,22,65,22,65,22,65,22,65,22,65,22,21,22,21,22, 65,22,21,22,21,22,21,22,65,22,65,22,65,22,65,22,21,22,65,22,65,22,65,22, 21,22,21,22,1523,341,86,22,3800»и«sendir,1:
Заключительный этап — проверка работоспособности команд. Он также поможет, если в найденной таблице есть неоднозначное соответствие. Для этой задачи используем программу iTest.
Устанавливаем модуль на машинку
Установите ИК-приёмник на обозначенную колодку при помощи стоек среднего размера, винтов и гаек. Вывод S ИК-приёмника окажется подключенным к 3 выводу Arduino.
Давайте выведем в монитор последовательного порта коды кнопок, которые передаёт пульт. Попробуйте сделать это не только с пультом из нашего набора, но и с имеющимися у Вас дома пультами.
Данный датчик является одним из устройств, для работы с которым необходима библиотека. В уроке о подключении библиотек мы уже скачали и установили её. Но если Вы вдруг его пропустили, то обязательно вернитесь туда и выполните указанные действия.
Рассмотрим функции библиотеки, которые Вам понадобятся для управления машинкой.
Функцияcheck() — проверяет наличие принятых с пульта данных.Синтаксис:check( [ УДЕРЖАНИЕ ] ); УДЕРЖАНИЕ — параметр реакции на удержание кнопок пульта.
Если параметр не указан или равен false, то функция будет реагировать только на НАЖАТИЕ кнопок, а если указать true, то функция реагирует и на НАЖАТИЕ, и на УДЕРЖАНИЕ.
Пример:
if( IR.check() ){ ... } // Если принимаются данные с пульта при нажатии кнопки if( IR.check(true) ){ ... } // Если принимаются данные с пульта при удержании кнопки
В следующем примере переменная data возвращает код кнопки, принятый с пульта.
if( IR.check() ){ // Если код кнопки принят Serial.println( IR.data ); // Выводим его в монитор порта }
Помните, что при смене пульта код кнопки может измениться. Используйте следующий скетч для того, чтобы узнать коды кнопок. Они будут выводиться в «Монитор порта».
#include <iarduino_IR_RX.h> // Подключаем библиотеку для работы с ИК-приёмником iarduino_IR_RX IR(3); // Объявляем объект IR с указанием вывода, к которому подключён ИК-приёмник void setup(){ IR.begin(); // Инициируем работу с ИК-приёмником Serial.begin(9600); // Инициируем передачу данных в монитор последовательного порта на скорости 9600 бит/сек } void loop(){ if(IR.check(true)){ // Если в буфере имеются данные, принятые с пульта (кнопка нажата или удерживается) Serial.println(IR.data, HEX); // Выводим код нажатой кнопки }}
В «Мониторе порта» Вы видите код кнопки. Проверьте, что все коды кнопок Вашего пульта соответствуют кодам кнопок следующего скетча.
После того, как Вы разобрались с библиотекой и сверили коды кнопок, можно переходить к написанию скетча, который позволит управлять машинкой с пульта.
#include <iarduino_IR_RX.h> // Подключаем библиотеку для работы с ИК-приёмником #include <Wire.h> // Подключаем библиотеку для работы с шиной I2C #include <iarduino_I2C_Motor.h> // Подключаем библиотеку для работы с мотором iarduino_IR_RX IR(3); // Объявляем объект IR с указанием вывода, к которому подключён ИК-приёмник iarduino_I2C_Motor mot_R (0x0A); // Объявляем объект mot_R для правого мотора iarduino_I2C_Motor mot_L (0x0B); // Объявляем объект mot_L для левого мотора int maxSpeed = 100; // Скорость мотора (% ШИМ - 0...100) int pwm_R; // Скорость правого мотора int pwm_L; // Скорость левого мотора long flagTime; // Время нажати кнопки пульта void setup() { IR.begin(); // Инициируем работу с ИК-приёмником mot_R.begin(); // Инициируем работу с правым мотором mot_L.begin(); // Инициируем работу с левым мотором mot_R.setDirection(true); // Задаём направление вращения правого мотора mot_L.setDirection(false); // Задаём направление вращения левого мотора } void loop() { if (IR.check(true)){ // Если в буфере имеются данные, принятые с пульта (была нажата кнопка) if (IR.data == 0xFFA25D) {flagTime = millis(); pwm_R = maxSpeed; pwm_L = maxSpeed/2;} // Стрелка вверх-влево if (IR.data == 0xFF629D) {flagTime = millis(); pwm_R = maxSpeed; pwm_L = maxSpeed;} // Стрелка вперёд if (IR.data == 0xFFE21D) {flagTime = millis(); pwm_R = maxSpeed/2; pwm_L = maxSpeed;} // Стрелка вперёд-направо if (IR.data == 0xFF22DD) {flagTime = millis(); pwm_R = maxSpeed; pwm_L = -maxSpeed;} // Стрелка влево if (IR.data == 0xFFC23D) {flagTime = millis(); pwm_R = -maxSpeed; pwm_L = maxSpeed;} // Стрелка вправо if (IR.data == 0xFFE01F) {flagTime = millis(); pwm_R = -maxSpeed; pwm_L = -maxSpeed/2;} // Стрелка назад-влево if (IR.data == 0xFFA857) {flagTime = millis(); pwm_R = -maxSpeed; pwm_L = -maxSpeed;} // Стрелка назад if (IR.data == 0xFF906F) {flagTime = millis(); pwm_R = -maxSpeed/2; pwm_L = -maxSpeed;} // Стрелка назад-вправо if (IR.data == 0xFF30CF) {if (IR.key_press) maxSpeed = 30;} // Красная кнопка - 1 скорость if (IR.data == 0xFF18E7) {if (IR.key_press) maxSpeed = 70;} // Зеленая кнопка - 2 скорость if (IR.data == 0xFF7A85) {if (IR.key_press) maxSpeed = 100;} // Фиолетовая кнопка - 3 скорость } if (flagTime 200 > millis()){ // Если кнопка удерживается более 200 мс mot_R.setSpeed(pwm_R, MOT_PWM); // Запускаем правый мотор mot_L.setSpeed(pwm_L, MOT_PWM); // Запускаем левый мотор } else{ // Иначе останавливаем моторы mot_R.setSpeed(0, MOT_PWM); // Запускаем правый мотор mot_L.setSpeed(0, MOT_PWM); // Запускаем левый мотор } }
Заключение
Использование ИК-канала для управления аудио/видеотехникой и другим оборудованием может являться единственным способом автоматизировать работу с ним, особенно в недорогом сегменте. Несмотря на очевидные недостатки этого метода, основным из которых в данном случае является отсутствие обратной связи, данный метод вполне работоспособен и позволяет реализовать достаточно гибкие сценарии. В целом, никаких сложностей в реализации описанных вариантов, не считая поиска требуемых кодов, мы не встретили.
Процесс поиска и составления требуемых команд способен превратиться в запутанный исследовательский процесс. Существенную помощь здесь оказывают интернет-ресурсы, на которых собирается информация об используемых ИК-кодах. Анализ представленных данных и поиск аналогий часто позволяет с относительно небольшими затратами найти необходимые для реализации проекта команды.
В качестве управляющего адаптера можно использовать как упомянутые в материале готовые устройства Global Cache, так и другие аналогичные модели, например собранные самостоятельно на основе микроконтроллеров, проекты для которых широко представлены в интернете.
Что касается интеграции в систему управления, то наиболее удобным представляется вариант работы по компьютерной сети, но в некоторых ситуациях будет достаточно и локальных подключений через USB или последовательный порт. Сетевой вариант, в частности, интересен тем, что может быть использован с различным программным обеспечением, например в составе решений Fibaro и через интернет.