Дистанционное управление с ИК-пульта – Описания, примеры, подключение к Arduino

Дистанционное управление с ИК-пульта - Описания, примеры, подключение к Arduino Мультикоптеры

Global cache itach flex

В данном материале мы использовали устройство iTach Flex из последнего поколения компактных адаптеров Global Cache. Модель существует в версиях для подключения к проводной сети и Wi-Fi.

Устройство для варианта Wi-Fi, который мы тестировали, имеет корпус с размерами всего 31×65×13 мм (не считая разъемов кабелей), что позволяет установить его где угодно. Модификация с RJ-45 будет немного крупнее из-за разъема.

Корпус изготовлен из черного пластика. Беспроводная антенна встроенная. Присутствует специальная металлическая рамка для крепления. Она устанавливается на одном или двух шурупах, а адаптер просто защелкивается на ней.

На корпусе есть светодиодный индикатор статуса, кнопка для подключения к беспроводной сети по WPS и сброса настроек, а также окошко ИК-приемника для обучения. С одного из торцов установлен вход питания (стандартный microUSB) и многофункциональный миниджек 3,5 мм для подключения кабелей Flex Link.

Благодаря последнему элементу, модель получилась уникально универсальной. На настоящий момент поддерживаются следующие варианты: последовательный порт, один ИК-передатчик, один ИК-бластер, три ИК-передатчика (один может быть бластером).

Как и ранее рассмотренного семейства iTach, ИК-бластер предназначен для использования на большом расстоянии (в комнате) и может оправлять команды на разные устройства. А обычный ИК-передатчик предназначен для крепления на окошке приемника конкретного устройства.

В этом уроке

  • Как работает передача данных с помощью инфракрасного света
  • Установка ИК-приёмника на машинку
  • Определение кодов, отправляемых пультом
  • Дистанционное управление машинкой с помощью ИК-пульта
Смотрите про коптеры:  сектора и влияние :: Stellaris General Discussions

Использование команд в 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 и через интернет.

Оцените статью
Радиокоптер.ру
Добавить комментарий