В качестве драйвера двигателей используем микросхему L293D, входы которой подсоединим к выводам микроконтроллера так, как показано на схеме. В данном примере будет рассмотрен микроконтроллер ATmega8, хотя можно использовать и другой микроконтроллер (например, ATtiny26 или какой-либо микроконтроллер из семейства Mega).

Схема робота на микроконтроллере AVR
На схеме робота входы драйвера двигателей L293D подключены к выводам порта C микроконтроллера ATmega8, но их можно подключить к любому из портов микроконтроллера (при этом будет необходимо внести изменения в программную часть, указав порт и непосредственно его выводы в соответствующих строках программы, приводимой ниже).
Электролитический конденсатор C3 (1000 мкф, 10-25 в.) необходим для того, чтобы сгладить броски по питанию, вызванные работой моторов. Этот конденсатор очень важен. Именно он дает возможность работать схеме с необходимым уровнем стабильности. Вместо одного конденсатора можно использовать два. Номинал каждого из них в этом случае может быть около 470 мкф. При этом один из конденсаторов устанавливают в непосредственной близости от выводов питания микроконтроллера, а второй - рядом с выводом Vs микросхемы драйвера моторов L293D. Обеспечение стабилизации питания - один из важнейших аспектов проектирования устройств на микроконтроллерах.
Для того чтобы еще больше стабилизировать работу микроконтроллера, хорошим решением может служить керамический конденсатор емкостью около 0,1 мкф, подсоединенный между выводами питания VCC, GND (ножки 7 и 8) и располагающийся в непосредственной близости от них (на схеме не указан).
Механическая схема рассматриваемого робота должна быть собрана по "танковому" принципу: левый мотор передает движение на левое колесо, правый - на правое. По-другому такая механическая схема называется схемой с двумя ведущими колесами.

Для того чтобы собранный робот "ожил", напишем для него программу. Откомпилируем ее и загрузим в микроконтроллер. (Как это сделать, см. в статьях: Makefile и компиляция программы; Простой программатор AVR; Первый проект на микроконтроллере AVR.)
/*******************************************************
ПРИМЕР 1 :: ВРАЩЕНИЕ МОТОРАМИ ВПЕРЕД-НАЗАД :: MYROBOT.RU
********************************************************/
#include <avr/io.h>
/***************** Функция задержки ****************/
void delay(unsigned short ms) // Минимальная задержка с кварцем 8 МГц - 1 мс
{
unsigned short i, j, k; // объявляем переменные
for (i=0; i<ms; i++) // главный цикл формирования задержки
for (j=0; j<185; j++) // вложенный цикл формирования задержки
k++; // произвольное действие
}
/****************************************************/
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(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(1000); // ждем 1 сек.
// --------------------------------------------------
} // закрывающая скобка бесконечного цикла
} // закрывающая скобка основной программы
Отсоединив программатор, проверим направление вращения колес робота. Если моторы вращают колеса в противоположные стороны, поменяйте местами их выводы.
Следующим шагом будет создание программы, реализующей поворот на необходимый угол остановкой одного из моторов.
/***************************************************
ПРИМЕР 2 :: ДВИЖЕНИЕ ПРЯМО С ПОВОРОТОМ :: MYROBOT.RU
****************************************************/
#include <avr/io.h>
/***************** Функция задержки ****************/
void delay(unsigned short ms) // Минимальная задержка с кварцем 8 МГц - 1 мс
{
unsigned short i, j, k; // объявляем переменные
for (i=0; i<ms; i++) // главный цикл формирования задержки
for (j=0; j<185; j++) // вложенный цикл формирования задержки
k++; // произвольное действие
}
/****************************************************/
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(1000); // ждем 1 сек.
// ----------------------------------------------------
// ---------- останавливаем мотор M2 на 0,5 сек ------
PORTC |= _BV(PC1); // установить "1" на линии 1 порта C
PORTC |= _BV(PC2); // установить "1" на линии 2 порта C
delay(500); // ждем 0,5 сек.
// ----------------------------------------------------
} // закрывающая скобка бесконечного цикла
} // закрывающая скобка основной программы
Изменяя время задержки, попробуйте добиться поворота на прямой угол так, чтобы траектория движения робота напоминала квадрат.
Для более быстрого разворота робота можно использовать реверс (вращение в противоположную сторону) одного из моторов. Написание такой программы будет хорошим практикумом для самостоятельного программирования движения робота.
Хотя получившийся робот достаточно прост, с ним можно провести ряд интереснейших экспериментов, среди которых могут быть опыты по созданию рисующего робота и робота-танцора.
Для того чтобы сделать первого из них, достаточно укрепить на шасси
робота цветной маркер, касающийся поверхности, по которой движется
робот, и поставить робота на лист ватмана. Циклоидные рисунки такого
арт-робота будут зависеть от написанной вами программы и, конечно же,
вашей фантазии.




Если последовательно использовать на одном листе несколько толстых цветных маркеров разных цветов, под каждый из которых будет написана специальная программа, можно получить настоящие шедевры абстрактного искусства. Такие произведения робототехнического искусства сегодня экспонируются даже в престижных галереях.
Интересные результаты можно получить, используя маркеры и фломастеры разных типов, толщины и фактуры. Красиво выглядит фактурная прерывистая линия, оставляемая мягким толстым стеклографом. А самые необычные результаты дают подогреваемые восковые палочки для рисования. Устройство подогрева легко сделать из небольшого кусочка нихромовой проволоки и стеклянной трубки. (Батареи питания робота при этом быстро садятся.)
Статья взята с http://myrobot.ru/