Ето, че настана време да усложним още повече нашата конструкция за BEAM-робот... И след като го направихме Line Tracer, сега е време да си променим малко схемата, за да го направим и мобилен.
Схемата ще използваме тази:
Като драйвер за двигатели отново ще използваме L239D, чийто входове ще съединим с микроконтролера така, както е показано на схемата. В дадения случай можем да използваме който и да е от микропроцесорите от серията AVR. Тук ще разгледаме случая с ATmega8, но може да се използват и ATtiny2313, ATtiny26, или който и да е от семейството Mega.
На схемата, драйверът за двигатели е включен към изходите на порта С на микроконтролера ATmega8, но те могат да се сложат на който и да е изход, с изключение на това, че после ще се наложи да променяме малко програмата.
Електролитическият кондензатор C3 (1000мкф, 10-25в.) е необходим за това, че да изглади препадите на напрежение, породени от работата на моторите. За да се стабилизира още повече работата на микроконтролера, няма да е зле да сложим и керамически кондензатор с капацитет около 0,33 мкф, включен към изходите за захранване VCC, GND (крачета 7 и
и разположен в непосредствена близост с тях (на схемата не е указан!).
Механиката на робота трябва да е от "танков" тип, т.е. левият мотор предава движение на лявото колело, а десният - на дясното.
За да "оживее" нашият току-що сглобен робот му трябва програма. Тази програма ние трябва да напишем. Всичко, което трябва да знаете за програмите е в раздел "Алгоритми". Там има и как да настроите WinAVR. Та...нека да започваме!
/************************************************
ПРИМЕР 1 :: ВЪРТЕНЕ НА МОТОРИТЕ НАПРЕД-НАЗАД
*************************************************/
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 8000000UL // 8 MHz
/***************** Функция на задържане ****************/
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 :: ДВИЖЕНИЕ НАПРЕД СЪС ЗАВОЙ
*************************************************/
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 8000000UL // 8 MHz
/***************** Функция на задържане ****************/
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 сек.
// ----------------------------------------------------
} // закриваща скоба на безкрайния цикъл
} // закриваща скоба на основната програма
Изменяйки времето на задържане, опитайте се да накарате робота да прави завой под прав ъгъл и да върви по квадратна траектория. За да се развъртява по-бързо роботът, опитайте се да направите реверс - т.е. когато дясното колело се върти за ляв завой, направете така, че лявото да се завърти в обратната посока!
Това е, вече сглобихме и програмирахме нашия първи мобилен робот! Надявам се тази статия да ви бъде от полза!
Желая успех на всички!!
Борислав