Во второй части статьи “Простой робот на микроконтроллере” мы попробуем сделать робота с фотодатчиком, реагирующим на отраженный свет.
Наш робот сможет бегать по линии, нарисованной на поверхности, и даже принять участие в соревнованиях по отслеживанию линии.
Кроме того, для него можно написать программу, которая будет удерживать робота в пределах области, ограниченной линией, что позволит принять участие в соревнованиях “Кегельринг”. Также стоит отметить, что датчик границы, описываемый в этой части статьи, является необходимой частью при создании сумо-роботов.
Конструкция ходовой части робота будет идентична роботу из первой части статьи. Поэтому мы подробно рассмотрим только устройства датчика и его подключение.
Принцип работы датчика границы основан на свойстве поверхностей по-разному отражать падающий на них свет. Черные или темные поверхности отражают свет намного хуже, чем белые или светлые. Улавливая отраженный свет, мы сможем определить тип поверхности, находящейся под датчиком.
Для изготовления датчика границы нам понадобятся фототранзистор и яркий светодиод. На приведенном рисунке изображена конструкция датчика. Светодиод и фототранзистор направлены в сторону исследуемой поверхности. Расстояние до поверхности зависит от силы свечения светодиода и чувствительности фототранзистора. Обычно оптимальное расстояние равно 1-1,5 см.
Расстояние между светодиодом и фототранзистором не следует делать слишком большим: хорошим выбором может стать зазор в 0,5-1 см. В некоторых случаях, чтобы предотвратить срабатывание фототранзистора от прямого света, излучаемого светодиодом, между ними располагают непрозрачную шторку.
Свет от светодиода отражается от поверхности и улавливается фототранзистором. Если поверхность светлая, то отраженного света достаточно для открытия фототранзистора, в противном случае фототранзистор будет закрыт (не будет пропускать ток).
Использование фототранзистора обусловлено тем, что скорость его срабатывания высока и достаточна даже при очень быстром движении робота. Использование фотодиодов также допустимо. Фоторезисторы имеют невысокую скорость срабатывания, и ее может быть недостаточно при высокой скорости движения робота.
Схема датчика очень проста, состоит непосредственно из фототранзистора, светодиода и ограничивающих резисторов.
При срабатывании фототранзистора на выходе формируется сигнал низкого уровня, который и подается на один из свободных входов микроконтроллера.
Комментарии к схеме робота |
В приведенной схеме рекомендуется использовать электродвигатели с током потребления до 150 мА и напряжением питания 3-5 В. При использовании более мощных моторов рекомендуется применить раздельное питание электронной схемы и электродвигателей, а также предусмотреть меры по стабилизации работы микроконтроллера.
При использовании другого микроконтроллера (например, ATtiny26 и др.) внутренних подтягивающих резисторов микроконтроллера может быть недостаточно для уверенного срабатывания датчика. В этом случае следует использовать подтягивающий резистор при подключении фототранзистора. Если фототранзистор имеет хорошую чувствительность, номинал резистора может лежать в диапазоне 1,5К – 2,7К. |
Рассмотрим программу, которая будет включать моторы, если датчик находится над белой поверхностью, и выключать – если над черной.
/*********************************************************************** ПРИМЕР 3 :: ВРАЩЕНИЕ МОТОРАМИ С ИСПОЛЬЗОВАНИЕМ ФОТОДАТЧИКА :: MYROBOT.RU ************************************************************************/ #include <avr/io.h> int main(void) // начало основной программы { DDRC = 0xff; // все выводы порта C сконфигурировать как выходы DDRD = 0x00; // все выводы порта D сконфигурировать как входы PORTD = 0xff; // установить "1" на всех выводах порта D, // включаем подтягивающие резисторы während (1) { // Бесконечный цикл // ПРОВЕРЯЕМ СИГНАЛ НИЗКОГО УРОНЯ ОТ ФОТОДАТЧИКА wenn (!(PIND & (1<<PIND1))) // проверить "0" на линии 1 порта D { // ---------- вращаем моторы вперед ---------- PORTC |= _BV(PC1); // установить "1" на линии 1 порта C PORTC &= ~_BV(PC2); // установить "0" на линии 2 порта C PORTC |= _BV(PC3); // установить "1" на линии 3 порта C PORTC &= ~_BV(PC4); // установить "0" на линии 4 порта C // -------------------------------------------------- } sonst { // ---------- вращаем моторы назад ---------- PORTC &= ~_BV(PC1); // установить "0" на линии 1 порта C PORTC |= _BV(PC2); // установить "1" на линии 2 порта C PORTC &= ~_BV(PC3); // установить "0" на линии 3 порта C PORTC |= _BV(PC4); // установить "1" на линии 4 порта C // -------------------------------------------------- } } // закрывающая скобка бесконечного цикла } // закрывающая скобка основной программы
Загрузим программу в микроконтроллер. (Как это сделать, см. в статьях: Makefile и компиляция программы; Простой программатор AVR; Первый проект на микроконтроллере AVR.) После чего проверим работу датчика, поставив робота на белый лист бумаги, на котором нарисуем широкую черную линию. Изменяя расстояние между датчиком и поверхностью, добьемся уверенного срабатывания фототранзистора. При необходимости следует защитить фототранзистор от прямых лучей светодиода, установив между ними шторку, как уже говорилось выше. Расположение фототранзистора и светодиода будет оптимальным в том случае, если линза фототранзистора будет смотреть точно в центр светового “зайчика”, отбрасываемого светодиодом на листе.
Добившись уверенного срабатывания датчика, напишем программу для следования робота по линии. Алгоритм движения робота строится на следующем принципе. Когда датчик находится над белым полем, то робот поворачивается в правую сторону по направлению к черной линии. Когда датчик находится над черной линией, то робот поворачивается в левую сторону, съезжая с черной линии. Чередуя повороты по направлению к линии и от нее, робот движется вперед, следуя по границе белого и черного. Алгоритм подробно описан в статье “Простой робот с логической микросхемой”.
/**************************************************************** ПРИМЕР 4 :: ПРОСТЕЙШИЙ АЛГОРИТМ СЛЕДОВАНИЯ ПО ЛИНИИ :: MYROBOT.RU *****************************************************************/ #include <avr/io.h> int main(void) // начало основной программы { DDRC = 0xff; // все выводы порта C сконфигурировать как выходы DDRD = 0x00; // все выводы порта D сконфигурировать как входы PORTD = 0xff; // установить "1" на всех выводах порта D, // включаем подтягивающие резисторы während (1) { // Бесконечный цикл // ПРОВЕРЯЕМ СИГНАЛ НИЗКОГО УРОНЯ ОТ ФОТОДАТЧИКА wenn (!(PIND & (1<<PIND1))) // проверить "0" на линии 1 порта D { // ---- включаем левый мотор, останавливаем правый ----- PORTC |= _BV(PC1); // установить "1" на линии 1 порта C PORTC &= ~_BV(PC2); // установить "0" на линии 2 порта C PORTC |= _BV(PC3); // установить "1" на линии 3 порта C PORTC |= _BV(PC4); // установить "1" на линии 4 порта C // ----------------------------------------------------- } sonst { // ---- останавливаем левый мотор, включаем правый ----- PORTC |= _BV(PC1); // установить "1" на линии 1 порта C PORTC |= _BV(PC2); // установить "1" на линии 2 порта C PORTC |= _BV(PC3); // установить "1" на линии 3 порта C PORTC &= ~_BV(PC4); // установить "0" на линии 4 порта C // ----------------------------------------------------- } } // закрывающая скобка бесконечного цикла } // закрывающая скобка основной программы
Для проверки и настройки робота, нарисуем на белом листе ватмана черную замкнутую линию шириной около 3-х см. Черную линию можно нарисовать тушью, баночки которой продаются практически в любом магазине канцтоваров.
Поставим робота так, чтобы датчик находился над белым полем, а линия была справа от него. Включим питание. Робот должен начать двигаться, следуя всем изгибам трассы.
При конструировании робота, следующего по линии и использующего вышеприведенный алгоритм движения, следует учесть расстояние между ведущими колесами и расстояние между датчиком и осевой линией ведущих колес. Чем больше первое и меньше второе, тем более размашистые движения будет совершать робот и тем выше будет общая скорость его движения. При этом будет повышаться риск того, что робот может переехать датчиком линию и таким образом потерять ее. Следует найти баланс между скоростью робота и уверенным следованием по линии.
При использовании конструкции с небольшим расстоянием между ведущими колесами для повышения скорости движения робота может понадобиться введение в программу небольшой задержки, увеличивающей длительность поворотов, и тем самым оптимизирующей движение робота.
Если вы решите принять участие в соревнованиях роботов “Следование по линии”, то разрешите дать маленький совет: сделайте вокруг датчика небольшую светонепроницаемую бленду, чтобы исключить “засветку” датчика от бокового света. Ну и, конечно же, не пожалейте свежий комплект батарей для своего электронного спортсмена. Хорошее питание поможет ему быстрей прийти к финишу.
Желаем Вам успехов!
Постоянный адрес статьи: http://myrobot.ru/stepbystep/r_firstbot2.php