Двухлучевой инфракрасный счётчик предназначен для счёта входящих в помещение и выходящих из него людей. Вычтя вышедших из вошедших, он может определить, сколько человек находится в помещении в текущий момент. Мне было интересно самостоятельно создать такой электронный прибор, изначально зная об его устройстве лишь то, что у него два инфракрасных луча, которые идущий человек пересекает своим телом, Ну и, конечно, то, что тут не обойтись без микроконтроллера. Словом, DIY (сделай сам), в чистом виде. Какие только причуды не приходят в голову человеку. И да, я сделал его. В процессе доведения счётчика "до ума" было изготовлено и испытано несколько разных его вариантов, пока не получился удачный (на мой взгляд). Сейчас полтора десятка таких счётчиков, образующих сеть, проходят "обкатку" в составе действующего прототипа системы управления эвакуацией. Работу сети счётчиков в реальном времени можно посмотреть по ссылке.
Когда я рассказываю об инфракрасном счётчике студентам и своим коллегам по работе, некоторые спрашивают меня, какой алгоритм определения направления движения человека заложен в "мозги" счётчика. Если бы у меня был покупной счётчик, я бы отвечал: "Откуда мне знать?" Но я рассказываю о счётчике, полностью сделанном мною, включая и написание программы для микроконтроллера, и значит, я знаю о нём всё.
Итак, каким образом микроконтроллер (моего) счётчика отличает входящих от выходящих, чтобы считать их раздельно?
Для начала — краткий ответ.
Чтобы отличить входящего в помещение человека от выходящего, микроконтроллер анализирует, в какой последовательности человек пересекает два горизонтальных параллельных луча, «протянутых» в дверном проёме наподобие финишной ленточки. Для кого‑то этот краткий ответ кажется достаточным. А для тех, чьё любопытство ещё не удовлетворено, ниже привожу развёрнутый ответ.
Вначале надо побольше сказать об устройстве счётчика. Сенсорная система счётчика состоит из двух излучателей, создающих два параллельных друг другу инфракрасных луча, и двух приёмников, на выходе которых сигнал либо есть, либо его нет, в зависимости от того, падает луч на соответствующий приёмник, или луч чем‑то прерван. (Расстояние между параллельными лучами — несколько сантиметров.)
Сигналы сенсорной системы поступают на вход микроконтроллера счётчика.
Микроконтроллер преобразует сигналы обоих инфракрасных приёмников в числа (это называется числовым кодированием) и далее манипулирует ими с помощью цифрового микропроцессора. Какие числа при этом возникают в загадочном чреве микроконтроллера, и как они помогают определить направление движения человека?
Чтобы прояснить это, буду использовать следующие термины:
Сенсорный канал — совокупность инфракрасного излучателя, луча и инфракрасного приёмника. Счётчик имеет два сенсорных канала, которым приписаны номера: 1 и 2. Каналы пронумерованы слева направо, если смотреть по ходу инфракрасных лучей. (Соответственно, человек может идти мимо счётчика слева направо или справа налево.)
Состояние сенсорного канала (двоичное): 1 или 0.
1 — канал открыт (луч свободно проходит)
0 — канал закрыт (препятствие на пути луча).
Событие — внезапная перемена состояния одного из сенсорных каналов, связанная с его открытием или закрытием (по сути, с появлением или исчезновением сигнала на выходе соответствующего приёмника).
Код события — число из приведённой ниже таблицы, которое временно запоминает микроконтроллер при появлении события.
Микроконтроллер заносит код очередного события в область памяти, предназначенную для временного хранения цепочки событий, пока не сформируется полный абстрактный образ прохождения человека.
Абстрактный образ прохождения — хронологическая последовательность кодов событий, порождённых прохождением одного человека. Формирование этой последовательности считается законченным, когда оба сенсорных канала вновь открыты (человек полностью вышел из лучей).
Ага! — восклицают после этого проницательные читатели. — Ты нас обманул! Мы подумали, что эта статья — о распознавании сложных образов искусственной нейронной сетью. А ты обозвал образами чёрт‑те что.
Ну что вы! — говорю им я. — Не собирался я вас обманывать. Ну какая может быть нейронная сеть у милого доброго маленького Ардуино Нано? Зрительный образ, с которым счётчику приходится иметь здесь дело — это всего лишь два огонька, мерцающих где‑то в ночи. И всё же это — образ. В каком‑то смысле. А когда зрительный образ превращается у Ардуино в цепочку сухих скучных чисел, я называю его — абстрактный образ. Из сочувствия к Ардуино.
Таблица 1. Коды событий, используемые в абстрактных образах.
событие |
код события |
закрылся канал 1 |
1 |
закрылся канал 2 |
2 |
открылся канал 1 |
3 |
открылся канал 2 |
4 |
Ниже перечисляются основные типы абстрактных образов (для наглядности они заключены в фигурные скобки).
Образы, содержащие два события:
{ 1 3 } - человек вторгся в канал 1 и вышел из него обратно: туда, откуда вошёл;
{ 2 4 } - человек вторгся в канал 2 и тоже с возвратом.
Оба образа описывают «нерешительное касание», то есть вторжение человека лишь в один из двух лучей сенсорной системы, с "испуганным отскоком" обратно.
Образы, содержащие четыре события:
{ 1 2 4 3 } - вторжение в оба канала слева и возврат;
{ 2 1 3 4 } - вторжение в оба канала справа и возврат;
{ 1 2 3 4 } - проход через оба канала слева направо;
{ 2 1 4 3 } - проход через оба канала справа налево.
Первая пара образов описывает вторжение в оба канала (в один, следом - в другой) и возврат назад (сквозной проход на другую сторону не состоялся). Вторая пара образов описывает состоявшийся сквозной проход через каналы. Эта пара соответствует случаям, которые, по замыслу разработчика, и должен считать инфракрасный счётчик.
Само собой разумеется, что абстрактный образ прохождения может содержать и большее число событий, чем четыре. Например, если человеку вдруг вздумалось поплясать в лучах сенсорной системы. Но и это — не беда. Дело в том, что для определения направления прохода человека абстрактный образ интересен не весь. Существенное значение имеют лишь два события образа: первое и последнее. Первое событие говорит о том, с какой стороны человек вошёл в сенсорную систему, а последнее — в какую сторону он из сенсорной системы вышел.
Это позволяет использовать для счёта проходящих людей вместо полного абстрактного образа — сокращённый.
Сокращённый абстрактный образ прохождения — результат редукции полного абстрактного образа до всего двух его событий: первого события и последнего.
Ниже приведён перечень всех возможных вариантов сокращённого абстрактного образа.
{ 1 3 } — вторжение слева и возврат (сквозной проход не состоялся);
{ 2 4 } — вторжение справа и возврат (сквозной проход не состоялся);
{ 1 4 } — сквозной проход через оба канала слева направо;
{ 2 3 } — сквозной проход через оба канала справа налево.
Итак, можно резюмировать: для определения направления, в котором прошёл человек, счётчику достаточно определить, к какому из четырёх типов относится только что порождённый проходом человека сокращённый абстрактный образ.
Комментарии (20)
Rsa97
16.12.2024 20:58По реальному использованию двухлучевых счётчиков посетителей в магазине - точность у них плюс-минус лапоть. Регулярно то в пустом закрытом магазине ночью человек пять сидит, то днём минус десять человек.
VirRus77
16.12.2024 20:58в пустом закрытом магазине ночью человек пять сидит
то днём минус десять человек
Не думал что магазин может использоваться как роддом. При этом у посетительниц двойни.
YDR
16.12.2024 20:58На мой взгляд, слишком много "воды" и "строгих" определений для простой концепции.
А вот примера кода нет. А в коде может быть много интересного. Например, реализация с помощью конечного автомата. На прерываниях или на поллинге? Или реализация на встроенном в микроконтроллере интерфейсе енкодера.
Попытка строго однозначно пронумеровать датчики слева направо, я считаю, провалилась, потому что если стоять вверх ногами, смотреть по направлению луча, то по этому вашему определению порядок датчиков изменится. Это общеизвестная проблема, нужно просто задуматься, что такое "лево" и "право" (и сколько нужно векторов для определения).
Про железо ничего не сказано. Как фокусиовали? Модулировали ли? Демодуляция в приемнике или контроллере? Как защищали от засветки? Как удобно провести провода между источником и приемником? (на самом деле, от контроллера до источника и от контроллера до приемника, но контроллер явно будет с одной из сторон, или в отдельном месте)
samigon Автор
16.12.2024 20:58Спасибо за замечание. Это лишь первая, затравочная статья. Она не столько для профи, сколько для тех, кто ничего о счётчиках ещё не знает. Напишу, надеюсь, и более полезные для профи статьи.
Nik_Vic
16.12.2024 20:58Даже немного завидую тому пути, который вам ещë предстоит пройти в чудесном мире сопряжения реальной физики и идеальной логики.
Просто навскидку - у вас появляется дребезг на перетëртом проводе к датчикам, события 1 и 2 регистрируются одновременно. Это будет проход справа налево или слева направо?
А если между "проходами" проходит менее ста миллисекунд, вашу программу это не смутит, так и засчитает?
samigon Автор
16.12.2024 20:58Спасибо. Я тоже завидую тем, у кого впервые. "Впервые" бывает лишь однажды. )
Barma2012
16.12.2024 20:58У меня дома уже 10 лет работает подобная штука при входе на кухню - зажигает и гасит свет, в зависимости от кол-ва прошедших туда-обратно. Используется только один фотоприемник, TSOP1736, соответственно лучи светодиодов модулированы 36 кГц. Зажигаются они поочередно, щас уже не помню с какой частотой, но достаточной, чтобы заметить направление движения быстрого взмаха рукой. МК знает, в какой момент какой светодиод включен, и на основании этого разбирает, какой луч в данный момент перекрыт.
Работает без сбоев, разве что лампы ЭСЛ как-то фонят на фотоприемник при включении, проблема в 95% случаев решается цифровой фильтрацией входных данных, но этого недостаточно. Со светодиодными лампами, или накаливания - всё норм.
Расстояние между светодиодами и приемником около метра, между светодиодами примерно 15 см.. Сами светодиоды внутри непрозрачных пластиковых трубочек, длиной 2 см - своего рода направляйки света ))) Никакой другой фокусировки нет.
strvv
16.12.2024 20:58О, появилась было аналогичная мысль, глядя на перечисление 4 типов событий, и так как скорость объекта значительно ниже, действительно оптимально сделать с 2 излучателями и одним приемником.
А для оптимизации расположения излучателей и сенсора можно их расположить блоком, а на противоположной стороне 1 протяжённое или 2 малых зеркала.Rsa97
16.12.2024 20:58Классическая схема - с одним выносным ненаправленным излучателем, которому нужно только два провода питания, и двумя приёмниками в блоке с микроконтроллером.
strvv
16.12.2024 20:58Я в своё время работал с линейными противопожарными датчиками там как раз были варианты с раздельными приемником и излучателем и где они вместе, а на другой стороне в таком же корпусе отражающий элемент.
Почему и думаю, что в одном блоке излучатели и приемник на расстоянии 1 метр проще организовать, чем добавлять длинную линию до сенсора и ловить помехи.
ukhanov
16.12.2024 20:58Делали такую же задачу. Начинали с того же. И тут понеслось: два человека в разных комбинациях туда-сюда, человек рукой взмахнул, кто-то что-то несёт-везёт, мигание рекламы...
Плюнули, бросили и поставили видеокамеру. Да, ардуина не потянет, но решать задачу надо было до практического выхлопа.
dreams_killer
Это если через проход проходит один человек за раз, а это не турникет...
Yuri0128
И, особенно, при эвакуации..... Так что имеется информация. О том, что информация о пробежавших будет недостоверной.
samigon Автор
Вы правы. Считать людей надо до начала эвакуации. После начала - любой счётный прибор бесполезен.
samigon Автор
Да, есть такая проблема ) Но есть и прилежные ходоки.
samigon Автор
Да, есть такая проблема. Приятно считать только прилежных ходоков. )