Компоненты · 4 мин чтения

ИК-приёмник и пульт: проекты с дистанционным управлением на Arduino

Как работает инфракрасный (ИК) приёмник? Подключение VS1838B, чтение кодов кнопок библиотекой IRremote, протокол NEC, управление светодиодами и реле с пульта, отправка ИК-сигнала ИК-светодиодом, работа с ESP32 и Pico.

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

Инфракрасный ИК-приёмник VS1838B
Инфракрасный приёмник (VS1838B): внутри чёрного купола светочувствительный диод и небольшая схема, которая декодирует сигнал; у него 3 ножки.

Как работает инфракрасный пульт?

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

Какая кнопка нажата, закодировано в длительности импульсов и пауз между ними. Для этого есть разные «языки», которые называют протоколами: самый распространённый — NEC (байт адреса и байт команды), также часто встречаются протоколы Sony, RC5 (Philips) и Samsung. К счастью, декодированием занимается библиотека, тебе остаётся только прочитать код кнопки.

Чтобы проверить, работает ли пульт, направь камеру телефона на светодиод пульта и нажми кнопку. Инфракрасный свет, невидимый глазу, на экране камеры выглядит как фиолетово-белое мерцание.

Характеристики (VS1838B)

ПараметрЗначение
Несущая частота38 kHz
Длина волныОколо 940 нм
Питание2,7–5,5 V
Дальность8–10 м (зависит от батарейки пульта и угла)
Угол обзораОколо ±35°
ВыходLOW, пока есть сигнал (активный LOW)
ВыводыOUT, GND, VCC

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

Вывод приёмникаArduino UnoESP32Raspberry Pi Pico
OUT (S)D2GPIO 15GP16
GND (–)GNDGNDGND
VCC (+)5V3V33V3
У голого VS1838B порядок выводов, если купол смотрит на тебя, слева направо такой: OUT, GND, VCC; у модулей на плате ориентируйся на подписи на плате. Если перепутать VCC и GND, приёмник нагреется и за несколько секунд выйдет из строя.

Чтение кодов кнопок библиотекой IRremote

В «Менеджере библиотек» (Library Manager) найди IRremote и установи библиотеку от Armin Joachimsmeyer. Код ниже работает с версией 4.x: при каждом нажатии кнопки он выводит в монитор порта протокол, адрес и код команды. Если в примерах из интернета встречаются команды вроде IRrecv и decode(&results), они относятся к старой версии.

C++ (Arduino IDE)
1#include <IRremote.hpp>
2
3const int IR_PIN = 2;
4
5void setup() {
6  Serial.begin(9600);
7  IrReceiver.begin(IR_PIN, ENABLE_LED_FEEDBACK);   // sinyal gelince dahili LED yanar / onboard LED blinks on signal
8}
9
10void loop() {
11  if (IrReceiver.decode()) {
12    Serial.print("Komut / command: 0x");
13    Serial.println(IrReceiver.decodedIRData.command, HEX);
14    IrReceiver.printIRResultShort(&Serial);        // protokol ve adres / protocol and address
15    IrReceiver.resume();                           // sonraki tuşa hazırlan / ready for the next key
16  }
17}

Нажимай кнопки пульта по одной и записывай коды. Маленькие пульты на 21 кнопку из наборов обычно работают по протоколу NEC, и коды у них чаще всего такие, как ниже; но всё равно проверь их, считав коды своего пульта:

КнопкаКоманда (NEC)
CH-0x45
CH0x46
CH+0x47
PREV0x44
NEXT0x40
PLAY/PAUSE0x43
VOL-0x07
VOL+0x15
00x16
10x0C
20x18
30x5E

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

Когда коды известны, каждой кнопке можно дать свою задачу. В примере ниже кнопка «1» переключает реле, а VOL+ и VOL- задают яркость светодиода через PWM. Если кнопку удерживать, пульт шлёт сигналы повтора; для задач «вкл/выкл» эти повторы нужно игнорировать, иначе реле будет щёлкать туда-обратно. Про подключение реле читай в статье Что такое модуль реле?

C++ (Arduino IDE)
1#include <IRremote.hpp>
2
3const int IR_PIN = 2;
4const int LED_PIN = 9;       // PWM pini / PWM pin
5const int RELAY_PIN = 7;     // aktif LOW röle / active-LOW relay
6
7bool relayOn = false;
8int brightness = 128;
9
10void setup() {
11  pinMode(LED_PIN, OUTPUT);
12  pinMode(RELAY_PIN, OUTPUT);
13  digitalWrite(RELAY_PIN, HIGH);
14  IrReceiver.begin(IR_PIN);
15}
16
17void loop() {
18  if (!IrReceiver.decode()) return;
19  bool repeat = IrReceiver.decodedIRData.flags & IRDATA_FLAGS_IS_REPEAT;   // tuş basılı tutuluyor / key held down
20  switch (IrReceiver.decodedIRData.command) {
21    case 0x0C:                               // "1": röleyi aç-kapa / toggle the relay
22      if (!repeat) {
23        relayOn = !relayOn;
24        digitalWrite(RELAY_PIN, relayOn ? LOW : HIGH);
25      }
26      break;
27    case 0x15:                               // VOL+: daha parlak / brighter
28      brightness = min(brightness + 15, 255);
29      break;
30    case 0x07:                               // VOL-: daha sönük / dimmer
31      brightness = max(brightness - 15, 0);
32      break;
33  }
34  analogWrite(LED_PIN, brightness);
35  IrReceiver.resume();                       // sonraki tuşa hazırlan / ready for the next key
36}
На Arduino Uno библиотека IRremote использует Timer2. Поэтому PWM на пинах 3 и 11 и функция tone(), которой пользуются для зуммеров, могут конфликтовать с библиотекой; подключай светодиод к пину 5, 6, 9 или 10.

Отправка ИК-сигналов с Arduino

Arduino умеет не только слушать пульты, но и сама быть пультом. Подключи ИК-светодиод (940 нм) к пину 3 Uno через резистор 100 Ω; чтобы увеличить дальность, светодиод можно запитать через транзистор. Сначала считай кодом выше пульт устройства, которым хочешь управлять, чтобы узнать его адрес и команду, затем отправь тот же код с Arduino:

C++ (Arduino IDE)
1#include <IRremote.hpp>
2
3const int IR_SEND_PIN = 3;    // IR LED, 100 Ω direnç ile / IR LED with a 100 Ω resistor
4
5void setup() {
6  IrSender.begin(IR_SEND_PIN);
7}
8
9void loop() {
10  IrSender.sendNEC(0x00, 0x46, 0);   // adres, komut, tekrar sayısı / address, command, repeats
11  delay(5000);
12}

ИК на ESP32 и Raspberry Pi Pico

VS1838B нормально работает от 3,3 V, поэтому подключается к ESP32 и Pico напрямую. Библиотека IRremote поддерживает ESP32; приёмник можно подключить к любому входному пину, например к GPIO 15. С ESP32 можно пересылать нажатия кнопок пульта на другие устройства по Wi-Fi или собрать «умный пульт», который передаёт команды с телефона на телевизор через ИК-светодиод. На Pico с MicroPython используют библиотеку micropython_ir от Peter Hinch:

MicroPython
1from machine import Pin
2from ir_rx.nec import NEC_8          # micropython_ir kütüphanesi / library (Peter Hinch)
3import time
4
5def on_key(command, address, ctrl):
6    if command >= 0:                 # negatif değerler tekrar ya da hata / negatives mean repeat or error
7        print("Komut / command: 0x{:02X}".format(command))
8
9ir = NEC_8(Pin(16, Pin.IN), on_key)  # GP16 → OUT
10
11while True:
12    time.sleep(1)

Идеи проектов с ИК-приёмником и пультом

  • Лампа с пультом: включай сетевую лампу через реле свободной кнопкой пульта от телевизора.
  • Цветной пульт: меняй цвет RGB-светодиода цифровыми кнопками.
  • Машинка-робот на пульте: машинка с двумя моторами, которой рулят кнопками-стрелками.
  • Музыкальная шкатулка: назначь каждой цифровой кнопке свою мелодию; про звук читай в статье Что такое зуммер?
  • Обучаемый пульт: записывай коды других пультов и отправляй их с одной Arduino.
  • Кодовый замок: открывай замок сервоприводом, когда введена правильная последовательность кнопок.

Частые ошибки и как их исправить

  • Коды вообще не приходят: провод OUT подключён не к тому пину, что в коде, ножки приёмника перепутаны или села батарейка пульта; проверь пульт камерой телефона.
  • Пример не компилируется: старые примеры из интернета написаны для IRremote 2.x; в версии 4.x используются IrReceiver.begin() и IrReceiver.decode().
  • Появляются случайные коды: возможно, на приёмник падает прямой солнечный свет или свет люминесцентной лампы; переставь его в тень.
  • Кнопка «вкл/выкл» срабатывает дважды: сигналы повтора не игнорируются; проверь флаг IRDATA_FLAGS_IS_REPEAT.
  • tone() или PWM на пинах 3 и 11 работают странно: на Uno они используют тот же таймер (Timer2), что и IRremote.
  • Очень маленькая дальность при отправке ИК-светодиодом: запитай светодиод большим током через транзистор и направь его на устройство.

ИК-приёмник — самый простой и дешёвый способ перейти на беспроводное управление; даже старые пульты, которые валяются дома, получают вторую жизнь в новых проектах. В приложении BlueGrays есть проекты со схемами и кодом: чтение кодов пульта, переключение светодиодов, мелодии с пульта, управление сетевой лампой и универсальный пульт на ESP32.

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

На каком расстоянии ИК-приёмник ловит сигнал?

Приёмники вроде VS1838B ловят сигнал на расстоянии до 8–10 метров при хорошем пульте и прямой видимости. Дальность уменьшается, когда садится батарейка пульта, растёт угол и становится светлее вокруг.

Любой ли пульт работает с Arduino?

Работают почти все инфракрасные пульты на 38 kHz, а IRremote декодирует большинство распространённых протоколов. С пультами на 36, 40 или 56 kHz дальность может быть меньше. Радиопульты (например, на 433 MHz) ИК-приёмником прочитать нельзя.

Работает ли ИК-приёмник на солнце?

Фильтр внутри приёмника в основном подавляет постоянный свет, но прямое солнце может «ослепить» приёмник и сильно уменьшить дальность. На улице держи приёмник в тени или в небольшой защитной трубке.

Работает ли ИК-пульт через стену?

Нет. Инфракрасный свет не проходит сквозь стены: между пультом и приёмником нужна прямая видимость или поверхность, от которой свет может отразиться. Чтобы управлять устройством в другой комнате, используй радиомодули или Wi-Fi.

Какую версию IRremote использовать?

Используй актуальную версию 4.x с IrReceiver.begin(), IrReceiver.decode() и decodedIRData.command. Команды IRrecv irrecv(pin) и decode(&results) из старых примеров в интернете относятся к версии 2.x и с новой версией несовместимы.

Можно ли использовать телефон как пульт?

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

Все проекты
Чтение кодов ИК-пульта
#16Новичок
Premium

Чтение кодов ИК-пульта

Каждая кнопка на пульте от телевизора отправляет секретный код светом, которого ты не видишь. ИК-приёмник ловит этот свет, а Arduino выводит на экран компьютера код каждой нажатой кнопки. Узнав эти ко

4.5(39)
55
Включение светодиода ИК-приёмником и пультом
#17Средний
Premium

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

Как будто управляешь тремя отдельными лампами, не вставая с кресла: клавиши 1, 2 и 3 на пульте включают синий, красный и зелёный светодиоды, а клавиши 4, 5 и 6 выключают их в том же порядке. Клавиша п

4.7(45)
66
Мелодии с ИК-пультом и зуммером
#18Новичок
Premium

Мелодии с ИК-пультом и зуммером

Собери музыкальную шкатулку, которая играет мелодии по кнопкам пульта от телевизора. Инфракрасный приёмник ловит сигнал пульта; одна кнопка играет на зуммере весёлую мелодию из видеоигры, другая — зна

4.8(57)
74
Включение лампы 220V пультом
#21Продвинутый
Premium

Включение лампы 220V пультом

Включай и выключай настоящую лампу у себя дома пультом от телевизора, не вставая с дивана. Arduino читает невидимый световой сигнал пульта; кнопка питания щёлкает реле и включает лампу, а кнопка отклю

4.4(22)
30
Лазерная охранная система
#23Продвинутый
Premium

Лазерная охранная система

Совсем как сцены ограблений с лазерами в фильмах: лазерный луч светит на датчик освещённости, и как только кто-то входит и прерывает луч, загорается красный светодиод и начинает звучать зуммер. Сигнал

4.8(60)
77
Пульт ДУ с ИК-приёмником на ESP32 (с экраном LCD)
#124Средний
Premium

Пульт ДУ с ИК-приёмником на ESP32 (с экраном LCD)

В этом проекте модуль ИК-приёмника TSOP4838 ловит сигналы пульта от телевизора, кондиционера или любого другого инфракрасного пульта с помощью ESP32. С библиотекой IRremote v4 расшифрованные ненулевые сырые коды выводятся на I2C LCD-экран. Этот пример помогает узнать коды пульта; включения, выключения или регулировки яркости светодиода с пульта в нём нет. Отличная отправная точка, чтобы превратить старые пульты в управление умным домом.

4.7(19)
30
Универсальный ИК-пульт на ESP32 (ИК-приёмник + пульт + 3 светодиода + зуммер + OLED)
#143Продвинутый
Premium

Универсальный ИК-пульт на ESP32 (ИК-приёмник + пульт + 3 светодиода + зуммер + OLED)

С ESP32 можно читать обычный ИК-пульт и управлять с него своим устройством! В этом проекте инфракрасный приёмник (протокол NEC, 38 kHz) ловит сигналы 20-кнопочного ИК-пульта. Каждой кнопке задано своё действие: кнопки 1, 2 и 3 переключают три отдельных светодиода, кнопка PWR выключает все, а цифры 4–9 показывают на OLED особые символы. OLED-дисплей SSD1306 крупно показывает последнюю нажатую кнопку и описание действия.

4.5(9)
16
Лазерная сигнализация
#22Средний
Premium

Лазерная сигнализация

Ты ставишь невидимую лучевую ограду, совсем как в кино. Лазер светит на датчик освещённости с другой стороны; как только кто-то проходит и прерывает луч, загорается светодиод и звучит зуммер, а когда

4.8(64)
83