Счётчик посетителей на входе в мою мастерскую прожил на PIR-датчике четыре дня. Потом он начал считать куртку на вешалке, собаку соседа и мою же руку, которой я здоровался с другом через порог. За выходные счётчик наскрёб восемнадцать человек при двух реально вошедших. Я убрал PIR и собрал то, что стоит в турникетах и на входах магазинов: передатчик и приёмник друг напротив друга, между ними невидимый луч. Пересёк — единица. Не пересёк — ноль. Никаких догадок о том, что происходит в комнате, только факт пересечения линии.
Но у луча тоже свой характер. Через неделю счётчик сошёл с ума в десять тридцать утра: солнце переехало на юго-восточное окно, ударило прямо в приёмник, и он начал прибавлять посетителей по три-четыре в минуту. Для фоторезистора не было разницы между светом ИК-диода и светом солнца — та же освещённость, те же единицы на входе. Тема урока — барьер, которому такое не страшно: с порогом, подобранным замером, с гистерезисом и с пониманием, почему полдень для него особое время суток.
Разберём две схемы барьера — прямой и отражённый, соберём счётчик с защитой от повторных срабатываний на millis, которым мы уже приручали маячок в уроке про millis вместо delay, и в симуляторе покрутим порог потенциометром ровно так же, как я крутил подстроечником на реальной макетке. Охранная версия с зуммером выйдет из той же схемы заменой одной ветки.
Прямой луч и отражённый: две схемы одного барьера
Прямой барьер — классика. ИК-светодиод светит постоянно, напротив него на другом краю прохода стоит фототранзистор или фоторезистор: луч долетает — приёмник видит свет, человек прошёл — свет оборвался. С тёмной трубкой-экраном на приёмнике у меня пара жила на полутора метрах, без экрана — метр, и то если диод питается через резистор 150 Ом. Ярче не стоит: в непрерывном режиме ИК-диод греется заметно сильнее, чем в пульте, где он мигает пачками по миллисекунде. Аргумент в пользу самодельной пары — цена: диод, транзистор и два резистора стоят копейки, сломать их я не умею, а замена — дело минуты.
Отражённый барьер — тот же диод и приёмник, но рядом, смотрят в одну сторону: луч отражается от руки, корпуса, человека и возвращается. Дальность честная — 5-30 сантиметров, зато не нужен второй конец прохода. Так устроены датчики линии для роботов на паре TCRT5000 и краны в общественных туалетах. Готовые модули тоже годятся: щелевой фотопрерыватель KY-010 — деталька с зазором в пару сантиметров, идеальная для бумажки в принтере или створки шкафа; модули на компараторе LM393 с фоторезистором дают готовый цифровой выход и подстроечник под порог. Подстроечник заменяет всю калибровку из скетча: покрутил — и порог стоит. Правда, гистерезиса внутри модуля нет, и дребезг на границе остаётся вашим личным делом — тот же одиночный порог, только завёрнутый в компаратор.
Оговорка, на которой я сам спотыкался: барьер — это не пульт. Пульт шлёт модулированный сигнал на несущей 38 кГц — мы разобрали, как устроен инфракрасный сигнал; барьеру модуляция не обязательна, приёмник здесь простой — фототранзистор или фоторезистор, которым всё равно, мигает свет или горит. А вот приёмник пульта VS1838B для барьера с непрерывным лучом не годится: он заточен под пачки несущей и отфильтрует постоянное свечение как фон. Деталь под задачу — половина успеха; три ноги приёмника и подтяжку мы разбирали в уроке про VS1838B.
const int PIN_RECV = A1; // фототранзистор через делительconst int PIN_LED = 12; // горит, пока луч свободенconst int POROG = 640; // середина между «светло» и «тень»const int GISTER = 60; // зазор между двумя порогами int state = 1; // 1 - луч свободен, 0 - перекрытint count = 0; void setup() { Serial.begin(9600); pinMode(PIN_LED, OUTPUT);} void loop() { int light = analogRead(PIN_RECV); if (state == 1 && light < POROG - GISTER) { state = 0; // луч перекрыт digitalWrite(PIN_LED, LOW); } if (state == 0 && light > POROG + GISTER) { state = 1; // луч снова свободен count = count + 1; // одно пересечение digitalWrite(PIN_LED, HIGH); Serial.print("count="); Serial.println(count); }}Главное слово в скетче — гистерезис. Аналоговый вход в момент пересечения не прыгает с 850 на 420: свет отражается от руки, значения ходят туда-сюда на десятки единиц, и один жёсткий порог превратил бы одно пересечение в серию из пяти-шести. Два порога лечат это бесплатно: помечаем «перекрыто» ниже 580, а «свободен» — только выше 700. Между ними скетч ничего не решает, он помнит, каким было предыдущее состояние, — первый шаг к автоматам, на которых построен, например, светофор с режимами.
Второе — дискретизация. Опрашивать вход можно на каждом проходе loop, но решение о пересечении стоит принимать не чаще, чем раз в 20-30 миллисекунд. Числа с условием: рука, движущаяся со скоростью полметра в секунду, висит в зоне луча шириной сантиметр те же 20 миллисекунд — опрос реже рискует пропустить короткое движение, чаще просто тратит внимание скетча. Таймер на millis стоит две строки и не съедает остальную логику.
Порог подбирается замером, а не на глаз. Мой протокол калибровки: днём при свободном луче фоторезистор показывал 850-900, при перекрытом — 420-450; порог взял посередине, 640, а зазор задал в 60 — десятая часть размаха. Меньше десяти процентов размаха не беру: у медленно плывущего света — облако за окном, включённая лампа — значения дрейфуют, и узкий зазор снова выдаёт серию срабатываний там, где человек прошёл один. Порог пересчитываю дважды в год: зимой яркая лампа на столе, летом солнце ниже — и середина между светло и тень уезжает на десятки единиц.
Счётчик, направление и охрана
Один барьер считает события. Чтобы различить вход и выход, ставят два барьера со сдвигом 15-20 сантиметров поперёк прохода: какой пересечён первым — туда и шли. Логика — два счётчика и сравнение порядка срабатываний, весь строительный набор у нас уже есть. Так устроены двухнаправленные счётчики посетителей, только вместо самодельных пар в них стоят сдвоенные модули в одном корпусе.
Высота установки — отдельная наука. Шлейф на высоте груди пересекают и взрослые, и дети, и собака — один проход даёт одно пересечение. Рука, помахавшая в луче туда-обратно, даст два события: для охраны это нормально, а счётчику оно врёт вдвое. Мой опыт: у двери шириной до метра счётчик жил честно, на широком проеме мастерской пришлось ставить лучи в шахматном порядке, иначе двое заходили плечом к плечу и считались как один.
Охранная версия проще счётчика: пересечение луча — событие тревожное, и скетч вместо прибавления единицы включает зуммер и реле. Реле берёт на себя лампу или камеру: модуль с оптопарой съедает с пина пару миллиампер и коммутирует свои 220 вольт — мы проходили подключение реле к нагрузке. Схема та же, меняется одна ветка, и барьер из счётчика превращается в первую линию шлейфа. В симуляторе ниже сирена повешена на зуммер, и работает она ровно так же, как на реальной макетке.
| Вариант | Из чего собрать | Дальность | На что смотреть |
|---|---|---|---|
| Прямой луч | ИК-светодиод и фототранзистор напротив | до 1,5 м с трубкой-экраном | засветка солнцем, нагрев диода при непрерывном свечении |
| Отражённый | диод и приёмник рядом, пара TCRT5000 | 5-30 см | цвет и расстояние отражающей поверхности |
| Щелевой модуль KY-010 | готовая пара в одной колодке | зазор 1-2 см | только узкие объекты: бумага, флажок, створка |
| Модуль на LM393 | фоторезистор, компаратор, подстроечник | до 0,5 м отражённый | цифровой выход уже с порогом, гистерезиса внутри нет |
- Барьер — пара передатчик и приёмник напротив (прямой, до 1,5 м) или рядом (отражённый, 5-30 см); приёмник пульта VS1838B для непрерывного луча не годится
- Два порога с зазором около 10% размаха вместо одного: аналоговый вход у границы ходит на десятки единиц, одиночный порог штампует серию срабатываний
- Опрос раз в 20-30 мс ловит руку на полуметровой скорости; таймер — две строки на millis
- Калибровка замером: светло 850-900, тень 420-450, порог 640 — цифры свои для каждого места и времени суток
- Солнце в приёмнике штампует ложные пересечения: трубка-экран, тень или модулированный луч на 38 кГц
- 1. Фоторезистор показывает около 700, порог один — 680, рука медленно уходит из луча. Что произойдёт?
- 2. Какая деталь не подойдёт как приёмник для барьера с непрерывным лучом?
- 3. Зачем ставят два барьера со сдвигом 20 сантиметров поперёк прохода?
- 4. Счётчик штампует пересечения только в солнечные утра. Первое действие?
- 5. Рука идёт 0,5 м/с, зона луча шириной 1 см. Опрос раз в 20 мс…
Барьер — самый честный датчик из всех, что я ставил: он не догадывается, он констатирует. Соберите пару на подоконнике и снимите таблицу значений для утра, вечера и включённой люстры — те же замеры пригодятся и для фотореле, и для ночника с автозапуском. Дальше по разделу — внутренняя кухня приёма: что происходит в прерывании, пока пульт шлёт кадр, и почему один скетч теряет команды, а второй нет. А счётчик со временем захочет помнить своё число после выключения питания — это пара строк в энергонезависимую память, мы делали счётчик включений ровно по такой схеме: та же переменная, та же забота о том, чтобы писать редко и по делу.
Частые вопросы по теме урока
- Фоторезистор показывает около 700, порог один — 680, рука медленно уходит из луча. Что произойдёт?
- У границы значения дрейфуют на десятки единиц из-за отражённого света, и одиночный порог пересекается много раз. Лечится гистерезисом — двумя порогами с зазором. Серия срабатываний: значения ходят вокруг порога туда-сюда
- Какая деталь не подойдёт как приёмник для барьера с непрерывным лучом?
- VS1838B ждёт пачки несущей 38 кГц и отфильтрует постоянное свечение как фон. Для барьера нужен простой фотоприёмник без фильтра несущей. Приёмник пульта VS1838B
- Зачем ставят два барьера со сдвигом 20 сантиметров поперёк прохода?
- Порядок срабатывания двух барьеров говорит, куда шёл человек: первый задел ближний — вошёл, первый задел дальний — вышел. Чтобы определить направление: вход или выход
- Счётчик штампует пересечения только в солнечные утра. Первое действие?
- Засветка лечится экраном от бокового света и переносом в тень; диагноз ставится печатью значений в то время, когда повторяется сбой. Прикрыть приёмник трубкой и снять значения днём
- Рука идёт 0,5 м/с, зона луча шириной 1 см. Опрос раз в 20 мс…
- 0,5 м/с — это 0,5 мм за миллисекунду, сантиметровая зона длится 20 мс. Опрос раз в 20 мс ловит такое пересечение впритык, но ловит. Успеет: рука сидит в зоне около 20 мс, опрос не реже