ИК-датчик препятствий для Arduino на базе фототранзистора


Здесь уже была заметка о самом простейшем датчике робота — контактном. Настала пора рассмотреть более продвинутый датчик препятствий — инфракрасный.

Вариант такого датчика на TSOP рассмотрим позже, а пока разберёмся с простым аналоговым сенсором на фототранзисторе.
Так как датчик аналоговый, то его выход должен подключаться к аналоговым портам контроллера Arduino (на вход АЦП микроконтроллера).
По величине аналогового сигнала мы сможем примерно оценивать расстояние до препятствия (разумеется, абсолютных величин мы получить не сможем, так как уровень сигнала будет меняться в зависимости от объекта).

Простейшая схема — это пара из ИК-светодиода и фототранзистора:
ИК-датчик препятствий для Arduino
LED1 — ИК-диод (L-53F3C)
Q1 — транзистор (например, 2N4401 из StarterKit-а)
Q2 — фототранзистор (L-53P3C)
R1 — 100
R2 — 1K
R3 — 4K7

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

макет ИК-датчика препятствий для Arduino

Для усиления сигнала от фототранзистора, можно дополнительно подключить транзистор.
Когда фототранзистор освещается, то через него начинает протекать ток, величина которого зависит от уровня освещения датчика. Так как меняется ток, проходящий через фототранзистор, то меняется и падение напряжения на подключённом последовательно резисторе. Напряжение с резистора мы отправляем на аналоговый вход Arduino (вход АЦП) и по его величине судим об уровне освещения датчика.

Обратите внимание, что для управления светодиодом используется дополнительный транзистор. Дело в том, что светодиод потребляет 50 мА, а максимальная нагрузка на порт МК – не более 40 мА.

Самый прямолинейный алгоритм работы — это просто включить светодиод и замерить напряжение на аналоговом порту контроллера и при превышении определённого значения делать вывод о приближении препятствия.

/*
 * IR-led & phototransistor
 * тестовый скетч для работы с фототранзистором
 *
 * https://robocraft.ru
 */

int photoPin = 0;  // фоторезистор подключен 0-му аналоговому входу
int ledPin = 13;   // светодиод подключается к digital pin 9
int val = 0;       // переменная для хранения значения входного напряжения

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  digitalWrite(ledPin, HIGH);    // зажигаем
  val = analogRead(photoPin);    // считываем значение с фототранзистора
  Serial.println(val);

  // здесь можно проверить значение на превышение заданного порога

  delay(200);
}

Но этот подход плох тем, что при такой работе датчик будет реагировать на общий уровень засветки.

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

/*
 * IR-led & phototransistor
 * тестовый скетч для работы с фототранзистором
 * замер разности освещённости
 *
 * https://robocraft.ru
 */

int photoPin = 0;  // фоторезистор подключен 0-му аналоговому входу
int ledPin = 13;   // светодиод подключается к digital pin 9
int val = 0;       // переменная для хранения значения входного напряжения

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  digitalWrite(ledPin, HIGH);    // зажигаем
  delay(2);
  val = analogRead(photoPin);    // считываем значение с фототранзистора

  digitalWrite(ledPin, LOW);     // гасим
  delay(2);
  val = val - analogRead(photoPin);  // считываем значение с фототранзистора

  Serial.println(val);

  // здесь можно проверить значение на превышение заданного порога

  delay(200);
}

test_IR_led.pde

Благодаря переходу к работе с разностью освещенности, датчик будет нечувствителен к общему уровню засветки.

Итого, мы получили простой, но удобный ИК-сенсор, который можно использовать, как ИК-бампер на мобильном роботе. Если же сгруппировать несколько таких датчиков на одной плоскости(схеме), то можно получить простейший прототип «глаза насекомого«, с помощью которого можно даже следить за объектом.

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

Ссылки
http://ru.wikipedia.org/wiki/Фототранзистор
http://licrym.org/index.php/ИК_бампер

По теме
Ардуино что это и зачем?
КМБ для начинающих ардуинщиков
Состав стартера (точка входа для начинающих ардуинщиков)


0 комментариев на «“ИК-датчик препятствий для Arduino на базе фототранзистора”»

  1. объекты на каком максимальном расстоянии можно уверенно детектировать?

    кстати, вот вам идея для следующей статьи: есть дешевый сонар MAXSONAR-UT (150p) и есть дорогой модуль замера расстояний на его базе — MAXSONAR EZx на его базе (1000+ р).

    схема модуля есть (в даташите можно посмотреть), но она достаточно трудоемка, а хотелось бы что-нибудь попроще, пусть и не очень универсальное

    • =) Эта иде уже год витает в головах команды.
      Но пока катигорически некогда=((

    • А какую зачем в схеме нужен ИК-приёмник?

    • Не так выразился, там ведь в схеме вообще нету ИК-приёмника, только фототранзистор и Ик-диод. Дак вот, не понимаю какая роль ИК-светодиода в этой схеме?

    • Указана модель фототранзистора — L-53P3C.
      Нетрудно найти документацию, где указано значение длины волны: 940 нм — точно на такой же длине волны излучает ИК-диод L-53F3C.

    • Спасибо, я только что понял почему у меня плохо работает датчик, были не те элементы и длины волн были разные. Но всё же, не понимаю зачем здесь нужен ИК-диод? Какую функцию он выполняет? Почему недостаточно просто фототранзистора, ведь именно он ключевой элемент?

    • Вы написали, что если дополнительно подключить к фототранзистору транзистор, то чувствительность увеличится. Почему?

  2. Можно фототранзистор подсоединять и по-другому — включить подтягивающий резистор на аналоговом входе, а другой ножкой — в землю. Это если нет под рукой резистора. 🙂

    Но, согласна с Вами, такой способ подключения — самый правильный!

    • >согласна
      Девушка- робототехник? Найс)

    • Всё гораздо печальнее. 🙂 Не только робототехник, но ещё и линуксоид. Как раз вчера ядро обновляла. 🙂

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

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение