ИК пульт

ИК-пульт для Arduino — это устройство, которое позволяет управлять Arduino с помощью инфракрасного сигнала. Обычно ИК-пульт состоит из передатчика и приемника инфракрасного излучения. Пульт отправляет кодированные сигналы на приемник, который декодирует их и передает Arduino соответствующую команду. Это позволяет управлять Arduino с помощью кнопок на пульте, что может быть удобно для создания умных домов, игрушек или других проектов, где требуется дистанционное управление.

  • Пульт с интерфейсом NEC
  • Приёмник TL1838
  • ИК светодиод

С его помощью можно:

  • Управлять своим устройством с пульта (комплектный пульт + приёмник)
  • Управлять своим устройством с любого пульта (от телевизора/люстры + приёмник)
  • Управлять телевизором, эмулируя его пульт (ИК светодиод)
  • Передавать данные с одной Ардуины на другую (ИК светодиод + приёмник), например библиотека GyverTransfer

Подключение

Модуль ИК приёмника подключается следующим образом:

  • S: сигнальный пин, любой цифровой пин МК
  • -: GND
  • Средний (не подписан): VCC

Библиотеки

  • IRremote – очень тяжёлая универсальная “стандартная” библиотека
  • IRLremote – более оптимизированная и продвинутая библиотека от NicoHood
  • NecDecoder – наша библиотека для интерфейса NEC (Hash), на котором работают все китайские пульты

В примерах на этом сайте мы будем использовать NecDecoder как очень лёгкую и простую в использовании. Библиотека идёт в архиве к набору GyverKIT, а свежую версию всегда можно установить/обновить из встроенного менеджера библиотек Arduino по названию NecDecoder. Краткая документация находится по ссылке выше, базовые примеры есть в самой библиотеке.

Примеры

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

Перед использованием нужно знать коды кнопок пульта, загружаем вот этот пример и открываем порт:

// приём команд с пульта
// приёмник подключать на прерывание по FALLING
#include <NecDecoder.h>
NecDecoder ir;
void setup() {
  Serial.begin(9600);
  // подключил на D2, прерывание 0
  attachInterrupt(0, irIsr, FALLING);
}
// в прерывании вызываем tick()
void irIsr() {
  ir.tick();
}
void loop() {
  // если пакет успешно принят
  if (ir.available()) {
    // вывести команду (8 бит)
    Serial.print("0x");
    Serial.println(ir.readCommand(), HEX);
  }
}

Стандартные коды кнопок пульта

#define IR_1    0xA2
#define IR_2    0x62
#define IR_3    0xE2
#define IR_4    0x22
#define IR_5    0x2
#define IR_6    0xC2
#define IR_7    0xE0
#define IR_8    0xA8
#define IR_9    0x90
#define IR_STAR 0x68
#define IR_0    0x98
#define IR_HASH 0xB0
#define IR_UP   0x18
#define IR_LEFT 0x10
#define IR_OK   0x38
#define IR_RIGHT 0x5A
#define IR_DOWN 0x4A

Парсим нажатия

// приёмник на D2

#define IR_1    0xA2
#define IR_2    0x62
#define IR_3    0xE2
#define IR_4    0x22
#define IR_5    0x2
#define IR_6    0xC2
#define IR_7    0xE0
#define IR_8    0xA8
#define IR_9    0x90
#define IR_STAR 0x68
#define IR_0    0x98
#define IR_HASH 0xB0
#define IR_UP   0x18
#define IR_LEFT 0x10
#define IR_OK   0x38
#define IR_RIGHT 0x5A
#define IR_DOWN 0x4A

#include <NecDecoder.h>
NecDecoder ir;

void setup() {
  Serial.begin(9600);
  attachInterrupt(0, irIsr, FALLING);
}

void irIsr() {
  ir.tick();
}

void loop() {
  if (ir.available()) {
    switch (ir.readCommand()) {
      // выводим в порт, тут может быть ваш код
      case IR_1: Serial.println("Pressed 1"); break;
      case IR_2: Serial.println("Pressed 2"); break;
      case IR_3: Serial.println("Pressed 3"); break;
      case IR_4: Serial.println("Pressed 4"); break;
      case IR_5: Serial.println("Pressed 5"); break;
      case IR_6: Serial.println("Pressed 6"); break;
      case IR_7: Serial.println("Pressed 7"); break;
      case IR_8: Serial.println("Pressed 8"); break;
      case IR_9: Serial.println("Pressed 9"); break;
      case IR_STAR: Serial.println("Pressed *"); break;
      case IR_0: Serial.println("Pressed 0"); break;
      case IR_HASH: Serial.println("Pressed #"); break;
      case IR_UP: Serial.println("Pressed up"); break;
      case IR_LEFT: Serial.println("Pressed left"); break;
      case IR_OK: Serial.println("Pressed ok"); break;
      case IR_RIGHT: Serial.println("Pressed right"); break;
      case IR_DOWN: Serial.println("Pressed down"); break;
    }
  }
}