Здесь уже была заметка о самом простейшем датчике робота — . Настала пора рассмотреть более продвинутый датчик препятствий — инфракрасный.
Вариант такого датчика на TSOP рассмотрим позже, а пока разберёмся с простым аналоговым сенсором на фототранзисторе.
Так как датчик аналоговый, то его выход должен подключаться к портам контроллера (на вход АЦП микроконтроллера).
По величине аналогового сигнала мы сможем примерно оценивать расстояние до препятствия (разумеется, абсолютных величин мы получить не сможем, так как уровень сигнала будет меняться в зависимости от объекта).
Простейшая схема — это пара из ИК-светодиода и фототранзистора:
Но как узнать, что ИК-диод работает? ИК-излучения ведь не видно. Очень просто — нужно воспользоваться фотокамерой мобильного телефона. Матрица чувствительна к ИК-излучению и вы увидите фиолетовое свечение работающего ИК-диода.
Для усиления сигнала от фототранзистора, можно дополнительно подключить транзистор.
Когда фототранзистор освещается, то через него начинает протекать ток, величина которого зависит от уровня освещения датчика. Так как меняется ток, проходящий через фототранзистор, то меняется и падение напряженяия на подключённом последовательно резисторе. Напряжение с резистора мы отправляем на аналоговый вход 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);
}
Благодаря переходу к работе с разностью освещенности, датчик будет нечувствителен к общему уровню засветки.
Итого, мы получили простой, но удобный ИК-сенсор, который можно использовать, как ИК-бампер на мобильном роботе. Если же сгруппировать несколько таких датчиков на одной плоскости(схеме), то можно получить простейший прототип "", с помощью которого можно даже следить за объектом.
Правда у этого датчика остаётся одна проблема — при сильной внешней засветке(на ярком солнце и т.п.), фототранзистор откроется полностью и никаких признаков отражённого сигнала светодиода мы не увидим.
Можно поставить ИК-фильтр(засвеченый негатив напимер)- хоть транзистор и инфракрасный, на видимый свет он всеже реагирует, однако паразитная засветка ИК-излучением никуда от этого не денется=(
Более радикально избавится от тот недостатока позволит модуляция сигнала но об этом в следущей статье=)
объекты на каком максимальном расстоянии можно уверенно детектировать?
кстати, вот вам идея для следующей статьи: есть дешевый сонар MAXSONAR-UT (150p) и есть дорогой модуль замера расстояний на его базе — MAXSONAR EZx на его базе (1000+ р).
схема модуля есть (в даташите можно посмотреть), но она достаточно трудоемка, а хотелось бы что-нибудь попроще, пусть и не очень универсальное
Можно фототранзистор подсоединять и по-другому — включить подтягивающий резистор на аналоговом входе, а другой ножкой — в землю. Это если нет под рукой резистора. :)
Но, согласна с Вами, такой способ подключения — самый правильный!
Комментарии (8)
RSS свернуть / развернутькстати, вот вам идея для следующей статьи: есть дешевый сонар MAXSONAR-UT (150p) и есть дорогой модуль замера расстояний на его базе — MAXSONAR EZx на его базе (1000+ р).
схема модуля есть (в даташите можно посмотреть), но она достаточно трудоемка, а хотелось бы что-нибудь попроще, пусть и не очень универсальное
xtile
noonv
Но пока катигорически некогда=((
Zoltberg
Но, согласна с Вами, такой способ подключения — самый правильный!
robofreak
Девушка- робототехник? Найс)
Tickat
robofreak
Tickat
burjui
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.