Автор Тема: Моят сумо робот  (Прочетена 43810 пъти)

durankulakat

  • Бил знаел какво е Мехатроника!
  • *****
  • Публикации: 103
    • Профил
Моят сумо робот
« -: Май 05, 2009, 12:10:49 pm »
От миналата седмица започнах работа по този проект и вече е почти готов :clap:
Остават само ралото, капакът и сензорите за следене на линия.
Вчера го тествах само с IR сензорите и изникна проблем...
Ето я схемата:

И кодът:#include <avr/io.h>
#include <avr/delay.h>
#define F_CPU 4000000UL // 4 MHz clock rate

int main(void)
{      
    DDRD=0xff;
    DDRC=0x00;
    DDRB =1<<PB2;  
    TCCR1A=(1<<COM1B1)|(1<<WGM11)|(1<<WGM10);
    TCNT1=0;
    OCR1A=105;   //tuning to 38kHz
    OCR1B=53; //50% duty cycle
    TCCR1B=(1<<WGM12)|(1<<WGM13)|(1<<CS10);
   
    PORTD|=_BV(PD0);
    PORTD|=_BV(PD3);
   
    while(1)
    {
       
       if(!(PINC&(1<<PC3)))
       {
       
          PORTD&=~_BV(PD0);
          PORTD&=~_BV(PD3);
          PORTD|=_BV(PD1);
          PORTD|=_BV(PD2);
          _delay_ms(500);
          PORTD&=~_BV(PD1);
          PORTD&=~_BV(PD2);
          PORTD|=_BV(PD0);
          _delay_ms(500);
          PORTD|=_BV(PD3);
         
       }
         
       if(!(PINC&(1<<PC2)))
       {
       
          PORTD&=~_BV(PD0);
          PORTD&=~_BV(PD3);
          PORTD|=_BV(PD1);
          PORTD|=_BV(PD2);
          _delay_ms(500);
          PORTD&=~_BV(PD1);
          PORTD&=~_BV(PD2);
          PORTD|=_BV(PD3);
          _delay_ms(500);
          PORTD|=_BV(PD0);
         
       }              
       
       while(PINC&(1<<PC2),PINC&(1<<PC3),!(PINC&(1<<PC2)),PINC&(1<<PC5))
       {
       
          PORTD&=~_BV(PD0);
         
       }
       
       PORTD|=_BV(PD0);
       
       while(PINC&(1<<PC2),PINC&(1<<PC3),PINC&(1<<PC4),!(PINC&(1<<PC5)))
       {
       
          PORTD&=~_BV(PD3);
         
       }
       
          PORTD|=_BV(PD3);
         
       while(PINC&(1<<PC2),PINC&(1<<PC3),PINC&(1<<PC4),PINC&(1<<PC5))
       {
       
          PORTD|=_BV(PD3);
          PORTD|=_BV(PD0);
       
       }
       
    }    

}

А проблемът е, че когато пусна контролера подава сигнал само на дясното серво и то назад  :shock:
Изобщо не реагира на сензорите и само се върти в кръг
Имам съмнения относно кода, но немога да намеря грешка
Някой може ли да ми помогне?
Иван Петров 16г
skype: slayer_kolyo

yasko

  • Administrator
  • *****
  • Публикации: 484
    • Профил
Моят сумо робот
« Отговор #1 -: Май 05, 2009, 04:24:32 pm »
Добре. Нека да го подкараме този сумбот :)
Първо имам няколко забележки по схемата:
1. Не виждам никъде филтрови кондезатори - сложи поне един 100nF и 10uF. Не е лошо да има и един по-голям филтров кондезатор (47-100uF) при L293D.
2. Вързал си Q1(биполярен транзистор) директно към изхода на микроконтролера (пин 11). Рискуваш да изгориш порта на контролера или транзистора. Трябва да има токоограничаващ резистор (примерно 1к).
Моля те поправи ги тези неща защо иначе объркваш другите участници във форума.
Относно софтуера - ако обясниш какъв алгоритъм искаш да постигнеш, ще може да измислим как да стане. За момента кода ми е малко неясен. Като начало функцията _delay_ms(500), няма да може да ти генерира толкова дълго закъснение, писал съм защо. Второ не виждам нищо свързано на PC2, PC3 според горната схема. И трето израза:
while(PINC&(1<<PC2),PINC&(1<<PC3),!(PINC&(1<<PC2)),PINC&(1<<PC5))
няма особен смисъл и компилатора предупреждава за това. Ако искаш да провериш всичките тези условия трябва да използваш логически операции помежду им. Но като начало мисля че ще е много полезно да направиш логическа схема на алгоритъма и след това да се облече с код.
Ясен Паунски,  гр.София, 39 г.

durankulakat

  • Бил знаел какво е Мехатроника!
  • *****
  • Публикации: 103
    • Профил
Моят сумо робот
« Отговор #2 -: Май 05, 2009, 06:36:08 pm »
1. Така, филтрови кондензатори всъщност съм сложил (100нано и 10микро) но ги няма на схемата :oops: . Ще те послушам и ще добавя един за драйвера  :)
2. И за транзистора ще те послушам :)
3. Алгоритъма (незнам как да направя логическа схема, засега само ще го обясня) -
Старт

моторите напред

ако десният сензор за линия се запуши (робота е на ръба), тогава:
моторите спират, включват се назад за определено време, спират, само десния се включва напред за определено време, и левия се включва.

ако левият сензор за линия се запуши, тогава:
моторите спират, включват се назад за определено време, спират, само левия се включва напред за определено време, и десния се включва.

ако десният IR сензор подава сигнал, левия и десния сензор за линия подават сигнал (робота не е на ръба), тогава:
десния мотор спира, докато не се получи сигнал и от двата IR сензора, тогава се пуска отново.

ако левият IR сензор подава сигнал, левия и десния сензор за линия подават сигнал (робота не е на ръба), тогава:
левият мотор спира, докато не се получи сигнал и от двата IR сензора, тогава се пуска отново.

край.

Това е алгоритъма който искам да постигна :)
За кодът предполагам че ще помогнат тези:
C5 - IR дясно
C4 - IR ляво
C3 - линия дясно
C2 - линия ляво

D0 - десен мотор напред
D1 - десен мотор назад
D2 - ляв мотор назад
D3 - ляв мотор напред

Към C2 и C3 не съм вързал нищо защото още не съм монтирал датчиците за линия. И тъй като висящите крачета на контролера са в високо ниво, няма да се изпълни кода за линията.
За израза който си цитирал - щом не се образува така е много вероятно заради него да не работи :?

Поздрави!
Иван Петров 16г
skype: slayer_kolyo

yasko

  • Administrator
  • *****
  • Публикации: 484
    • Профил
Моят сумо робот
« Отговор #3 -: Май 08, 2009, 12:11:04 am »
Първо ще е добре да качиш, новата и поправена схема, където има всички компоненти. Относно програми за правене на блок-схеми и дргуги подобни -попаднах на тази:
http://live.gnome.org/Dia - тя е open source и има добри възможности
Сега да минем към софтуера - твърдението че когато даден порт е конфигуриран като вход, ще се чете като високо ниво не е съвсем коректно.
Ако вземе Порт C и имаме:
DDRC=0x00; PORTC=0x00;
тогова I/O порта е конфигуриран като високо импедансен вход и ако бъде оставен висящ, състоянието на отделните пинове няма да ясно, най-верояно поради наличието на външни смущения ще се преключват от 0-1 и обратно. Обаче ако конфигурираме порта така:
DDRC=0x00; PORTC=0xFF; ,
тогава включваме вградените pull-up резистори (50-100к) и входовете ше бъдат във високо ниво, дори ако са оставени висящи.
Сега нека да видим как изглежда на C следната проверка от няколко условия:
Цитат
ако десният IR сензор подава сигнал, левия и десния сензор за линия подават сигнал (робота не е на ръба), тогава:

Доколкото сxващам под подава сигнал се разбира нулево ниво така че нещата изглеждат така:

if  (!PINC&(1<<PC5)&&(PINC&(1<<PC2))&&(PINC&(1<<PC3))&&(PINC&(1<<PC4))) {}

С други думи условието ще бъде валидно, когато PC5=0, a PC2,PC3,PC4=1. Така написано това условие изглежда малко тромаво, но утре ще измислим нещо по елегантно.
Ясен Паунски,  гр.София, 39 г.

durankulakat

  • Бил знаел какво е Мехатроника!
  • *****
  • Публикации: 103
    • Профил
Моят сумо робот
« Отговор #4 -: Май 09, 2009, 12:11:58 am »
Ето я пълната схема на робота  :)
Иван Петров 16г
skype: slayer_kolyo

Borislav

  • Administrator
  • *****
  • Публикации: 1010
    • Профил
    • http://robotics-bg.com
Моят сумо робот
« Отговор #5 -: Май 09, 2009, 09:45:19 pm »
Браво за проекта!
Само че ще си позволя малка забележка към схемата ти... Най-добре пусни захранването към цялата схема през стабилизатор (L7805), за да избегнеш проблема, с който аз се бях сблъскал - падът на напрежение. Другият вариант е да подадеш по-високо захранващо напрежение на 8-мото краче на драйвера L293 - нещо от порядъка на 9V.
Поздрави и все така! :)
Роботиката не е хоби - тя е начин на живот!

durankulakat

  • Бил знаел какво е Мехатроника!
  • *****
  • Публикации: 103
    • Профил
Моят сумо робот
« Отговор #6 -: Май 09, 2009, 10:18:51 pm »
Мерси!
А как по-точно с стабилизатора се избягва падът на напрежение?
Иван Петров 16г
skype: slayer_kolyo

Borislav

  • Administrator
  • *****
  • Публикации: 1010
    • Профил
    • http://robotics-bg.com
Моят сумо робот
« Отговор #7 -: Май 10, 2009, 11:14:10 am »
Цитат на: "durankulakat"
Мерси!
А как по-точно с стабилизатора се избягва падът на напрежение?


Да, това е добра забележка, защото съм забравил схемата. :D
Ето един от възможните варианти, над които да помислиш:


Единственото изяснение по схемата е това, че Vin е желателно да бъде в границите 7,4 - 12 V.
Поздрави!
Роботиката не е хоби - тя е начин на живот!

zoro1

  • Global Moderator
  • *****
  • Публикации: 610
    • Профил
    • http://www.zoro1.com
Моят сумо робот
« Отговор #8 -: Май 10, 2009, 12:34:18 pm »
Горе долу се спазва следното :входния  капацитет да е 10 пъти по-голям от изходния .Случвало ми се е без кондензатори интегралата да дава изходно напрежение 7,6 Волта.След поставянето на 100 нано фарада на фхода и изхода ,нещата се нормализираха.


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

Аматьор

  • Бил знаел какво е Мехатроника!
  • *****
  • Публикации: 107
    • Профил
Моят сумо робот
« Отговор #9 -: Май 10, 2009, 03:09:09 pm »
Относно линейните стабилизаторо 78ХХ.
  Електролитен кондензатор на входа е необходим, когото той се намира на по-голямо разстояние от изправителя.  Служи да поеме импулсният ток от консуматора.  В случая с батерийно захранване този кондензатор пак може да помогне, защото вътрешното съпротивление на последоватено свързаните батерии се получава с относително голяма стойност.  
На изхода на стабилизатора кондензатор с типична стойност 100 nF на практика е задължителен.  Той трябва да се запои в непосредствена близост до изводите на стабилизатора и служи за предпазване от саможъзбуждане.  Ако се получи самовъзбуждане с постояннотоков волтметър обикновено се измерва по-голямо напрежение от 5V, но с осцилоскоп се наблюдават генерации .  Вероятно заради пробива на цифровите схеми (за ТТЛ е някъде към 7.5V), амплитудата има такава стойност.
Допустимото входно напрежение  може да бъде различно и трябва да се проверят справочните данни на конкретния производите.  За корпуси ТО220 обикновено то е 37V, a за Т092 (78L05) - 20V.

  Имам идея за намаляване на консумирания ток на показаната схема - светодиодите D1 и D2 да се вържат последователно. Вариантите са два.
  Ако се изпозва стабилизираното напрежение (5V) може да не се поставя токоограничаващ резистор.  На пръв поглед схемата ще изглежда грешна, но всъщност не е.  Причината е, че както отпушения транзистор, така и светодиодите имат някакво съпротивление, което обикновено е няколко десетки ома.   Така, ако сумарният пад на напрежение върху транзистора и диодите е 4.2V, а сумарното им съпротивление е 80 ома, ще преминава ток 10 мА.  Разбира се това са само предположения и трябва да се направят конкретни измервания.  Недостатък на този вариант е, че параметрите не са гарантирани, а освен това са температурно зависими.  Все пак решението е допустимо.
 Другият  вариант е да се използва нестабилизираното напрежение и да се използва подходящ по големина токоограничаващ резистор.  Така няма да се товари стабилизатора.  Поради същата причина е желателно двигателят също да се захранва непосредствено от батериите.  Възможно е при комутациите на двигателя да възникват смущения по захранване и процесорът да се прецаква.  И аз съм съгласен , че в непосредствена  близост до L293, както и до Д1 и Д2 трябва да има електролитни кондензатори с прилични капацитети.
Красимир Милев    51г

durankulakat

  • Бил знаел какво е Мехатроника!
  • *****
  • Публикации: 103
    • Профил
Моят сумо робот
« Отговор #10 -: Февруари 02, 2011, 06:00:13 pm »
Привет съфорумници!  :D
Ето че пак се връщам към този проект и този път смятам да го завърша.
Има подобрения по системата:
- ползвам Atmega88
- кодът е писан в MikroC (много по-лесно е)
- алгоритъмът е по-добър (така мисля...)
- електронната схема е усъвършенствана
- шасито на робота е от 30-годишен метален конструктор (голяма надеждност)

Нека да започна с електронната схема:



Пояснение за пиновете на Atmega88:
C5 - Вход ляв IR приемник
C4 - Вход десен IR приемник
C3 - Вход десен сензор за линия
C2 - Вход ляв сензор за линия
D0 - Изход ляв мотор напред
D1 - Изход ляв мотор назад
D2 - Изход десен мотор напред
D3 - Изход десен мотор назад
D5 - Изход 38KHz за IR светодиодите

Сложил съм два регулатора, като този за микроконтролера е в корпус TO92, а другия TO220.

Сензорите за линия са свързани към главната платка по следния начин:



Крачетата на конектора съответстват: квадратно (1-во) към квадратно.

Захранването ще е от две 9-волтови батерии свързани паралелно.

Ето го и кодът:
void str() // Function for turning both motors forward
{
 PORTD=0b00000101;
}
void left() // Function for turning the left motor back and the right one forward
{
 PORTD=0b00000110;
}
void right() // Function for turning the left motor forward and the right one back
{
 PORTD=0b00001001;
}
void back() // Function for turning both motors backward
{
 PORTD=0b00001010;
}
void clear() // Function for making all PORT C pins go low (actually I dont use it...)
{
 PORTD=0x00;
}
void main() // Main function
{
 DDRC=0x00; // Defining all PORT C pins as Inputs
 DDRD=0xFF; // Defining all PORT D pins as Outputs
 PORTC=0b0111100; // Activating Pull-up resistors on pins C2, C3, C4 and C5
 TCCR0A=(1<<COM0B1)|(1<<WGM01)|(1<<WGM00); // Timer 0 settings
 TCNT0=0; // Enabling Timer 0 (I think...)
 OCR0A=210;   //Tuning to 38kHz
 OCR0B=105; //50% duty
 TCCR0B=(1<<WGM02)|(1<<CS00); // More Timer 0 settings
 
 delay_ms(5000); // Initial 5sec delay
 str(); // Go straight!
 while(1) // Primary endless cycle
 {
  while(PINC3_bit&&PINC2_bit) // While the robot is not on the line
  {
   if(PINC5_bit&&PINC4_bit) str(); // If both IR are inactive go straight
   else if(PINC5_bit&&(!PINC4_bit)) right(); // If the left IR is inactive and the right one is active, go right
   else if((!PINC5_bit)&&PINC4_bit) left(); // If the left IR is active and the right one is inactive, go left
   else str(); // If all fails...just go straight :D
  }
   if(!PINC3_bit) // If right line sensor is active
   {
    while(!PINC3_bit) // Go back while its active
    {
     back();
    }
    PORTD=0b00000010; // Turn only left motor back
    delay_ms(300);   // for 300ms
   }
   else // Else if the left line sensor is active
   {
    while(!PINC2_bit) // Go back while its active
    {
     back();
    }
    PORTD=0b00001000; // Turn only left motor back
    delay_ms(300);   // for 300ms
   }
 }
}


Коментарите съм писал на английски защото на кирилица не излизат.

Най-вероятно тази вечер ще наредя елементите на бредборда и ще тествам.

Очаквайте резултати!  :D

П.П. Ако някой се затруднява с четенето на коментарите, да каже, ще ги напиша в notepad на български.
Иван Петров 16г
skype: slayer_kolyo

sv_shady

  • Administrator
  • *****
  • Публикации: 636
    • Профил
Моят сумо робот
« Отговор #11 -: Февруари 02, 2011, 06:04:34 pm »
Може да махнеш регулатора на L293D, дори ще е хубаво :)
Imagination is the only limit.......

Светлин Пенков
София / Рединг, Великобритания

durankulakat

  • Бил знаел какво е Мехатроника!
  • *****
  • Публикации: 103
    • Профил
Моят сумо робот
« Отговор #12 -: Февруари 02, 2011, 06:05:53 pm »
Ползвам сервомашинки и като подам директно 9 волта няма ли да изгорят?
Иван Петров 16г
skype: slayer_kolyo

sv_shady

  • Administrator
  • *****
  • Публикации: 636
    • Профил
Моят сумо робот
« Отговор #13 -: Февруари 02, 2011, 10:22:24 pm »
Ами 9 волта и около 2волта върху L293 остават около 7в за сервомашинките. Виж им харектеристиките - може да са до 6в или до 7,2в.
Imagination is the only limit.......

Светлин Пенков
София / Рединг, Великобритания

durankulakat

  • Бил знаел какво е Мехатроника!
  • *****
  • Публикации: 103
    • Профил
Моят сумо робот
« Отговор #14 -: Февруари 03, 2011, 11:56:26 am »
Значи 7в са идеални за сервотата.
Скоро ще кача поправената схема.
Имам проблем:
Ползвам PonyProg за записване в микроконтролера и програматор тип 5 проводника. От настройките давам Probe и изписва тест окей. Избрал съм AVR Auto за модела микроконтролер, всичко засега е наред. Като му кажа да прочете паметта, изписва че не разпознава устройството или няма такова  :?:
Проверих всички връзки по схемата, няма пропуски.
Как мога да проверя дали микроконтролера е наред? Може да му е изгоряла някоя част...
Иван Петров 16г
skype: slayer_kolyo