Оглавление:

Инфракрасный пульт дистанционного управления I2C с Arduino: 8 шагов (с изображениями)
Инфракрасный пульт дистанционного управления I2C с Arduino: 8 шагов (с изображениями)

Видео: Инфракрасный пульт дистанционного управления I2C с Arduino: 8 шагов (с изображениями)

Видео: Инфракрасный пульт дистанционного управления I2C с Arduino: 8 шагов (с изображениями)
Видео: Инфракрасный пульт дистанционного управления для Ардуино - распаковка и обзор 2024, Июль
Anonim
Инфракрасный пульт дистанционного управления I2C с Arduino
Инфракрасный пульт дистанционного управления I2C с Arduino
Инфракрасный пульт дистанционного управления I2C с Arduino
Инфракрасный пульт дистанционного управления I2C с Arduino

Преамбула В этой инструкции подробно описано, как создать универсальный пульт дистанционного управления с использованием интерфейса I2C.

Как странно, вы говорите, использовать ведомое устройство I2C?

Да, подчиненное устройство I2C.

Это связано с тем, что точная синхронизация IR-пакетов довольно требовательна, и типичный Arduino будет бороться с этим, если он уже выполняет множество других задач одновременно. Лучше распределять вычислительную нагрузку, по возможности назначая интенсивные по времени действия на выделенные процессоры (еще лучше делать это аппаратно). Учитывая, что I2C - это хорошо документированный и надежный метод связи между ИС, я выбрал его в качестве интерфейса.

Вступление

Как упоминалось выше, в этом руководстве описывается, как управлять бытовой техникой, такой как телевизор, DVD-плеер, спутник и т. Д., С помощью библиотеки IRremote на Arduino.

Он завершается примером дизайна, превращающим Arduino в подчиненный модуль дистанционного управления I2C (рис. 1 выше) с прототипом испытательной схемы (рис. 2 выше), и подробно описывается, как сократить ваш дизайн до минимума необходимых компонентов, чтобы его можно было встроен в другой дизайн. В моем случае я использую это встроенное устройство в универсальном устройстве дистанционного управления IoT на базе ESP8266-12E.

Какие запчасти мне нужны?

Для построения схемы, изображенной на шаге 1 (ИК-передатчик), вам понадобятся следующие детали;

  • 2 резистора 10 кОм
  • 1 резистор 390R
  • 1 резистор 33R
  • 1 шт. Резистор 3K8
  • 1 не горит красный светодиод
  • 1 выключенный ИК-светодиод TSAL6400
  • 1 транзистор BC337
  • 1 конденсатор 220 мкФ
  • 1 шт. На Arduino Uno

Для построения схемы, изображенной на шаге 4 (ИК-приемник), вам понадобятся следующие детали;

  • 1 резистор 10 кОм
  • 1 шт. TSOP38328
  • 1 конденсатор 220 мкФ
  • 1 шт. На Arduino Uno

Для построения схемы, изображенной на шаге 5 (тестовая схема ведомого устройства), вам понадобятся следующие детали;

  • 4 резистора 10 кОм
  • 2 резистора 390R
  • 1 резистор 33R
  • 1 шт. Резистор 3K8
  • 2 красных светодиода не горит
  • 1 выключенный ИК-светодиод TSAL6400
  • 1 транзистор BC337
  • 1 конденсатор 220 мкФ
  • 2 кнопки выключения SPST
  • 2 от Arduino Unos

Для построения схемы, изображенной на шаге 6 (конструкция с усадкой), вам понадобятся следующие детали;

  • 3 резистора 10 кОм
  • 1 резистор 270R
  • 1 резистор 15R
  • 4 резистора 1 кОм
  • 1 не горит красный светодиод
  • 1 выключенный ИК-светодиод TSAL6400 или TSAL5300
  • 1 транзистор BC337
  • 1 конденсатор 220 мкФ электролитический при 6,3 В
  • 1 электролитический конденсатор емкостью 1000 мкФ при 6,3 В
  • 2 конденсатора 0,1 мкФ
  • 2 конденсатора 22 пФ
  • 1 выключатель 16 МГц Xtal
  • 1 шт. ATMega328P-PU

Примечание. Вам также потребуется устройство FTDI для программирования ATMega328P.

Какие навыки мне нужны?

  • Минимальное владение электроникой,
  • Знание Arduino и его IDE,
  • Немного терпения,
  • Было бы полезно некоторое понимание I2C (см. Здесь некоторые общие сведения о библиотеке I2C / Wire).

Темы охватывали

  • Краткий обзор схемы,
  • Краткий обзор программы,
  • Содержимое пакета I2C,
  • Получение кодов дистанционного управления (ui32Data),
  • Как проверить ваше ведомое устройство I2C,
  • Сжимая ваш дизайн,
  • Заключение,
  • Использованные ссылки.

Отказ от ответственности

Как всегда, вы используете эти инструкции на свой страх и риск, и они не поддерживаются.

Шаг 1: Краткий обзор схемы

Краткий обзор схемы
Краткий обзор схемы

Назначение схемы - передача кодов ИК-пульта ДУ. Его дизайн довольно прост и понятен.

Когда транзистор Q1 и BC337 NPN включается через логическую единицу от Arduino PWM O / P D3 к резистору R5, ток проходит через светодиоды 1 и 2. Ограничивается только балластными резисторами R3 и R4 соответственно. Q1 используется для увеличения тока, проходящего через ИК-диод (IF Max = 100 мА), до значения, превышающего то, что поддерживает Arduino O / P ~ 40 мА при питании +5 В.

Конденсатор C1 a 220uF Electrolytic обеспечивает некоторую стабилизацию, предотвращая падение напряжения питания из-за мощности, потребляемой светодиодами 1 и 2.

Резисторы R1 и R2 являются подтягивающими I2C.

Шаг 2: Краткий обзор программного обеспечения

Краткий обзор программного обеспечения
Краткий обзор программного обеспечения
Краткий обзор программного обеспечения
Краткий обзор программного обеспечения
Краткий обзор программного обеспечения
Краткий обзор программного обеспечения

Преамбула

Для успешной компиляции этого исходного кода вам понадобится следующая дополнительная библиотека;

IRremote.h

  • Автор: z3t0
  • Назначение: инфракрасная удаленная библиотека для Arduino: отправка и получение инфракрасных сигналов по нескольким протоколам.
  • От:

Обзор кода

Как показано на рисунке 1 выше, при запуске код настраивает ввод / вывод микроконтроллера, а затем опрашивает состояние внутреннего программного флага «bFreshDataFlag». Когда этот флаг установлен, контроллер утверждает, что линия «занята» (отправляет низкий уровень на выводе данных D4) и переходит в состояние «eBUSY», последовательно считывая команды нажатия кнопок, хранящиеся в uDataArray , и отправляя данные с ИК-модуляцией на ИК-светодиод в последовательность передачи.

После того, как данные, хранящиеся в uDataArray , были полностью отправлены, состояние 'eIDLE' возобновляется, а линия 'Занято' отменяется (отправка данных на выводе D4 высокий уровень). Теперь устройство готово к получению дополнительных нажатий кнопок, обозначающих конец последовательности передачи.

Прием данных нажатия ИК-кнопки

Когда данные отправляются на удаленный контроллер InfraRed через I2C, он запускает прерывание, а вызов функции receiveEvent () запускается асинхронно.

После запуска полученные данные I2C последовательно записываются в буфер uDataArray.

Во время приема данных, если ведущий сигнализирует об окончании последовательности (bFreshData! = 0x00), устанавливается 'bFreshDataFlag', тем самым сигнализируя о начале последовательности передачи.

На рисунках 2… 3 показан пример типичной последовательности пакетов.

Примечание. Полный исходный код доступен здесь.

Шаг 3: содержимое пакета I2C

Содержимое пакета I2C
Содержимое пакета I2C

Формат пакета управления, отправляемого ведомому устройству по I2C, приведен выше на рисунке 1, значение каждого поля приведено ниже.

Значение полей пакета управления

byte bEncoding;

  • Кодировка ИК-пульта ДУ,

    • RC6 (Небо) = 0,
    • СОНИ = 1,
    • SAMSUNG = 2,
    • NEC = 3,
    • LG = 4

uint32_t ui32Data;

Шестнадцатеричное представление двоичного потока данных IR 4 байта данных (беззнаковое длинное), LSByte… MSByte

byte bNumberOfBitsInTheData;

Количество бит в данных (максимум 32). Диапазон = 1… 32

byte bPulseTrainRepeats;

Сколько повторов этой последовательности импульсов. Диапазон = 1… 255. Обычно 2… 4 повтора. Вы можете расширить это действие для команд включения / выключения, поскольку принимающему устройству иногда требуется несколько дополнительных повторов последовательности импульсов для получения сигнала включения

byte bDelayBetweenPulseTrainRepeats;

Задержка между повторами этой последовательности импульсов. Диапазон = 1… 255 мс. Обычно 22 мс… 124 мс

byte bButtonRepeats;

Имитирует повторное нажатие одной и той же кнопки (но не поддерживает измененный код, как пульт Apple, он просто повторяет код кнопки). Диапазон = 1… 256. По умолчанию = 1

uint16_t ui16DelayBetweenButtonRepeats;

Задержка между повторениями кнопки (беззнаковое целое). Всего 2 байта LSByte… MSByte. Диапазон = 1… 65535 мс. По умолчанию = 0 мс

byte bFreshData;

  • Свежие данные. Ненулевое значение. Записанный последним, запускает последовательность IR TX. Диапазон 0x00… 0xFF

    • Будут еще пакеты управления = 0
    • Это последний контрольный пакет = ненулевое значение 1, 2,… 255

Обратите внимание на использование директивы компилятора _packed_. Это необходимо для обеспечения того, чтобы данные представляли собой пакетный байт за байтом в памяти независимо от используемой целевой системы (Uno, Due, ESP8266 и т. Д.). Это означает, что для объединения между registerAllocationType и dataArrayType требуется только последовательная синхронизация / синхронизация в байтах из пакета управления, что упрощает программное обеспечение TX / RX.

Шаг 4. Получение кодов дистанционного управления (ui32Data)

Получение кодов дистанционного управления (ui32Data)
Получение кодов дистанционного управления (ui32Data)
Получение кодов дистанционного управления (ui32Data)
Получение кодов дистанционного управления (ui32Data)
Получение кодов дистанционного управления (ui32Data)
Получение кодов дистанционного управления (ui32Data)
Получение кодов дистанционного управления (ui32Data)
Получение кодов дистанционного управления (ui32Data)

Есть три способа получить соответствующий код ключа дистанционного управления;

  1. Посредством подсчета битов с помощью осциллографа,
  2. Посмотрите это на веб-сайте,
  3. Декодируйте его прямо из потока данных в программном обеспечении.

Посредством подсчета бит с помощью прицела

Это неэффективный метод, поскольку он занимает довольно много времени и может потребовать более одной попытки, однако он может быть очень точным. Это также полезно для визуальной проверки кодов, полученных с использованием методов 2 и 3, а также для определения каких-либо особенностей пульта дистанционного управления. Например, при удержании кнопки на пульте дистанционного управления Apple IR. Пульт дистанционного управления сначала выдаст последовательность команд, а затем повторяет сжатую последовательность 0xF….

Поищи на сайте

База данных кодов дистанционного управления на веб-сайте Linux Infrared Remote Control является хорошим источником.

Однако недостатком является то, что вам, возможно, придется попробовать несколько кодов, пока вы не найдете тот, который вам подходит. Возможно, вам также придется интерпретировать некоторые представления кодов, чтобы преобразовать их в эквивалентную шестнадцатеричную форму.

Расшифровать прямо из потока данных

Используя схему на рисунке 1 выше в сочетании с примером библиотеки IRremote «IRrecvDumpV2.ino», можно декодировать поток данных прямо с пульта дистанционного управления. На рисунке 2 показан декодированный пульт телевизора Samsung для нажатия кнопки включения / выключения в окне терминала Arduino IDE.

Комбинированный приемник / передатчик

На рисунках 3 и 4 выше показано решение, которое позволяет принимать и передавать ИК-команды, что упрощает создание прототипа.

Чтобы декодировать нажатия кнопок ИК-пульта дистанционного управления, вам нужно будет прошить Arduino с помощью примера IRrecvDumpV2.ino, который поставляется с библиотекой IRremote.

Он также одинаково хорошо работает для передачи ИК-команд. Красный светодиод включен как визуальная индикация работы устройства.

Шаг 5: Как проверить ваше ведомое устройство I2C

Как проверить ваше ведомое устройство I2C
Как проверить ваше ведомое устройство I2C
Как проверить ваше ведомое устройство I2C
Как проверить ваше ведомое устройство I2C

Используя исходный код здесь и схему, описанную выше на рисунке 1, запрограммируйте «Master» Arduino с «IR_Remote_Sim_Test.ino» и «Slave» Arduino с «IR_Remote_Sim.ino».

Предполагая, что у вас есть телевизор Sony Bravia, приставка Sky HD и звуковая панель Sony BT SoundBar, нажмите кнопку 1, и ваш телевизор переключится на BBC1 (канал 101). Нажмите кнопку 2, и звуковая панель отключится. Нажмите еще раз, и звук будет включен.

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

Конечно, если у вас не настроена такая же развлекательная система, как указано выше, вы можете перепрограммировать ведомое устройство с помощью IRrecvDumpV2.ino, декодировать представляющие интерес удаленные команды, а затем запрограммировать их в IR_Remote_Sim_Test.ino для вашего данный сценарий.

На рисунке 2 показан обзор программного обеспечения для тестирования системного уровня между ведущим и ведомым.

Шаг 6: уменьшение вашего дизайна

Уменьшение вашего дизайна
Уменьшение вашего дизайна

Итак, если вы следовали этой инструкции, полагаться на два Arduinos для управления домашними устройствами - не самое эффективное использование вашего Arduino. Следовательно, если вы построите схему, показанную на рисунке выше, и следуете инструкциям здесь, чтобы запрограммировать ATMega328P с помощью «IR_Remote_Sim.ino», вы сможете сократить всю систему до минимальных компонентов. Это позволит вам встроить ваш дизайн в другую систему.

Шаг 7: Заключение

Заключение
Заключение
Заключение
Заключение

Решение стабильно и хорошо работает, уже несколько недель оно без проблем встроено в другую систему.

Я выбрал Arduino Uno R3, так как мне нужно было устройство с достаточным объемом оперативной памяти, чтобы иметь буфер кнопок разумной глубины. Я остановился на размере буфера 20 пакетов (MAX_SEQUENCES).

Изготовленный мной экран Hybrid TX / RX также очень пригодился при декодировании пультов дистанционного управления Sony и Sky. Хотя я должен признаться, что время от времени использую свой цифровой прицел для проверки того, что команда ИК-сигнала, декодированная программным обеспечением, была такой же, как и исходящая от полученного ИК-сигнала (TSOP38328).

Единственное, что я бы сделал иначе, - это использовать схему управления постоянным током для ИК-светодиода, как показано выше на рис.2.

Еще одно замечание: не все ИК-передатчики имеют частоту 38 кГц, TSOP38328 оптимизирован для частоты 38 кГц.

Шаг 8: Использованные ссылки

IRRemote.h

  • Автор: z3t0
  • Назначение: инфракрасная удаленная библиотека для Arduino: отправка и получение инфракрасных сигналов по нескольким протоколам.
  • От:

ИК-пульт дистанционного управления

  • z3t0.github.io/Arduino-IRremote/
  • https://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html

Инфракрасный датчик приемника - TSOP38238 (аналог)

https://cdn-shop.adafruit.com/datasheets/tsop382.pdf

Чтобы избежать заполнения структуры данных до границ слова

  • https://github.com/esp8266/Arduino/issues/1825
  • https://github.com/tuanpmt/esp_bridge/blob/master/modules/include/cmd.h#L15
  • https://stackoverflow.com/questions/11770451/what-is-the-meaning-of-attribute-packed-aligned4

Хороший источник сведений об ИК-пульте дистанционного управления

https://www.sbprojects.com/knowledge/ir/index.php

I2C

  • https://playground.arduino.cc/Main/WireLibraryDetailedReference
  • https://www.arduino.cc/en/Reference/WireSend

База данных ИК-пультов

  • https://www.lirc.org/
  • https://lirc-remotes.sourceforge.net/remotes-table.html

BC337 Лист данных

https://www.onsemi.com/pub/Collateral/BC337-D. PDF

1N4148 Лист данных

https://www.vishay.com/docs/81857/1n4148.pdf

Рекомендуемые: