ИК-пульт на Arduino: коды кнопок и библиотека IRremote
ИК-пульт — самый дешёвый способ дать проекту дистанционное управление: приёмник стоит рубль, а пульт от ТВ уже лежит на диване. Вся работа сводится к трём вещам: подключить приёмник, снять коды кнопок своего пульта и привязать их к действиям. Разберу всё это на пульте CAR MP3 — маленьком чёрном пульте из стартовых наборов — и проверю скетч в браузере без единого радиокомпонента.
В нашем симуляторе есть виртуальный пульт: карточка из палитры «Макетка» с кнопками CAR MP3, каждая шлёт в скетч свой код — приёмник на указанном пине получает его так же, как настоящий. Сначала — про то, где в этом месте грабли поколений библиотеки.
Два поколения API: decode_results против IrReceiver
Скетчи 2010-х написаны на API второй версии: IRrecv irrecv(11); decode_results results; и сравнение results.value. IRremote четвёртой версии этот словарь вынес: приёмник стал синглтоном IrReceiver, данные живут в decodedIRData.command, а decode_results остался в статьях и на форумах. Важная честная деталь про симулятор: рантайм исполняет begin, decode, resume и decodedIRData.command — а объявление decode_results даёт ошибку компиляции (я проверил прогоном: «Функция decode_results не поддерживается симулятором»). Старые скетчи в браузере не оживут — перепишите пять строк по новому словарю, они на живой плате тоже соберутся только с IRremote 4.x. Историю версий и таблицу миграции я разбирал в лендинге про установку IRremote.
Подключение приёмника: три ноги
- Приёмник TSOP1838/VS1838B или модуль с тремя пинами: OUT на любой цифровой пин, у меня D11.
- VCC на 5 В, GND на землю — приёмник тянет доли миллиампера, питание от платы не просаживает.
- Ножки читаются лицом к себе: слева OUT, в центре GND, справа VCC — у модулей маркировка на плате.
- Протокол NEC, по которому шлёт CAR MP3, передаёт адрес и команду: команда — байт кнопки, его и сравнивает скетч.
Коды кнопок: таблица виртуального пульта
Пульт CAR MP3 шлёт команды NEC одним байтом. Таблица ниже — коды, которые отправляет виртуальный пульт в симуляторе; у реального пульта из набора цифры такие же или близкие, но каждую кнопку своего экземпляра лучше снять сканером — коды копеечных пультов плавают от партии к партии.
| Кнопка | Код команды | Куда удобно привязать |
|---|---|---|
| VOL+ | 21 | яркость вверх, шаг ближе |
| VOL- | 7 | яркость вниз, шаг дальше |
| CH+ | 69 | следующий режим |
| CH | 71 | старт/пауза |
| CH- | 70 | предыдущий режим |
| OK | 67 | подтвердить выбор |
В карточке пульта из палитры «Макетка» есть и цифры, и звёздочка с решёткой — коды видны в подсказках кнопок. Занятая деталь: кнопка «0» несёт команду 64, а «1» — 22, и это не последовательные числа, потому что байт команды повторяет раскладку конкретного пульта, а не счёт от нуля. Сканер кодов, который печатает всё это таблицей за минуту, разобран в уроке про сканер кодов пульта.
Скетч: свет с пульта — четыре команды
Вставьте скетч в симулятор, запустите и жмите кнопки виртуального пульта: VOL+ зажигает светодиод на D9, VOL- гасит, CH+ и CH- переключают режим мигания. Именно так я проверяю логику пультовых проектов до сборки железа.
#include <IRremote.hpp>const byte SVET = 9; // светодиод через резистор 220 Ом void setup() { IrReceiver.begin(11, ENABLE_LED_FEEDBACK); // приёмник на D11 pinMode(SVET, OUTPUT); Serial.begin(9600);} void loop() { if (IrReceiver.decode()) { int kod = IrReceiver.decodedIRData.command; Serial.println(kod); if (kod == 21) digitalWrite(SVET, HIGH); // VOL+ — включить if (kod == 7) digitalWrite(SVET, LOW); // VOL- — выключить if (kod == 69) Serial.println("rezhim +"); if (kod == 70) Serial.println("rezhim -"); IrReceiver.resume(); // без этой строки — одна посылка и тишина } delay(10);}resume() — главный источник тихих поломок во обоих поколениях API: после decode приёмник замолкает, пока вы не разрешите следующий приём. Забыли — первая кнопка сработала, остальные нет. Пин приёмника — любой цифровой, но библиотека занимает таймер, и на Uno он конфликтует с tone() на пинах 3 и 11: разбор таймерных конфликтов — в уроке про таймер2 и tone, а готовый проект управления светом — в уроке про пульт и освещение.