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ů.
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é:
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.
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);
}
}