ЗАДАЧА
Требуется управлять с помощью платы Arduino телевизором или каким-либо другим устройством, эмулируя коды ИК-сигналов пульта ДУ. Эта задача противоположна рассмотренной в разд. 10.2 — здесь нам нужно не принимать команды, а отправлять их.
Для приема платой Arduino сигналов пульта ДУ используется модуль приемника ИК-сигналов. На рынке широко представлены приемники ИК-сигнала TSOP38238, TSOP4838, PNA4602 и TSOP2438. Первые три эти приемника имеют одинаковую схему расположения контактов, а у приемника TSOP2438 выводы питания (+5 В и GND) поменяны местами. При использовании какого-либо иного приемника ИК-сигналов уточните схему расположения его контактов в справочном листке (datasheet) на него и подключите его к плате Arduino, как там указано. Подключение приемников TSOP38238, TSOP4838 и PNA4602 к плате Arduino показано в схеме на рис. 10.1.
Рис. 10.1. Подключение приемника ИК-сигнала к плате Arduino
РЕШЕНИЕ
Для решения этой задачи к плате Arduino нужно подключить пять кнопок и инфракрасный светодиод, как показано на рис. 10.2.
Скетч для управления этой схемой приводится в листинге 10.4. Для управления устройством в нем используются коды кнопок из скетча, приведенного в решении из разд. 10.2 (см. листинг 10.2). Коды для управления вашим устройством, скорее всего, будут другими, поэтому узнайте их, исполнив скетч из разд. 10.2, а затем замените ими коды в скетче из листинга 10.4. Нажатие одной из пяти кнопок выбирает и отправляет требуемый код.
Листинг 10.4. Скетч для эмулирования ИК-пульта ДУ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | /* * Скетч irSend * Требует подключения ИК-светодиода к контакту 3 * и 5 кнопок к контактам 6-10 */ #include <IRremote.h> // Подключаем библиотеку IRremote const int numberOfKeys = 5; const int firstKey = 6; // Номер первого из пяти последовательных // контактов, к которым подключаются кнопки bool buttonState[numberOfKeys]; bool lastButtonState[numberOfKeys]; long irKeyCodes[numberOfKeys] = { 0x18E758A7, //0 key 0x18E708F7, //1 key 0x18E78877, //2 key 0x18E748B7, //3 key 0x18E7C837, //4 key }; IRsend irsend; void setup() { for (int i = 0; i < numberOfKeys; i++) { buttonState[i] = true; lastButtonState[i] = true; int physicalPin=i + firstKey; pinMode(physicalPin, INPUT_PULLUP); // Включаем внутренние повышающие резисторы } Serial.begin(9600); } void loop() { for (int keyNumber=0; keyNumber<numberOfKeys; keyNumber++) { int physicalPinToRead = keyNumber + firstKey; buttonState[keyNumber] = digitalRead(physicalPinToRead); if (buttonState[keyNumber] != lastButtonState[keyNumber]) { if (buttonState[keyNumber] == LOW) { irsend.sendSony(irKeyCodes[keyNumber], 32); Serial.println("Sending"); // Посылаем команду } lastButtonState[keyNumber] = buttonState[keyNumber]; } } } |
Рис. 10.2. Подключение кнопок и инфракрасного светодиода к плате Arduino
Увидеть невооруженным глазом отправляемые коды невозможно, поскольку инфракрасный свет невидим для человеческого глаза.
Но в работе передатчика можно удостовериться, наблюдая за ИК-светодиодом на жидкокристаллическом дисплее видоискателя цифровой камеры. |
Обсуждение работы решения и возможных проблем
Скетч Arduino управляет удаленным устройством, включая и выключая инфракрасный светодиод таким образом, чтобы имитировать сигналы, посылаемые ИК-пультом ДУ от этого устройства. Характеристики используемого ИК-светодиода не являются критическими. Информация по подбору подходящего компонента приводится в приложении 1.
Преобразование числовых кодов в мигания ИК-светодиода реализует библиотека IRremote. Для этого в скетче требуется создать экземпляр объекта этой библиотеки. Такой экземпляр для управления светодиодом, подключенным к контакту 3 (выбирать контакт для подключения светодиода не представляется возможным, поскольку этот параметр жестко закодирован в библиотеке), создается следующей строкой кода:
IRsend irsend; |
В зависимости от используемой платы Arduino, ИК-светодиод может потребоваться подключить к иному контакту, чем 3. Например, для плат Teensy 3.x ИК-светодиод надо подключать к контакту 5. Более подробная информация на этот счет содержится в файле README библиотеки IRremote (https://oreil.ly/XOfdd). Если для вашей платы ИК-светодиод нужно подключать к одному из контактов, который в скетче решения используется для подключения кнопок (контакты 6–10), следует взять другой диапазон номеров контактов для подключения кнопок. |
Для хранения диапазона значений кодов управления в скетче используется массив irKeyCodes (см. также решение разд. 2.4). Скетч отслеживает состояние пяти кнопок и при обнаружении нажатия одной из них посылает соответствующий код кнопки следующим оператором:
irsend.sendSony(irKeyCodes[keyNumber], 32); |
Объект irSend поддерживает разные функции для работы с различными популярными форматами ИК-кодов. В случае использования системы дистанционного управления с другими форматами кодов, посмотрите эти форматы в документации на библиотеку. Коды также можно узнать с помощью скетча из разд. 10.2, который выводит их в окно монитора порта.
При передаче функции кода кнопки из массива в конце кода также передается число, сообщающее функции количество битов в коде. Префикс 0x перед определениями кодов в массиве irKeyCodes в начале скетча означает шестнадцатеричный формат этих чисел (подробная информация о шестнадцатеричных числах приводится в главе 2). Каждый символ шестнадцатеричного числа представляет 4-битное значение. Восемь шестнадцатеричных цифр кода означает 32 бита.
Светодиод к плате Arduino подключается через токоограничивающий резистор (подробная информация о применении токоограничивающих резисторов со светодиодами приводится во введении главы 7 (разд. 7.0)).
Зону действия передатчика можно увеличить, используя несколько светодиодов или более мощный светодиод.
Дополнительная информация
Дополнительная информация по управлению светодиодами приведена в главе 7.
Проект необычного ИК-пульта дистанционного управления для телевизоров представлен на веб-странице https://oreil.ly/7BzKh.