Перейти к содержанию

Как сделать ИК-передатчик на ESP32?

Обновлено Редакция GAW

Пульт ДУ передаёт не постоянный уровень, а пачки несущей 38 кГц, разделённые паузами; код заложен в длительностях. У ESP32 для этого есть готовая периферия — RMT (Remote Control Transceiver), изначально задуманная именно для ИК. Она выдаёт последовательность символов «уровень + длительность» без участия процессора.

Что настроить

  1. Канал передачи с разрешением 1 МГц: один такт — 1 мкс. Так в примере ESP-IDF ir_nec_transceiver.
  2. Кодировщик: кадр NEC — это 34 символа: начальная пачка и пауза, 32 бита и завершающая пачка.
  3. Несущая: rmt_apply_carrier() с частотой 38 000 Гц и скважностью 0,33. Генератор несущей сам заполняет ею высокие участки символов.
  4. Выход на ИК-светодиод через транзисторный ключ.
Элемент кадра NEC (пример ESP-IDF)ПачкаПаузаТактов при 1 МГц
Начало9000 мкс4500 мкс9000 + 4500
Бит 0560 мкс560 мкс560 + 560
Бит 1560 мкс1690 мкс560 + 1690

Пример ESP-IDF округляет длительности до 560 и 1690 мкс; калькулятор NEC берёт точные кратные 562,5 мкс. Для приёмника разница несущественна.

Почему частота несущей не ровно 38 кГц

Генератор несущей делит такт группы целым числом. Наш расчёт для такта 80 МГц:

N=80 МГц38 кГц≈2105,f=80 МГц2105≈38 004,75 ГцN = \frac{80\ \text{МГц}}{38\ \text{кГц}} \approx 2105, \qquad f = \frac{80\ \text{МГц}}{2105} \approx 38\,004{,}75\ \text{Гц}

Ошибка — 0,01 %, ИК-приёмнику это безразлично. От медленного REF_TICK 1 МГц получилось бы лишь 26 тактов на период и 38 461 Гц. Как драйвер выбирает делители и что меняется на других чипах, показывает калькулятор RMT ESP32: он выдаёт и готовый код канала, кодировщика и несущей для ESP-IDF v5 и v6.

Светодиод

ИК-светодиоду для дальности нужен импульсный ток больше, чем способен дать вывод, поэтому между ESP32 и светодиодом ставят ключ, а ток задают резистором — его посчитает калькулятор резистора для светодиода. Скважность несущей 33 % заодно снижает средний ток светодиода втрое по сравнению с постоянным свечением во время пачки (наш вывод). Подробнее о периферии — в термине RMT.

Похожие вопросы

Почему с разрешением 10 МГц код NEC не передаётся?

Половина символа RMT вмещает не больше 32 767 тактов, а начальная пачка NEC длится 9 мс: при 10 МГц это 90 000 тактов. Наш расчёт: 9 мс помещаются в поле при разрешении не выше 3,64 МГц, поэтому для ИК берут 1 МГц — такт 1 мкс, как в примере ESP-IDF.

Можно ли подключить ИК-светодиод прямо к выводу ESP32?

Для дальности в несколько метров светодиоду нужен ток в десятки и сотни миллиампер импульсами, а вывод ESP32 рассчитан на единицы и десятки миллиампер. Поэтому светодиод включают через NPN-транзистор или MOSFET с резистором в цепи светодиода — ключ и резистор посчитают калькуляторы ключа и резистора для светодиода (наш вывод).

Как принять ИК-код на ESP32?

Тем же RMT, но каналом приёма: к выводу подключают ИК-приёмник на 38 кГц, который уже снимает несущую, и RMT записывает длительности импульсов и пауз в символы. В примере ESP-IDF приёмник висит на GPIO19, а декодер сверяет длительности с таблицей NEC.

Источники

  1. Espressif. ESP-IDF Programming Guide v6.1: Remote Control Transceiver (RMT) — символ — два периода по 15 бит и два бита уровня, длительность 1–32 767 тактов, ноль — конец передачи; rmt_carrier_config_t: frequency_hz и duty_cycle, rmt_apply_carrier(); пример несущей 38 кГц, 33 %
  2. Espressif. ESP-IDF v6.1, пример peripherals/rmt/ir_nec_transceiver — EXAMPLE_IR_RESOLUTION_HZ 1 000 000 — такт 1 мкс; передатчик на GPIO18, приёмник на GPIO19; mem_block_symbols 64; carrier_cfg.duty_cycle 0,33, frequency_hz 38 000; кадр NEC: 9000/4500, 560/560, 560/1690 мкс
  3. Espressif. ESP32 Technical Reference Manual v5.8, гл. 30 — такт RMT — APB 80 МГц или REF_TICK; генератор несущей канала; нулевой период — маркер конца

Нашли ошибку?