В нашем несовершенном мире весьма востребованы разные технические штуки, призванные стоять на страже имущества и спокойствия граждан. Поэтому сложно, полагаю, найти человека, который бы никогда не видел охранных сигнализаций, снабженных датчиками движения. Физические принципы их работы, а также реализация могут быть разные, но, вероятно, наиболее часто встречаются пироэлектрические пассивные инфракрасные датчики (PIR).
Реагируют они на изменение излучения в инфракрасном диапазоне, а именно в средней его части — 5-15 мкм (тело среднего здорового человека излучает в диапазоне около 9 мкм). С точки зрения конечного потребителя штука очень простая — вход питания (чаще 12 вольт) и выход реле (обычно твердотельное и с нормально замкнутыми контактами). Прокрался кто-нибудь тепленький мимо — реле сработало. Скукота. Но внутри все не так просто.
Сегодня мы немного времени посвятим теории, а затем распотрошим один такой девайс и сделаем из него не просто датчик, реагирующий на факт движения, но регистрирующий направление движения.
Немного теории
Некоторые кристаллические вещества обладают свойством поляризоваться под действием падающего на них излучения. С изменением интенсивности излучения изменяется и поляризация, а, следовательно, и напряженность электрического поля в кристалле. Отсюда и название — пироэлектрики. Далее измеряя разность потенциалов между разными точками кристалла можно судить о величине излучения. Правда возникающая разность потенциалов довольно быстро компенсируется «налипающими» на кристалл заряженными частицами, которых в окружающем пространстве достаточно. По этой причине для измерения постоянной интенсивности излучения пироэлектрик не очень пригоден. Внятно может быть зафиксировано именно изменение излучения. Но в целях, в которых подобные датчики применяются — фиксация движения, это то, что нужно.
Вроде все просто, но есть небольшая проблема. Нам не интересно изменение излучения вообще, а интересно его изменение по причине прохода нарушителя. Но солнце встает и заходит, лето сменяется зимой, отопление включают и выключают, и падающее на сенсор инфракрасное излучение меняется в очень больших пределах, хотя никто и не думал покушаться на наше имущество. Понятно, что практическая ценность устройства, реагирующего на что попало, близка к нулю. Обходят эту неприятность довольно просто — вместо одного чувствительного элемента используют два. Включая их в цепь последовательно так, чтобы изменения напряженности на них происходили в противоположных направлениях. А конструктивно располагая с тем расчетом, чтобы «глобальное» изменение уровня инфракрасного излучения (скажем при изменении температуры воздуха) влияло на них в равной степени, а «локальное» (перемещение объекта вроде человека) — в разной. Чтобы было понятнее перейдем к иллюстрации (рисунки намеренно сделаны от руки, дабы несколько разнообразить засилье компьютерной графики).
Внутри металлического корпуса (изображено синим) помещают два кристалла пироэлектрика. Для измеряемого излучения в корпусе имеется окошко, закрытое фильтром (красный), пропускающим только нужный нам диапазон длин волн. Перед окошком размещают оптическую систему (зеленая), формирующую нужную диаграмму направленности датчика. Двояковыпуклая линза нарисована, конечно, условно. В реальных датчиках используют линзы Френеля, отштампованные на пластике (прозрачном в нужном диапазоне частот, само собой). Вот такие:
О линзах подробнее чуть позже.
Прямо рядом с кристаллами внутри корпуса (дабы не растерять в «дальней дороге» измеряемую величину) размещают полевой транзистор, сток и исток которого уже выведены наружу. Транзистор полевой неспроста. Этот прибор, как известно, управляется электрическим зарядом, изменение которого на кристалле мы, собственно, и измеряем. Биполярный транзистор здесь совершенно бы не подошел, как прибор управляемый током, которого пироэлектрик выдать не в состоянии. Резистор нужен для стекания паразитных статических зарядов, хотя несколько ухудшает чувствительность прибора.
Теперь о линзах. Без линз датчик имеет очень широкую диаграмму направленности — 100-120° по вертикали и горизонтали. При этом (условно) одну половину пространства «видит» один кристалл, вторую — другой. Т.е. получается этакий конус, рассеченный плоскостью, направление которой зависит от взаимного расположения кристаллов. Обычно эта плоскость вертикальна. При помощи линзы из двух получившихся полуконусов формируется два относительно узких «луча» диаграммы направленности. Это повышает чувствительность датчика по расстоянию и снижает паразитные шумы. Однако узость диаграммы приводит к возможности нарушителю легко обойти чувствительные зоны. Чтобы этого не случилось линз делают несколько (это как раз видно на фото выше) и, соответственно, формируют несколько пар лучей. Их вид и число зависят от области применения датчика. Скажем для коридоров нужно «видеть» узко, но далеко. Для квадратного помещения — близко и широко. Где-то нужно защитить зону под датчиком, где-то над ним и т. п. Но это все не принципиально, поэтому сосредоточимся на одной паре лучей, которую пересекает движущийся теплый объект.
По мере движения объект попадет в поле зрения одного кристалла, и тот сформирует импульс напряжения в соответствии с изменением уровня инфракрасного излучения. Когда объект попадет в поле зрения другого кристалла, тот тоже сформирует импульс, но другой направленности (мы же помним, что кристаллы включены в противоположной полярности). Если объект пересечет несколько пар лучей, то весь этот процесс повторится.
Примечание: Ввиду того, что питание датчика, как правило, однополярное, нельзя говорить о положительном и отрицательном импульсе. Можно говорить лишь об изменении напряжения в большую или меньшую сторону от некоего среднего значения «покоя», зависящего от параметров сенсора, схемы его включения, состояния окружающей среды. Но для удобства изложения далее все же будем говорить об отрицательном и положительном импульсах.
С этого момента уже становится понятно каким образом можно определить направление движения. Если зафиксирован сначала положительный импульс, а потом отрицательный, то направление одно, если наоборот — другое. Однако в бытовых датчиках, о которых мы ведем речь, это свойство не используется. Но далее мы это исправим.
Пользоваться сигналом прямо с сенсора нельзя — он слишком мал, а его среднее значение «плавает» в больших пределах. Сигнал нужно усилить, причем в сотни тысяч раз, избавиться от дрейфа среднего значения и преобразовать в дискретный вид — есть движение/нет движения. Типовая структурная схема датчика движения, решающая эти задачи, имеет такой вид:
Слабый сигнал сенсора усиливается и подается на пару компараторов, один из которых фиксирует превышение заданной амплитуды положительным импульсом, второй — отрицательным. Уже дискретный сигнал с компараторов отправляется на исполнительное устройство. В качестве последнего обычно выступает ждущий мультивибратор, который на некоторое фиксированное время включает реле, а то уже размыкает/замыкает охранный шлейф. В более продвинутых датчиках вместо компараторов могут быть более сложные схемы, обеспечивающие защиту от ложных срабатываний, резких колебаний параметров окружающей среды, срабатываний от движения мелких животных, дополнительную реакцию на пожар и т. п. В самых современных датчиках все это делается не аналоговыми схемами, а DSP.
Однако для достижения поставленной цели нас будет интересовать только то, что до компаратора. Т.е. усилительная часть, а конкретнее — выход уже усиленного сигнала пироэлектрического сенсора. Для того, чтобы можно было найти это место в разбираемом датчике, посмотрим что именно нужно искать. А искать нужно в первую очередь микросхемы операционных усилителей (ОУ), расположенных недалеко от сенсора.
Типовая схема усилителя выглядит приблизительно так (нарисовано приблизительно, поскольку вариаций конкретных исполнений не счесть):
В данном случае первый каскад представляет собой неинвертирующий усилитель, второй инвертирующий. Коэффициенты усиления каждого из них порядка десятков тысяч, а обоих порядка сотен тысяч. Но главный «секрет» в том, что обратные связи ОУ содержат элементы (а именно конденсаторы), делающие эти связи зависимыми от частоты. Номиналы элементов таковы, что вблизи нулевой частоты (постоянный ток) общий коэффициент усиления стремится к нулю, около частоты 5 герц находится максимум усиления, а при частотах более 10 герц снова стремится к нулю. Такая частотная характеристика не случайна. Размер области, которую захватывает наша пара лучей, порядка 0,5-1 метра. Скорость движения человека порядка 1-3 м/с. Соответственно частота пересечения чувствительных зон составит как раз единицы герц. А сигналы лежащие вне этого диапазона можно считать паразитными. В том числе и дрейф постоянной составляющей сигнала. Т.е. в потрохах датчика нужно искать нечто подобное выходу второго каскада усиления.
Переходим к практическим упражнениям
Вооружившись теоретическими сведениями достанем паяльник. На фото показан разобранный датчик (снята передняя крышка с линзами Френеля и металлический экран).
Смотрим маркировку ближайшей к пироэлектрическому сенсору (круглый металлический с окошечком — это он и есть) микросхемы и (о, удача!) ею оказывается LM324 — счетверенный ОУ. Путем рассматривания окружающих элементов находим вывод ОУ, наиболее вероятно подходящий для наших целей (в моем случае это оказался вывод 1 микросхемы). Теперь неплохо бы проверить, а то ли мы нашли. Обычно для этого используют осциллограф. У меня под рукой его не оказалось. Зато оказался ардуино. Поскольку уровень сигнала после усиления составляет порядка единиц вольт, и особой точности замеров нам не нужно (достаточно качественной оценки), то входы АЦП ардуино вполне подойдут. К найденному выводу ОУ и минусу питания паяем проводки и выводим на макетку. Провода не должны быть длинными. В противном случае есть шанс померить не сигнал датчика, а что-нибудь совершенно другое.
Теперь подумаем насколько быстро нужно считывать сигнал, чтобы получить что-то вменяемое. Выше было сказано, что частотный диапазон полезного сигнала ограничен величиной примерно 10 Гц. Вспоминая теорему Котельникова (или Найквиста — кому что больше нравится), можно сделать вывод, что замерять сигнал с частотой выше 20 Гц смысла нет. Т.е. период дискретизации в 50 мс вполне подойдет. Пишем простой скетч, который каждые 50 мс читает порт А1 и вываливает его значение в сериал (строго говоря, измерения сигнала происходят реже, чем через 50 мс, поскольку на запись в порт тоже нужно время, однако для наших целей это не важно).
unsigned long time;
void setup() {
Serial.begin(9600);
pinMode(A1, INPUT);
time=millis();
}
void loop() {
if ((millis()-time) >= 50) {
Serial.println(analogRead(A1));
}
time=millis();
}
Включаем и машем перед датчиком руками (можно побегать, даже полезнее). На стороне компьютера данные с порта вываливаем в файл.
stty -F /dev/ttyUSB0 raw ispeed 9600 ospeed 9600 -ignpar cs8 -cstopb -echo
cat /dev/ttyUSB0 > output.txt
Строим график (в файл добавлен столбец с нумерацией отсчетов):
gnuplot> plot "output.txt" using 1:2 with lines
И видим то, что, собственно, и хотели — разнополярные всплески напряжения. Ура, теория работает и провод припаян куда надо. А простой анализ (проще говоря — рассматривание) графика позволяет сделать вывод, что более или менее надежной фиксацией факта наличия движения можно считать отклонение сигнала на 150 единиц от среднего значения.
Настало время сделать, наконец, датчик направления движения.
Модифицируем схему. Помимо аналогового сигнала сенсора подключим к ардуино пару светодиодов (порты 2 и 3, не забудьте токоограничительные резисторы) и напишем чуток более сложный скетч.
int a1;
int state2=0;
long average=0;
int n=0;
unsigned long time;
void setup() {
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(A1, INPUT);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
delay (30000); //мой датчик после включения
//до начала работы тупит 30 сек.
time=millis();
//тысячу раз делаем замер сигнала для
//вычисления его среднего значения
//чтобы было от чего отсчитывать отклонения
while (n <= 1000) {
++n;
a1=analogRead(A1);
average=average+a1;
delay(50);
}
average=average/1000;
//одновременным включением светодиодов
//сигнализируем, что система готова
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
delay(1000);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
time=millis();
}
void loop() {
//опрашиваем датчик каждые 50 мс
if ((millis()-time) >= 50) {
//этим простым выражением аналаговый сигнал
//превращаем в дискретный со значениями -1/0/1
a1=(analogRead(A1)-average)/150;
//если было изменение полярности сигнала, то
//включаем нужный светодиод
switch (a1) {
case 1:
if (state2=-1) {digitalWrite(2, HIGH);digitalWrite(3, LOW);}
state2=a1;
break;
case -1:
if (state2=1) {digitalWrite(2, LOW);digitalWrite(3, HIGH);}
state2=a1;
break;
}
//повторяем сначала
time=millis();
}
}
Чтобы из всего множества лучей диаграммы направленности датчика оставить только одну пару, закрываем все, кроме одной, линзы Френеля бумажным экраном.
Наслаждаемся результатом.
Автор: murzin