CraftDuino v2.0
  • - это CraftDuino - наш вариант полностью Arduino-совместимой платы.
  • CraftDuino - настоящий конструктор, для очень быстрого прототипирования и реализации идей.
  • Любая возможность автоматизировать что-то с лёгкостью реализуется с CraftDuino!
Просто добавьте CraftDuino!

ИК-датчик препятствий для 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
 * тестовый скетч для работы с фототранзистором
 *
 * http://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
 * тестовый скетч для работы с фототранзистором
 * замер разности освещённости
 *
 * http://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/ИК_бампер

По теме:
Ардуино что это и зачем?
КМБ для начинающих ардуинщиков
Состав стартера (точка входа для начинающих ардуинщиков)
  • +1
  • 21 мая 2011, 15:04
  • noonv

Комментарии (9)

RSS свернуть / развернуть
+
0
объекты на каком максимальном расстоянии можно уверенно детектировать?

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

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

xtile

  • 21 мая 2011, 16:53
+
+1
дальность небольшая — 20 см где-то
avatar

noonv

  • 21 мая 2011, 16:57
+
+1
=) Эта иде уже год витает в головах команды.
Но пока катигорически некогда=((
avatar

Zoltberg

  • 21 мая 2011, 16:58
+
+1
Можно фототранзистор подсоединять и по-другому — включить подтягивающий резистор на аналоговом входе, а другой ножкой — в землю. Это если нет под рукой резистора. :)

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

robofreak

  • 21 мая 2011, 21:02
+
0
>согласна
Девушка- робототехник? Найс)
avatar

Tickat

  • 21 мая 2011, 21:07
+
+2
Всё гораздо печальнее. :) Не только робототехник, но ещё и линуксоид. Как раз вчера ядро обновляла. :)
avatar

robofreak

  • 22 мая 2011, 07:31
+
0
Найс, найс
avatar

Tickat

  • 22 мая 2011, 10:39
+
+1
Никакой печали, Linux — наше всё (:
avatar

burjui

  • 22 мая 2011, 23:37
+
0
у меня значение прыгает только от 50 до 150. Получается всего 100 градаций. Почему так происходит? =((
avatar

arduinofan

  • 20 августа 2012, 21:00

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.