Форум по Роботика
Проекти за роботи => Други роботи => Темата е започната от: Borislav в Юни 28, 2007, 10:35:27 am
-
Ето, че настана време да усложним още повече нашата конструкция за BEAM-робот... И след като го направихме Line Tracer, сега е време да си променим малко схемата, за да го направим и мобилен.
Схемата ще използваме тази:
(http://robotics-bg.com/a/roboAVR.JPG)
Като драйвер за двигатели отново ще използваме L239D, чийто входове ще съединим с микроконтролера така, както е показано на схемата. В дадения случай можем да използваме който и да е от микропроцесорите от серията AVR. Тук ще разгледаме случая с ATmega8, но може да се използват и ATtiny2313, ATtiny26, или който и да е от семейството Mega.
На схемата, драйверът за двигатели е включен към изходите на порта С на микроконтролера ATmega8, но те могат да се сложат на който и да е изход, с изключение на това, че после ще се наложи да променяме малко програмата. :)
Електролитическият кондензатор C3 (1000мкф, 10-25в.) е необходим за това, че да изглади препадите на напрежение, породени от работата на моторите. За да се стабилизира още повече работата на микроконтролера, няма да е зле да сложим и керамически кондензатор с капацитет около 0,33 мкф, включен към изходите за захранване VCC, GND (крачета 7 и 8) и разположен в непосредствена близост с тях (на схемата не е указан!).
Механиката на робота трябва да е от "танков" тип, т.е. левият мотор предава движение на лявото колело, а десният - на дясното.
За да "оживее" нашият току-що сглобен робот му трябва програма. Тази програма ние трябва да напишем. Всичко, което трябва да знаете за програмите е в раздел "Алгоритми". Там има и как да настроите 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 сек.
// ----------------------------------------------------
} // закриваща скоба на безкрайния цикъл
} // закриваща скоба на основната програма
Изменяйки времето на задържане, опитайте се да накарате робота да прави завой под прав ъгъл и да върви по квадратна траектория. За да се развъртява по-бързо роботът, опитайте се да направите реверс - т.е. когато дясното колело се върти за ляв завой, направете така, че лявото да се завърти в обратната посока!
Това е, вече сглобихме и програмирахме нашия първи мобилен робот! Надявам се тази статия да ви бъде от полза!
Желая успех на всички!!
Борислав
-
Извинявай,но нещо не схванах,какво прави този робот? :oops: Да програмираме микроконтролер?
-
Извинявай,но нещо не схванах,какво прави този робот? :oops: Да програмираме микроконтролер?
Това е робот без датчици! Той не може да прави практически нищо, освен вървене напред-назад,наляво-надясно. Но това е много удобно, защото направиш ли платформата на робота, успееш ли да накараш да върви, после добавянето на датчици не е толкова сложна задача! :) Да, това е робот с програма, както си личи!
-
Build started 4.7.2008 at 21:21:02
avr-gcc.exe -mmcu=atmega8 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT dvijenie.o -MF dep/dvijenie.o.d -c ../dvijenie.c
../dvijenie.c: In function 'main':
../dvijenie.c:15: error: 'DDRC' undeclared (first use in this function)
../dvijenie.c:15: error: (Each undeclared identifier is reported only once
../dvijenie.c:15: error: for each function it appears in.)
../dvijenie.c:21: error: 'PORTC' undeclared (first use in this function)
../dvijenie.c:21: warning: implicit declaration of function '_BV'
../dvijenie.c:21: error: 'PC1' undeclared (first use in this function)
../dvijenie.c:22: error: 'PC2' undeclared (first use in this function)
../dvijenie.c:23: error: 'PC3' undeclared (first use in this function)
../dvijenie.c:24: error: 'PC4' undeclared (first use in this function)
make: *** [dvijenie.o] Error 1
Build failed with 8 errors and 1 warnings...
Това излиза като се билдне с AVR
-
Трябва да включиш в твойта програма файла с дефиниции на входно-изходните протове на микроконтролера. Обикновено това се прави в началото със следния ред:
#include <avr/io.h>
И ако си решил да правиш тази схема не е лошо да се сложат малко филтрови кондезатори по захранването (10uF,100nF)
-
Привет!
Станало е някакво объркване с кодовете... В тези са пропуснати (или аз съм пропуснал при превода) следните редове отгоре:
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 8000000UL // 8 MHz
Тоест, кодът придобива следният вид:
/************************************************
ПРИМЕР 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 сек.
// --------------------------------------------------
} // затваряща скоба на безкрайния цикъл
} // затваряща скоба на основната програма
При мен не прави проблеми, и при теб не би трябвало да има. :)
Поздрави!
П.п. Яско ме изпревари. :)
-
:clap: yes!
стана .
Направил съм електрониката и сега чакам един френд да ми даде два касетофона за да им взема моторчетата/в тях има вграден регулатор на обороти/
и да видя какво ще се получи.... :-D
...И ако си решил да правиш тази схема не е лошо да се сложат малко филтрови кондезатори по захранването (10uF,100nF)....
не.Смятам да сложа филтров дросел с гасящи кондензатори.Четох че така най-малко е възможно смущение на МК./При условие че се захранват от един източник./А и моторчетата са с електроника -тиристор и управление.
-
не.Смятам да сложа филтров дросел с гасящи кондензатори.Четох че така най-малко е възможно смущение на МК./При условие че се захранват от един източник./А и моторчетата са с електроника -тиристор и управление.
Ако сложиш захранване от един източник, ще се сблъскаш с моя проблем. :) L293D дава голям пад на напрежение, поради което се нуждае от собствено захранване. Иначе моторите ти ще се въртят ужасно бавно и/или няма да се въртят. :) Трябва да предвидиш захранване за Микроконтролера, и захранване за моторите (към L293D-то).
При мен се получи точно това, мъчих го с две захранвания, но в крайна сметка това не ме удовлетворява, та правя H-мостове... :)
Поздрави!
-
е захранването е 12 волта със стабилизатор 78l05
Все пак се надявам да не падне под 7 волта че тогава вече няма да стабилизира.