Автор Тема: Първият ни мобилен робот  (Прочетена 14060 пъти)

Borislav

  • Administrator
  • *****
  • Публикации: 1010
    • Профил
    • http://robotics-bg.com
Първият ни мобилен робот
« -: Юни 28, 2007, 10:35:27 am »
Ето, че настана време да усложним още повече нашата конструкция за BEAM-робот... И след като го направихме Line Tracer, сега е време да си променим малко схемата, за да го направим и мобилен.

Схемата ще използваме тази:



Като драйвер за двигатели отново ще използваме 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 сек.
                        // ----------------------------------------------------


                   } // закриваща скоба на безкрайния цикъл

} // закриваща скоба на основната програма


Изменяйки времето на задържане, опитайте се да накарате робота да прави завой под прав ъгъл и да върви по квадратна траектория. За да се развъртява по-бързо роботът, опитайте се да направите реверс - т.е. когато дясното колело се върти за ляв завой, направете така, че лявото да се завърти в обратната посока!

Това е, вече сглобихме и програмирахме нашия първи мобилен робот! Надявам се тази статия да ви бъде от полза!
Желая успех на всички!!

Борислав
Роботиката не е хоби - тя е начин на живот!

TheDarkSoul

  • Заклет Роботостроител
  • *****
  • Публикации: 293
    • Профил
Първият ни мобилен робот
« Отговор #1 -: Февруари 03, 2008, 03:44:57 pm »
Извинявай,но нещо не схванах,какво прави този робот? :oops: Да програмираме микроконтролер?
Иван Зарев-14г.-гр.Дупница Skype:thedarksoul4
Не подценявай този, който прави крачка назад, защото може и да се засилва...:!:

Borislav

  • Administrator
  • *****
  • Публикации: 1010
    • Профил
    • http://robotics-bg.com
Първият ни мобилен робот
« Отговор #2 -: Февруари 03, 2008, 06:00:45 pm »
Цитат на: "tar"
Извинявай,но нещо не схванах,какво прави този робот? :oops: Да програмираме микроконтролер?


Това е робот без датчици! Той не може да прави практически нищо, освен вървене напред-назад,наляво-надясно. Но това е много удобно, защото направиш ли платформата на робота, успееш ли да накараш да върви, после добавянето на датчици не е толкова сложна задача! :) Да, това е робот с програма, както си личи!
Роботиката не е хоби - тя е начин на живот!

zoro1

  • Global Moderator
  • *****
  • Публикации: 610
    • Профил
    • http://www.zoro1.com
Първият ни мобилен робот
« Отговор #3 -: Юли 04, 2008, 09:22:06 pm »
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


...Великите нации  се държат като гангстери,а малките като проститутки...
И.Несторов
Skype:Zorro1430

yasko

  • Administrator
  • *****
  • Публикации: 484
    • Профил
Първият ни мобилен робот
« Отговор #4 -: Юли 04, 2008, 09:42:23 pm »
Трябва да включиш в твойта програма файла с дефиниции на входно-изходните протове на микроконтролера. Обикновено това се прави в началото със следния ред:
#include <avr/io.h>
И ако си решил да правиш тази схема не е лошо да се сложат малко филтрови кондезатори по захранването (10uF,100nF)
Ясен Паунски,  гр.София, 39 г.

Borislav

  • Administrator
  • *****
  • Публикации: 1010
    • Профил
    • http://robotics-bg.com
Първият ни мобилен робот
« Отговор #5 -: Юли 04, 2008, 09:46:35 pm »
Привет!
Станало е някакво объркване с кодовете... В тези са пропуснати (или аз съм пропуснал при превода) следните редове отгоре:

#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 сек.
                        // --------------------------------------------------


                   } // затваряща скоба на безкрайния цикъл

} // затваряща скоба на основната програма


При мен не прави проблеми, и при теб не би трябвало да има. :)
Поздрави!

П.п. Яско ме изпревари. :)
Роботиката не е хоби - тя е начин на живот!

zoro1

  • Global Moderator
  • *****
  • Публикации: 610
    • Профил
    • http://www.zoro1.com
Първият ни мобилен робот
« Отговор #6 -: Юли 04, 2008, 10:04:54 pm »
:clap: yes!
стана .
Направил съм електрониката и сега чакам един френд да ми даде два касетофона за да им взема моторчетата/в тях има вграден регулатор на обороти/
и да видя какво ще се получи.... :-D


...И ако си решил да правиш тази схема не е лошо да се сложат малко филтрови кондезатори по захранването (10uF,100nF)....

не.Смятам да сложа филтров дросел с гасящи кондензатори.Четох че така най-малко е възможно смущение на МК./При условие че се захранват от един източник./А и моторчетата са с електроника -тиристор и управление.


...Великите нации  се държат като гангстери,а малките като проститутки...
И.Несторов
Skype:Zorro1430

Borislav

  • Administrator
  • *****
  • Публикации: 1010
    • Профил
    • http://robotics-bg.com
Първият ни мобилен робот
« Отговор #7 -: Юли 05, 2008, 11:58:51 am »
Цитат на: "zoro1"
не.Смятам да сложа филтров дросел с гасящи кондензатори.Четох че така най-малко е възможно смущение на МК./При условие че се захранват от един източник./А и моторчетата са с електроника -тиристор и управление.


Ако сложиш захранване от един източник, ще се сблъскаш с моя проблем. :) L293D дава голям пад на напрежение, поради което се нуждае от собствено захранване. Иначе моторите ти ще се въртят ужасно бавно и/или няма да се въртят. :) Трябва да предвидиш захранване за Микроконтролера, и захранване за моторите (към L293D-то).
При мен се получи точно това, мъчих го с две захранвания, но в крайна сметка това не ме удовлетворява, та правя H-мостове... :)
Поздрави!
Роботиката не е хоби - тя е начин на живот!

zoro1

  • Global Moderator
  • *****
  • Публикации: 610
    • Профил
    • http://www.zoro1.com
Първият ни мобилен робот
« Отговор #8 -: Юли 05, 2008, 07:00:26 pm »
е захранването е 12 волта със стабилизатор 78l05
Все пак се надявам да не падне под 7 волта че тогава  вече няма да стабилизира.


...Великите нации  се държат като гангстери,а малките като проститутки...
И.Несторов
Skype:Zorro1430