Содержание
Обзор датчика препятствия 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 — цифровой выход.
Рисунок 1. Схема соединений подключения датчика YL-63 к плате Arduino
Загрузим скетч из листинга 1 на плату Arduino и посмотрим как датчик реагирует на препятствия (см. рис. 3).Листинг 1
// Скетч к обзору датчика препятствий YL-63 // // контакт подключения выхода датчика #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
Проверьте правильность подключения датчика.
2. Датчик не определяет препятствие на определенном расстоянии
С помощью протенциометра подберите порог срабатывания датчика.