Принцип действия Принцип действия ИК-локатора основан на обнаружении препятствия по отраженному от него свету. Зона перед локатором освещается некоторым источником света, а фотодатчик меряет уровень освещенности. При появлении препятствия уровень освещенности фотодатчика повышается, что датчиком и фиксируется.
Чтобы повысить защиту локатора от фоновой засветки и помех используют, во-первых, свет инфракрасного диапазона, и, во-вторых, "подсветку цели" производят не непрерывным лучом, а импульсами. Если уровень сигнала с фотодатчика одинаков при включенной и при выключенной подсветке, то препятствие, скорее всего, отсутствует; если же в момент импульса подсветки сигнал с приемника заметно выше, чем во время паузы, то, с большой вероятностью, это вызвано наличием препятствия. В то же время, при отдельных импульсах возможны ложные срабатывания, а если давать импульсы непрерывно, то датчик начнет реагировать, к примеру, на солнечный свет или излучение люминесцентных ламп.
Поскольку те же подходы используются в системах дистанционного управления, сейчас широко распространены ИК-приемники рассчитанные на работу с пачками сигналов определенной частоты. В одном корпусе они содержат ИК-датчик, предварительный усилитель, фильтры и пр. Их выходной сигнал, как правило, таков, что позволяет подключать их непосредственно к микроконтроллерам.
Приемники
Таких ИК-приемников довольно много. Познакомимся с ними на примере вполне типичной серии TSOP17хх производства Vishay
Серия включает семь моделей: TSOP1730, TSOP1733, TSOP1736, TSOP1737, TSOP1738, TSOP1740, TSOP1756, две последние цифры в обозначении модели соответствуют частоте несущей ИК-сигнала (30, 33, 36 и т.д. кГц). Схема приемников хорошо защищена от случайных импульсов и помех. Отсутствию сигнала (как и у большинства других ИК-приемников) соответствует высокий логический уровень на выходе ИК-приемника; при получении сигнала на выходе появляется импульс низкого уровня.
"Рабочий" сигнал должен отвечать следующим требованиям:
* быть возможно ближе к частоте несущей для данной модели (например, 36 кГц для TSOP1736)
* в пачке должно быть 10 или более импульсов
* за пачкой от 10 до 70 импульсов должна следовать пауза длительностью не менее 14 импульсов
Используя микроконтроллер и подобный ИК-приемник, легко построить несложный, но практичный ИК-локатор.
Реализация
Основой локатора является микроконтроллер. В приводимой схеме использован один из самых простых и дешевых контроллеров семейства AVR - ATtiny12V, - но практически без изменений схемы и программы может быть взят любой другой контроллер семейства. Конструкция локатора очень проста и может быть легко скорректирована под имеющиеся в наличии детали.
ИК-излучатель (LED1) - любой светодиод, работающий в ИК-диапазоне, желательно ближе к 950нм. Должен подойти, к примеру, ИК-передатчик от практически любого пульта ДУ.
Светодиод управляется сигналом от контроллера по линии РВ4. Если вам удасться найти светодиод на ток до 20мА, то можно включить его прямо на выход контроллера, если же нет, то, как и в нашем случае, следует поставить транзистор (V1) в качестве ключа. Какой именно транзитор - не очень важно, лишь бы он был n-p-n типа и был расчитан на тот же ток, что и выбранный вами светодиод. Резистор R2 надо поставить таким, чтобы ток через светодиод не превышал допустимый для данной модели.
ИК-приемник (IF1) - TSOP1736, сигнал с него поступает на непосредственно на вход контроллера (линия РВ3). В отсутствие подходящего ИК-сигнала на выходе приемника присутствует высокий логический уровень, а при появлении сигнала - проходит импульс низкого уровня.
Обратите внимание: для "ответственных" приложений контроллер и ИК-приемник лучше включать в соответствии с рекомендациями изготовителей,
а керамический конденсатор примерно в 100нФ рядом с вводами питания контроллера - вещь во всех случаях обязательная
Индикатором в нашем случае служит "обычный" светодиод LED2, подключенный на линию РВ0 контроллера последовательно с токоорганичивающим резистором.
Разъем J1 используется для подключения программатора. Питание +5В подается на клемму Vcc и "землю".
При желании локатор может быть изготовлен даже без печатной платы, в виде единого модуля размерами примерно 1х1х2см
Работа локатора
Локатор работает следующим образом: контроллер включает ИК-излучатель LED1 несколько раз с частотой около 36кГц, затем "смотрит", есть ли сигнал от ИК-приемника IF1 и если сигнал есть - зажигает индикатор LED2. Затем контроллер "ждет" несколько миллисекунд, после чего посылает следующую пачку ИК-импульсов, и так далее.
По показаниям индикатора можно судить о наличии препятствия перед локатором:
* если посылаемые пачки импульсов "не возвращаются" (видны отдельные редкие вспышки индикатора в следствие случайных помех) - препятствие отсутствует;
* если некоторые из посланных пачек детектируются приемником (частые более или менее регулярные вспышки индикатора) - препятствие *есть, но "далеко";
* если приемник регистрирует каждую из посланных пачек (индикатор горит непрерывно) - препятствие "близко".
Регулировка и настройка
ИК-излучатель и, особенно, ИК-приемник имеют довольно широкие диаграммы направленности, поэтому прежде, чем приступать к
настройке локатора убедитесь, что излучатель и приемник тщательно оптически изолированы друг от друга (к примеру, установлены в глубине непрозрачных,
соосно расположенных, тубусов).
Если не касаться вопроса организации потока ИК-лючей и их приема (использования различных тубусов, линз и пр., взаимного расположения излучателя и приемника и т.д.), то по своей схемотехнике чувствительность локатора может регулироваться в довольно широких пределах. Так, в нашем случае зона "близко" может составлять от 5 до 20см, а ширина зоны "далеко" - от пары сантиметров до одного метра и более.
Иметь большую зону "далеко", в принципе, выгодно, поскольку частота импульсов индикатора здесь примерно пропорциональна расстоянию до препятствия и, таким образом, можно судить не только о наличии препятствия но и дистанции до него. Однако с увеличением этой зоны (через повышение общей чувствительности локатора) усиливается влияние помех, а также проявляется отражение сигнала не только от данного препятствия, но и прочих "подсвеченных" объектов. Для большинства приложений оказывается удобным, если локатор обнаруживает препятствие в 30-50см и считает, что препятствие "близко", когда оно находится в 10-15см от него.
Чувствительность локатора зависит от многих факторов и, соответственно, их можно в той или иной степени использовать для ее настройки.
Прежде всего, чувствительность локатора зависит от типа ИК-излучателя и тока через него. Ток, текущий через излучатель, определяется параметрами транзистора V1 и сопротивлением резистора R1. Таким образом, меняя сопротивление резистора можно менять и чувствительность локатора. В принципе, поставив последовательно с резистором R1 дополнительный подстроечный резистор, можно использовать его для регулирования чувствительности.
Если напряжение в цепи R1 - V1 - LED1 не стабилизируется специально (как в данной схеме), то ток через излучатель будет зависеть от напряжения питания схемы, причем сильно. Так, изменение напряжения питания на 0.1В дает изменение дальности обнаружения препятствия на 5 - 7см. Поэтому в "ответственных" случаях следует принимать специальные меры для стабилизации напряжения всей схемы, либо излучателя отдельно.
Однако наиболее удобный способ "зарезать" излишнюю чувствительность - изменить частоту несущей сигнала ИК-излучателя, поскольку, как видно из графика Изображение:ir_locator_02.jpg
чувствительность ИК-приемника в сильнейшей степени от нее зависит.
Частота сигнала ИК-излучателя задается программно. Период сигнала складывается из длительности ипульса и длительности паузы между импульсами. Длительность импульса задается величиной переменной TIME1, а длительность паузы - переменной TIME2; соответственно, меняя эти значения (одновременно или независимо) можно настроить оптимальную для данного приложения чувствительность локатора.
Значения перменных TIME1, TIME2 и TIME3 в приводимом тексте программы даны для контроллера ATtiny12V с "заводскими" установками,
т.е. для тактовой частоты 1.2МГц; при другой тактовой частоте значения TIME1, TIME2 и TIME3 должны быть скорректированы.
Программа
;********************************************************************
;* ИК-локатор: ИК-светодиод на PB4 дает пачки импульсов с частотой
;* около 36кГц, а TSOP1736 на PB3 их отслеживает
;*
;* MCU: ATtiny12@1MHz © RoboClub 2003
;********************************************************************
.include "tn12def.inc"
rjmp RESET ;reset handle
;* Объявление переменных
.def t1 = r1 ;счетчик для "длинных" задержек
.def temp = r19 ;счетчик времени задержки
.def count = r20 ;счетчик числа импульсов в пачке
;* Определения
.equ led = 0 ;LED на PB0
.equ tsop = 3 ;TSOP на PB3
.equ ir_led = 4 ;IR LED на PB4
;* Начало кода
RESET:
sbi DDRB, led ;подключаем LED на выход PORTB линия 5
sbi DDRB, ir_led ;подключаем IR LED на выход PORTB линия 3
cbi DDRB, tsop ;подключаем TSOP на вход PORTB линия 2
sbi PORTB,tsop ;включаем "подтяжку"
;* Задание значений
.equ TIME1 = 4 ;длительность импульса
.equ TIME2 = 5 ;задержка между импульсами
.equ TIME3 = 20 ;задержка между пачками импульсов
.equ COUNT = 10 ;число импульсов в пачке
; Главный цикл программы
; ----------------------
start:
ldi count, COUNT ;загружаем в счетчик число импульсов в пачке
; цикл выдачи пачки импульсов
flash:
cbi PORTB, ir_led ;зажигаем IR LED
ldi temp, TIME1 ;загружаем в temp длительность импульса
Delay1: dec temp ;уменьшаем на единицу temp, пока
brne Delay1 ; не станет равным 0
sbi PORTB, ir_led ;гасим IR LED
ldi temp, TIME2 ;загружаем в temp длительность паузы между импульсами
Delay2: dec temp ;уменьшаем на единицу temp, пока
brne Delay2 ; не станет равным 0
dec count ;уменьшаем на 1 счетчик числа импульсов
brne flash ;если не 0, то посылаем следующий импульс
;когла пачка импульсов выдана - проверяем, есть ли сигнал от TSOP
sbis PINB, tsop ;если уровень на выходе TSOP низкий (т.е. сигнал есть)
rjmp ledon ;то идем зажигать LED
cbi PORTB, led ;иначе гасим LED
rjmp wait_next ;и переходим к ожиданию следующей пачки
ledon: sbi PORTB, led ;гасим LED
;задержка перед следующей пачкой импульсов
wait_next:
clr t1 ;сбрасываем t1 (т.е. t1=0 или, что тоже t1=256)
ldi temp, TIME3 ;устанавливаем число задержек
Delay3: dec t1 ;задержка по счетчику t1 от 256 до 0
brne Delay3 ; т.е. 256*3 тактов
dec temp ;повторяем TIME3 раз задержку по t1
brne Delay3 ; т.е. всего (TIME3*256*3 + TIME3*3) тактов
rjmp start ;переходим к началу главного цикла