Инфракрасный датчик препятствия на компараторе LM393. Простой инфракрасный сенсор Датчик определения препятствия

Каждый робот, способный ездить, летать или плавать, должен видеть препятствия, находящиеся у него на пути. Чтобы робот смог это сделать, ему необходимы соответствующие датчики. В английской литературе такие устройства называют proximity sensor , мы же их будем называть датчиками препятствия. На этом уроке мы рассмотрим один из самых распространенных датчиков препятствия, который работает по принципу отражения. Устроен он очень просто. Датчик содержит направленный источник света и детектор света. Источником часто служит инфракрасный светодиод с линзой, а детектором — фотодиод или фототранзистор. Светодиод на датчике постоянно включен и излучает узкий пучок света в прямом направлении. Если перед датчиком есть препятствие (рисунок А), то на детектор попадает отраженный свет от источника, и на выходе датчика появляется положительный импульс. В противном случае, если препятствия нет, то датчик молчит (рисунок Б). Есть и третий вариант, когда препятствие есть, но свет от него не отражается! На рисунке В изображен как раз такой случай. Получается, матовую черную поверхность робот не увидит.

1. Подключение

Будем подключать самый простой датчик с цифровым выходом. Принципиальная схема подключения к выводам Ардуино Уно :
Внешний вид макета

2. Настройка чувствительности

Как известно, вокруг нас имеется множество источников инфракрасного излучения, включая лампы освещения и солнце. Фоточувствительный элемент датчика регистрирует это фоновое излучение, и может дать ложный сигнал срабатывания. Другими словами, датчик препятствия может сработать, когда никакого препятствия и нет вовсе. Чтобы решить эту проблему, на датчике имеется возможность настроить чувствительность таким образом, чтобы воспринимать только свет достаточной силы. Обычно это реализуется с помощью компаратора — электронного устройства, позволяющего сравнивать два уровня напряжения. Одно напряжение подается на компаратор с фотодиода, а другое с делителя напряжения на основе потенциометра. Второе напряжение будем называть пороговым . Теперь датчик даст положительный сигнал только тогда, когда напряжение на фотодиоде станет больше, чем настроенное нами. Для настройки порогового напряжения нам понадобится шлицевая отвертка (она же — плоская). В этой процедуре нам также поможет зеленый светодиод состояния, который загорается когда датчик регистрирует достаточный уровень инфракрасного света. Алгоритм настройки сводится к трем шагам:
  • помещаем датчик в условия освещенности, в которых он будет работать;
  • подключаем датчик к питанию, при этом на нем загорится красный светодиод;
  • убираем перед датчиком все препятствия, и крутим потенциометр до тех пор, пока зеленый светодиод состояния не погаснет.
Для проверки поднесем к датчику ладонь, и на определенном расстоянии загорится зеленый светодиод. Уберем руку — светодиод погаснет. Расстояние на котором датчик регистрирует препятствие зависит от уровня фоновой засветки, от настройки чувствительности и от правильного расположения фотодиода и светодиода на датчике. Они должны быть расположены строго параллельно друг другу. Теперь, когда датчик настроен должным образом, приступим к составлению программы.

3. Программа

Для примера, будем зажигать и гасить штатный светодиод №13 на Ардуино Уно , в зависимости от показаний датчика. При использовании цифрового датчика, программа будет такой же, как и в случае работы с кнопками. На каждой итерации цикла loop мы считываем значение на выводе №2, и затем сравниваем это значение с уровнем HIGH . Если значение равно HIGH , значит датчик видит препятствие, и мы зажигаем светодиод на выводе №13. В противном случае — гасим светодиод. const int prx_pin = 2; const int led_pin = 13; byte v; void setup() { pinMode(prx_pin, INPUT); pinMode(led_pin, OUTPUT); } void loop() { v = digitalRead(prx_pin); if(v == HIGH) digitalWrite(led_pin, HIGH); else digitalWrite(led_pin, LOW); }

4. Пример использования

Попробуем теперь применить цифровой датчик по прямому назначению. Заставим двухколесного робота реагировать на показания двух датчиков, размещенных слева и справа. Сделаем так, чтобы при обнаружении препятствия робот отворачивал от него в противоположную сторону, а затем продолжал движение вперед. Оформим программу в виде блок-схемы процедуры loop .

Задания

Если все получилось, попробуйте выполнить еще несколько заданий с роботом.
  1. Направить датчики препятствия вниз, чтобы робот смог чувствовать край стола. Написать программу, которая предотвращает падение робота со стола.
  2. Снова направить датчики вниз, но на этот раз для другой цели. Как мы выяснили, датчик может отличить черную поверхность от белой. Воспользуйтесь этим свойством, чтобы сделать робота-следопыта (он же LineFollower).
  3. Направить датчики в стороны, и заставить робота двигаться вдоль стены.

Заключение

На следующем уроке мы познакомимся с датчиком, который устроен практически так же, но больше подходит для детектирования черных и белых поверхностей. Попробуем считывать уже не цифровой, а аналоговый сигнал датчика, чтобы сделать более совершенного робота-следопыта.

Устройство представляет собой простой цифровой датчик препятствия, ориентирующийся по отраженному инфракрасному излучению. Этот датчик был приобретен на Алиэкспресс. Принцип действия схож со схемой, которую недавно рассматривали


Инфракрасный датчик препятствия купленный на Али

Конструкция и параметры

Конструктивно датчик представляет собой печатную плату 31 x 14 мм, на плате имеется одно крепежное отверстие.


Инфракрасный датчик препятствия — плата печатная

Масса датчик 2,7 г. Для питания и передачи информации на датчике имеется трех контактный разъем, выводы которого промаркированы.


Трехконтактный разъем подключения датчика
  • Устройство питается постоянным напряжением в диапазоне от 3,3 до 5 В, ток потребления составляет 25 мА при напряжении питания 3,3 В и 40 мА при напряжении 5 В.

На датчике размещен инфракрасные светодиод и фотоприемник. Наличие препятствия определяется по интенсивности отраженного инфракрасного излучения. Подстроечным резистором на плате датчика можно установить требуемую чувствительность устройства. По заявлениям производителя датчик реагирует на препятствия в диапазоне от 2 до 30 см, угол зрения датчика 35 градусов. У автора получилось настроить датчик на препятствия в диапазоне 3-8 см, хотя возможно проблема в том, что испытывался только один датчик, к тому же угол зрения датчика, действительно весьма широк. Не следует также забывать, что различные поверхности отражают инфракрасное излучение по разному, более «блестящая», в данном диапазоне, поверхность будет обнаружена с большего расстояния, чем темная. В любом случае, этот датчик является «оружием ближнего боя».


ИК датчик препятствия — размер платы

Когда в поле зрения датчика появляется препятствие, на его информационном выходе устанавливается сигнал логического нуля. Если в поле зрения препятствия нет, то на выходе сигнал логической единицы. На плате датчика имеются два светодиода, один – индикатор питания, а другой — индикатор срабатывания датчика, который загорается при появлении в зоне видимости препятствия.

Подключение к Ардуино

По заявлению продавца датчик оптимизирован для Arduino, учитываю богатую, для столь простого устройства, индикацию и маркировку с этим можно легко согласиться.


ИК датчик препятствия с Ардуино

Для примера взаимодействия датчика с платформой Arduino, можно взять программу, которая зажигает светодиод, подключенный к 13 цифровому порту, по нажатию кнопки, подключенной к 12 цифровому порту платы Arduino UNO. Программа взята с сайта robocraft.ru

/*
* LED with button
*/

int ledPin = 13; // сетодиод
int btnPin = 12; // кнопка
int val=0;

void setup()
{
pinMode(ledPin, OUTPUT); // это выход — светодиод
pinMode(btnPin, INPUT); // а это вход — кнопка
Serial.begin(9600); // будем записывать в COM-порт
}

void loop()
{
val = digitalRead(btnPin); // узнаём состояние кнопки
if(val==HIGH) // кнопка нажата
{
digitalWrite(ledPin, HIGH); // зажигаем светодиод
Serial.println(«H»);
}
else // кнопка не нажата
{
digitalWrite(ledPin, LOW); // гасим светодиод
Serial.println(«L»);
}
delay(100);
}

Датчик при этом подключается вместо кнопки. После загрузки программы в память микроконтроллера, можно поэкспериментировать с разными режимами работы датчика.

Вывод о покупке

В целом неплохой дешевый датчик для систем сенсорного управления и ориентирования роботов. В последнем случае может, вероятно, быть альтернативой или дополнением, концевым выключателям, которые срабатывают при контакте робота с препятствием. Своих денег стоит. Denev

Практически каждый самодвижущийся робот имеет такие датчики. Это своеобразные глаза робота. Датчик работает по принципу радара - посылка и прием ИК света. Светодиод излучает инфракрасные лучи, которые отражаясь от препятствия попадают на приемник ИК излучения TSOP1736 , который формирует на выходе сигнал низкого уровня, что говорит о том, что есть сигнал. Если же препятствия нет, то лучи уйду в никуда и отражения не будет, приемник ИК лучей ничего не увидит.

Вобщем идея очень проста, но есть тут несколько тонкостей. Во первых приемник ИК излучения реагирует только на импульсы определенной частоты, частота указана в последних двух цифрах обозначения TSOPа - 1736 - 36Кгц, 1738 - 38 Кгц. Т.е. для управления светодиодом (вывод вход датчика) нужно подавать импульсы именно с частотой приема TSOPа. Это можно реализовать либо программно, либо использовав модуль ШИМ управляющего микроконтроллера, а можно и аппаратно, собрав генератор на нужную частоту, скажем на таймере 555. Лично я использую для управления ИК диодами ШИМ модуль микроконтроллера. Чтобы датчик ответил на сигнал оптимально подавать пачку из 8-15 импульсов на светодиод, а потом сразу же проверять состояние ИК приемника. Если на его выводе лог.0 то есть препятствие - нужно выполнять маневр. И еще, фильтр ИК приемника может подстраиваться в небольших пределах на принимаемый ИК сигнал, это нигде не документируется, но это так. Поэтому совсем точно выдерживать 36Кгц не обязательно, достаточно установить близкую частоту (ну скажем 35750 ГЦ) и дать достаточное количество импульсов, чтобы TSOP мог подстроиться к ним и успеть среагировать, обычно делают 10-15 импульсов.

Вывод TSOPа имеет открытый коллектор, когда сигнал принят вывод устанавливается в низкий логический уровень. Если выход датчика подключен к порту контроллера со встроенным подтягивающим резистором то резистор R2 в схеме не нужен.

Тут еще нужно сказать, что дальность определения расстояния очень сильно зависит от материала. Например на черный пластик датчик вобще не реагирует, а на белые обои реагирует прекрасно. Для относительной регулировки чувствительности датчика используется подстроечный резистор R4. А чтобы датчик реагировал только на отраженный свет, а не на сам светодиод нужно между диодом и приемником установить непрозрачную для ИК лучей перегородку.

Питается устройство напряжением 5 вольт (у меня от NI-MH аккумулятора 4,8 вольт).

Пример настройки модуля ШИМ на 36 КГц для микроконтроллера PIC
movlw d"14"
movwf CCPR1L ;Установка периода 50%
movlw b"00001111"
movwf CCP1CON ;Включаем ШИМ
bsf STATUS,RP0 ;Банк 1
movlw d"27" ;Частота ШИМ примерно 36КГЦ (для TSOP1736)
movwf PR2
bcf STATUS,RP0 ;БАНК 0
clrf TMR2
movlw b"00000100" ;Включение модуля ШИМ
movwf T2CON ;и таймера TMR2, чтобы ШИМ работало

Обзор датчика препятствия YL-63

Цифровой инфракрасный датчик обхода препятствий YL-63 (или FC-51) (рис.1) применяется тогда, когда нужно определить наличие объекта, а точное расстояние до объекта знать необязательно. Датчик состоит из инфракрасного излучателя, и фотоприемника. ИК источник излучает инфракрасные волны, которые отражаются от препятствия и фиксируются фотоприемником. Датчик обнаруживает препятствия в диапазоне расстояний от нуля до установленной предельной границы. Он построен на основе компаратора LM393, который выдает напряжение на выход по принципу: обнаружено препятствие –логический уровень HIGH, не обнаружено – логический уровень LOW, данное состояние показывает и находящийся на датчике красный светодиод. Пороговое значение зависит от настройки датчика и регулируется с помощью установленного на модуле потенциометра. Для индикации питания на датчике установлен зеленый светодиод. Датчик применяется в робототехнике для обнаружения препятствий при движении колесных или гусеничных роботов.

Технические характеристики датчика препятствия YL-63

  • Модель: YL-63(или FC-51)
  • напряжение питания: 3.3–5 В
  • тип датчика: диффузионный
  • компаратор: LM393
  • расстояние обнаружения препятствий: 2 – 30 см
  • эффективный угол обнаружения препятствий: 35°
  • потенциометр для изменения чувствительности
  • светодиод индикации питания
  • светодиод индикации срабатывания
  • размеры: 43 х 16 х 7 мм

Подключение YL-63 к Arduino

Модуль имеет 3 вывода:
  • VCC - питание 3-5 В;
  • GND - земля;
  • OUT - цифровой выход.
Подключим датчик к плате Arduino (Схема соединений на рис. 1) и напишем простой скетч, сигнализирующий звуковым сигналом о наличии препятствия. Загрузим скетч из листинга 1 на плату Arduino и посмотрим как датчик реагирует на препятствия (см. рис. 2).

Рисунок 1. Схема соединений подключения датчика YL-63 к плате Arduino

Загрузим скетч из листинга 1 на плату Arduino и посмотрим как датчик реагирует на препятствия (см. рис. 3). Листинг 1 // Скетч к обзору датчика препятствий YL-63 // http:// http://3d-diy.ru // контакт подключения выхода датчика #define PIN_YL63 5 // Данные с датчика Y63 #define barrier digitalRead(PIN_YL63) void setup() { // инициализация последовательного порта Serial.begin(9600); // настройка контакта подключения датчика в режим INTPUT pinMode(PIN_YL63,INTPUT); } void loop() { if (barrier == 1) { Serial.println("BARRIER!!!"); // Зона обнаружения препятствия while (barrier == 1) // Ждем выхода {;} } else { Serial.println("not barrier"); // Вне зоны обнаружения препятствия while (barrier == 1) // Ждем входа {;} } }

Рисунок 2. Вывод данных в монитор последовательного порта

С помощью потенциометра поэкспериментируем с установкой порогового значения.

Пример использования

Рассмотрим пример использования датчика YL-63 на борту популярной самоходной робототехнической платформы – мобильный робот на базе Arduino (см. 3).

Рисунок 3. Робототехническая платформа – мобильный робот на базе Arduino

Создадим скетч обхода роботом лабиринта. Если при движении робота в лабиринте придерживаться одной его стороны (левой или правой), то выход обязательно будет достигнут (рис. 4).

Рисунок 4. Схема обхода лабиринта роботом.

Установим на передний бампер робота три датчика препятствий, два смотрят вперед, один – вправо (см. рис. 5).

Наличие двух передних датчиков улучшает качество определения препятствий спереди, поскольку один датчик не охватывает всю переднюю зону.

Рисунок 5. Подключение датчиков препятствий к мобильному роботу на базе Arduino.

В скетче проверяем состояние датчиков и в зависимости от полученных данных принимается решение о движении. Датчики подключены к контактам Arduino 2, 12, 13. // Номера портов к которым подключены датчики препятствия. const int Front1 = 2, Front2 = 12, Right = 13; Создадим в Arduino IDE новый скетч, занесем в него код из листинга 2 и загрузим скетч на на плату Arduino. Листинг 2 // Объявляем переменные для хранения состояния двух моторов. int motor_L1, motor_L2, input_L; int motor_R1, motor_R2, input_R; // Временные константы служат для точного задания времени на поворот, разворот, движение вперед // в миллисекундах. const int time_90 = 390; // Номера портов к которым подключены датчики препятствия. const int Front1 = 2, Front2 = 12, Right = 13; //========================================= void setup() { // Заносим в переменные номера контактов (пинов) Arduino. // Для левых и правых моторов машинки. setup_motor_system(3, 4, 11, 7, 8, 10); // pinMode(Front1, INPUT); pinMode(Front2, INPUT); pinMode(Right, INPUT); // Двигатели запущены. setspeed(255, 255); } // Основная программа. void loop() { boolean d_Front1, d_Front2, d_Right; d_Front1 = digitalRead(Front1); d_Front2 = digitalRead(Front2); d_Right = digitalRead(Right); // Если ни один датчик не сработал. if (d_Front1 && d_Front2 && d_Right) { //Замедление правых колес setspeed(255, 15); forward();//подворот вправо. } else { //Если сработал один из передних датчиков и не сработал правый. if ((!d_Front1) || (!d_Front2)) { //Максимальная мощность на все колеса. setspeed(255, 255); // поворачиваем налево на 90 градусов. left(); delay(time_90 / 5); } else { // Если сработал правый датчик. // Замедление левых колес. setspeed(15, 255); forward();//подворот влево. } } } // Функция инициализации уравления моторами. void setup_motor_system(int L1, int L2, int iL, int R1, int R2, int iR) { // Заносим в переменные номера контактов (пинов) Arduino. motor_L1 = L1; motor_L2 = L2; input_L = iL; // Для левых и правых моторов машинки. motor_R1 = R1; motor_R2 = R2; input_R = iR; // Переводим указанные порты в состояние вывода данных. pinMode(motor_L1, OUTPUT); pinMode(motor_L2, OUTPUT); pinMode(input_L, OUTPUT); pinMode(motor_R1, OUTPUT); pinMode(motor_R2, OUTPUT); pinMode(input_R, OUTPUT); } // Функция задает скорость двигателя. void setspeed(int LeftSpeed, int RightSpeed) { // Задаем ширину положительного фронта от 0 до 255. analogWrite(input_L, LeftSpeed); analogWrite(input_R, RightSpeed); // Чем больше, тем интенсивнее работает мотор. } // Поворот налево с блокировкой левых колес. void forward() { // Левые колеса вращаются вперед. digitalWrite(motor_L1, HIGH); digitalWrite(motor_L2, LOW); // Правые колеса вращаются вперед. digitalWrite(motor_R1, HIGH); digitalWrite(motor_R2, LOW); } // Поворот налево. void left() { // левые колеса вращаются назад digitalWrite(motor_L1, LOW); digitalWrite(motor_L2, HIGH); // правые колеса вращаются. digitalWrite(motor_R1, HIGH); digitalWrite(motor_R2, LOW); } Запускаем робота в лабиринте и смотрим как он движется в лабиринте.

Часто задаваемые вопросы FAQ

1 . Не горит зеленый светодиод
  • Проверьте правильность подключения датчика.
2. Датчик не определяет препятствие на определенном расстоянии
  • С помощью протенциометра подберите порог срабатывания датчика.

Описание и схема датчика препятствий на инфракрасных лучах, который собран на микросхеме К561ЛН2. Одна из задач, которую приходится решать при разработке самодельных бытовых электроприборов, движущихся игрушек и других подобных автоматизированных устройств, - обнаружение и обход препятствий, а так же, обнаружение преград и приближающихся предметов.

Использование для этих целей контактных датчиков не всегда удобно, потому что требует механического соприкосновения с препятствием, с некотором пороговым усилием, зависящим от конструкции датчика, что не всегда желательно. Намного более удобен, надежен и эффективен бесконтактный датчик, не ощупывающий препятствие, а видящий его.

Здесь приводится описание простого датчика, видящего в ИК-излучении, и сделанного из деталей от систем дистанцинного управления бытовой аппаратуры. Максимальная дальность обнаружения препятствий может достигать одного метра или больше, но если этого много (например, нужно реагировать на приближение всего на один сантиметр), его дальность очень просто уменьшить увеличением сопротивления резистора, включенного последовательно излучающему ИК-светодиоду.

Принципиальная схема

Схема датчика приведена на рисунке в тексте. Она выполнена на основе микросхемы К561ЛН2, содержащей шесть инверторов повышенной нагрузочной способности, и таких элементов систем дистанционного управления аппаратурой, как инфракрасный светодиод и инфракрасный фото приемник. Фотоприемник интегральный, на частоту модуляции ИК-потока 33 кГц.

Рис. 1. Принципиальная схема датчика препятствий на ИК-лучах.

Функционально схема состоит из приемника и излучателя. Приемник состоит из интегрального фотоприемника HF1 и логического элемента D1.1. Излучатель состоит из ИК-светодиода HL1 и генератора импульсов 33 кГц на элементах D1.2-D1.6. Фотоприемник и светодиод расположены на плате рядом и направлены в одну сторону, - на препятствие.

Печатная плата

Рис. 2. Печатная плата для схемы датчика.

Между ними непрозрачная перегородка. Чувствительность (дальность) регулируется подбором сопротивления R3 (на схеме минимальное сопротивление, дающее максимальную чувствительность).

Горбунов С. РК-2016-09.