ИК-приёмник: как это работает
Пульт от телевизора передаёт команды инфракрасными вспышками, модулированными на 38 кГц. ИК-приёмник (VS1838B, TSOP38238) — трёхногая микросхема, которая демодулирует эти вспышки в цифровой сигнал. На Arduino остаётся только декодировать — какая кнопка нажата.
Это открывает проекты: умный дом по пульту, макро-команды, захват протокола любого пульта и управление техникой из кода.
Подключение приёмника
VS1838B (прищупкой к себе, выводы вниз):
левый — OUT ── Arduino D2
средний — GND
правый — VCC (5 В)
У TSOP38238 порядок другой — смотрите даташит, но логика та же: OUT на пин, VCC и GND. Конденсатор 100 мкФ между VCC и GND рядом с приёмником стабилизирует.
Библиотека IRremote: читаем коды
Ставим IRremote (Armin Joachimsmeyer). Минимальный приёмник:
#include <IRremote.hpp>
#define IR_PIN 2
void setup() {
Serial.begin(9600);
IrReceiver.begin(IR_PIN, ENABLE_LED_FEEDBACK);
Serial.println("жду ИК-сигнал...");
}
void loop() {
if (IrReceiver.decode()) {
// код кнопки — в decodedIRData
Serial.print("протокол: ");
Serial.println(IrReceiver.decodedIRData.protocol);
Serial.print("адрес: 0x"); Serial.println(IrReceiver.decodedIRData.address, HEX);
Serial.print("команда: 0x"); Serial.println(IrReceiver.decodedIRData.command, HEX);
IrReceiver.resume(); // готовимся к следующему
}
}
Нажмите кнопку на любом пульте — в Serial увидите протокол (NEC, Sony, Samsung...), адрес устройства и код команды. Запишите коды нужных кнопок — это карта пульта.
Выполняем команды
const uint32_t CMD_POWER = 0x45; // ваш код кнопки
const uint32_t CMD_VOL_UP = 0x46;
const uint32_t CMD_VOL_DN = 0x15;
if (IrReceiver.decode()) {
uint32_t cmd = IrReceiver.decodedIRData.command;
switch (cmd) {
case CMD_POWER:
digitalWrite(RELAY_PIN, !digitalRead(RELAY_PIN)); // переключить реле
break;
case CMD_VOL_UP:
volume += 10;
break;
case CMD_VOL_DN:
volume = max(0, volume - 10);
break;
}
IrReceiver.resume();
}
Важно: после decode() обязательно resume() — иначе следующее нажатие не прочитается.
Повторы и удержание кнопки
Когда кнопку держат, пульт шлёт повторы с флагом isRepeat. Для «зажал — громкость растёт»:
if (IrReceiver.decode()) {
if (IrReceiver.decodedIRData.flags & IRDATA_FLAGS_IS_REPEAT) {
// удержание — обрабатывайте по-другому
}
IrReceiver.resume();
}
Обратная сторона: ИК-передатчик
Arduino может и отправлять команды — управлять телевизором, кондиционером, приставкой. Нужен ИК-светодиод (не путать с обычным!) и транзистор — светодиод питается сильнее пина:
Arduino D3 ── база транзистора через резистор 1к
Эмиттер ── GND
Коллектор ── ИК-светодиод ── резистор 100 Ом ── 5V
#include <IRremote.hpp>
IrSender.begin(3); // пин для передатчика (обычно пин с таймером)
// отправить код NEC
IrSender.sendNEC(0x00, 0x45, 0); // адрес, команда, повторы
Протоколы бывают разные: NEC, Sony, Samsung, RC5 — библиотека знает десятки. Коды берут из базы IRDB или снимают приёмником с оригинального пульта.
Проект: умное включение
if (IrReceiver.decode()) {
if (IrReceiver.decodedIRData.command == MY_POWER_CODE) {
IrSender.sendNEC(TV_ADDR, TV_POWER, 0); // включаем телевизор
digitalWrite(RELAY, LOW); // и розетку ресивера
}
IrReceiver.resume();
}
Одна кнопка на вашем пульте включает сразу два устройства — макросы по ИК.
Типичные проблемы
- Приёмник молчит: перепутаны выводы VS1838B, пин не тот, пульт далеко/батареи сели.
- Коды каждый раз разные: пульт шлёт toggle-бит (Sony) или вы ловите помехи — берите только command, фильтруйте по протоколу.
- Передатчик не работает: ИК-светодиод невидим — проверяйте камерой телефона (видно фиолетовое свечение); без транзистора тока не хватает.
- Дальность передатчика маленькая: ИК-светодиод хочет ~100 мА — транзистор обязателен, питание с 5V.
Итог
ИК-приёмник — три ноги и IrReceiver.decode(): получили протокол, адрес и команду — и управляйте чем угодно с любого пульта. Передатчик добавляет обратную сторону: Arduino сама притворяется пультом для телевизора и кондиционера. Главное — помнить про resume() и транзистор для ИК-диода.
Полный пример: пульт управляет светодиодом
#include <IRremote.hpp>
const int IR_PIN = 2;
const int LED = 13;
void setup() {
IrReceiver.begin(IR_PIN, ENABLE_LED_FEEDBACK);
pinMode(LED, OUTPUT);
Serial.begin(9600);
}
void loop() {
if (IrReceiver.decode()) {
Serial.printf("протокол: %d, команда: 0x%X\n",
IrReceiver.decodedIRData.protocol,
IrReceiver.decodedIRData.command);
IrReceiver.resume();
if (IrReceiver.decodedIRData.command == 0x45) { // ваша кнопка
digitalWrite(LED, !digitalRead(LED));
}
}
}
Протоколы ИК-пультов
Разные производители используют разные протоколы кодирования: NEC, Sony, RC5, Samsung, Panasonic. IRremote распознаёт их автоматически — вам нужно только выяснить код каждой кнопки. Включите вывод printIRResultShort — получите таблицу протокол/адрес/команда для каждого нажатия.
Отправка ИК-команд
Можно не только принимать, но и излучать — превратить Arduino в пульт:
#include <IRremote.hpp>
const int IR_SEND = 3;
void setup() {
IrSender.begin(IR_SEND);
}
void loop() {
IrSender.sendNEC(0x00, 0x45, 0); // адрес, команда, повторы
delay(2000);
}
Управляйте телевизором, кондиционером, проектором — клон любого ИК-пульта.
Типичные приёмники ИК
- TSOP38238 / VS1838B — самый распространённый, три ноги, 38 кГц.
- IRM-3638 — аналог, на модуле с подтяжками.
- На модулях KY-022 — приёмник + резистор + светодиод готовы.
Проблемы и решения
- Не принимает ничего: перепутаны ноги приёмника (обычно слева-направо Out-GND-VCC при виде на пузырёк), пин не подходит, не поднята подтяжка.
- Считывает мусор: засветка — экранируйте приёмник или используйте модуль с металлическим корпусом.
- Одна кнопка = разные коды: пульт шлёт повторы с флагом — берите
commandприprotocol != UNKNOWN. - ESP32 не работает:
IRremoteдля ESP32 —IRremoteESP8266, другая библиотека.
Проекты
- Пульт для любой техники — клонировать и расширить.
- Универсальный пульт: один Arduino заменяет пять.
- ИК-барьер (передатчик + приёмник) — детектор пересечения линии.
- Управление роботом с обычного ТВ-пульта.