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

Каждый робот, способный ездить, летать или плавать, должен видеть препятствия, находящиеся у него на пути. Чтобы робот смог это сделать, ему необходимы соответствующие датчики. В английской литературе такие устройства называют proximity sensor, мы же их будем называть датчиками препятствия.

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

refl_

Светодиод на датчике постоянно включен и излучает узкий пучок света в прямом направлении. Если перед датчиком есть препятствие (рисунок А), то на детектор попадает отраженный свет от источника, и на выходе датчика появляется положительный импульс. В противном случае, если препятствия нет, то датчик молчит (рисунок Б). Есть и третий вариант, когда препятствие есть, но свет от него не отражается! На рисунке В изображен как раз такой случай. Получается, матовую черную поверхность робот не увидит.

Список необходимых компонентов

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

В корзину
В корзину
В корзину

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

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

proximity_ir_схема

Внешний вид макета

proximity_ir_bb

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. Пример использования

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

robot

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

Alg

Задания

Если все получилось, попробуйте выполнить еще несколько заданий с роботом.

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

К размышлению

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


Изменено:

Ардуино: оптический датчик препятствия: 4 комментария

  1. Здравствуйте, посоветуйте датчик который реагирует на белое и черное

  2. Здравствуйте. Как можно сделать так, чтоб после подачи питания, пока на датчике сигнал не изменится на high, крутил моторчик в одну сторону. А после того как получит сигнал high, начал делать определенную операцию?
    Помогите с этим разобратся

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.