У входа в мастерскую нужен счётчик: сколько раз пересекли дверной проём, плюс один на каждое пересечение, без угадываний и без порогов, которые уползают к утру. Раздел уже строил барьеры двумя способами: на фоторезисторе с порогом и гистерезисом — в уроке про ИК-барьер, на двух лучах с направлением и EEPROM — в уроке про два луча. Оба живут и работают, но в обоих решение принимает аналоговый мир. Здесь ступень ниже по суете и выше по чёткости: приёмник — цифровой, выход — факт, а не вольты.
Речь про TSOP4838 и его родню: деталь из читалки пульта внезапно оказывается готовым датчиком пересечения. У него цифровой выход с открытым коллектором, он различает модулированный свет 38 кГц от любого фона и стоит копейки — но именно на барьере его используют задом наперёд, и это надо объяснить медленно. Устройство самой трёхногой банки, пины и разбор модулей на платках я не повторяю: они разобраны в уроке про TSOP и VS1838 — здесь беру готовую деталь и смотрю на неё иначе.
План такой: почему постоянная подсветка глушит приёмник, как пачки-маяк возвращают чувствительность, как счётчик живёт на паузах, а не на вспышках, и почему солнце для барьера — главное испытание, а не лампы. Железо на обе стороны обойдётся дешевле обеда: два диода, пара резисторов, приёмник из набора и вторая плата, которая и так валяется без дела.
Почему постоянная подсветка не работает
Наивная схема напрашивается сама: диод горит непрерывно, TSOP в покое держит выход HIGH, объект перекрывает луч — выход падает или поднимается, считай. Схема умирает за секунды, и причина внутри банки приёмника. АРУ — автоматическая регулировка усиления — следит за уровнем входа, и непрерывную несущую она воспринимает как помеху: усиление спадает, и через десятки-сотни миллисекунд приёмник перестаёт видеть собственный луч. Выход возвращается в покой при свете, который горит, но больше не мигает, — приёмник ослеп именно к тому, что мы ему подсадили. Первый раз это выглядит как неисправность: диод светит по камере, а читалка молчит, — и только даташит объясняет, что так и задумано.
Промышленность решает это железом: у Vishay есть барьерные версии вроде TSOP4038 и TSSP4038, рассчитанные на непрерывную несущую и повышенную чувствительность — они для световых шлагбаумов и родились. Только в ящиках у большинства из нас лежат пультовые TSOP4838 и VS1838B, а за ними стоит общее правило Vishay: чем агрессивнее АРУ давит шум, тем хуже она дружит с непрерывным сигналом. Поэтому лечим то, что есть, и лечится это прекрасно — делаем свет пульсирующим, а не горящим, и обычная пультовая деталь превращается в датчик пересечения.
Лекарство следует из болезни: пачки-маяк. Несущая 38 кГц подаётся короткими вспышками — 600 микросекунд каждые 15 миллисекунд; между пачками АРУ успевает отдышаться, диод горит четыре процента времени, и средний ток падает до двух-четырёх миллиампер даже при пиковых 50–100 мА. Источник маяка — что угодно, умеющее мигать на 38 килогерцах: вторая плата с tone(), как в скетче ниже, или NE555, настроенный подстроечником по осциллографу читалки. Протокол не нужен: содержимого пачки никто не читает, важен сам факт, и в этом разница с лучом из кадров NEC из соседнего урока — там содержимое ещё разбиралось, здесь от него отказались нарочно.
// Маяк барьера: отдельная плата. Несущая 38 кГц, пачка 600 мкс каждые 15 мсconst int SEND_PIN = 3; // tone() живёт на пинах 3 и 11 (Timer2) void setup() { pinMode(SEND_PIN, OUTPUT);} void loop() { tone(SEND_PIN, 38000); // пачка несущей: 600 мкс delayMicroseconds(600); noTone(SEND_PIN); delayMicroseconds(14400); // пауза: АРУ между пачками дышит}// Приёмник барьера: TSOP4838 на пине 2, счёт пересечений по паузамconst int TSOP_PIN = 2;const int LED_PIN = 12; const unsigned long BLOCKED_MS = 40; // тишина дольше - луч перекрытconst unsigned long CROSS_MAX_MS = 2500; // пауза длиннее - заслонка, не проход unsigned long lastPulse = 0;unsigned long silenceAt = 0;unsigned long flashAt = 0;bool blocked = false;int count = 0; void setup() { Serial.begin(9600); pinMode(TSOP_PIN, INPUT_PULLUP); // выход TSOP - открытый коллектор pinMode(LED_PIN, OUTPUT); Serial.println("barer gotov: zhdem pachki");} void loop() { bool pulse = digitalRead(TSOP_PIN) == LOW; // пачка маяка прижимает линию if (pulse) { if (blocked) { // луч вернулся - пора считать unsigned long silence = millis() - silenceAt; if (silence <= CROSS_MAX_MS) { count++; flashAt = millis(); digitalWrite(LED_PIN, HIGH); Serial.print("peresechenie #"); Serial.println(count); } else { Serial.println("dolgaya pauza: zanaves ili zasvet - ne schitat"); } blocked = false; } lastPulse = millis(); return; } if (!blocked && millis() - lastPulse >= BLOCKED_MS) { // луч пропал blocked = true; silenceAt = lastPulse; } if (flashAt > 0 && millis() - flashAt > 80) { // вспышка гаснет digitalWrite(LED_PIN, LOW); flashAt = 0; }}Приёмник ведёт себя непривычно для раздела: он не декодирует ничего. Библиотека IRremote здесь не нужна вовсе — выход TSOP читается как обычный цифровой вход, и в этом вся суть приёма: приёмник работает компаратором света, а не читалкой команд. Счётчик живёт на паузах, а не на вспышках: пачки прижимают линию каждые 15 миллисекунд, и тишина дольше 40 мс означает перекрытый луч. Окно взято с запасом вдвое против цикла маяка: два пропущенных пачками такта — блик, рывок руки у края луча — луч не роняют, и отдельный антидребезг достаётся бесплатно.
Событие пересечения рождается не в момент пропадания, а в момент возвращения луча: только тогда известна длина паузы. Возвращение в окне до 2,5 секунды — проход: человек через луч в 20 сантиметров идёт доли секунды, рука тянется чуть дольше, и всё это влезает с запасом. Пауза длиннее окна — не проход, а состояние: шторка, карман, заслонённый на день приёмник; счётчик отказывается плюсовать и просто перевзводится. Именно эта вилка отделяет турникет от простой мигалки: короткая тишина — событие, долгая — фон.
Монтаж решает столько же, сколько код. Диод и приёмник садятся друг напротив друга на высоте пояса — метр от пола: ниже тянет пыль и ноги мимо, выше ловит свет из окон. Расстояние между платами держите от полуметра до двух: на ладони диод перегружает вход приёмника, и выход ведёт себя нервно, на пяти метрах без транзистора и узкого конуса пачки уже тонут. Соосность проверяется камерой телефона раз и навсегда: пятно от маяка должно попадать точно в объектив приёмной стороны — отклонение на ширину ладони на двух метрах уже роняет часть пачек, и окно 40 мс прощает это не всегда.
Турникет: счёт с окном и перевзводом
Счёт и люди — разные вещи, и лучше принять это сразу. Один луч считает события: два человека вошли вплотную — единица, прошёл и отступил — ноль, зашёл и замер в луче — одна долгая пауза без плюса. Для мастерской такая честность устраивает: мне нужен трафик, а не перепись. Если однажды понадобится направление и вход-выход по отдельности, добавится второй луч со сдвигом и машина порядка пересечений — маршрут уже разобран в уроке про два луча, здесь я сознательно не дублирую его и держу один луч: чем меньше механики, тем дольше прибор живёт без ремонта.
Против LDR-барьера из соседнего урока этот честно выигрывает в шуме, и вот почему: фоторезистор видит любой свет и различает ИК-диод от солнца только порогом и гистерезисом, а TSOP отбирает по частоте — всё, что не пульсирует около 38 кГц, отлетает на входе. Несущую как общий язык пультов и приёмников мы разбирали в уроке про несущую и протоколы; здесь она работает не на передачу команд, а на различение света. Дешевле TSOP-барьер при этом не станет: две платы против одной. Мнение с условием: если луч живёт в тёмном коридоре без окон — бери LDR и не плати за вторую плату; как только солнце оказывается в кадре — TSOP с маяком окупается первым же утром.
Проверка счётчика занимает вечер и делается двадцатью проходами: пройдите луч двадцать раз в разном темпе — быстро, боком, с сумкой, с остановкой в луче — и сверьте счёт с блокнотом. Потом перенесите проверку на утро: солнце переезжает по стене именно в утренние часы, и если к девяти счёт пополз вверх без посетителей, у вас тот самый засвет, за который отвечает козырёк и место установки — об этом честно написано в уроке про помехи от света. И только после обоих тестов счётчику выдаётся постоянное место на стене.
Для симулятора, где непрерывного луча нет, счётчик переносится на панель пульта: каждое нажатие изображает одно пересечение, а логика — замок, вспышка, отчёт — остаётся ровно та же, что в приёмнике выше. Честную пометку оставил в подписи, а разницу почувствуете руками: на реальной плате события приходят сами, без пальца, и именно тогда окно замка превращается из защиты от двойных щелчков в защиту от дрожи на границе луча.
| Что случилось с лучом | Длина паузы | Что делает счётчик | Почему так |
|---|---|---|---|
| объект прошёл сквозь луч | 50 мс – 2,5 с | +1 и вспышка светодиода | человек через луч в 20 см идёт доли секунды |
| пропуск пачки, блик | меньше 40 мс | ничего | окно вдвое шире цикла маяка глотает рывки |
| шторка, карман, засветка | дольше 2,5 с | не считает, перевзводится | долгая тишина — состояние, а не проход |
| дрожание на границе луча | миллисекунды | ничего | пачки 15 мс дают антидребезг бесплатно |
- 1. Почему пультовый TSOP4838 слепнет при непрерывной подсветке?
- 2. Что возвращает чувствительность пультовому TSOP в барьере?
- 3. Пауза в луче длилась 90 секунд, потом маяк вернулся. Что сделает счётчик?
- 4. Зачем окно BLOCKED_MS в 40 мс, если цикл маяка всего 15 мс?
- 5. Чем барьер на TSOP честно лучше LDR-барьера из соседнего урока?
- Непрерывная несущая глушит пультовый TSOP: АРУ роняет усиление, приёмник слепнет к собственному лучу.
- Лечение — пачки-маяк: 600 мкс несущей каждые 15 мс, диод горит 4% времени, средний ток копейки.
- Счётчик живёт на паузах: тишина дольше 40 мс — луч перекрыт, возврат в окне до 2,5 с — пересечение.
- Долгая тишина — не проход, а состояние: шторка или засветка, счётчик перевзводится без плюса.
- Солнце бьёт по АРУ и роняет маяк: козырёк, место не напротив окна, тест именно в утренний час.
Частые вопросы по теме урока
- Почему пультовый TSOP4838 слепнет при непрерывной подсветке?
- АРУ следит за уровнем входа: непрерывную несущую она считает помехой и через десятки-сотни миллисекунд роняет усиление. Приёмник перестаёт видеть свет, который горит, но не мигает. АРУ спадает при постоянной несущей и давит усиление
- Что возвращает чувствительность пультовому TSOP в барьере?
- Пачки-маяк дают АРУ отдышаться между вспышками, а средний ток диода падает до копеек: он горит четыре процента времени. Ярче и постояннее — ровно то, что глушит приёмник. короткие пачки несущей: 600 мкс каждые 15 мс
- Пауза в луче длилась 90 секунд, потом маяк вернулся. Что сделает счётчик?
- Событием считается возврат в окне до 2,5 секунды. Долгая тишина — состояние: шторка, карман или ослепшее от солнца окно, и плюсовать такое — источник фантомных посетителей. не станет считать и перевзводится: это заслонка или засветка
- Зачем окно BLOCKED_MS в 40 мс, если цикл маяка всего 15 мс?
- Окно вдвое шире цикла маяка: два пропущенных такта луч не роняют. Дребезг и дрожание на границе луча отрабатываются бесплатно, без отдельного антидребезга. чтобы пара пропущенных пачек не роняла луч — блики и рывки глотаются
- Чем барьер на TSOP честно лучше LDR-барьера из соседнего урока?
- Фоторезистор видит любой свет и держит фону порогом и гистерезисом; TSOP отбирает по частоте несущей. Цена — вторая плата маяка, и она окупается, как только в кадре оказывается солнце. отбирает свет по частоте: всё, что не пульсирует около 38 кГц, отлетает на входе