Мой домашний кинотеатр живёт в закрытой тумбе — и это приговор пульту: дверца из ДСП глушит инфракрасный свет почти в ноль, в лучшем случае одна команда из пяти доезжает через щель. Продавать тумбу ради ресивера не хотелось, поэтому между пультом и прибором встал посредник: маленькая плата, у которой один глаз смотрит в комнату и читает пульт, а один диод — внутрь тумбы и светит на окошко ресивера. Нажатие ловится и немедленно повторяется; для ресивера это выглядит так, будто пульт лежит внутри тумбы рядом с ним.
Механику пересылки раздел уже собирал: в уроке про ретранслятор на одной плате разобран порядок decode → resume → sendNEC, кадр на 68 мс и пересылка удержания. Здесь я ставлю этот механизм в квартиру: считаю сквозную задержку канала, разбираю ловушку, которой в том уроке не было, — собственный передатчик светит в собственный приёмник, — и рассказываю про монтаж, куда ни один даташит не заглянет. Сторона отправки опирается на разбор IrSender.sendNEC, выбор диода и транзисторного плеча тока — на урок про передатчик 940 нм.
Критерий успеха у удлинителя простой и прагматичный: нажал — за 100–150 миллисекунд прибор отработал, глаз разницу с прямым пультом не замечает, автоповтор громкости не сбился. Всё, что укладывается в этот бюджет, — рабочий удлинитель, всё, что вылезает, — повод считать кадры и искать, где канал затыкается.
Тракт: приёмник на D2, передатчик на D3
Схема — два плеча на одной плате. Приёмное: TSOP4838 на пин 2, выход с подтяжкой, как в любой читалке раздела. Передающее: ИК-светодиод на пин 3 — и это не выбор вкуса: IrSender на Uno и Nano раскручивает несущую 38 кГц вторым таймером, а тот привязан именно к пину 3, так что передатчик сам выбирает место жительства. Диод сажаю через транзистор: база через 330 Ом, ток диода 60–100 мА — конуса хватает, чтобы прожечь окошко ресивера с полуметра сквозь полку, а не только в упор.
Теперь хронометраж, ради которого всё считалось. Полный кадр NEC живёт на эфире около 68 мс; пульт при удержании шлёт короткий повтор каждые 110 мс. Значит, у канала есть комфортные 40–100 мс между кадрами: принять, отправить, отдышаться — конвейер не затыкается. Сквозная задержка одного нажатия складывается из приёма и отправки: до 60 мс на декодирование, если поймали кадр не с порога, плюс 68 мс собственной отправки плюс копейки кода — и получается те самые 100–150 мс, которые я обещал. Пересылка — один вызов: sendNEC(decodedIRData.address, decodedIRData.command, 0) с нулём повторов; удержание пересылается само, потому что кадры-повторы пульта приходят в приёмник отдельными кадрами и повторяются по одному. Прикиньте на пальцах: удержание громкости три секунды — это примерно 27 кадров-повторов, и все 27 обязаны доехать, иначе прибор разгоняется рывками, как будто у него нервный тик. Ровно поэтому в скетче нет ни одного delay — любая заморозка loop роняет очередь кадров целиком.
Про ток передатчика — короткий расчёт, который стоит сделать до монтажа. NPN-транзистор типа BC337 или 2N2222: база через 330 Ом с пина 3, диод в коллекторе через резистор 47–68 Ом от пяти вольт — (5 − 1,2)/68 ≈ 56 мА, через 47 Ом — около 80. Пик короткий, кадр живёт 68 мс, средний ток при редких нажатиях — доли миллиампера, а при трёхсекундном удержании громкости диод всё равно остаётся холодным. Можно посадить диод прямо на пин через 100 Ом — доедет до окошка вплотную, но запас конуса стоит пары деталей, и я его беру всегда: тумба вибрирует, клеи стареют, а свет должен доходить при любой геометрии.
Ограничение честно: моя связка понимает NEC-пульты — а их в квартире большинство. Чужой протокол библиотека поймает как «неизвестный», и тогда выручает printIRSendUsage(): после пойманного кадра она печатает готовый вызов отправки, который остаётся скопировать в ветку. Для домашнего удлинителя одного пульта этого хватает всегда, но знайте, где граница, пока не удивились встрече с пультом кондиционера.
// ИК-удлинитель: TSOP на D2, ИК-диод на D3 (IrSender сам ставит несущую там)#include <IRremote.hpp> const int RX_PIN = 2;const unsigned long TX_MUTE_MS = 120; // глушим приём на время отправки unsigned long rxMutedUntil = 0;unsigned long forwarded = 0; void setup() { Serial.begin(9600); IrReceiver.begin(RX_PIN, ENABLE_LED_FEEDBACK); IrSender.begin(); // на Uno несущая встанет на пин 3 Serial.println("udlinitel gotov: D2 - priem, D3 - peredacha");} void loop() { if (IrReceiver.decode()) { if (millis() < rxMutedUntil) { // кадр прилетел, пока мы сами светим: это эхо, не пульт Serial.println("kadry v okno peredachi - eho, glotaem"); IrReceiver.resume(); return; } forwarded++; Serial.print("kadr #"); Serial.print(forwarded); Serial.print(": povtoryaem cmd="); Serial.println(IrReceiver.decodedIRData.command); IrSender.sendNEC(IrReceiver.decodedIRData.address, IrReceiver.decodedIRData.command, 0); rxMutedUntil = millis() + TX_MUTE_MS; // приём закрыт на 120 мс IrReceiver.resume(); }}| Вариант удлинителя | Задержка | Железо | Когда беру |
|---|---|---|---|
| проводной: фотоприёмник и диод на шлейфе | практически ноль | готовый выносной блок, шлейф 2-5 м | тумба рядом, лень паять |
| ретранслятор на Arduino | 100-150 мс на нажатие | TSOP, диод с транзистором, плата | прибор за стеной или в глухой тумбе |
| два ретранслятора цепочкой | 200-300 мс, копятся потери | две платы | квартира-студия с двумя углами |
| заводской ИК-удлинитель | 50-100 мс | коробочка из магазина | нужна гарантия и коробка с проводами |
Эхо: свой передатчик светит в свой приёмник
Ловушка прячется в слове «на одной плате». Диод и TSOP стоят в сантиметрах друг от друга, и приёмник не знает, кто отправитель: свою же отправку он декодирует как чужой кадр — поймал, повторил, поймал эхо своего повтора, повторил ещё раз. Петля замыкается, и прибор в тумбе получает десятки кадров на одно нажатие, а светодиод передатчика строчит сам с собой. Треды на форумах об этом пестрят одной и той же жалобой: после send() приёмник живёт своей жизнью — причина всегда одна, эфир один на всех, и собственный свет для TSOP ничем не отличается от пульта.
Лечится эхо тремя ходами, и я применяю их вместе, а не по одному. Первый — геометрия: приёмник смотрит в комнату, диод — в тумбу, между ними трубка из чёрной термоусадки или изоленты в роли бленды, которая съедает боковой свет. Второй — глушение приёма на время собственной отправки: после sendNEC ставим rxMutedUntil = millis() + 120, и все кадры, прилетевшие в окно передачи, съедаются без разбора; мерить окно честнее от длины кадра — 68 мс плюс запас, в моём скетче 120 мс. Третий — фильтр по адресу из урока про фильтрацию кодов, но для удлинителя он не годится: пересылать нужно всё подряд, фильтр отрежет именно то, за чем удлинитель ставили. Окна на millis, без единого delay, — это тот же приём, что в уроке про millis вместо delay: заморозка loop на время передачи убила бы автоповтор и очередь кадров целиком.
И ещё одна причина, почему окно заглушения стоит держать коротким и точным: за эти 120 мс приёмник слеп не только для эха, но и для пульта. Держать приём выключенным «на всякий случай» по секунде — значит ронять кадры удержания громкости: пользователь держит кнопку, а прибор разгоняется рывками. Чем короче окно при живой защите, тем прозрачнее канал.
Монтаж решает больше, чем код, и вот как стоит моё устройство. Приёмная платка выведена из тумбы: сидит на дверце или на верхней полке с прямой линией взгляда на диван — геометрия приёма отсюда переносится целиком, включая проверку пятна света камерой телефона. Передающий диод приклеен к окошку фотоприёмника ресивера вплотную: на таком расстоянии хватает и 25 мА с пина, но я оставил транзисторное плечо на 60 мА — тумба вибрирует от баса, клеи и стяжки гуляют, и запас по току окупается тем, что переклеивать ничего не приходится. Бленду делайте честной: трубка из чёрной термоусадки диаметром 8–10 мм на приёмник съедает боковой свет, а два слоя изоленты на диод сужают конус до узкого луча — цель светить в прибор, а не в дверцу. И одна оговорка про частоту: TSOP4838 — приёмник ровно на 38 кГц, и редкие пульты на 56 кГц он просто не услышит — если удлинитель молчит на всё подряд, сверьте несущую своего пульта раньше, чем перепаивать схему. Питание — пять вольт от того же блока, что подсвечивает тумбу, земля общая.
После сборки — два теста за пять минут. Первый: пять команд пульта подряд, счёт в мониторе порта совпал с блокнотом — канал прозрачен. Второй: зажмите кнопку громкости на три секунды и слушайте прибор — уровень должен ползти ровно, без рывков; рывки значат, что окно заглушения съедает повторы, и его стоит ужать со 120 до 80–90 мс. Через неделю такое устройство перестаёшь замечать — высшая оценка, которую я знаю для удлинителя.
- 1. Сколько времени полный кадр NEC живёт на эфире?
- 2. Почему приёмник на той же плате, что передатчик, глушат на время sendNEC?
- 3. Что случится с удлинителем, который шлёт кадры и не глушит приём?
- 4. Как поставить передающий диод на окошко ресивера в тумбе?
- 5. Какая сквозная задержка удлинителя считается рабочей?
- Тракт: TSOP на D2, диод через транзистор на D3 — IrSender на Uno/Nano ставит несущую 38 кГц именно там (второй таймер).
- Полный кадр NEC — 68 мс эфира, повтор пульта — каждые 110 мс: конвейер «принял-отправил» успевает с запасом.
- Сквозная задержка 100-150 мс: до 60 мс приём, 68 мс отправка, ноль delay — только millis.
- Эхо-петля лечится втроём: бленда на приёмник, геометрия «диод в тумбу», millis-окно заглушения приёма на 120 мс.
- Пересылка — один вызов sendNEC(address, command, 0); удержание пересылается само, кадр-за-кадром.
Частые вопросы по теме урока
- Сколько времени полный кадр NEC живёт на эфире?
- Полный кадр NEC занимает около 68 мс. Отсюда хронометраж канала: приём до 60 мс плюс отправка 68 мс дают сквозные 100-150 мс на нажатие. около 68 миллисекунд
- Почему приёмник на той же плате, что передатчик, глушат на время sendNEC?
- Эфир один на всех: TSOP декодирует и собственный свет. Без окна заглушения пойманный кадр повторяется, его эхо — тоже, и прибор получает десятки кадров на одно нажатие. чтобы приёмник не декодировал собственную отправку и не зациклил эхо
- Что случится с удлинителем, который шлёт кадры и не глушит приём?
- Так замыкается эхо-петля. Диагноз простой: счётчик кадров растёт на пустом месте, светодиод строчит сам. Лечение — бленда, геометрия и millis-окно на 120 мс. ловит собственный кадр, повторяет его, ловит эхо повтора — петля, счётчик кадров растёт без пульта
- Как поставить передающий диод на окошко ресивера в тумбе?
- Вплотную хватает и малых токов, но тумба вибрирует от басов, а крепление гуляет — запас через транзистор окупается тем, что ничего не переклеиваешь. Видимый диод ресивер не поймает: он ждёт 940 нм с несущей 38 кГц. транзисторное плечо на 60-100 мА и диод вплотную к окошку фотоприёмника
- Какая сквозная задержка удлинителя считается рабочей?
- Приём до 60 мс плюс 68 мс отправки плюс код — укладывается в 100-150 мс, и это незаметно. Полсекунды уже мешают: автоповтор громкости превращается в рывки. 100-150 мс на нажатие — глаз разницы с прямым пультом не видит