Mobilní robot

O projektu

Někdy na začátku prázdnin po čtvrtém ročníku na univerzitě jsem se rozhodl, že bych si rád vyzkoušel postavit vlastní mobilní robot. Všechny zkoušky se povedly, tak jsem se brzo začal nudit. Studoval jsem zrovna technickou kybernetiku, tak jsem si řekl, proč se nenaučit ještě neco dalšího. Navíc jsem se už nějaký čas chtěl naučit pořádně pájet, tak tohle byla příležitost ;)

Nejdřív jsem pár dní hledal na Internetu a vybíral jsem ten správný hardware, který by splňoval moje představy o funcích a hlavně byl hodně levný. Nejvíc se mi líbil HandyBoard. Uměl prakticky všechno co jsem potřaboval a programoval se v C-čku, což byl můj největší požadavek. S assemblerem jsem si užil svoje a rozhodně jsem nehodlal zabít prázdniny studiem tohohle jazyka. Na HandyBoardu běží speciální systém Interactive C, který se umí spojit s počítačem po sériovém portu a dovoluje spouštět příkazy jakyka C v reálném čase přímo v konzoli! Na testování je to naprosto neocenitelná funkce. Prostě jsem položil robota na stůl, připojil kabel a hned jsem mohl z klávesnice řídit motory, číst hodnoty na vstupech atd. Funguje to v podstatě jako Unixový shell :)

Vždycky, když se někdo dozvěděl o téhle hračce, hned ho zajímala pořizovací cena. Elektroniku jsem pořídil za cenu desky plošných spojů, displeje a několika konektorů. Jinak prakticky všechny součástky včetně procesoru, paměti a LED diod jsem získal zdarma z Internetu od výrobců.

Robot s deskou HandyBoard

 

Specifikace

Mikrokontrolér: Podvozek:

 

Elektronika

Začátkem července (2004) jsem se rozhodl, že pro ovládání použiju Handyboard a začal jsem shánět součástky. Dalo mi dost práce sehnat všechny s odpovídajícími parametry, někde jsem musel zvolit vhodnou náhradu, ale nakonec se to povedlo. Desku plošných spojů jsem chtěl původně vyrobit sám, ale protože podklady jsou jen ve formě GIFů a práce by mi zabrala minimálně týden, obědnal jsem jí nakonec od výrobce z Kalifornie. Ukázalo se, že nakonec byla levnější než v případě vlastní výroby a opravdu profesionálně zpracovaná. Nepájivá maska, prokovy, potisk... zkrátka paráda. Asi za 3 dny (nemohl jsem sehnat rezistorovou síť s 10 nožičkami) jsem spájel hlavní desku i desku pro spojení s počítačem. Všechno proběhlo hladce.
HandyBoard mounted on the robot

Schémata všech částí desky jsou k dispozici on-line, ale pouze jako obrázky:

Také desky plošných spojů jsou volě přístupné:

 

Konstrukce robota

Použil jsem podvozek z terénního auta na vysílačku, které jsem sehnal na burze za 200,- korun :) Má pohon na zadní kola, diferenciál, dvoustupňovou převodovku a nezávislé uložení předních kol. Řízení bylo vyřešené dost neštastně stejnosměrným motorkem s převodovkou, ale prakticky bez možnosti kontroly úhlu natočení kol. Na pěti drátech byla informace o stavu předních kol:

Takže řízení jsem se věnoval nejdřív. Ideální by bylo servo, kterému pošlu požadovanou polohu a nemusím se víc starat. Jenže ještě nevím jaké servo bude nejvhodnější a navíc jsem to řešil o weekendu. Na stole se mi shodou okolností válel miniaturní trimr od Piheru, který svými parametry akorát pasuje na analogový vstup. Řešení je jasné, přidělal jsem trimr přímo na osu, která řídí kola. Na analogovém vstupu teď mám informaci o poloze předních kol. Z možného rozsahu 256 kroků jich využiju sice jen 25, ale i tak mám lepší představu, kam vlastně jedu. Trimr pochopitelně nevydrží věčně a taky se zpětnou vazbou je dost práce. Programovat nějaký regulátor v tomhle případě nemá smysl. V nejbližší době proto musím koupit servo.

 

Software

Jak už jsem psal dříve, na HandyBoardy běží systém Interactive C [IC], ve kterém se programuje jako v klasickém céčku, ale je tady několik omezení vzhledem k malé paměti. Jedna z nich (a bohužel poměrně nepříjemná) je absence některých matematických funkcí. Nenajdete například goniometrické funkce (sin(), cos() atd.) a exponencielu. V příkladu uvedeném níže je ukázka, jak se dá toto omezení vyřešit a zároveň i doporučení pro všechny podobné aplikace na pomalém hardware. Řešil jsem problém s velmi citlivým joystickem, v poloze kolem nuly dostával motor poměrně silný signál a nebylo prakticky možné motory úplně zastavit. Proto jsem potřeboval nějakou nelineární charakteristiku, která by joystick zpomalila v nějakém okolí nuly. Místo modelování nelineární funkce přímo na desce, doporučuju použít třeba Matlab, vytvořit si funkci, která svými parametry přesně odpovídá potřebám, potom jí navzorkovat a v kódu použít předpočítané hodnoty. Je totiž mnohem rychlejší se podívat do pole na hodnotu rychlosti motoru, než jí počítat pořád dokola nějakou matematickou funkcí.

/*
 * Simple joystick controller for a wheeled robot
 */

void main() {

    int motor_0; // Main motor

    int motor_2; // Steering motor

    /* Table mapping analog input values to PWM.
       Generated by sampling custom function in Matlab.
     */

    int speed[195] = {<Insert 195 values ranging from 100 to -100 according to your

                        requirements and sensitivity of your joystick.>};

    while(!stop_button()){
        /* Main motor */
        motor_0=speed[analog(5)];

        if((motor_0 < 3) && (motor_0 > -3)) motor_0 = 0;

        motor(0, motor_0);

        /* Steering motor */
        if(analog(6)<140) motor(2,-20);

        if(analog(6)>160) motor(2,20);

        if((analog(6)>=140) && (analog(6)<=160)) off(2);

        msleep(20L);
    }
}

 

Fotky

01.jpg 02.jpg 03.jpg 04.jpg 05.jpg 06.jpg 07.jpg 08.jpg 09.jpg 10.jpg 11.jpg 12.jpg 13.jpg