Проекти за роботи > Робо-сумо

Моят сумо робот

(1/9) > >>

durankulakat:
От миналата седмица започнах работа по този проект и вече е почти готов :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:
Изобщо не реагира на сензорите и само се върти в кръг
Имам съмнения относно кода, но немога да намеря грешка
Някой може ли да ми помогне?

yasko:
Добре. Нека да го подкараме този сумбот :)
Първо имам няколко забележки по схемата:
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))
--- Край на кода ---

няма особен смисъл и компилатора предупреждава за това. Ако искаш да провериш всичките тези условия трябва да използваш логически операции помежду им. Но като начало мисля че ще е много полезно да направиш логическа схема на алгоритъма и след това да се облече с код.

durankulakat:
1. Така, филтрови кондензатори всъщност съм сложил (100нано и 10микро) но ги няма на схемата :oops: . Ще те послушам и ще добавя един за драйвера  :)
2. И за транзистора ще те послушам :)
3. Алгоритъма (незнам как да направя логическа схема, засега само ще го обясня) -
Старт

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

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

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

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

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

край.

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

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

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

Поздрави!

yasko:
Първо ще е добре да качиш, новата и поправена схема, където има всички компоненти. Относно програми за правене на блок-схеми и дргуги подобни -попаднах на тази:
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. Така написано това условие изглежда малко тромаво, но утре ще измислим нещо по елегантно.

durankulakat:
Ето я пълната схема на робота  :)

Навигация

[0] Списък на темите

[#] Следваща страница

Премини на пълна версия