Добавить в избранное

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

Чтение ≈ 4 мин

Подключаем ИК-приёмник VS1838B к Arduino: библиотека IRremote, чтение кодов кнопок пульта, выполнение команд и обратная сторона — ИК-передатчик для управления телевизором и кондиционером.

ИК-приёмник: как это работает

Пульт от телевизора передаёт команды инфракрасными вспышками, модулированными на 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 заменяет пять.
  • ИК-барьер (передатчик + приёмник) — детектор пересечения линии.
  • Управление роботом с обычного ТВ-пульта.
Поделиться
Понравился материал?

Комментарии

Добавить комментарий