ДРАЙВЕР ДВИГАТЕЛЕЙ L293D
Для управления
двигателями робота необходимо устройство, которое бы преобразовывало
управляющие сигналы малой мощности в токи, достаточные для управления
моторами. Такое устройство называют драйвером двигателей.
Купить Робототехника: роботы, комплектующие для робототехники, Квадрокоптеры
|
ПРОСТЕЙШИЙ РОБОТ НА ОДНОЙ МИКРОСХЕМЕ
Сделать робота
можно, используя лишь одну микросхему драйвера моторов и пару фотоэлементов.
В зависимости от способа соединения моторов, микросхемы и фотоэлементов робот
будет двигаться на свет или, наоборот, прятаться в темноту, бежать вперед в
поисках света или пятиться, как крот, назад. Если добавить в схему робота
пару ярких светодиодов, то можно добиться, чтобы он бегал за рукой и даже
следовал по темной или светлой линии.
Схема робота с одним фототранзистором
Монтажная схема простейшего робота с двумя фототранзисторами
Схема робота, движущегося на отраженный свет
ПРОГРАММИРОВАНИЕ МИКРОКОНТРОЛЛЕРОВ AVR
Компиляторы
|
ПРОСТОЙ ПРОГРАММАТОР AVR :: AVRDUDE
Для того чтобы запрограммировать ("прошить") микроконтроллер, необходим программатор. Программатор представляет собой программно-аппаратный комплекс, состоящий непосредственно из устройства, связывающего микроконтроллер с компьютером, и программы, которая этим устройством управляет. Программатор заносит подготовленную для микроконтроллера программу в его память. Наиболее распространенным способом программирования для AVR является внутрисхемное программирование (функция ISP - in-cirсuit serial programming) через коммуникационный интерфейс SPI. Этой возможностью обладают все микроконтроллеры AVR, кроме Tiny11 и Tiny28. Данный режим удобен тем, что позволяет программировать AVR, расположенный в готовом устройстве, то есть вам не нужно вытаскивать микроконтроллер из платы каждый раз, когда вы хотите его перепрограммировать.
Программная часть
AVRDUDE
AVReAl IcProg |
PonyProg
Свободная GNU-утилита с открытым исходным кодом для программирования
Flash-микросхем с последовательным доступом. PonyProg написан Клаудио Ланконелли (Claudio Lanconelli) и
существует в Windows и Linux версиях. Имеет поддержку русского языка. Может
использовать стандартный последовательный порт (COM) или параллельный (LPT)
порт. Поддерживает ряд популярных программаторов.
Купить
Робототехника: роботы, комплектующие для робототехники, Квадрокоптеры
Настройка AVRDUDE
В Windows 2000 и Windows XP запрещена прямая работа с параллельным (LPT)
портом, поэтому для нормальной работы AVRDUDE необходимо установить драйвер giveio.sys.
Для установки этого
драйвера зайдите в папку WinAVR\bin и запустите файл install_giveio.bat
(удалить драйвер из системы можно, запустив файл remove_giveio.bat).
В Windows 98 никаких специальных настроек не требуется
Аппаратная часть
Простой программатор AVR
Схема простого программатора AVR Разъем, подключаемый к параллельному порту ПК,
показан со стороны пинов Один из самых простых программаторов состоит из
25-контактного разъема для параллельного (LPT) порта, 4-х резисторов (150 Ом)
и соединительного кабеля, длина которого не должна превышать 1,5 метра.
Резисторы необходимы для предохранения параллельного порта в случае
неправильного монтажа и некоторых других неприятностей. Схема получила свое
название от отладочных плат Atmel для быстрого начала работы с микроконтроллерами
AVR. Если вы хотите, чтобы ваш программатор почти в точности соответствовал
классическому программатору STK200, то следует поставить перемычку для
определения программатора программным обеспечением (для AVRDUDE не
обязательно). Перемычка должна соединять выводы 2-12. Следует обратить
внимание, что схема не имеет промежуточного буфера и не имеет гальванической
развязки по отношению к параллельному порту, поэтому во избежание вывода из
строя параллельного порта подключать и отключать кабель следует при
выключенном питании на плате, где установлен контроллер. Кроме того, когда
программатор подключен к параллельному порту, следует избегать короткого
замыкания его выводов. |
Для того чтобы собрать схему для реализации примера, нам понадобятся:
Соберем все, как показано на принципиальной схеме.
Принципиальная схема первого проекта на микроконтроллере.
Вывод GND соединим с "землей" (отрицательным полюсом источника
питания). Вывод VCC соединим с положительным полюсом источника питания.
Подсоединим катод ("минус") светодиода LED1 через компенсирующий
резистор R1 к "земле" (отрицательному полюсу источника питания), а
анод ("плюс") - к любому выводу порта D микроконтроллера (на схеме -
PD0).
Микроконтроллер будет тактироваться от внутреннего генератора тактовых
импульсов. ATmega8 выпускаются с предустановками на работу от внутреннего
генератора, настроенного на частоту 1 мегагерц (МГц).
Подключим RESET (PC6), SCK (PB5), MISO (PB4), MOSI (PB3) и общий провод (GND) к
предварительно собранному программатору (описание программатора см. в
предыдущей статье "Простой программатор AVR"). Перед подачей питания
к схеме еще раз проверим правильность подключения всех элементов. Подключим
программатор к параллельному (LPT) порту компьютера и только после этого
подадим питание к схеме. Если ничего не загорелось и не задымилось, можно
переходить к следующей части.
Запустим Programmers Notepad, откроем пример программы. Можно еще раз
откомпилировать его командой Tools -> [WinAVR] Make All. После чего загрузим
откомпилированный файл my_test.hex в память программ вашего микроконтроллера
командой Tools -> [WinAVR] Make Program.
По окончании процесса внизу, в окне "Output", должно появиться
сообщение об успешной загрузке:
Отсоединим программатор (светодиод должен весело замигать).
Вы можете подсоединить несколько светодиодов таким же образом к другим выводам
порта D (PD1-PD7) и наслаждаться мигающей гирляндой, пока не решите перейти к
следующим опытам.
MAKEFILE И КОМПИЛЯЦИЯ ПРОГРАММЫ
Исходный текст программы
Сначала
создадим на диске папку, где будут находиться файлы вашего проекта. Название
папки любое, а вот место для нее желательно выбрать на том диске, куда
установлен пакет WinAVR. Запустим редактор программиста Programmers Notepad
[WinAVR], его ярлык должен остаться у вас на рабочем столе. В меню редактора
выберем File -> New -> C/C++ и напишем программу на языке Си.
/************************************************ ПРИМЕР МИГАНИЯ СВЕТОДИОДАМИ ::
MYROBOT.RU *************************************************/ #define F_CPU 1000000UL // 1 MHz #include <avr/io.h> #include <avr/delay.h> int main(void) // начало основой программы { DDRD = 0xff; // все выводы порта D сконфигурировать как выходы while (1) { // Бесконечный цикл PORTD = 0xff; // установить "1" на всех линиях порта D _delay_ms(250); // Ждем 0.25 сек. PORTD = 0x00; // установить "0" на всех линиях порта D _delay_ms(250); // Ждем 0.25 сек. } // закрывающая скобка бесконечного цикла } // закрывающая скобка основной программы
Создание файла Makefile
Компиляция программы
:1000000012C02BC02AC029C028C027C026C025C0C6 :1000100024C023C022C021C020C01FC01EC01DC0DC :100020001CC01BC01AC011241FBECFE5D4E0DEBF28 :10003000CDBF10E0A0E6B0E0E0E8F0E002C005903F :100040000D92A036B107D9F710E0A0E6B0E001C0EC :100050001D92A036B107E1F701C0D2CFCFE5D4E0C1 :10006000DEBFCDBF8FEF81BB282FE0E0F0E022BBE9 :10007000CF010197F1F712BACF010197F1F7F7CF4E :00000001FF
В файле my_test.eep
хранится шестнадцатиричный код для загрузки в энергонезависимую память данных
(EEPROM). |
Купить
Робототехника: роботы, комплектующие для робототехники, Квадрокоптеры
ПРОСТОЙ РОБОТ НА МИКРОКОНТРОЛЛЕРЕ (Часть 1)
Простого робота на микроконтроллере можно собрать на основе драйвера управления двигателями и непосредственно самого микроконтроллера. В качестве драйвера двигателей используем микросхему L293D, входы которой подсоединим к выводам микроконтроллера так, как показано на схеме. В данном примере будет рассмотрен микроконтроллер ATmega8, хотя можно использовать и другой микроконтроллер (например, ATtiny26 или какой-либо микроконтроллер из семейства Mega).
Схема робота на микроконтроллере AVR |
В
приведенной схеме рекомендуется использовать электродвигатели с током
потребления до 150 мА и напряжением питания 3-5 В. При использовании более
мощных моторов рекомендуется применить раздельное питание электронной схемы и
электродвигателей, а также предусмотреть меры по стабилизации работы
микроконтроллера. На схеме робота входы драйвера двигателей L293D подключены к
выводам порта C микроконтроллера ATmega8, но их можно подключить к любому из
портов микроконтроллера (при этом будет необходимо внести изменения в
программную часть, указав порт и непосредственно его выводы в соответствующих
строках программы, приводимой ниже). Электролитический конденсатор C3 (1000
мкф, 10-25 в.) необходим для того, чтобы сгладить броски по питанию, вызванные
работой моторов. Этот конденсатор очень важен. Именно он дает возможность
работать схеме с необходимым уровнем стабильности. Вместо одного конденсатора
можно использовать два. Номинал каждого из них в этом случае может быть около
470 мкф. При этом один из конденсаторов устанавливают в непосредственной
близости от выводов питания микроконтроллера, а второй - рядом с выводом Vs
микросхемы драйвера моторов L293D. Обеспечение стабилизации питания - один из
важнейших аспектов проектирования устройств на микроконтроллерах. Для того
чтобы еще больше стабилизировать работу микроконтроллера, хорошим решением
может служить керамический конденсатор емкостью около 0,1 мкф, подсоединенный
между выводами питания VCC, GND (ножки 7 и 8) и располагающийся в непосредственной
близости от них (на схеме не указан). Механическая схема рассматриваемого
робота должна быть собрана по "танковому" принципу: левый мотор
передает движение на левое колесо, правый - на правое. По-другому такая
механическая схема называется схемой с двумя ведущими колесами.
Для того чтобы собранный робот "ожил", напишем для него программу.
Откомпилируем ее и загрузим в микроконтроллер.
А что
мне добавить в схему в первую очередь, если я захочу сделать ее более
защищенной?
Начни с цепи сброса, о которой мы только что говорили. Подключи внешний
подтягивающий резистор номиналом от 4,7 до 10 кОм так, как показано на
следующем рисунке,
и подключи вывод "аналогового" питания AVCC. Схема при этом усложнится не намного.
Кроме того, чтобы избежать проблем с наводками от работающих электродвигателей,
подсоедини непосредственно к каждому из них керамический конденсатор номиналом 0,1 мкф.
А каким образом я должен подключить микроконтроллер, чтобы быть абсолютно
уверенным в своем устройстве?
Абсолютно уверенным быть ни в чем нельзя (Бобот с сожалением посмотрел на свою
беспричинно погасшую трубку).
Но вот обеспечить некоторые меры, чтобы работа устройства была приближена к уровню стабильности промышленной автоматики, вполене можно.
Питание
микроконтроллеров AVR и тактовая частота. Подключение питания
к микроконтроллеру AVR. Снижение риска непреднамеренного сброса.
Микроконтроллер в схеме с электромоторами.
Микроконтроллеры AVR второго поколения имеют улучшенную защиту от кратковременных (brown-out) и полных (black-out) просадок питания. Кроме того, они имеют low-pass фильтр, чтобы устранить пики и шум, которые могли бы вызвать сброс микроконтроллера. Также все микроконтроллеры AVR второго поколения имеют встроенный резистор, который "подтягивает" RESET к питанию. Номинал встроенного pull-up резистора калибруется на заводе Atmel таким образом, чтобы обеспечить максимально устойчивую работу чипа.
Но, как бы ни были устойчивы AVR сами по себе, часто стоит предпринять дополнительные меры по стабилизации их работы.
Питание микроконтроллеров AVR и тактовая частота
Существует два основных типа микроконтроллеров AVR. Первый из них предназначен
для получения максимального быстродействия при высокой частоте, второй - для
экономичной работы на небольших тактовых частотах. Маркировка микросхем второго
типа отличается от первого тем, что на конце добавляется буква "L".
Например, ATtiny26 и ATtiny26L, ATmega8 и ATmega8L. Микроконтроллеры первой
группы допускают питание в диапазоне от 4,5 до 5,5 вольт при тактовой частоте 0...16
МГц (для некоторых моделей - до 20 МГц, например ATtiny2313-20PU или
ATtiny2313-20PI), вторые - соответственно 2,7...5,5 вольт при частоте 0...8 МГц
(для большинства моделей, у некоторых моделей диапазон может быть уже). Ток
потребления у них также различается: микроконтроллеры с индексом "L"
потребляют меньше электроэнергии. Существуют также микроконтроллеры с
возможностью понижения питания до 1.8 В, которые обычно маркируются буквой
"V", например ATtiny2313V. При понижении питания соответствующим
образом должна быть снижена и тактовая частота. Для ATtiny2313V при питании
1,8...5,5 В частота должна находиться в интервале 0...4 МГц, при питании
2,7...5,5 В - в интервале 0...10 МГц. Для создания экспериментальных роботов
подойдут микроконтроллеры любой группы. К тому же, если вы, например, захотите
поставить ATmega8 в схему с питанием 3 вольта и запустить его на невысокой
тактовой частоте, то ничего страшного не произойдет: в таком режиме он будет
успешно работать. Единственное, что нельзя будет гарантировать, так это
устойчивый запуск микроконтроллера при крайних значениях температур, да и ток
потребления будет выше, чем у ATmega8L. Таким образом, мы можем говорить, что
если требуется максимальное быстродействие, то надо ставить ATtiny26 или
ATmega8 и повышать тактовую частоту до 8...16 МГц при питании 5 В. Если важнее
всего экономичность вашего робота, то лучше применить ATtiny26L или ATmega8L и
понизить частоту и питание. Хорошим вариантом во втором случае может быть
питание от трех пальчиковых аккумуляторов по 1,2 В, что в сумме дает 3,8 В или
от трех алкалиновых батарей по 1,5 В, что в сумме даст 4,5 В. Хотя указывается максимальное рекомендуемое
напряжение в 5,5 В, тем не менее на практике очень часто используют напряжение
питания 6 В: микроконтроллер AVR можно запитать от четырех батарей по 1,5 В.
Это удобно также в тех случаях, когда не используется раздельное с моторами
питание. При этом стоит учитывать, что чем выше частота, тем выше потребление
энергии, а соответственно, и нагрев микросхемы. Т. е. в данном случае лучше не
запускать микроконтроллер на крайнем значении тактовой частоты. Стоит также
учитывать, что максимальный ток через выводы GND, VCC не должен превышать 200
мА.
|
Чтобы сгладить возможные броски напряжения, особенно в схемах с общим питанием для микросхем и моторов, параллельно питающим линиям включают электролитический конденсатор 100-1000 мкф (C1), который обычно дополняют керамическим конденсатором около 0,1 мкф (C2) для фильтрации высокочастотных и среднечастотных помех (точный номинал этого конденсатора можно расчитать только тогда, когда точно известна паразитная частота).
|
|
|
Подключение питания к микроконтроллеру AVR
Среди микроконтроллеров AVR существуют микросхемы, имеющие двойное питание:
"цифровое" (выводы VCC и GND) и "аналоговое" (AVCC и AGND,
который часто обозначают просто GND). К таким микросхемам относятся, например, ATmega8 и ATtiny26.
В стандартном включении выводы VCC и AVCC закорачивают между собой.
Выводы GND уже замкнуты внутри микроконтроллера через сопротивление 0,7 Ом, и их обычно просто соединяют с "землей". Керамические конденсаторы С1 и С2 емкостью 0,1 мкф располагают максимально близко от "своих" по схеме выводов. Если у микроконтроллера AVR нет вывода AVCC, то, вместо двух, ставят один конденсатор. На практике так часто поступают и для микросхем с двойным питанием. Если используется встроенный аналогово-цифровой преобразователь (АЦП), то вывод AVCC подключают к напряжению питания VCC через резистор около 100 Ом. Кроме того, для уменьшения помех применяют последовательный LC-фильтр для питания. Номинал индуктивности L1 может лежать в диапазоне 30...47 мкГн. Танталовый конденсатор C1 - 4,7 мкф
.
Снижение риска непреднамеренного сброса
Как уже говорилось выше, линия RESET имеет внутренний
резистор привязки к шине питания для увеличения помехозащищенности, который
калибруется на фабрике при изготовлении микроконтроллера. Кроме того,
микроконтроллеры AVR второго поколения имеют улучшенную защиту от
кратковременных (brown-out) и полных (black-out) просадок питания. Исходя из
этого в простых схемах на AVR иногда обходятся без дополнительных мер по
отношению к выводу RESET и даже оставляют его висящим в "воздухе. Такой
подход может быть применим для экспериментального макетирования и любительских
самоделок, но в промышленной автоматике может приводить к сбоям при помехах по
питанию. В условиях сильных внешних помех сопротивление этого резистора
(100-500 кОм) оказывается слишком большим, и при отсутствии на линии RESET
сигнала высокого уровня может происходить случайный сброс микроконтроллера.
Купить
Робототехника: роботы, комплектующие для робототехники, Квадрокоптеры
|
Существует несколько
способов снижения риска непреднамеренного сброса. Один из самых простых - это
подключить к линии RESET внешний подтягивающий резистор с рекомендуемым значением
сопротивления от 4,7 до 10 кОм.
Для поддержки режима
высоковольтного программирования микроконтроллеры AVR не имеют стандартного
внутреннего диода для защиты от избыточного напряжения на входе RESET.
Поэтому, если высоковольтное программирование не используется, для защиты от
помех рекомендуется подключать внешний диод, например 1N4148 между линией RESET
и шиной питания микроконтроллера. Таким образом, типовая схема внешней
"обвязки" для линии RESET будет выглядеть следующим образом. |
Кнопка "Сброс"
|
При отладке сложных
программ может понадобиться осуществление принудительного сброса
микроконтроллера. В этом случае удобно добавить в схему кнопку сброса,
замыкание контактов которой будет подавать сигнал низкого уровня на вход
RESET. Кнопку сброса обычно подключают вместе со стандартной RC-цепочкой. |
Микроконтроллер
в схеме с электромоторами
|
Для того чтобы снизить помехи от "искрящих" цепей электродвигателей, параллельно двигателям включают керамические конденсаторы 0,01...0,1 мкф. Конденсаторы располагают непосредственно на самих контактах двигателей. |
|
Дополнительной мерой
может служить шунтирование каждого контакта электродвигателя на его корпус
или на "землю".
|
|
При установке микроконтроллера в непосредственной близости от двигателей следует позаботиться о снижении риска возможных наводок на внешние цепи AVR. Так, цепь внешнего тактирования может служить транзитным путем для наводок. Чтобы устранить возможные сбои, рекомендуется конденсаторы С1 и С2 устанавливать как можно ближе к выводам XT1 и XT2, а их "земляные" обкладки подключать непосредственно к выводу GND микроконтроллера короткими проводниками. Кроме того, рекомендуется корпус кварцевого резонатора Q1 припаивать коротким проводом к цепи GND. Еще большую безопасность может обеспечить экранирующий контур на печатной плате вокруг кварцевого резонатора и конденсаторов. |
/*******************************************************
ПРИМЕР 1 :: ВРАЩЕНИЕ МОТОРАМИ ВПЕРЕД-НАЗАД :: MYROBOT.RU
********************************************************/
#define F_CPU 1000000UL // указываем частоту в герцах
#include <avr/io.h>
#include <util/delay.h>
int main(void) // начало основной программы
{
DDRC = 0xff; // все выводы порта C сконфигурировать как выходы
while (1) { // Бесконечный цикл
// ---------- вращаем моторы вперед 1 сек ----------
PORTC |= _BV(PC1); // установить "1" на линии 1 порта C
PORTC &= ~_BV(PC2); // установить "0" на линии 2 порта C
PORTC |= _BV(PC3); // установить "1" на линии 3 порта C
PORTC &= ~_BV(PC4); // установить "0" на линии 4 порта C
_delay_ms(1000); // ждем 1 сек.
// --------------------------------------------------
// ---------- вращаем моторы назад 1 сек ----------
PORTC &= ~_BV(PC1); // установить "0" на линии 1 порта C
PORTC |= _BV(PC2); // установить "1" на линии 2 порта C
PORTC &= ~_BV(PC3); // установить "0" на линии 3 порта C
PORTC |= _BV(PC4); // установить "1" на линии 4 порта C
_delay_ms(1000); // ждем 1 сек.
// --------------------------------------------------
} // закрывающая скобка бесконечного цикла
} // закрывающая скобка основной программы
Отсоединив программатор, проверим направление вращения колес робота.
Если моторы вращают колеса в противоположные стороны, поменяйте местами их выводы.
Следующим
шагом будет создание программы, реализующей поворот на необходимый угол
остановкой одного из моторов.
/***************************************************
ПРИМЕР 2 :: ДВИЖЕНИЕ ПРЯМО С ПОВОРОТОМ :: MYROBOT.RU
****************************************************/
#define F_CPU 1000000UL // указываем частоту в герцах
#include <avr/io.h>
#include <util/delay.h>
int main(void) // начало основной программы
{
DDRC = 0xff; // все выводы порта C сконфигурировать как выходы
while (1) { // Бесконечный цикл
// ---------- вращаем моторы вперед 1 сек ------------
PORTC |= _BV(PC1); // установить "1" на линии 1 порта C
PORTC &= ~_BV(PC2); // установить "0" на линии 2 порта C
PORTC |= _BV(PC3); // установить "1" на линии 3 порта C
PORTC &= ~_BV(PC4); // установить "0" на линии 4 порта C
_delay_ms(1000); // ждем 1 сек.
// ----------------------------------------------------
// ---------- останавливаем мотор M2 на 0,5 сек ------
PORTC |= _BV(PC1); // установить "1" на линии 1 порта C
PORTC |= _BV(PC2); // установить "1" на линии 2 порта C
_delay_ms(500); // ждем 0,5 сек.
// ----------------------------------------------------
} // закрывающая скобка бесконечного цикла
} // закрывающая скобка основной программы
Изменяя время задержки, попробуйте добиться поворота на прямой угол так, чтобы
траектория движения робота напоминала квадрат.
Для более быстрого разворота робота можно использовать реверс (вращение в
противоположную сторону) одного из моторов.
Написание такой программы будет хорошим практикумом для самостоятельного программирования движения робота.
ПРОСТОЙ РОБОТ НА МИКРОКОНТРОЛЛЕРЕ (Часть 2)
Робот с фотодатчиком для следования по линии . Во второй
части статьи "Простой робот на микроконтроллере" мы попробуем
сделать робота с фотодатчиком, реагирующим на отраженный свет. Наш робот
сможет бегать по линии, нарисованной на поверхности, и даже принять участие в
соревнованиях по отслеживанию линии. Кроме того, для него можно написать
программу, которая будет удерживать робота в пределах области, ограниченной
линией, что позволит принять участие в соревнованиях "Кегельринг".
Также стоит отметить, что датчик границы, описываемый в этой части статьи,
является необходимой частью при создании сумо-роботов. Конструкция ходовой
части робота будет идентична роботу из первой части статьи. Поэтому мы
подробно рассмотрим только устройства датчика и его подключение.
Схема робота с фотодатчиком. |
Купить
Робототехника: роботы, комплектующие для робототехники, Квадрокоптеры
В приведенной схеме рекомендуется использовать электродвигатели с током потребления до 150 мА и напряжением питания 3-5 В.
При использовании более мощных моторов рекомендуется применить раздельное питание электронной схемы и электродвигателей,
а также предусмотреть меры по стабилизации работы микроконтроллера.
При использовании другого микроконтроллера (например, ATtiny26 и др.) внутренних подтягивающих резисторов микроконтроллера может
быть недостаточно для уверенного срабатывания датчика. В этом случае следует использовать
подтягивающий резистор при подключении фототранзистора. Если фототранзистор имеет хорошую чувствительность, номинал резистора может лежать в диапазоне 1,5К - 2,7К.
Рассмотрим программу, которая будет включать моторы,
если
датчик находится над белой поверхностью, и выключать - если над черной.
/***********************************************************************
<
pre
style='text-align:center'>ПРИМЕР 3 :: ВРАЩЕНИЕ МОТОРАМИ С
ИСПОЛЬЗОВАНИЕМ ФОТОДАТЧИКА :: MYROBOT.RU************************************************************************/
#include <avr/io.h>
int main(void) // начало основной программы
{
DDRC = 0xff; // все выводы порта C сконфигурировать как выходы
DDRD = 0x00; // все выводы порта D сконфигурировать как входы
PORTD = 0xff; // установить "1" на всех выводах порта D,
// включаем подтягивающие
резисторы
while (1) { // Бесконечный цикл
// ПРОВЕРЯЕМ СИГНАЛ НИЗКОГО УРОНЯ ОТ
ФОТОДАТЧИКА
if (!(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
//
--------------------------------------------------
}
else
{
// ---------- вращаем моторы назад
----------
PORTC &= ~_BV(PC1); // установить "0" на линии 1 порта C
PORTC |= _BV(PC2); // установить "1" на линии 2 порта C
PORTC &= ~_BV(PC3); // установить "0" на линии 3 порта C
PORTC |= _BV(PC4); // установить "1" на линии 4 порта C
//
--------------------------------------------------
}
} // закрывающая скобка бесконечного цикла
} // закрывающая скобка основной программы
Загрузим программу в микроконтроллер. После чего проверим работу датчика,
поставив робота на белый лист бумаги, на котором нарисуем широкую черную линию.
Изменяя расстояние между датчиком и поверхностью, добьемся уверенного
срабатывания фототранзистора. При необходимости следует защитить фототранзистор
от прямых лучей светодиода, установив между ними шторку, как уже говорилось
выше. Расположение фототранзистора и светодиода будет оптимальным в том случае,
если линза фототранзистора будет смотреть точно в центр светового
"зайчика", отбрасываемого светодиодом на листе. Добившись уверенного
срабатывания датчика, напишем программу для следования робота по линии.
Алгоритм движения робота строится на следующем принципе. Когда датчик находится
над белым полем, то робот поворачивается в правую сторону по направлению к
черной линии. Когда датчик находится над черной линией, то робот поворачивается
в левую сторону, съезжая с черной линии. Чередуя повороты по направлению к
линии и от нее, робот движется вперед, следуя по границе белого и черного.
/****************************************************************
ПРИМЕР 4 :: ПРОСТЕЙШИЙ АЛГОРИТМ
СЛЕДОВАНИЯ ПО ЛИНИИ :: MYROBOT.RU
*****************************************************************/
#include <avr/io.h>
int main(void) // начало основной программы
{
DDRC = 0xff; // все выводы порта C сконфигурировать как выходы
DDRD = 0x00; // все выводы порта D сконфигурировать как входы
PORTD = 0xff; // установить "1" на всех выводах порта D,
// включаем подтягивающие
резисторы
while (1) { // Бесконечный цикл
// ПРОВЕРЯЕМ СИГНАЛ НИЗКОГО УРОНЯ ОТ
ФОТОДАТЧИКА
if (!(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
//
-----------------------------------------------------
}
else
{
// ---- останавливаем левый мотор, включаем
правый -----
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-х см. Черную линию можно нарисовать тушью,
баночки которой продаются практически в любом магазине канцтоваров. Поставим
робота так, чтобы датчик находился над белым полем, а линия была справа от
него. Включим питание. Робот должен начать двигаться, следуя всем изгибам
трассы.
При конструировании робота, следующего по линии и использующего
вышеприведенный алгоритм движения, следует учесть расстояние между ведущими
колесами и расстояние между датчиком и осевой линией ведущих колес. Чем больше
первое и меньше второе, тем более размашистые движения будет совершать робот и
тем выше будет общая скорость его движения. При этом будет повышаться риск
того, что робот может переехать датчиком линию и таким образом потерять ее.
Следует найти баланс между скоростью робота и уверенным следованием по линии.
При использовании конструкции с небольшим расстоянием между ведущими колесами
для повышения скорости движения робота может понадобиться введение в программу
небольшой задержки, увеличивающей длительность поворотов, и тем самым
оптимизирующей движение робота. Если вы решите принять участие в соревнованиях
роботов "Следование по линии", то разрешите дать маленький совет:
сделайте вокруг датчика небольшую светонепроницаемую бленду, чтобы исключить
"засветку" датчика от бокового света. Ну и, конечно же, не пожалейте
свежий комплект батарей для своего электронного спортсмена. Хорошее питание
поможет ему быстрей прийти к финишу.
Желаем Вам успехов!
ПРОСТОЙ РОБОТ НА МИКРОКОНТРОЛЛЕРЕ (Часть 3)
Робот для соревнований.
/********************************************************** ПРИМЕР 5 :: РОБОТ ДЛЯ СОРЕВНОВАНИЙ
КЕГЕЛЬРИНГ :: MYROBOT.RU ***********************************************************/ #define F_CPU 1000000UL // указываем частоту в герцах #include <avr/io.h> #include <util/delay.h> int main(void) // начало основной программы { DDRC = 0xff; // все выводы порта C сконфигурировать как выходы DDRD = 0x00; // все выводы порта D сконфигурировать как входы PORTD = 0xff; // установить "1" на всех выводах порта D, // включаем подтягивающие
резисторы while (1) { // Бесконечный цикл // ПРОВЕРЯЕМ СИГНАЛ НИЗКОГО УРОНЯ
ОТ ФОТОДАТЧИКА if (!(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 //
----------------------------------------------------- } else { // ------------------ отъезд назад
------------------ // -------- включаем моторы назад на 1,8 сек
-------- PORTC &= ~_BV(PC1); // установить "0" на линии 1 порта C PORTC |= _BV(PC2); // установить "1" на линии 2 порта C PORTC &= ~_BV(PC3); // установить "0" на линии 3 порта C PORTC |= _BV(PC4); // установить "1" на линии 4 порта C _delay_ms(1800); // ждем 1,8 сек. //
-------------------------------------------------- // --------------------- поворот
-------------------- // правый мотор вперед, левый мотор
стоп на 0,6 сек PORTC |= _BV(PC1); // установить "1" на линии 1 порта C PORTC &= ~_BV(PC2); // установить "0" на линии 2 порта C PORTC |= _BV(PC3); // установить "1" на линии 3 порта C _delay_ms(600); // ждем 0,6 сек. //
-------------------------------------------------- } } // закрывающая скобка бесконечного цикла } // закрывающая скобка основной программы |
Данного робота можно использовать на соревнованиях "Кегельринг". Сделайте белый круглый ринг, ограниченный черной линией около 50 мм шириной (именно такая ширина ограничительной линии используется на соревнованиях "Кегельринг"). Внутренний диаметр круга - 1 метр. Ринг может быть сделан из листов белого ватмана. Расставьте в круге 8 кеглей (используйте в качестве кеглей пустые жестяные банки объемом 0,33 л. из-под напитков).
Поставьте робота в центр ринга и включите. Объезжая ринг, робот начнет
выталкивать банки одну за другой. Добейтесь такого угла поворота и длины
отъезда робота, чтобы он не пропускал расставленные на ринге кегли. Наиболее
выигрышной будет конструкция робота с установленным спереди заборником. Он
необходим для того, чтобы робот "захватывал" попавшиеся ему на пути
кегли. Заборник должен быть вынесен вперед относительно датчика настолько,
чтобы робот, подъезжая к ограничительной линии, мог полностью вытолкнуть кеглю
с ринга. Настройка робота для соревнований "Кегельринг" является
увлекательнейшим занятием, а сами соревнования одними из самых азартных и
зрелищных.