ИК-приёмник Arduino – подключение и чтение кодов пульта

Трёхвыводной инфракрасный приёмник TSOP1738 в металлическом экране с окном для линзы

ИК-приёмник с Arduino превращает команды пульта в программные события. Рассмотрим правильную распиновку, совместимость по частоте, обработку кода и поиск причин, по которым пульт не определяется.

Как работает инфракрасное управление

ИК-пульт передаёт команды короткими вспышками инфракрасного светодиода. Для защиты от солнечного света и других помех информация обычно модулируется несущей частотой, например близкой к 38 кГц, хотя конкретные системы используют разные варианты. Специализированный приёмник содержит фотодиод, усилитель, фильтр и демодулятор, после чего выдаёт на цифровом выходе последовательность импульсов. Arduino измеряет временные интервалы между ними и пытается определить протокол и команду. Поэтому обычный фотодиод и трёхконтактный демодулирующий модуль – не взаимозаменяемые детали. Если соединить фотодиод с цифровым входом и запустить пример для TSOP-приёмника, результата может не быть. Перед сборкой выясните тип датчика, его несущую частоту и диапазон питания. Для обучения удобно использовать телевизионный пульт и демодулирующий ИК-модуль, но следует учитывать, что некоторые современные пульты используют Bluetooth либо радиоканал, а не инфракрасный свет.

Несущая ИК-пульта и сигнал на выходе приёмника для протокола NECВерхняя линия – ИК-излучение пульта: пачки несущей около 38 кГц показаны штриховкой. Кадр NEC начинается пачкой 9 мс и паузой 4,5 мс, затем идут биты: каждый начинается пачкой 562,5 мкс, после неё пауза 562,5 мкс означает ноль, пауза 1687,5 мкс – единицу. Нижняя линия – выход OUT демодулирующего приёмника: во время пачки несущей на нём низкий уровень, в паузах – высокий. Масштаб времени условный.ИК-сигналпультаВыход OUTприёмника9 мс4,5 мс0101Начало кадра NEC: пачка 9 мс, пауза 4,5 мс, затем биты по 562,5 мкс несущей;«0» – пауза 562,5 мкс, «1» – 1687,5 мкс. Пока идёт несущая, OUT в нуле. Масштаб условный
Начало кадра NEC: пачки несущей на входе приёмника и импульсы на его выходе OUT. Во время несущей выход в нуле.

Распиновка ИК-приёмника: VCC, GND и OUT

Готовые платы часто подписаны VCC, GND и OUT, однако у отдельных трёхконтактных корпусов без платы физический порядок ножек зависит от модели производителя. Например, различные серии TSOP и похожих изделий могут располагать землю, питание и выход иначе, даже если корпуса на вид одинаковы. Поэтому ориентироваться только на расположение ножек слева направо опасно. Поэтому на рисунке ниже показан вид спереди и указана точная модель – Vishay TSOP382xx. Если распиновку перепутать, приёмник может не работать или выйти из строя. Линию OUT подключают к подходящему цифровому входу Arduino, питание – в допустимый диапазон из даташита, землю – к общей земле логической схемы. На длинных проводах полезно дополнительное локальное развязывание питания; конкретную цепь берут из документации. Перед запуском мультиметром проверяют отсутствие короткого замыкания и правильность полярности.

Распиновка ИК-приёмника Vishay TSOP382xx, вид на линзуКорпус приёмника TSOP382xx с линзой, обращённой к зрителю, выводы направлены вниз. Слева направо: 1 – OUT, выход; 2 – GND, общий провод; 3 – VS, питание от 2,0 до 5,5 В. У других моделей и готовых модулей порядок может отличаться.TSOP382xx1OUTвыход2GNDобщий3VS2,0–5,5 ВVishay TSOP382xx, вид на линзу, выводы вниз. Порядок выводову других моделей и модулей бывает другим – сверяйте даташит
Vishay TSOP382xx, вид на линзу: 1 – OUT, 2 – GND, 3 – VS.
Па­ра­метрTSOP382xx
Выводы1 – OUT, 2 – GND, 3 – VS
Напря­же­ние пи­та­ния2,0–5,5 В
Ток потребле­ния0,25–0,45 мА при 3,3 В
Ток выходане более 5 мА
Выходактивный низкий, внутренняя подтяжка 30 кОм к VS
Не­су­щая30, 33, 36, 38, 40 или 56 кГц – по двум последним цифрам обозна­че­ния
По даташиту Vishay TSOP382.., TSOP384.. (документ 82491). Выход нельзя нагружать светодиодом напрямую.

Выбор частоты несущей и совместимость с пультом

Многие распространённые ИК-приёмники рассчитаны на диапазон около 38 кГц, но это не универсальный стандарт для любой техники. Есть устройства на 36, 40, 56 кГц и других частотах. Приёмник может иногда реагировать на близкую несущую, однако дальность и стабильность приёма будут хуже. Кроме частоты важно, чтобы Arduino умел распознавать протокол пульта. NEC, Sony SIRC, RC5 и RC6 используют разные правила кодирования и повторов. Современная библиотека нередко сама определяет протокол, но не каждое нажатие получает «красивый» стандартный код. Возможны неизвестные или нестандартные последовательности. Если команда не определяется, проверьте не только программу, но и совместимость пульта и приёмника, а также расстояние до источников помех. Для проверки самого ИК-светодиода иногда используют камеру смартфона, но некоторые камеры фильтруют ИК-излучение, поэтому отрицательный результат не является доказательством неисправности.

Про­то­колНе­су­щаяКо­ди­ро­ва­ниеПри удержа­нии кнопки
NEC38 кГцдли­тель­ность паузы: «0» – 562,5 мкс, «1» – 1687,5 мкско­роткий кадр повто­ра каждые 108 мс
Sony SIRC40 кГцдли­тель­ность импуль­сакадр повто­ряется це­ли­ком
RC536 кГцманчестерский кодкадр повто­ряется с тем же битом пе­реклю­че­ния
RC636 кГцманчестерский кодкадр повто­ряется с тем же битом пе­реклю­че­ния
Основные протоколы бытовых пультов. Бит переключения меняется при каждом новом нажатии, поэтому по нему удержание отличают от повторного нажатия.

Подключение ИК-приёмника к Arduino Uno

На макете достаточно трёх основных соединений: питание датчика, общая земля и выход OUT на выбранный цифровой контакт Arduino. Для некоторых примеров библиотеки нужен определённый номер пина; в современных версиях его указывают в коде. Нельзя брать схему из старого урока и без проверки устанавливать библиотеку нового поколения: интерфейс методов мог измениться. Сначала выберите конкретную модель приёмника и плату Uno, затем откройте актуальный пример декодирования из библиотеки. В нём установите номер цифрового входа, загрузите программу и откройте последовательный монитор с указанной скоростью. После нажатия кнопки пульта должны появиться сообщения о протоколе, адресе и команде. Если на экране пусто, проверьте кабель USB, номер порта, питание приёмника и фактическую распиновку. Переходите к собственному алгоритму управления лишь после устойчивого чтения нескольких разных кнопок.

Подключение ИК-приёмника TSOP382xx к Arduino UnoВывод 3 VS приёмника подключён к 5V Arduino Uno через резистор R1, у вывода VS на общий провод стоит конденсатор C1 – это фильтр питания, рекомендованный Vishay при пульсациях. Вывод 2 GND соединён с GND платы, вывод 1 OUT – с цифровым входом D2.Arduino Uno5VGNDD2TSOP382xx3 VS2 GND1 OUTR1C1R1 и C1 – фильтр питания, который Vishay рекомендует при пульсацияхи выбросах на линии питания. Без помех OUT, GND и VS подключают напрямую
TSOP382xx и Arduino Uno: OUT – D2, GND – GND, VS – 5V; R1 и C1 – фильтр питания при пульсациях.

Библиотека Arduino-IRremote и изменения API

Arduino-IRremote – популярная библиотека для обработки ИК-протоколов. Её API менялся между версиями: старые примеры часто используют объекты и методы вроде IRrecv.decode(), тогда как современные примеры могут работать через IrReceiver и декодированные структуры. Копирование фрагментов из разных версий в один скетч приводит к ошибкам компиляции и ложным выводам о неисправности модуля. Поэтому скетчи ниже написаны для Arduino-IRremote версии 4.x; для другой версии сверяйтесь с её официальными примерами. Полезно отдельно объяснить, где найти адрес устройства, код команды и признак повтора. Эти значения отличаются по смыслу: код адреса обычно описывает группу устройств, а команда – действие конкретной кнопки. После чтения команд их удобно записать в таблицу, например «громкость +», «громкость –», «питание», «влево» и «вправо», сохранив формат данных без ручного перевода между десятичной и шестнадцатеричной записью.

Первый скетч только принимает кадры и печатает в Serial Monitor протокол, адрес, команду и признак повтора. Скорость монитора – 115 200 бод.

// ИК-приёмник: OUT – D2, VS – 5V, GND – GND
// Библиотека Arduino-IRremote 4.x
#include <IRremote.hpp>

const byte IR_PIN = 2;

void setup() {
  Serial.begin(115200);
  IrReceiver.begin(IR_PIN, ENABLE_LED_FEEDBACK);
  Serial.println(F("Жду команды пульта"));
}

void loop() {
  if (IrReceiver.decode()) {
    // протокол, адрес, команда, признак повтора
    IrReceiver.printIRResultShort(&Serial);
    IrReceiver.resume(); // готов к следующему кадру
  }
}

Что происходит при удержании кнопки

Многие пульты отправляют особый сигнал повтора либо периодически повторяют основную команду при удержании кнопки. Если программа трактует каждое сообщение как новое разовое нажатие, светодиодная лента или мотор может реагировать слишком быстро. Для настройки меню полезно различать первое нажатие, удержание и отпускание. Структура повторов зависит от протокола и даже от версии библиотеки: у NEC часто используются специализированные кадры повтора, а у других систем данные могут иметь иное поведение. Поэтому сначала выводите в Serial Monitor все признаки и интервалы сообщений, не пытаясь «угадать» их. Затем добавьте программную обработку времени между командами и, при необходимости, подавление слишком частых действий. Не стоит бездумно вставлять delay(500) после любого принятого пакета: это упрощает демонстрацию, но может пропускать следующие команды и замедлять весь проект.

В Arduino-IRremote 4.x признак повтора – флаг IRDATA_FLAGS_IS_REPEAT в поле decodedIRData.flags. Если кадры с ним пропускать, удержание кнопки сработает как одно нажатие; если считать их, удержание можно превратить в плавную регулировку.

Пример управления светодиодом от пульта

Самый безопасный пример – изменить состояние светодиода, подключённого к цифровому выходу через ограничительный резистор. Сначала в программе хранится полученная команда, затем конструкция switch или if выбирает действие по известному коду. Для разных кнопок можно задать включение, выключение и переключение состояния. Важный момент: не всякий вывод принимает один и тот же ток и не всякая плата имеет светодиод на одном контакте, поэтому номер вывода в коде должен соответствовать фактическому подключению на вашей плате. Для реального светодиодного светильника нужно отдельное силовое управление. В образовательном проекте не стоит сразу подключать к ИК-пульту сетевое реле: лучше убедиться, что команды получаются устойчиво, библиотека корректно обрабатывает повтор, а питание платы не проседает. После этого можно расширить проект дисплеем или меню, сохранив обработку ошибок приёма.

Скетч ниже переключает светодиод на D8 одной кнопкой. Он проверяет протокол, адрес и команду, а кадры повтора пропускает, чтобы удержание не мигало светодиодом.

// Переключение светодиода кнопкой пульта
// Arduino-IRremote 4.x; OUT приёмника – D2
#include <IRremote.hpp>

const byte IR_PIN = 2;
const byte LED_PIN = 8;  // светодиод через резистор
// Подставьте адрес и команду своей кнопки
// из Serial Monitor (здесь – пример)
const uint16_t ADDR = 0x00;
const uint8_t CMD_TOGGLE = 0x45;

bool ledOn = false;

void setup() {
  pinMode(LED_PIN, OUTPUT);
  IrReceiver.begin(IR_PIN);
}

void loop() {
  if (!IrReceiver.decode()) return;
  IRData &d = IrReceiver.decodedIRData;
  bool repeat = d.flags & IRDATA_FLAGS_IS_REPEAT;
  if (d.protocol != UNKNOWN && !repeat &&
      d.address == ADDR && d.command == CMD_TOGGLE) {
    ledOn = !ledOn;
    digitalWrite(LED_PIN, ledOn);
  }
  IrReceiver.resume();
}

Значения ADDR и CMD_TOGGLE замените адресом и командой своей кнопки из первого скетча.

Помехи от солнца, ламп и других устройств

ИК-приёмник работает с оптическим сигналом, поэтому на его работу влияют направленность, солнечный свет, некоторые осветительные приборы, расстояние и закрывающие предметы. При расположении рядом с мощной светодиодной лампой датчик может получать помехи от её драйвера. На длинных проводах добавляются электрические наводки на питание и линию OUT. Если приёмник работает только вблизи пульта, проверьте его частоту, качество батареек пульта, ориентацию корпуса и наличие источников помех. Некорректный приём не всегда выглядит как полное отсутствие данных: иногда библиотека показывает неизвестные протоколы или случайные последовательности. Для диагностики полезно попробовать несколько пультов, затем убрать устройство от окна и светильников, после чего сравнить логи. Смена библиотеки без анализа этих обстоятельств обычно не решает проблему на уровне физического сигнала.

ESP32, Arduino Nano и уровни логики

Идея подключения похожа для разных контроллеров, но электрические уровни имеют значение. Классическая Arduino Uno использует определённый диапазон питания, а ESP32 обычно требует входных логических уровней 3,3 В и не рассчитана на произвольную подачу 5 В на GPIO. Если выход модуля подтянут к напряжению выше допустимого для контроллера, нужен другой способ питания или согласования. У некоторых демодуляторов рабочее питание допускает 3,3 В, у других границы отличаются. Поэтому при переносе схемы с Uno на ESP32 перепроверьте питание датчика, уровни OUT и совместимость используемого GPIO с библиотекой. Также у разных плат Arduino может быть другая организация таймеров, что важно для ИК-передачи; для простого приёма требования часто мягче. Прежде чем заявлять поддержку, откройте документацию библиотеки по конкретной архитектуре и её актуальной версии.

Почему ИК-приёмник не реагирует: таблица причин

Если в мониторе порта нет строк, сначала проверьте загрузку скетча и выбранную скорость Serial. Если строки появляются, но данные пустые – проверьте номер входного пина и провод OUT. Если приёмник внезапно нагревается, питание необходимо сразу отключить и проверить распиновку. Если код меняется при каждом нажатии одной кнопки, изучите режимы повтора, помехи и формат, в котором библиотека выводит результаты. Если реакция есть только на очень близком расстоянии, проверьте частоту несущей, батарейки и освещение. Если часть кнопок работает, а часть нет, возможна несовместимость протокола или отличие адреса. Сводка – в таблице «симптом – вероятная причина – проверка». Многие ошибки устраняются последовательной проверкой питания, сигнального пина и библиотечного примера, а не заменой приёмника.

СимптомВе­роятная при­чи­наПро­верка
в мо­ни­то­ре порта нет строкскетч не загру­жен, не­верная ско­ростьзагрузка без ошибок, ско­рость 115 200 бод
строки есть, данных нетне тот номер входа, обрыв OUTIR_PIN в скетче и провод OUT
приёмник нагре­ваетсяпе­ре­пу­та­ны выводысразу отклю­чить пи­та­ние, све­рить распи­новку
код ме­няется при каждом на­жа­тиикадры повто­ра, помехи, формат выводафлаг повто­ра, усло­вия осве­ще­ния
приём только вблизидругая не­су­щая, ба­та­рейки, засветкачасто­та приёмни­ка, ба­та­рейки пульта
ра­бо­тает часть кнопокдругой про­то­кол или адреспро­то­кол и адрес в Serial Monitor

Как составить таблицу команд своего пульта

После устойчивого приёма полезно создать небольшую таблицу с колонками «кнопка», «протокол», «адрес», «команда» и «признак повтора». Пройдите по клавишам по одной, каждый раз записывая значения из Serial Monitor. Если команда меняется при удержании, проверьте, не печатает ли библиотека специальный повторный кадр вместо исходного значения. Для разных телевизионных пультов может совпадать код отдельной команды, поэтому в программе лучше проверять не только число команды, но и адрес, когда протокол его предоставляет. Затем зафиксируйте реакцию на неизвестный пакет: устройство не должно активировать нагрузку из-за случайного шума. В настольном примере достаточно мигать светодиодом, а для настоящего управления насосом, нагревателем или приводом должны существовать независимые аппаратные механизмы безопасности. Таблица кодов станет полезным приложением к статье, которое читатель сможет заполнить собственными данными, не копируя чужую настройку пульта.

КнопкаПро­то­колАдресКо­мандаПовтор
пи­та­ние
громкость +
громкость –
влево
вправо
Шаблон для своего пульта: значения переписывают из Serial Monitor.

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

На корпусах бытовых пультов обычно не написаны частота несущей и кодовый протокол. Некоторые устройства используют стандартные ИК-команды, другие – фирменные расширения, комбинации клавиш или радиосвязь. Приёмник, рассчитанный на определённую частоту, может обнаруживать часть сигналов с пониженной чувствительностью, что особенно заметно на расстоянии. Если Arduino успешно распознаёт пульт с одного метра, но теряет пакеты на трёх, проверьте угол и условия освещения, а затем паспорт частоты приёмника. Не пытайтесь компенсировать несовместимость мощным передатчиком или повышением напряжения на датчике. Лучше подобрать правильный приёмник и протокол. Для тестов используйте простой известный ИК-пульт, удалите потенциальные помехи и сохраните лог нескольких нажатий. После этого можно объективно сравнивать результат при смене датчика или версии программной библиотеки.

Частые вопросы

Куда подключать OUT ИК-приёмника?

К выбранному цифровому входу Arduino, указанному в скетче; земля и питание подключаются отдельно.

Почему приёмник не видит пульт?

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

Все ли ИК-приёмники имеют одинаковую распиновку?

Нет, расположение ножек зависит от конкретного корпуса и модели.

Можно ли управлять Arduino пультом от телевизора?

Часто да, если пульт действительно использует ИК и приёмник совместим по несущей и протоколу.

Почему при удержании команды повторяются?

Большинство протоколов предусматривают повторные кадры; в программе нужно отдельно обработать удержание.

Материалы по теме