Недавно начал заниматься сборкой самоходного робота, контролируемого ИК пультом и был вынужден самостоятельно разработать зональный инфракрасный датчик, который может распознавать положение объектов или их движение перед датчиком, происходящее слева направо или наоборот.
Схема ИК датчика с определением направления
Схема основана на 2 ИК диодах, ИК датчике 36 кГц, МК Tiny13 и нескольких светодиодах. Эти светодиоды используются для регулярной индикации состояния устройства , так что вы можете легко откалибровать его , тут есть такие возможности.
Датчик может обнаружить объект в 3-х различных положениях: ВЛЕВО, СРЕДНИЙ, ВПРАВО
Можно настроить расстояние детектирования в диапазоне от 2 см до 1,5 м потенциометром, который можно увидеть на схеме и на плате. Всякий раз, когда обнаруживается какое-либо изменение в состоянии объекта в поле зрения, сигнал INTERRUPT (IRQ) генерируется на внешние устройства. Благодаря этому процессу в процедуре обработки достаточно, чтобы прочитать состояние входов L и R и знать, что происходит. Возможные ситуации:
LR (левый/правый)
- 0 0 , нет объекта в поле зрения
- 1 0 , объект находится слева
- 0 1 , объект находится справа
- 1 1 , объект находится посередине.
Лучше всего ситуация показана на анимированном изображении.
Несмотря на то, что ИК-диоды работают на несущей частоте 36 кГц, это не мешает работе пульта (тем более этот датчик будет проверять переднюю часть, а у робота второй ИК-приемник для управления сзади).
Прерывание IRQ генерируется не только тогда, когда что-то появляется в зоне видимости датчика, но и когда оно исчезает из поля зрения. Это значительно облегчает работу процессора. Можно сказать что после чтения прерывания в такой процедуре , состояние просмотра датчика , также можно сразу ввести команды для управления двигателями ведущих колес или другими вещами.
Сама программа не сложна , она состоит из генерации несущей 36 кГц с помощью Timer0 и подачи ее попеременно к обоим ИК-диодам , после чего приём и анализ того что происходит.
Также введена буферизация нескольких показаний и только сравнение несколько из тех же самых сигналов запускают сигнал прерывания , он ведь должен быть устойчивым к различным типам помех, включая другие пульты дистанционного управления например телевизора (даже когда один синий LED быстро мигает несколько раз , красный светодиод, сигнализирующий о исходящем сигнале прерывания, срабатывает только один раз). Благодаря этому датчик не будет беспокоить главный процессор нестабильными состояниями когда объект находится на краю чувствительности.
Очень удобный таймер обратного отсчёта с цифровым дисплеем LED
Алгоритм работы программы
- Отправляем пакет, то есть несущую на короткое время на левый ИК-диод.
- Ждем короткий промежуток времени несколько миллисекунд.
- Проверка получает ли ИК-приемник какие-либо отражения.
- Если датчик их видит , значит на дороге слева какой-то объект.
- Затем делаем те же шаги, но с правым ИК-диодом.
Для суммирования и усреднения времени выполнения всего алгоритма, исправления ошибок и небольшого обобщения , пакеты отправляются в среднем каждые несколько десятков миллисекунд с каждого ИК-диода.
Помехи вообще не проявляются, когда речь идет о каком-либо искусственном освещении, конечно если не приблизить датчик ближе 20 см к люминесцентной лампе, тогда фактически светодиоды иногда будут мигать , хотя прерывание включится только один или два раза. Основной целью создания этого датчика было свести к минимуму влияние таких факторов, и это удалось.
Схема ИК датчика без контроллера
А далее схема аналогичного датчика на TTL микросхемах, это для тех кто не любит микроконтроллеров и прошивок.
Еще одна приятная особенность этого датчика , возможность корректировать положение ИК-диодов, то есть если они установлены под прямым углом , будет самый широкий диапазон расстояний, если речь идет о видимости датчика по бокам , при увеличении минимального расстояния, с которого объект может быть обнаружен посередине, то есть в области нескольких сантиметров в центре перед датчиком ничего не обнаружено , объект должен быть слегка отодвинут. Но если слегка наклоним их внутрь, то сможем резко изменить условия работы и обнаружить даже тонкие объекты.
Если датчик не обнаруживает никаких отражений после ожидания , это означает что в пределах видимости препятствий нет и можно ехать вперед.