Инфракрасный датчик препятствий YL-63

Содержание:

  • Обзор
  • Технические характеристики модуля
  • Подключение
  • Пример использования
  • Часто задаваемые вопросы FAQ

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

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

Рисунок 1. Цифровой датчик обнаружения препятствий YL-63


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

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

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

Модуль имеет 3 вывода (рис. 1):

  • VCC — питание 3-5 В;
  • GND — земля;
  • OUT — цифровой выход.

Подключим датчик к плате Arduino (Схема соединений на рис. 2) и напишем простой скетч, сигнализирующий звуковым сигналом о наличии препятствия. Загрузим скетч из листинга 1 на плату Arduino и посмотрим как датчик реагирует на препятствия (см. рис. 3).

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

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

Загрузим скетч из листинга 1 на плату Arduino и посмотрим как датчик реагирует на препятствия (см. рис. 3).

Листинг 1

//  Скетч к обзору датчика препятствий YL-63
//  http:// http://makerplus.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)            // Ждем входа
       {;}
  }  
}

 

Вывод данных в монитор последовательного порта

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

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


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

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

mobilnyj-robot-arduino

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

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

skhema-obhoda-labirinta-robotom

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

Установим на передний бампер робота три датчика препятствий, два смотрят вперед, один – вправо (см. рис. 6). Наличие двух передних датчиков улучшает качество определения препятствий спереди, поскольку один датчик не охватывает всю переднюю зону.

podklyuchenie-datchikov-prepyatstvij-arduino

Рисунок 6. Подключение датчиков препятствий к мобильному роботу на базе 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. Датчик не определяет препятствие на определенном расстоянии

С помощью протенциометра подберите порог срабатывания датчика.