Před zahájením provozu RP6 nebo jiných rozšiřujících přístrojů musíte kompletně přečíst
příručku základního modulu i příručky rozšiřujících modulů! Dokumentace obsahuje
informace o tom, jak systém správně funguje a jak se vyhnout nebezpečným situacím!
Příručky dále poskytují další důležité detaily, které běžný uživatel nemusí znát.
Důsledkem nedodržení upozornění uvedených v této příručce bude ztráta záruky! Firma
AREXX Engineering nemůže odpovídat za škody způsobené zanedbáním pokynů z této
příručky!
Zvláštní pozornost věnujte kapitole “Bezpečnostní pokyny”!
Nepřipojujte rozhraní USB k osobnímu počítači PC před prostudováním
kapitoly 3 – “Nastavení Hardware a Software” a kompletní instalací
software!
Tato příručka je chráněna autorským právem.
Žádná část nesmí být kopírována, přetisknuta
nebo šířena bez písemného souhlasu editora!
Změny technických parametrů a obsahu
balení jsou vyhrazeny. Obsah této příručky se
může kdykoliv změnit bez upozornění.
Nová verze příručky bude publikována na
našich webových stránkách:
http://www.arexx.com/
AREXX Engineering.
Všechny další obchodní známky použité
v tomto dokumentu jsou registrovány svými
vlastníky.
Přestože jsme pečlivě kontrolovali obsah, nemůžeme ovlivnit obsah externích webových
stránek uvedených v odkazech. Za obsah jednotlivých stránek odpovídají jejich správci.
Záruka je firmou AREXX Engineering je omezena výlučně na výměnu přístroje během zákonné
záruční doby v případě poruchy hardware, mechanického poškození přístroje, chybějící nebo
špatné montáži elektronických součástek včetně součástek umístěných v patici. Rozšířená
záruka neumožňuje aplikovat zákonnou odpovědnost firmy AREXX Engineering na libovolné
poškození přímo nebo nepřímo způsobené používáním přístroje.
Nevratné modifikace (tj. připájení dalších součástek, vrtání otvorů atd.) nebo poškození
přístroje způsobené nedodržením pokynů uvedených v této příručce ukončí platnost záruky.
Záruka se nemůže vztahovat na dílčí požadavky včetně software a bezchybného
a nepřerušovaného běhu programu. Program nejvíce může modifikovat a nahrávat uživatel.
Proto uživatel plně odpovídá za kvalitu software a celkové chování robotu.
Firma AREXX Engineering ručí za funkčnost dodávaných příkladů programů pokud budou
dodržovány předepsané provozní podmínky. Pokud přístroj pracuje mimo rozsah těchto
podmínek nebo se na PC používá poškozený či nefunkční program, uhradí zákazník všechny
náklady spojené s výměnou, opravou a náhradou. Pamatujte, prosím, také na licenční ujednání
uvedené na CD-ROM!
Symboly
V příručce se používají následující symboly:
Symbol “Výstraha!” se používá k označení důležitých detailů.
Nedodržení těchto pokynů může poškodit nebo zničit robot nebo
dalších dílů a může ohrozit vaše zdraví!
Symbol “Informace” se používá k označení užitečných tipů a triků
nebo základních informací. V tomto případě lze informace označit
jako “užitečné, ale ne nezbytné”.
A – Vyhledávání a odstraňování problémů ............................................................................ 123
B – Kalibrace enkodérů ......................................................................................................... 130
C – Rozmístění kontaktů na konektorech .............................................................................. 132
D – Recyklace a bezpečnostní pokyny .................................................................................. 134
5
1. Úvod
RP6 je levný autonomní mobilní robotický systém, navržený pro začátečníky, kteří mají
zkušenosti s elektronikou a vývojem software, jako úvod do fascinujícího světa robotiky.
Robot se dodává kompletně sestavený. To znamená, že je vhodný pro všechny uživatele bez
praxe s pájením a mechanickým zpracováním, kteří se chtějí soustředit na vývoj software.
Můžete však také implementovat vlastní obvody a přidávat další části robotu! Ve skutečnosti je
RP6 otevřený pro řadu rozšiřování a může se používat jako platforma pro širokou škálu
zajímavých elektronických experimentů!
RP6 je následník velmi úspěšného "C-Control Robby RP5", který byl představen roku 2003
společností Conrad Electronic SE. Zkratka “RP5” se může interpretovat jako "Robotický Projekt
5". Nový robot a předchozí systém nemají příliš mnoho společného s výjimkou shodné
mechanické části. Mikrokontrolér C-Control od firmy Conrad Electronic byl zaměněn a proto se
nadále nemůže nový robot programovat v interpretu jazyka Basic. Místo toho je aplikován
mnohem výkonnější mikroprocesor ATMEGA32 od výrobce Atmel, který se programuje pomocí
jazyka C. Do budoucna plánujeme nabídnout rozšiřující modul pro přizpůsobení robotu
k nejnovějším modulům řady C-Control (tj. CC-PRO MEGA 128). Tento modul bude umožňovat
programování v mnohem jednodušším jazyku Basic a nabízí velké množství rozšiřujících
rozhraní a větší paměť.
Nová konstrukce obsahuje rozhraní USB a nové rozšíření systému se zdokonalenou montáží,
odometrické snímače s velkým rozlišením (rozlišení je 150x vyšší ve srovnání s předchozím
systémem), přesný stabilizátor napětí (který byl u staršího systému nabízený jen jako rozšiřující
modul), nárazníky sestavené ze dvou mikrospínačů s dlouhými rameny a mnoho dalších
zdokonalení. Výhodnou součástí systému je i experimentální rozšiřující modul pro sestavení
vlastních elektronických obvodů. Ve srovnání s předchozím systémem je mnohem výhodnější
poměr ceny a výkonu.
Základní mechanické koncepce byla odvozena ze systému RP5. Konstrukci je však
optimalizovaná na nižší provozní hluk a nyní poskytuje další otvory pro mechanické rozšiřování
systému.
Robot RP6 byl navržen tak, aby byl kompatibilní s našimi předchozími roboty ASURO a YETI,
které používají menší mikroprocesor ATMEGA8 a identické vývojové nástroje (WinAVR,
avrgcc). Systémy ASURO a YETI se dodávaly jako konstrukční stavebnice, které si musel
sestavit uživatel. S ohledem na to, že byl RP6 navržen pro mnohem náročnější uživatele,
umožňuje větší možnosti rozšiřování, obsahuje větší mikroprocesor a více snímačů.
Momentálně je k dispozici několik rozšiřujících modulů, které se mohou použít na rozšíření
možností robotu. Například to bude rozšíření systému na předchozí řízení C-Control, rozšiřující
modul nabízející zvláštní MEGA32 a samozřejmě experimentální rozšiřující deska pro sestavení
vlastních elektronických obvodů, která se dá přikoupit samostatně. Na robot je možné umístit
několik modulů.
V blízké době se připravuje několik dalších zajímavých modulů a samozřejmě je možné vyvíjet
vlastní rozšiřující obvody!
Přejeme vám mnoho zábavy a úspěchů s robotickým systémem RP6!
6
1.1. Technická podpora
Na následující adrese můžete prostřednictvím internetu kontaktovat náš
podpůrný tým (Před vyžádáním technické podpory si pečlivě prostudujte
návod, abychom mohli co nejlépe odpovědět na vaše dotazy! Přečtěte si
pozorně také dodatek A – Řešení problémů):
- prostřednictvím našeho fóra: http://www.arexx.com/forum/
- e-mailem: info@arexx.nl
Na začátku příručky najdete poštovní adresu firmy. Všechny aktualizace
software, nové verze příručky a další informace budou publikovány na
domovské stránce:
http://www.arexx.com/
a stránce věnované robotu:
http://www.arexx.com/rp6
1.2. Obsah balení
V krabici s robotem RP6 byste měli najít následující položky:
• Kompletně sestavený robot
• Rozhraní RP6 USB
• USB kabel A->B
• 10 žilový plochý kabel
• CD-ROM RP6
• Příručka pro rychlý začátek
• Experimentální deska RP6
• 4 ks. šroub M3 x 25 mm
• 4 ks. matice M3
• 4 ks. podložka M3
• 4 ks. 14 vývodový konektor
• 2 ks.14 žilový plochý kabel
7
1.3. Vlastnosti a technické údaje
Tato část podává přehled vlastností robotu a zavádí některá základní klíčová slova, abyste se
seznámili s terminologií používanou v této příručce. Většina těchto klíčových slov bude
vysvětlena v následujících kapitolách.
Vlastnosti, jednotlivé části a technické údaje ROBOTICKÉHO SYSTÉMU RP6:
• Výkonný 8-bitový mikroprocesor Atmel ATmega32
◊ Rychlost 8 MIPS (= 8 milionů instrukcí za sekundu) při hodinové frekvenci 8 MHz
◊ Paměť: 32 kB Flash ROM, 2 kB SRAM, 1 kB EEPROM
◊ Volně programovatelný v jazyku C (používá WinAVR/avr-gcc)!
◊ … mnoho dalších předností! Další podrobnosti budou uvedeny v kapitole 2
• Flexibilní rozšiřující systém, založený na sběrnici I2C
◊ Potřebuje pouze dva signály (TWI -> "Dvou vodičové rozhraní")
◊ Přenosová rychlost až 400 kbit/s
◊ Architektura Master->Slave
◊ Na sběrnici se může připojit až 127 zařízení typu Slave
◊ Velmi populární sběrnicový systém. Na trhu je nabízeno mnoho standardních
integrovaných obvodů, snímačů a dalších modulů, které stačí jen přímo připojit na
sběrnici
• Je možná symetrická montáž rozšiřujících modulů na přední a zadní část robotu
◊ Teoreticky je možné na robot umístit řada rozšiřujících modulů, ale možnosti
napájecího zdroje a přetížení podvozku umožňuje montáž maximálně 6 až 8 modulů
(3 až 4 moduly na přední a zadní straně robotu).
◊ Základní deska poskytuje 22 volných montážních otvorů s průměrem 3,2 mm
a podvozek nabízí dalších 16 otvorů. Celkem je to 38 montážních otvorů – dále je na
podvozku volný prostor pro individuální otvory.
• Balení obsahuje experimentální desku plošných spojů(viz fotografie obsahu balení)
• USB rozhraní pro programování mikroprocesoru přímo z PC.
◊ Kabelové připojení zajistí maximální přenosovou rychlost. Nahrávání aktualizace
programu obvykle probíhá rychlostí 500 kBaud a celý paměťový prostor (30 kB, 2 kB
jsou vyhrazeny pro bootloader) se naplní během několika sekund.
◊ Rozhraní se může používat k programování všech dostupných rozšiřujících modulů
systému RP6 s mikroprocesorem AVR.
◊ Rozhraní se může použít také pro komunikaci mezi robotem a rozšiřujícími moduly.
Připojení můžete například využít k ladění, přenosu textových zpráv a dalších dat do
PC.
◊ Ovladač rozhraní umožňuje vytvořit virtuální COM port (VCP) pro všechny populární
operační systémy včetně Windows 2K/XP/Vista a Linux. VCP se může používat
v běžných terminálových programech a aplikačních programech.
◊ Program RP6Loader pro Windows a Linux umožňuje pohodlné nahrávání
aktualizovaného programu. Obsahuje také malý terminál pro komunikaci s robotem
prostřednictvím textových zpráv.
•Výkonná jednotka pásového pohonu v kombinaci s novou převodovkou s minimální
hlučností (ve srovnání s předchozím systémem CCRP5…)
◊ Dva výkonné stejnosměrné motory 7,2 V.
◊ Maximální rychlost cca 25 cm/s – závisí na stavu nabití a kvalitě baterií, celkové
hmotnosti a dalších podmínkách!
◊ Samo mazná, zapouzdřená ložiska pro všechny 4 hřídele kol.
◊ Dva gumové pásy.
◊ Robot je schopen překonávat malé překážky (s výškou do cca 2 cm), například hrany
koberců, práh nebo šikmou plochu se sklonem až do 30% (s namontovanými
nárazníkovými spínači). Při odstranění nárazníku a omezením počtu modulů na
2 dokáže robot šplhat do sklonu až 40%.
• Dva výkonné budiče motorů s tranzistory MOSFET (H-Bridges)
◊ Rychlost a směr otáčení se může řídit přímo mikroprocesorovým systémem.
◊ Dva proudové snímače provádí měření proudu jednotlivých motorů až do velikosti
1,8 A. To umožňuje rychlé rozpoznání zablokování nebo přetížení motorů.
• Dva enkodéry s vysokým rozlišením pro řízení rychlosti a trajektorie.
◊ Rozlišení 625CPR ("přírustků na otáčku"), které znamená, že systém napočítá 625
segmentů během jediné otáčky kola! Rozlišení je 150x vyšší než u předchozího
systému CCRP5, který měl pouze 4 CPR.
◊ Přesné a rychlé měření a regulace rychlosti!
◊ Velké rozlišení umožňuje měření vzdálenosti cca 0,25 mm na jeden segment
snímače.
•Anti kolizní systém (ACS), který může detekovat překážky pomocí integrovaného IR
přijímače a dvou IR diod umístěných na levé a přední straně robotu.
◊ Detekuje překážky přímo před robotem, vlevo i vpravo od robota.
◊ Nastavení citlivosti a výkonu vysílače umožňuje spolehlivou detekci předmětů se
špatným odrazem.
• Infračervený komunikační systém (IRCOMM)
◊ Dokáže přijímat signály standardního univerzálního infračerveného dálkového
ovladače televize nebo videa. Robot můžete ovládat dálkovým ovladačem se
systémem RC5! Protokol se může změnit v software, ale poskytována je pouze
implementace standardního protokolu RC5.
◊ Dálkové ovládání se může používat ke komunikaci s více roboty (pomocí přímého
dosahu nebo odrazem od stropu a stěn) nebo pro vysílání telemetrických dat.
• Dva světelné snímače – tj. pro měření intenzity světla a vyhledávání světelného zdroje.
• Dva nárazníkové snímače pro detekci kolize.
• 6 stavových LED – pro zobrazení stavů snímačů a programu.
◊ Pokud je nezbytné, mohou se pro další funkce použít čtyři LED porty.
9
•Dva volné kanály analogově/číslicového převodníku (ADC) pro externí senzorické
systémy (alternativně se mohou použít jako standardní I/O vývody).
• Přesný stabilizátor napětí 5 V.
◊ Maximální napájecí proud: 1,5 A.
◊ Rozsáhlá měděná plocha pro odvod tepla do desky plošných spojů.
◊ Trvalý odběr proudu nesmí překročit 1A. Vyšší proud vyžaduje zvláštní chlazení!
Doporučujeme, aby byla maximální hodnota trvalého odběru proudu pod 800 mA.
• Výměnná pojistka 2,5 A.
• Nízký klidový proud menší než 5 mA (typicky 4 mA a přibližně 17 až 40 mA při používání,
který samozřejmě závisí na zatížení a aktivitě systému (LED, snímače atd.). Tyto hodnoty
zahrnují pouze spotřebu elektronických obvodů a neberou v úvahu motory a rozšiřující
moduly!
• Napájecí zdroj tvořený baterií 6 nabíjecích článků NiMH (nejsou obsaženy v balení!).
◊ Doporučené články Panasonic nebo Sanyo (NiMH 1,2 V, 2500 mAh, HR-3U, velikost
AA HR6) nebo Energizer (NiMH 1,2V, 2500 mAh, NH15-AA).
◊ Provozní doba přibližně 3 až 6 hodin, závisí na způsobu používání a kvalitě/kapacitě
baterie (pokud se příliš často nepoužívají motory, může robot fungovat mnohem déle.
Tento údaj o provozní době je uvedena pro vlastní robotický systém bez rozšiřujících
modulů).
•Připojení externí nabíječky baterie – hlavní spínač napájení se přepíná mezi dvěma
polohami “Nabíjení/Vyp” a “Provoz/Zap”.
◊ Pomocí několika pájecích propojek na DPS je možné robot připojit k externímu
napájecímu zdroji nebo přídavné baterii.
◊ K nabíjení 6 článků NiMH baterie se může použít libovolný nabíječ. Různé externí
nabíječky, které se drasticky liší výkonem a provozními možnostmi, dovedou nabít
baterii během 3 až 14 hodin. K nabíjení robotu je potřeba nabíječka s kulatým
konektorem o průměru 5,5 mm.
• Hlavní deska poskytuje 6 malých rozšiřujících oblastí (a dále 2 velmi drobné políčka na
malých DPS snímačů v přední části robotu) pro další senzorické obvody tj. k implementaci
dalších IR snímačů pro zlepšení detekce překážek. Rozšiřující oblasti se mohou také použít
k montáži mechanických součástí.
•Umožňuje vytvořit velké množství rozšíření!
Dále dodáváme docela velké množství ukázkových programů v jazyku C a rozsáhlou knihovnu
funkcí pro pohodlný vývoj software.
Webové stránky robotu budou brzy nabízet další programy a aktualizaci software určeného pro
robotický systém a rozšiřující moduly. Samozřejmě uvítáme nabídku vašich vlastních programů,
které zařadíme na internet ke sdílení s ostatními uživateli RP6. Knihovna RP6Library a soubory
ukázkových programů jsou šířeny na základě licence Open Source Licence GPL!
10
1.4. Co RP6 dokáže?
No tak – vyjměte obsah krabice!
Software určuje skutečné chování robotu RP6 - co to přesně bude, to záleží jen na vás a vaší
kreativitě naučit robota správně fungovat. Přitažlivost základů robotiky spočívá ve fascinujícím
procesu implementace nových nápadůči optimalizaci a zdokonalování existujících věci!
Samozřejmě můžete začít tím, že jednoduše spustíte a postupně úpravíte připravené ukázkové
programy, které předvádí standardní funkce, ale neomezujte se pouze na to!
Následující seznam zmiňuje pouze několik příkladů dovedností RP6, které můžete dále
rozšiřovat. Existují stovky možností (viz příklady na následující stránce).
Základní provedení robotu RP6 může …:
• … autonomní pohyb v prostoru (to znamená nezávislý, bez dálkového ovládání),
• … vyhýbat překážkám,
• … sledovat světelné zdroje a měřit intenzitu osvětlení,
• … detekovat kolize, blokovat motory, sledovat stav baterie a správně reagovat na podněty,
• … měřit a regulovat rychlost otáčení motorů – prakticky nezávisle na stavu baterie,
hmotnosti atd. (umožňují to enkodéry s vysokým rozlišením),
• … přesun na určenou, otáčení o zadaný úhel a měření ujeté vzdálenosti (podrobnosti viz
kapitola 2),
• … projíždění geometrických obrazců tj. kruhů, polygonů a dalších,
• … výměnu dat s dalšími roboty nebo zařízeními. Povely mohou být přijímány ze
standardního TV/video/HiFi dálkového ovládání a robot budete jednoduše ovládat podobně
jako dálkově ovládané autíčko.
• … přenos senzorických a dalších dat do PC prostřednictvím rozhraní USB,
• … snadné rozšiřování pomocí flexibilního sběrnicového systému!
• … modifikaci podle vlastních návrhů. Stačí prostudovat schéma a osazení DPS na CD! Při
realizaci modifikací dávejte pozor na úplné zvládnutí problematiky! Obvykle je vhodnější
projekt realizovat na rozšiřující desce – zvláště pokud nemáte dostatečnou praxi s pájením
a sestavováním běžných elektronických obvodů.
11
1.5. Záměry a plány aplikace
Robot RP6 byl konstruován tak, aby dobře umožňoval rozšiřování. Pokud RP6 vybavíte dalšími
senzorickými obvody, můžete robot “naučit” některé z následujících dovedností (některé
z následujících úloh jsou docela komplikované a seznam je uspořádán podle složitosti):
• Rozšíření robotu o další ovladače zvyšuje výkon CPU, rozšiřuje paměť nebo jednoduše
přidává další I/O porty a ADC, jak bude probráno v ukázkových programech pro snadné
rozšíření pomocí I2C portu a ADC.
• Výstup senzorických dat a textu na LCD displej.
• Reakce na hluk a generované akustické signály.
• Měření vzdálenosti k překážce pomocí ultrazvukových snímačů, infračervených snímačů
nebo jiných podobných zařízení, které zajišťuje lepší předvídání kolize.
• Sledování černých čar na podlaze.
• Sledování a následování dalších robotů nebo objektů.
• Ovládání robotu z PC pomocí infračervených signálů (k tomu je třeba speciální hardware,
robot bohužel nedokáže spolupracovat se standardním rozhraním IRDA). Alternativně
můžete začít přímo používat bezdrátové VF moduly.
• Ovládání RP6 pomocí PDA nebo Smartphone (v takovém případě doporučujeme zabudovat
tato zařízení přímo do robotu místo používání jako dálkového ovladače, jsou však možné
oběřešení!).
• Připevnění malého robotického ramene k uchopení předmětů.
• Navigace pomocí elektronického kompasu nebo infračervených paprsků (realizované malou
věžičkou s řadou IR LED a polohování do známých směrů) pro určení polohy robotu
a vyhledání zadané polohy.
• Nabízí řadu robotické výbavy včetně kopání do balónu, obslužných mechanismů a nějakých
zvláštních snímačů, které umožňují zařazení do závodních týmů pro soutěže v robotickém
fotbalu!
• … mnoho dalšího, co vás může napadnout!
Nejdříve byste však měli přečíst příručku a seznámit se s robotikou a programováním.
Předchozí seznam nápadů je pouze zlomek možností a základ motivace.
A pokud se vám programování nepodaří na poprvé, hned to nevzdávejte a nevyhazujte z okna:
každý začátek je těžký!
12
2. RP6 podrobně
Tato kapitola popisuje nejdůležitější části hardware ROBOTICKÉHO SYSTÉMU RP6.
Probereme zde elektroniku, mikroprocesor a propojení software a hardware. Pokud již ovládáte
technologii mikropočítače a elektroniky, pravděpodobně tuto kapitolu pouze letmo prohlédnete.
Začátečník by však měl tuto kapitolu pečlivě prostudovat, aby získal základní poznatky o RP6.
Pokud nechcete čekat a raději otestujete robot, přejděte na kapitolu 3, ale k této kapitole se
později vraťte, protože obsahuje řadu užitečných vysvětlení podrobností programování robotu.
A vy přece chcete znát, co se řídí pomocí software a jak vše funguje, že ano?
Nebudeme se nořit do detailů, ale několik témat v této kapitole může být složitější na pochopení
– autor se pokoušel vše vysvětlit co nejlépe.
Pokud chcete podrobně studovat některou problematiku, můžete vyhledat další informace na
webových stránkách http://www.wikipedia.org/, která poskytují dobrou výchozí pozici pro většinu
témat.
Obrázky často řeknou více než slova a proto začneme s přehledným blokovým schématem
RP6. Obrázek ukazuje drasticky zjednodušené schéma elektronické části robotu a vzájemné
propojení:
13
Robot můžeme rozdělit na pět hlavních funkčních jednotek:
• Řídicí systém
• Napájecí zdroj
• Snímače, IR komunikace a displeje (senzorika) – vše komunikuje s okolním světem a měří
fyzikální veličiny
• Systém pohonu
• Rozšiřující systém
2.1. Řídicí systém
Jak vidíte na blokovém schématu, centrální jednotkou robotu je
8-bitový mikrokontrolér ATMEL ATmega32.
Mikrokontrolér je kompletní jednočipový mikropočítač. Tento
mikroprocesor se liší od velkých počítačů (jako je třeba PC) tím,
že poskytuje méně periferií. Malý mikroprocesor samozřejmě
nemůže obsahovat mechaniku normálního hard disku a paměť
RAM o velikosti několika GB. Mikrokontrolér nepotřebuje příliš
velkou paměť. MEGA32 nabízí “pouze” 32 kB (32768 byte) Flash
ROM – který můžeme srovnat s normální “mechanikou hard
disku” nebo nověji s flashdrive. Flash ROM se používá k uložení
všech programových dat. Velikost paměti s libovolným přístupem (RAM) je omezena na 2 kB
(2048 byte) a přitom bude dostate čná pro vaše potřeby. Pro představu srovnání s řadičem
staršího robotu CCRP5 s pouhými 240 byte RAM, která byla celá vyhrazena pro interpret jazyka
Basic.
Ale proboha, jak může mikroprocesor fungovat s tak malou kapacitou paměti? Je to
jednoduché: procesor nikdy nezpracovává velké množství dat jako operační systém Linux nebo
Windows a nedokáže realizovat složité grafické rozhraní nebo podobné úkoly. Zde poběží
pouze jeden program a bude to vás vlastní software!
Toto omezení není žádná nevýhoda, ale jedna ze základních předností mikroprocesorových
systémů ve srovnání s velkými počítači (dále můžeme zmínit spotřebu energie, velikost a cenu)!
Mikroprocesor je navržen pro zpracování úloh ve známých časových intervalech (často se
označuje jako zpracování “v reálném čase”). Obvykle mikroprocesor nesdílí napájení s řadou
dalších mikroprocesorů jako je tomu v běžném PC a programátor se nemusí zabývat určením
časového rozložení speciálního funkčního modulu.
Řídící jednotka RP6 běží na frekvenci 8 MHz, která dovoluje zpracování programu rychlostí
8 milionu instrukcí za sekundu. Mikroprocesor sice umožňuje časování frekvencí až 16 MHz,
ale nižší frekvence se používá kvůli snížení spotřeby systému. Stoj zůstává dostatečně rychlý
pro zpracování všech standardních úloh! Rychlost můžeme opět porovnat se starším
předchůdcem CCRP5 s hodinami 4 MHz, které umožňovaly zpracování pouze 1000
(interpretovaných) instrukcí jazyka Basic během jedné sekundy. Z tohoto důvodu bylo ACS řízení staršího robotu koncipováno s dalším slave řadičem – už nikdy nebudeme potřebovat
tento podružný mikroprocesor! Více procesorů má navíc větší spotřebu energie a rozsáhlejší
rozhraní. Na RP6 je možné přidat rozšiřující řídící modul M32, který obsahuje další MEGA32 časovaný maximálně frekvencí 16 MHz.
14
Mikrokontrolér komunikuje s okolním světem přes 32 I/O vývodů ("vstup/výstupní piny"),
uspořádaných do "portů" po 8 I/O vývodech. Tímto způsobem poskytuje MEGA32 4 "porty":
PORTA až PORTD. Mikroprocesor je schopen číst logické stavy těchto portů a získanou
informaci zpracovat programem. Mikroprocesor bude samozřejmě používat také výstup
logických signálů na portech pro ovládání malých zátěží do maximálního proudu 20 mA
(například LED).
Mikroprocesor dále poskytuje řadu integrovaných hardwarových modulů určených pro speciální
úlohy. Implementace těchto úloh v software může být velmi komplikované nebo nemožné.
Jednou z takových speciálních funkcí je časovač. K dispozici jsou tři časovače na čítání
hodinových period. Časovače jsou naprosto nezávislé na běhu programu. Ve skutečnosti může
mikroprocesor zpracovávat jinou práci, dokud nenastane požadovaný stav čítače.
RP6 používá jeden časovač na generování PWM signálů (PWM = "pulsně šířková modulace")
pro regulaci rychlosti motorů a tak časovač může přijímat příslušné vstupní parametry, které
zvládnou tuto úlohu na pozadí. Generování PWM signálu podrobně probereme v kapitole
“Systém pohonu”.
Další moduly MEGA32 například jsou:
• Sériové rozhraní (UART) pro komunikaci RP6 s PC přes sběrnici USB. Pokud není zapojena
sběrnice USB, může se pomocí tohoto rozhraní připojit další mikroprocesor s USART.
• Modul "TWI" (= "dvou vodičové rozhraní") poskytuje sběrnici I2C pro rozšiřující moduly.
• Analogově-číslicový převodník (ADC) poskytuje 8 vstupních kanálů pro měření napětí s 10-
bitovým rozlišením. RP6 používá ADC ke sledování napětí baterie, snímačů proudu motorů
a intenzitu světla se dvěma fotorezistory.
• Tři vstupy externího přerušení pro generování signálů, které budou přerušovat chod
programu v řídící jednotce a vynutí skok do speciální "obsluhy přerušení". Mikroprocesor
zpracuje obsluhu přerušení a okamžitě se vrátí do normálního programu. Tuto programovou
vychytávku budeme používat pro snímače orometrie. Tento snímač podrobně probereme
později.
Integrované hardwarové moduly nemají vlastní individuální vývody, ale mohou se použít
alternativně místo standardních I/O vývodů. Běžně se tyto speciální funkce volně mapují na I/O
vývody, ale RP6 je téměř všechny vývody standardně nakonfigurovány (protože jsou trvale
připojené k ostatním elektronickým obvodům) a modifikace bude komplikovaná.
MEGA32 nabízí řadu dalších možností, které nemohou být podrobně
popsané v této příručce. Více informací získáte v katalogových listech
jednotlivých výrobců (které můžete najít na RP6 CD-ROM).
15
2.1.1. Bootloader
Ve speciální části paměti mikroprocesoru je umístěn tzv. bootloader. Tento krátký program
zajišťuje nahrávání uživatelských programů do paměti počítače přes sériové rozhraní.
Bootloader komunikuje s programem RP6Loader, který běží na nadřízeném PC. Při takovém
programování není potřeba další hardware. USB rozhraní se může použít ke komunikaci
s mikroprocesorem pomocí textových zpráv a dále pro programování mikroprocesoru.
Používání bootloaderu má však jednu nevýhodu: zabírá 2 kB paměti FLASH a pro vlastní
program zbývá 30 kB volné paměti. Toto omezení nijak neomezuje, protože je dostatek místa i
pro velmi složité programy (v porovnání s robotem ASURO, kde je k dispozici 7 kB volné
paměti)!
2.2. Napájecí zdroj
Robot samozřejmě potřebuje energii. RP6 získává tuto energii v podobě baterie složené ze
šesti akumulátorů. Provozní čas bude velmi záviset na kapacitě baterie, a protože elektronické
systémy budou spotřebovávat relativně malé množství energie bude hlavní spotřeba energie
v motorech, která závisí na zatížení. Dostatečně dlouhou provozní dobu můžete zajistit
oblíbenými bateriemi s kapacitou vyšší než 2500 mAh. Dostatečné budou i baterie s kapacitou
2000 mAh. Velmi kvalitní baterie umožní provozní dobu 3 až 6 hodin, podle zatížení motorů a
kvality nabití. Budete potřebovat 6 kusů baterií, které společně dávají napětí 6 x 1,2 V = 7,2 V.
V blokovém schématu je toto napětí označeno jako "UB" (= "U-baterie", U je standardní
písmeno používané v elektrotechnických vzorcích pro napětí). "UB" je definováno jako
jmenovité napětí, které se může časem měnit. Úplně nabitá NIMH baterie může dodávat až 8,5
V! Při vybíjení baterie se napětí snižuje a může se prudce změnit podle zátěže a kvality článků.
Kritický faktor kvality článků je vnitřní odpor.
Proměnné napětí samozřejmě není vhodné pro senzorická měření. Mnohem důležitější je však
omezený rozsah provozního napětí polovodičových obvodů. Například mikroprocesor se
poškodí při napájecím napětí větším než 5 V. Proto se musí napájecí napětí snížit a stabilizovat
na přesně definovanou hodnotu.
Napájení elektroniky je vyřešeno pomocí integrovaného
stabilizátoru napětí, který je schopen dodávat proud až 1,5 A (viz
obrázek). Při odběru 1,5 A se tento stabilizátor zahřívá, proto je
umístěn na velké měděné ploše DPS Toto chlazení však omezuje
odběr proudu na maximálně 1A po dobu několika sekund. Pro
větší odběry proudu se musí instalovat přídavný chladič. Trvalý
odběr proudu je omezen přibližně na 800 mA. Větší zátěž navíc
rychle vybije baterii.
Při normální zátěži elektronikou bez rozšiřujících modulů nebude
robot odebírat více než 40 mA, který se sníží vyřazením vysílače
IRCOMM. Tato hodnota proudu není žádný problém pro
stabilizátor a tak je možné připojit řadu experimentálních desek.
Rozšíření elektroniky obvykle zvýší odběr proudu o maximálně 50
mA, pokud neobsahuje zátěže jako jsou motory nebo LED.
16
2.3. Senzorika
Většina snímačů byla zmíněna v předchozích kapitolách, ale nyní se na ně víc zaměříme.
V přehledném schématu najdete snímače v krajní modré oblasti “Senzory”. Některé snímače
zasahují do dalších modulů. I když mezi ně patří odometrické enkodéry, snímače proudu a
napětí baterie budou také probrány v této kapitole!
2.3.1. Snímač napětí baterie
Základem tohoto snímače je jednoduchý dělič napětí složený ze dvou rezistorů. Můžeme
předpokládat, že maximální napětí baterie bude 10 V. Šest NiMH článků bude mít zaručeně
menší hodnotu. Referenční napětí ADC, které se při měření porovnává, je nastaveno na 5 V.
Vstup nikdy nesmí překročit napájecí napětí mikroprocesoru 5 V. Z tohoto důvodu se musí
sledované napětí dělit dvěma. Dělič napětí musí zajistit, aby sledované napětí odpovídalo
napěťovému rozsahu převodníku.
AD převodník měří napětí s rozlišením na 10 bitů (10 V se převede na hodnotu v rozsahu 0 až
1023 jednotek), výsledkem je rozlišení napětí 10V/1024 = 9.765625mV. Změřená hodnota 512
jednotek odpovídá hodnotě 5 V a 1023 přibližně 10V. Tuto hodnotu nemůže 6 běžných NiMH
baterií překročit!
Měření není příliš přesné, protože nepoužíváme přesné rezistory. Přesnost se pohybuje
v jednotkách procent. Referenční napětí není přesné a může kolísat podle zatížení napájecího
zdroje. Tato nepřesnost nás neznepokojuje, protože potřebujeme pouze rozpoznat hranici vybití
baterie. Pokud potřebujete přesně určit napětí, musíte pomocí altimetru změřit přesnou hodnotu
napětí a pak upravit hodnoty v software.
Pokud akceptujete tolerance, můžete napětí určit přímo z hodnot AD převodníku: 720 jednotek
zhruba odpovídá 7,2 V; 700 na 7,0 V a 650 na 6,5 V. Konstantní hodnota 560 se může chápat
jako prázdná baterie.
2.3.2. Světelné snímače (LDR)
Malá destička plošných spojů snímače na přední straně robotu
obsahuje dva tak zvané LDR (= "rezistor citlivý na světlo"), které
míří na levou respektive pravou stranu. Mezi dvěma senzory je
černá přepážka, která brání dopadu světla na “špatnou” stranu
systému světelného snímače. Jelikož má snímač napěťový
výstup, tvoří oba světelné snímače společně s pevnými rezistory
napěťové děliče, určující intenzitu osvětlení. V tomto případě se 5
V dělí na hodnotu určenou proměnným rezistorem. Dělicí poměr se mění podle intenzity
dopadajícího světla a poskytuje napětí závislé na světle, které se přivádí na jeden z kanálů
ADC!
Rozdíl napětí mezi oběma snímači se může použít k určení, na které straně robotu je umístěn
jasnější zdroj světla: vlevo, vpravo nebo uprostřed. Vhodný program může sledovat jasnou
svítilnu ve tmavé místnosti nebo navádět robota do nejvíce osvětlené části podlahy.
17
Samozřejmě se můžete pokusit o opak: robot můžete naprogramovat tak, aby se skrýval před
světlem.
Systém světelného snímání můžete zdokonalit montáží jednoho nebo dvou dalších LDR na
boční strany robotu. Výchozí používání pouze dvou snímačů nemusí dobře rozlišit světlo na
přední a zadní straně. Dva kanály AD převodníku jsou stále volné…
2.3.3. Anti kolizní systém (ACS)
Z pohledu software je nejsložitější snímač ACS - “Anti kolizní systém”!
ACS tvoří integrovaný obvod infračerveného (IR) přijímače (viz obrázek)
a dvě IR LED umístěné na levé a pravé straně přední senzorické DPS.
Mikroprocesor přímo ovládá IR LED. Obslužná funkce se může změnit a
upravit přesně podle vašich potřeb! Předchozí model robotu měl
k tomuto účelu speciální řadič a uživatel nemohl modifikovat software
tohoto zařízení.
IR LED vysílají krátké infračervené impulsy modulované na kmitočtu 36
kHz, které může detekovat IR přijímač. Jakmile se IR impulsy odrazí od
předmětu zpět a zachytí je IR přijímač, může mikroprocesor reagovat na
tuto situaci a spustit únikový manévr. Aby se potlačila příliš velká
citlivost, zpozdí ACS rutina detekci událostí dokud systém nepřijme
definovaný počet impulsů během krátké časové periody. Dále ACS
synchronizuje detekci pomocí rutiny pro příjem kódování RC5 a robot nebude reagovat na
signály z televizního dálkového ovladače. Jiné kódy však mohou se systémem ACS interferovat
a robot se může pokusit vyhnout neexistující překážce!
Díky tomu, že má ACS systém umístěnu jednu IR LED na levé a druhou na pravé straně, může
snadno určit, zda se překážka nachází vlevo, vpravo nebo přímo před robotem.
Systém umožňuje změnu intenzity impulsů obou IR LED ve třech úrovních. Ale při nejvyšší
hodnotě proudu nemůže ACS spolehlivě detekovat všechny překážky. To velmi závisí na
odrazových vlastnostech povrchu překážek!
Černý předmět bude samozřejmě IR světlo odrážet méně než bílá překážka a předmět
s reflexními hranami může nasměrovat IR světlo přímo do několika zvláštních směrů. Z těchto
důvodů dosah ACS drasticky závisí na povrchu překážek! Tato závislost musí být považována
za základní nevýhodu všech infračervených senzorických systémů (obzvlášť v této cenové
kategorii).
Robot přesto může bezvadně rozpoznávat a obcházet překážky. Pokud selže ACS detekce,
zůstávají v činnosti nárazníky s dotykovými snímači. A když selžou i dotykové snímače, může
robot pomocí snímače proudu nebo enkodéru zjistit zablokování motoru!
Pokud nebudete spokojeni s tímto senzorickým systémem, můžete na robot namontovat
například nějaké ultrazvukové snímače.
18
2.3.4. Nárazníky
Malá destička osazená dvěma mikrospínači s dlouhými páčkami je umístěná na přední části
robotu. Tato destička chrání IR LED snímače před mechanickým poškozením, pokud robot
nešťastně narazí na překážku. Pomocí mikrospínačů může mikropočítač detekovat kolize,
couvnout nebo zatočit a pak znovu jet dopředu.
Spínače jsou připojeny na porty již používané pro LED. Proto nezabírají volné porty
mikroprocesoru. Toto dvojité využití způsobí, že se LED rozsvítí, jakmile se sepne některý
spínač! Spínače se však stisknou jen občas a aktivace LED nebude rušit.
Destička nárazníků se může odmontovat a příležitostně nahradit například
kopacím/záchytávacím zařízením pro balóny.
2.3.5. Snímače proudu motoru
Každý ze dvou snímačů proudu motoru obsahuje
výkonový rezistor. Ohmův zákon U = R•I říká, že úbytek
napětí na rezistoru je přímo úměrný proudu, který přes něj
protéká!
Aby nebyl úbytek napětí příliš velký, musí se zvolit velmi
malá hodnota odporu. Zde jsme použili 0,1 ohmu.
Při tak nízké hodnotě je úbytek napětí velmi malý (0,1
V při proudu 1 A) a před přivedením na vstup AD
převodníku se musí zesílit. Zesílení se realizuje pomocí
operačního zesilovače. RP6 používá samostatný operační zesilovač pro každý individuální
proudový snímač. Měřicí rozsah proudu je přibližně 1,8 A. Výsledkem tohoto proudu je úbytek
napětí na výkonovém rezistoru 0,18 V a na výstupu operačního zesilovače napětí asi 4 V. To je
maximální výstupní napětí operačního zesilovače napájeného ze zdroje napětí 5 V.
Použité typy výkonových rezistorů mají toleranci hodnoty 10 %, rezistory u operačních
zesilovačů 5 %. Všechny součástky jsou nepřesné, a pokud neprovedete kalibraci, můžete
zjistit odchylku měřené hodnoty až 270 mA! My však potřebujeme pouze zjistit úroveň proudu,
která odpovídá podmínkám kritického zatížení motoru. Robot bude schopen detekovat
blokování/přetížení motoru popřípadě poruchu motoru nebo odometrických snímačů!
Stejnosměrné motory odebírají při větší zátěži (momentu) větší proud. Při zablokovaných
motorech se rapidně zvýší protékající proud. Tento stav se rozpozná v software a spustí se
nouzové odpojení. Pokud by se tak nestalo, budou se motory velmi zahřívat
(a také přetěžovat) a časem dojde k jejich poškození.
Pokud selžou enkodéry – jakýmkoliv způsobem – může systém tento stav také spolehlivě
rozpoznat. Měření rychlosti samozřejmě spadne na nulu. Ale pokud se motor pohání plným
výkonem a proudové snímače detekují pouze malý proudy (které značí, že motor není
zablokován) můžete vyvodit závěr, že je poškozen motor, enkodér nebo obě zařízení. Tento
stav může například nastat, když se v programu zapomenou aktivovat snímače…
19
2.3.6. Enkodéry
36
36
125012
Enkodéry fungují naprosto jinak než dříve probrané
snímače. Tvoří je reflexní optické snímače a kódovací kola
připevněná na jednom převodovém kolu v každé
převodovce. Tato sestava se používá k určení rychlosti
otáčení motorů. Obě kola enkodérů mají 36 segmentů (jak
ukazuje obrázek, jedná se o 18 černých a 18 bílých
políček). Jakmile se převodovky otáčí, pohybují se tyto
segmenty před reflexním snímačem. Bílé segmenty odráží
IR světlo, zatímco černé budou odrážet jen zanedbatelné
množství světla. Stejně jako u ostatních snímačů produkují
enkodéry analogový signál, který ale bude interpretován
číslicově. Nejprve se signál zesílí a následně se
Schmitovým klopným obvodem tvaruje na pravoúhlý signál.
Náběžná i sestupná hrana signálu (změny z 5 V na 0 V a
z 0 V na 5 V) spustí přerušení tato událost se započítá programem. Tímto způsobem se může
měřit vzdálenost a společně s časovačem se může vypočítat rychlost.
Určení rychlosti je hlavní aplikace enkodérů. Zpětná vazba z enkodérů je jediný spolehlivý
způsob regulace rychlosti motoru. V neřízeném systému by mohla rychlost motoru záviset na
napětí baterie, zatíženi a parametrech motoru.
Vysoké rozlišení enkodérů umožňuje spolehlivou
regulaci i při docela malých rychlostech.
V každém z obou převodových složení má
střední převodový systém 50 zubů a malé vnitřní
převodové kolo 12 zubů (viz obrázek). Kódovací
kolečka jsou umístěna na převodovém kole, které
je umístěno za pastorkem motoru, tak lze
vypočítat:
50
17
13
17;
62536
==•
13
Přestože je zde 36 segmentů musí být výsledek
pro celou otáčku kola celé číslo bez zlomkové části. Enkodéry generují 625 hran na jednu
otáčku a každá hrana představuje jeden segment.
Rozměr kola včetně gumového pásu je kolem 50 mm a teoreticky získáme, při obvodu cca 157
mm, krok 0,2512 mm na každou započítanou jednotku enkodéru. Sledování dráhy však může
být deformováno díky tlaku nebo nedostatečně poddajným povrchem. Proto můžeme uvažovat
maximálně 0,25 mm na každou započítanou jednotku. Často bude lepší aplikovat 0,24 mm
nebo 0,23 mm. Kalibrační hodnoty se mohou určit pohonem na přesně definovanou vzdálenost,
jak je popsáno v dodatku. Měření není příliš přesné díky prokluzu nebo podobným vlivům. Při
přímé jízdě vpřed bude mít enkodér minimální chybu přesnosti, ale při zatáčení robotu budou
růst odchylky výsledku. Největší odchylku způsobí speciálně otáčení robotu na místě.
Odchylky mohou být zjištěny a opraveny testováním, zkoušením a chybami. Je to nevýhoda
všech pásových pohonů – v našem robotu i mnohem dražších systémech. V porovnání s roboty
se standardní diferenciální pohonnou jednotkou se dvěma koly a přídavným podpůrným
kolečkem umožňují pásové systémy lepší chování při jízdě v různorodém prostředí. Pásový
pohon bude snadno překonávat malé překážky, šikmé plochy a hrbolaté podlahy. Na každém
povrchu jsou extrémně užitečné enkodéry, protože umožňují regulaci rychlosti při všemožném
zatížení, kompletně nezávislé na kvalitě povrchu, zátěži motoru a napětí baterie.
20
Pokud budeme uvažovat hodnotu 0,25 mm na segment, pak při rychlosti 50 segmentů za
sekundu dostaneme rychlost 1,25 cm/s. Tato rychlost je minimální, která se může spolehlivě
regulovat (při implementaci nejnovější verze standardního software). Přesná hodnota se může
u jednotlivých robotů lišit. Rychlost 1200 segmentů za sekundu odpovídá maximální dosažitelné
rychlosti 30 cm/s (rozlišení 0,25 mm, kdežto 0,23 mm koresponduje s 27,6 cm/s). Maximální
rychlost závisí na stavu nabití baterie a při běžných bateriích nelze 30 cm/s dosáhnout na delší
dobu. Z tohoto důvodu je knihovní funkce omezena na 1000 segmentů/sekundu, která udržuje
konstantní maximální rychlost během delší doby vybíjení baterie. Dále se při nižších rychlostech
prodlužuje životnost převodovek a motorů!
Jakmile robot napočítá 4000 segmentů, urazí se vzdálenost přibližně jeden metr. Jak již bylo
vysvětleno, tato specifikace je platná pro rozlišení přesně 0,25 mm – bez správné kalibrace
musíme uvažovat větší či menší odchylky. Pokud vás nezajímá přesný výpočet vzdálenosti,
nemusíte kalibrovat enkodéry a jednoduše uvažovat hodnotu 0,25 mm nebo ještě lépe 0,24
mm!
Dobré navigační systémy nespoléhají při řízení vzdálenosti a úhlovém natočení zcela na
enkodérech, ale používá externí pevné značky, jako jsou infračervené majáky a přesné
elektronické kompasy. Používání externích systémů je obvykle dobrý nápad pro častou korekci
odchylek orometrie.
2.4. Pohonný systém
Pohonný systém RP6 se skládá ze dvou stejnosměrných motorů s přídavnou převodovkou pro
pohon pásových kol (viz předchozí obrázek). Motory mohou spotřebovat docela velké množství
energie a mikroprocesor nemůže přímo dodávat tak velké proudy.
Z tohoto důvodu potřebujeme výkonný budič
motoru. Pro řízení motorů v robotu RP6
používáme dva tak zvané H-můstky. Schéma na
pravé straně ukazuje základní princip budiče.
Můžete zde také vidět, že spínače a motor
společně tvoří písmeno “H”.
Nyní uvažujeme všechny spínače jako otevřené,
Pokud sepneme spínače S1 a S4 (červené) bude
se na motor přivádět napětí a ten se začne otáčet,
řekněme doprava. Pokud nyní znovu otevřeme
spínače S1 a S4 a následně sepneme spínače S2
a S3 (zelené), přivede se napětí s opačnou
polaritou a motor se začne otáčet opačným
směrem (doleva). Samozřejmě musíme dávat
pozor na to, aby se současně neseply spínače S1 a S2 nebo S3 a S4. Každá tato kombinace
může mít za výsledek zkrat obvodu a může poškodit spínače.
21
Konstrukce RP6 samozřejmě nebude používat mechanické spínače, ale tranzistory MOSFET,
které vedou, pokud je na jejich hradlo přivedeno vhodné napětí. MOSFET může spínat velkou
rychlostí v řádu několika kHz.
Nyní jsme nalezli způsob jak měnit směr otáčení motoru, A jak můžeme realizovat zrychlování
nebo zpomalování motoru? Stejnosměrný motor se bude otáčet rychleji, když se přivede vyšší
napětí a rychlost motoru můžeme regulovat zvyšováním nebo snižováním napětí. Podívejme se
znovu podrobně na H-můstek.
Obrázek ukazuje, co můžeme dělat,
Generujeme pravoúhlý průběh s pevným
kmitočtem a zavedeme pulsně šířkovou
modulaci, která mění střídu. “Střída” znamená
poměr mezi vysokou a nízkou periodou
signálu.
Nyní bude motor dostávat menší střední
hodnotu stejnosměrného napětí, která
odpovídá střídě.
Na grafu je toto chování vyznačeno červenou
čarou (Ug) a červenou plochou pod čarou.
Pokud je například na řídící obvod motoru
přivedeno napětí baterie 7 V a motor se
reguluje PWM signálem se střídou 50 %, bude
průměrná hodnota stejnosměrného napětí 3,5
V. Tento výklad přesně neodpovídá podmínkách reálného elektronického obvodu, ale je dobrou
vizualizací principu.
Robot RP6 výhodně používá převodovku s velkým redukčním poměrem (~ 1:72). Díky tomu
dostává robot skutečně silný pohon, který umožňuje, ve srovnáním s malými roboty typu
ASURO, převoz větších zátěží. Při zvyšování hmotnosti se však musí počítat s větším
zatížením napájecího zdroje, jehož důsledkem se zkrátí doba vybíjení baterie…
V porovnání s dálkově ovládaným závodním autem můžeme se domnívat, že je robot RP6
pomalé vozítko – což je naprostá pravda – ale robot byl záměrně konstruován pro pomalou
jízdu. Robot je postaven pro ovládání mikroprocesorem a pokud programátor vytvoří chyby
v software, může být nevýhodné, kdyby robot narazil do zdi rychlostí třeba 10 m/s. Díky volnější
rychlosti se robot nedostane do problémů, protože pomalejší pohyb poskytne dostatek času pro
reakci snímačů na překážky. Robot je navíc výkonnější a získá přesnější regulaci rychlosti.
Menší rychlost umožňuje pomalý pohyb robotu RP6 konstantní rychlostí.
2.5. Rozšiřující systém
Jednou z nejužitečnějších vlastností RP6 je rozšiřující
systém, který umožňuje snadné přidávání dalších komponent
na základ robotu. Základní platforma RP6 obsahuje dostatek
snímačů. Stávající počet snímačů přesahuje běžné vybavení
srovnatelných robotů v dané cenové kategorii, ale robot se
po přidání několika senzorických modulů stane mnohem
zajímavější. Systém ACS pak bude například pouze
detekovat existenci překážek před robotem. Použití
ultrazvukových snímačů nebo dokonalejších IR snímačů
můžete být schopni určit vzdálenost a zahájit sofistikované
manévrování při obcházení překážek.
22
Vzdálené senzorické obvody může řídit další mikroprocesor, který je užitečný pro zpracování
dalších úloh, např. RP6 CONTROL M32 poskytuje další mikroprocesor ATmega32.
Rozšiřovací systém samozřejmě umožňuje připojení několika rozšiřujících modulů (viz obrázek),
které používají minimální počet signálových vodičů a přitom poskytuje dostatečně velkou
komunikační rychlost.
2.5.1. Sběrnice I2C
Tyto požadavky splňuje sběrnice I2C. Název tohoto standardu vnitřní sběrnice integrovaných
obvodů je odvozen z I kvadrát C. Někdy se místo “I2C” píše “I2C”, protože symbol druhé
mocniny “2” není možné vložit do názvu proměnných a podobně. Sběrnice potřebuje pouze dva
signálové vodiče a může se na ni připojit 127 dílčích zařízení komunikujících rychlostí 400
kbit/s.
Velmi populární sběrnici I2C, navržená firmou Philips Semiconductors v průběhu osmdesátých a
devadesátých let minulého století, je aplikována ve velkém počtu elektronických přístrojů,
například video rekordérech, televizních přijímačích, ale také v průmyslových systémech. Řada
moderních PC a notebooků používá variantu této sběrnice, která se nazývá SMBus, pro
regulaci ventilace a teploty vnitřních zařízení. Sběrnicový systém I2C používá také velký počet
robotů. Z tohoto důvodu je sběrnicí I2C vybavena řada senzorických modulů jako jsou
ultrazvukové snímače, elektronické kompasy, teplotní čidla a podobná zařízení dostupná na
trhu.
Sběrnice I2C má master/slave orientaci. Jeden nebo více zařízení typu master řídí komunikaci
s až 127 zařízeními typu slave. I když tato sběrnice dokáže zpracovat multi masterovou
komunikaci, budeme popisovat sběrnicovou komunikaci s jediným zařízením typu master.
Topologie multi-master je jen složitější variantou.
Dvě nezbytné datové linky se nazývají SDA a SCL. SDA se může číst jako "sériová data" a SCL
se nazývá "sériové hodiny" – které již vysvětlují používání datového a hodinového signálového
vodiče. SDA se používá jako obousměrný signál a proto jsou schopna přenášet data zařízení
typu master i slave. SCL je zcela ovládán zařízením typu master.
Datové bity se vždy přenášejí synchronně s hodinovým signálem odvozeným v zařízení typu
master. Úroveň signálu SDA se může měnit pouze, pokud je signál SCL v low (s výjimkou
podmínky START a STOP, viz dále). Přenosová rychlost se může, kdykoliv během přenosu dat,
měnit mezi 0 a 400 kbit/s.
Předchozí obrázky ukazují obvyklé přenosové protokoly. Na prvním je přenos z masteru do
zařízení slave. Bílá políčka odkazují na přenos dat z master do slave a tmavá políčka
představují odezvu od zařízení typu slave.
Každý přenos začíná inicializační podmínkou START a musí být ukončen podmínkou STOP.
Podmínka START se vytvoří pokaždé, když se při vysoké úrovni SCL přitáhne linka SDA
z vysoké do nízké úrovně. Opačná podoba signálových úrovní se aplikuje při podmínce STOP:
když se při vysoké úrovni SCL vytáhne linka SDA z nízké do vysoké úrovně dostaneme
podmínku STOP.
23
Bezprostředně po podmínce START vyšleme 7 bitů dlouhou slave adresu, která adresuje
zařízení, následovanou bitem, který definuje, zda se budou zapisovat nebo číst data. Zařízení
typu slave odpoví vysláním ACK ("Acknowledge = potvrzení"). Následovat může libovolný počet
datových byte a každý jednotlivě přijatý byte bude potvrzen od slave (pomocí signálu ACK).
Komunikace se ukončí podmínkou STOP.
Tento popis je pouze velmi stručné vysvětlení sběrnice I2C. Hloubaví čtenáři si mohou vyhledat
další informace ve specifikaci sběrnice I2C od firmy Philips. Mnoho informací obsahuje také
dokumentace mikroprocesoru ATmega32.
Ukázkové programy názorně ukazují, jak se používá hardware sběrnice. Knihovna RP6 již
nabízí funkce pro ovládání sběrnice I2C. Nebudeme zabíhat do detailů protokolu, ale je užitečné
porozumět základní funkci komunikace po sběrnici.
2.5.2. Rozšiřující konektory
Hlavní deska poskytuje čtyři rozšiřující konektory.
Dva jsou označeny “XBUS1” respektive “XBUS2”.
“XBUS” je zkratka “eXpansion BUS = rozšiřující
sběrnice”. “XBUS1” a “XBUS2” jsou kompletně
propojené a na hlavní desce jsou uspořádány
symetricky. Z tohoto důvodu budete moci umístit
rozšiřující moduly na přední i zadní stranu robotu.
Každý rozšiřující modul poskytuje na jedné straně
modulu dva konektory XBUS. K vzájemnému
propojení modulů a hlavní desky slouží 14 žilový plochý kabel. K propojení nabízí každý
rozšiřující modul dva shodné propojovací konektory. Vnější konektor se použije k propojení
směrem dolů, kdežto vnitřní konektor slouží k propojení směrem nahoru. Tento způsob
umožňuje (teoreticky) skládat na sebe řadu modulů (viz obrázek, který ukazuje tři rozšiřující
moduly s jednotlivými obvody sestavenými na univerzální desce RP6).
Konektory XBUS poskytují napájecí napětí, dříve popsanou sběrnici I2C, reset hlavního
mikroprocesoru a přerušovací signály.
Napájecí zdroj tvoří dvě napětí: nejprve je to stabilizovaných 5 V ze stabilizátoru, ale také napětí
přímo z baterie. Napětí se bude během zatížení měnit – obvykle od 5,5 V (vybité baterie) až do
přibližně 8,5 V (nové nabité baterie – tato hodnota se u jednotlivých výrobců liší). Hodnota
napětí se však může překročit tyto limity podle zátěže, typu a stavu nabití baterie.
Signál master reset je důležitý pro resetování všech mikroprocesorových obvodů, když se
stiskne tlačítko Start/Stop nebo při programování. Programování pomocí bootloaderu
v mikroprocesoru spustí uživatelský program low impulsem (high-low-high) na lince SDA. Tímto
způsobem se spustí všechny programy na mikroprocesorech (AVR) současně po stisknutí a
uvolnění tlačítka Start/Stop nebo start programu bootloaderem … (bootloader negeneruje
pouze low impuls pro start, ale také úplné všeobecné volání na sběrnici I2C s datovým byte =
0).
24
Několik modulů může využívat linky přerušení pro signalizaci příchodu nových dat nebo
dokončení práce a očekávání nových povelů od hlavního procesoru. Tyto linky nejsou určeny
pro vynucené opakované dotazování některých speciálních rozšiřovacích modulů na nová data.
Tato metoda je samozřejmě možná, ale alternativní návrh s dalšími linkami přerušení budou
obvykle omezovat provoz sběrnice a zatěžovat CPU. Přestože je počet linek přerušení
omezený na 3 signály a jednu volnou linku vyhrazenou pro uživatelské
signály, můžeme přiřadit jednu linku několika modulům (například
všem ultrazvukovým snímačům) a oslovovat všechny moduly na
základě jediné signalizace přerušení.
Další dva rozšiřující konektory na hlavní desce označené “USRBUS1”
a “USRBUS2” nejsou vzájemně propojené. Všechny linky jsou
přivedeny na pájecí plošky všech rozšiřujících modulů a na tyto plošky
můžete aplikovat svoje vlastní signály.
“USRBUS” je zkratka “uživatelské-sběrnice”. Tento 14 vývodový
rozšiřující konektor můžete použít pro cokoliv chcete – pro vlastní
sběrnicový systém, další napájecí vodiče (ale musíte být opatrní,
protože spoje dovolují maximální proud pouze 500 mA) nebo pro
cokoliv jiného. Uvedeme příklad: jste schopni propojit dva rozšiřující
moduly bez možnosti připojení k dalšímu modulu. To může být
užitečné pro řadu složitých obvodů nebo snímačů, které se namohou
umístit na jediný rozšiřující modul. Tato metoda bude čistější pro
vlastní zapojení.
Samozřejmě nemůžete přidávat libovolný počet rozšiřovacích modulů
– pokud nechcete přetížit vozidlo, můžete na přední nebo zadní stranu
robotu navršit 6 modulů. Příliš velký počet modulů způsobí také problémy s přetěžování
bateriového zdroje. Běžným pravidlem je připojení maximálně 8 modulů na RP6: 4 na přední
stranu a 4 na zadní stranu.
Obrázek ukazuje zapojení obou rozšiřujících konektorů. Na hlavní
desce je špička 1 vždy umístěna blízko nápisu XBUS1 respektive
XBUS2. Alternativně je špička označena “1” na značce umístění
konektoru.
+UB je napětí baterie, VDD je rozvod +5V, GND označuje “minus”
neboli “zem” (GND = uzemnění), MRESET označuje signál
Master Reset, INTx jsou linky přerušení, SCL jsou hodiny a SDA
datová linka sběrnice I2C.
Jediné, co musíte udělat, je zapájení konektoru USRBUS.
Důležité upozornění: nepřetěžujte napájecí vodiče VDD a +UB! Tyto vodiče mohou
dodávat maximální proud 1 A (aplikovaný na obě špičky DOHROMADY. To znamená
spojení špiček 4+6 (+UB) a 3+5 (VDD) na konektorech!
25
3. Nastavení hardware a software
Dříve než začnete nastavovat robot RP6 nebo příslušenství, přečtěte si
pozorně následující bezpečnostní pokyny. Zvláště to platí, pokud budou
RP6 později používat děti!
Tuto kapitolu čtěte obzvlášť pozorně!
3.1. Bezpečnostní pokyny
Díky otevřené architektuře RP6, existuje na konstrukci několik ostrých hran. Proto by robot
neměly používat děti mladší 8 let! Hlídejte, prosím děti, když se v místnosti pohybuje RP6
a informujte děti o možném nebezpečí!
Neprovozujte robot v místech, kde se volně pohybují zvířata, například křečci, protože by je
mohl RP6 poranit. Naopak velká zvířata jako psi a kočky mohou poškodit robot…
Pásový systém pohonu má nějaké nebezpečné části mezi pásy a koly, kam může pás vtáhnout prsty. Tyto oblasti jsou z velké části zakryté koly, přesto však dávejte pozor. Hlavně
nestrkejte prsty mezi točící se kolo a pásy. Motory jsou skutečně výkonné a mohou vás snadno
zranit. Prsty nestrkejte ani mezi pásy a desku plošných spojů!
POZOR: v případě, že používáte standardní software, mohou motory automaticky zvyšovat
výkon! Podle způsobu naprogramování, mohou motory začít fungovat kdykoliv a nečekaně
reagovat pohybem!
Robot nikdy neprovozujte bez dozoru!
3.1.1. Elektrostatické výboje a zkraty
Povrch hlavní desky plošných spojů, rozhraní USB a všech rozšiřujících modulů není nijak
chráněn a odhaluje velké množství nechráněných součástek a vodivých cest. Nezpůsobte,
prosím, zkrat tím, že na povrch robotu položíte kovové předměty nebo nástroje!
Napájecí napětí se mění ve velkém rozsahu, je však pro člověka bezpečné. Řadu součástek
může poškodit elektrostatický výboj (ESD) a proto se jich nedotýkejte, pokud to není nezbytné!
Speciálně v kombinaci se syntetickými textiliemi a suchým vzduchem se může vytvořit
elektrostatický výboj při pohybu člověka. Také robot může získat náboj pohybem po některém
povrchu podlahy. Při dotyku na kovové části se může náboj vybít přes tělo a vytvořit malé jiskry.
Při manipulaci s robotem mohou tyto výboje poškodit nebo zničit elektronické součástky.
Poškození vlivem ESD se vyhnete tím, že před manipulací s elektronickými obvody vybijete
náboj z těla dotykem na velké uzemněné předměty (například kovová skříň PC, vodovodní
potrubí nebo ústřední topení). Dotyk s uzemněným předmětem vybije elektrostatický náboj
z těla. Neřízené vybití robotu při dotyku s uzemněnou překážkou nepoškodí robot, ale může
porušit program nebo způsobit neočekávané chování.
26
Všechny elektrické linky vedoucí do systému musí být zapojeny, před přivedením napájecího
napětí.
Neočekávané zapojení nebo odpojení konektorů, kabelů nebo modulu do spuštěného robotu
může poškodit nebo zničit součástky elektronického systému a další díly.
3.1.2. Prostředí robotu
Neprovozujte robot na horní desce stolu nebo plochách s velkým převýšením, které mohou
způsobit pád robotu na zem. Seznamte se, prosím, s možnostmi šplhání pásového vozidla!
Robot může snadno přejet přes malé překážky a odtlačit lehké předměty. Z provozní oblasti
robota odstraňte všechny předměty, které obsahují tekutiny tj. pohárky, sklenice a vázy.
Šasi robotu bude chránit mechanické díly před řadou účinků okolního prostředí, ale není
vodotěsné a prachotěsné. Elektronika není chráněna vůbec. Robot byste měli provozovat
pouze v čistém a suchém domácím prostředí. Nečistota, malé mechanické drobky a vlhkost
mohou poškodit nebo zničit mechanické a elektronické části robotu. Provozní teplota je
omezena na rozsah od 0°C do 40°C.
Provoz vnitřních stejnosměrných motorů generuje drobné jiskření. Robot se nesmí používat
v prostředí s nebezpečím požáru nebo výbuchu (tekuté, plynné nebo prašné).
Pokud se robot nepoužívá delší dobu, neměl by se skladovat na místě s vyšší vlhkostí. Také,
prosím, vyjměte baterie, aby nedošlo k poškození vytékajícím elektrolytem.
3.1.3. Napájecí napětí
Robot byl konstruován na napájení ze zdroje s napětím 7,2 V, který tvoří 6 nabíjecích NiMH
článků. Maximální napětí zdroje je 10 V a nesmí být nikdy překročeno. Používejte pouze
nabíjecí články s platnou bezpečnostní certifikací pro nabíjení.
Jako náhradu můžete robot provozovat se šesti kvalitními alkalickými bateriemi. Normální
baterie se však velmi rychle vybijí, důsledkem je dražší provoz a zatěžování životního prostředí.
Pokud je to možné, používejte vždy jen nabíjecí články. Nabíjecí články dodávají větší
maximální proud a mohou se snadno nabíjet uvnitř robotu!
Dodržujte, prosím, bezpečnostní a provozní podmínky pro baterie uvedené v dodatku!
Modifikace robotu by měli provádět pouze zkušení uživatelé, kteří úplně ovládají
problematiku. Nevhodná modifikace může poškodit robot nebo zranit obsluhu (například
přehřívání součástek může způsobit požár bytu…).
27
3.2. Nastavení software
Následuje nastavení software. Pro všechny následující kapitoly je nezbytná
správná instalace software.
Při instalaci musíte mít přístupová práva administrátora, přihlaste se proto
jako administrátor počítačového systému.
Doporučujeme nejprve přečíst celou kapitolu a pak procházet jednotlivé
pokyny krok za krokem.
Musíme předpokládat, že máte základní znalosti pro práci s počítači, které používají operační
systémy Windows nebo Linux a standardní softwarové balíčky jako je souborový manažer,
prohlížeč webových stránek, komprimační programy (WinZip, WinRAR, unzip atd.) a adekvátní
Linux-Shell! Pokud neovládáte práci s počítačem, měli byste se před používáním RP6,
seznámit se základními znalostmi tohoto oboru. Tato příručka nemůže poskytnout úvodní kurz
používání osobního počítače a na toto problematiku se text příručky nezaměřuje. Tato příručka
bude popisovat robotický systém RP6, programování RP6 a specializovaný systémový
software.
3.2.1. CD-ROM RP6
Pravděpodobně jste již CD-ROM RP6 vložili do mechaniky CD-ROM ve vašem PC – pokud ne,
vložte CD nyní. V systému by se měla spustit akce automatického spuštění a v okně
prohledávače by se měla objevit nabídka. Pokud ne, můžete ve webovém prohlížeči např.
Firefox otevřít soubor "start.htm" umístěný v hlavním adresáři CD. Pokud PC nedisponuje
moderním prohlížečem, můžete najít instalační balíček Firefox ve složce CD:
<CD-ROM-Drive>:\Software\Firefox
Měli byste používat poslední verzi Firefox 1.x nebo Internet Explorer 6.
Zvolte váš národní jazyk a CD menu vám nabídne řadu užitečných informací a software. Mimo
tuto příručku (kterou můžete stáhnout z našich domácích stránek) si můžete prohlédnout
například katalogových součástek použitých v robotu. Nabídka označená “software” poskytuje
přístup ke všem softwarovým nástrojům, ovladač USB a ukázkové programy včetně zdrojových
textů pro RP6.
Podle bezpečnostního nastavení vašeho webového prohlížeče můžete spustit instalační balíčky
přímo z CD. Pokud to nastavení prohlížeče neumožňuje, nepokoušejte se instalaci dokončit.
Zkopírujte soubory na pevný disk a instalaci proveďte z pevného disku PC. Podrobnosti tohoto
postupu najdete na softwarové stránce CD nabídky. Alternativně můžete prozkoumat kořenový
adresář CD souborovým manažerem a spustit instalaci přímo z CD. Názvy adresářů můžete
vybrat podle názvu příslušného softwarového balíčku a operačního systému.
28
3.2.2. WinAVR pro Windows
Nejdříve nainstalujete WinAVR. WinAVR je však – jak již napovídá název – dostupný jen pro
Windows.
Uživatelé Linuxu mohou tuto část přeskočit.
WinAVR (vyslovuje se “whenever”) je balíček užitečných a nezbytných nástrojů pro vývoj
software pro mikroprocesory AVR v programovacím jazyce C. Více informací o samotném GCC
pro cílovou platformu AVR (který se nazývá "AVR-GCC") bude následovat později. Prostředí
WinAVR také poskytuje komfortní editor zdrojových textů, nazvaný "Programmers Notepad 2",
který je vhodný i pro vývoj software pro RP6. WinAVR má vnitřní projektové uspořádání a
programový balíček je volně dostupný na internetu. Nové verze a další informace můžete najít
na oficiálních webových stránkách projektu:
http://winavr.sourceforge.net/
Teprve nedávno zahájila firma ATMEL oficiální podporu projektu a AVRGCC se nyní může
integrovat do jejich integrovaného vývojového prostředí AVRStudio. Editor Programmers
Notepad 2 je pro vaše vlastní projekty mnohem výhodnější, proto zde nebudeme popisovat
prostředí AVRStudio. Přesto můžete při vývoji programů pro RP6 používat i AVRStudio.
Instalaci WinAVR můžete najít na CD:
<CD-ROM-Drive>:\Software\AVR-GCC\Windows\WinAVR\
Instalace WinAVR je velmi jednoduchá a samo vysvětlující – obvykle nemusíte měnit nastavení
– vždy jen kliknete pokračovat. Pokud budete mít problémy se spuštění nejnovější verze
WinAVR, jsou na CD k dispozici také starší verze tohoto programu. Pokud se objeví nějaké
problémy se standardní verzí programu, je zde také složka pro Win x64.
3.2.3. AVR-GCC, avr-libc a avr-binutils pro Linux
Uživatelé Windows mohou tuto část přeskočit.
Instalace avr-gcc v prostředí Linux může být o něco komplikovanější. Několik distribucí již
poskytuje potřebnou podporu, ale programové balíčky často obsahují nepodporované verze bez
nezbytných složek.
Pravděpodobně budete muset kompilovat a instalovat nejnovější verze.
Nemůžeme zmiňovat detaily všech známých rozdílných variant distribucí operačního systému
Linux jako jsou SuSE, Ubuntu, RedHat/Fedora, Debian, Gentoo, Slackware, Mandriva atd. a
jejich odlišnosti. Seznámíme vás pouze s obecnou instalací.
Platí to také pro všechny ostatní Linux témata uvedená v této kapitole!
Pro specifické nastavení systému nemusí být následující seznámení automaticky dostačující.
Často budete muset hledat pomoc pomocí hesla "<LinuxDistribution> avr gcc" a modifikací
fráze v tomto řetězci. Je to také dobrý postup pro všechny další potíže, které se mohou objevit
v operačním systému Linux. Pokud se při instalaci avr-gcc vyskytnou nějaké potíže, můžete se
pokusit najít řešení návštěvou našeho fóra nebo řady dalších diskusí věnovaných systému
Linux.
29
Nejdříve musíte odinstalovat předchozí verze avr-gcc – zpravidla již nepodporované – totéž
platí pro nástroje avr-binutils a avr-libc. Odinstalování spustíte z nástroje správy souborů,
vyhledáním “avr” a odstraněním programového balíčku ze systému. Pokud nástroj najde
příslušné objekty, spustí “avr-gcc”.
Snadno můžete zkontrolovat, zda je avr-gcc instalován či ne. Pokud existuje, můžete zjistit
umístění programu pomocí následujícího příkazového řádku:
> which avr-gcc
Pokud systém reaguje názvem adresáře, bude pravděpodobně ve vašem systému již existovat
nějaká verze avr-gcc. V takovém případě zkontrolujte verzi:
> avr-gcc --version
Pokud je číslo verze nižší než 3.4.6, pak ji definitivně odinstalujte. Pokud je verze mezi 3.4.6 a
4.1.0 můžete ji vyzkoušet kompilací programů (viz následující kapitola). Pokud kompilace selže,
odinstalujte starší verze a instalujte avr-gcc verzi z CD. Následující kapitola se opírá o
nejnovější verzi 4.1.1 (uvolněnou v březnu 2007), která obshuje nějaké důležité záplaty aby se
shodovala s WinAVR.
Pozor: před zahájením kompilace a instalací zkontrolujte možnosti standardního vývojového
balíku pro Linux tj. GCC, make, binutils, libc atd. Použijte manažer distribučního balíku. Každá
distribuce systému Linux by měla na instalačním CD poskytovat potřebnou podporu.
Alternativně můžete poslední verzi získat přes internet.
Dávejte pozor, aby byl nainstalován program “texinfo”. Pokud program chybí, musíte ho vložit
před instalací – jinak instalační proces selže.
Pokud dokončíte přípravy, můžete zahájit aktuální instalaci.
Můžete si vybrat ze dvou možností: buď ruční kompilaci a instalaci všech balíčků, nebo můžete
použít jednoduchý skript automatické instalace.
Doporučujeme, aby jste se nejprve pokusili spustit skrip a ruční istalaci použít pouze když se
objeví problémy.
Pozor: Zkontrolujte, prosím, zda je na disku dostatek místa. Budete potřebovat více než 400 MB
volného prostoru. Více než 300 MB těchto dat je potřeba pouze dočasně pro kompilaci a
můžete je později odstranit.
Řada instalací požaduje přesné umístění adresářů a doporučujeme přihlášení kořenového
adresáře “su” nebo alternativně spustit kritické úlohy s parametrem “sudo” (jak je to obvyklé u
distribuce Ubuntu) nebo příslušným příkazem. Instalační skript mkdir v adresářích /usr/local/ a
make file vytvoří při instalaci správnou strukturu adresářů.
Dávejte pozor na SPRÁVNÉ psaní následujících příkazů. Všechny symboly jsou důležité a
některé příkazy se mohou zablokovat –tyto řádky přepisujte správně, aby neobsahovaly chyby
(samozřejmě můžete nahradit řetězec <CD-ROM-drive> názvem vaší mechaniky CD-ROM).
30
Důležité instalační soubory pro avr-gcc, avr-libc a binutils můžete najít v adresáři:
<CD-ROM-Drive>:\Software\avr-gcc\Linux
Začněte kopírováním všech instalačních souborů do adresáře na pevném disku – to platí pro
obě metody instalace. V tomto případě použijeme domácí adresář (standardní zkratka
domácího adresáře je znak vlnovka: “~”).
> mkdir ~/RP6
> cd <CD-ROM-Laufwerk>/Software/avr-gcc/Linux
> cp * ~/RP6
Po dokončení instalace se mohou tyto soubory odstranit, aby se ušetřilo místo na disku.
3.2.3.1. Skript automatické instalace
Spustitelný skript, který používá chmod, můžete vytvořit následovně:
> cd ~/RP6
> chmod -x avrgcc_build_and_install.sh
> ./avrgcc_build_and_install.sh
Můžete reagovat odpovědí “y”, když budete chtít instalovat s touto konfigurací.
POZOR: Zpracování kompilace a instalace bude někdy záviset na výkonu počítačového
systému (tj. asi 15 minut při dvojitém jádru s taktem 2 GHz, notebook – pomalejší systémy
mohou potřebovat mnohem větší dobu).
Skript také vytvoří několik adresářů – ty jsou označeny v adresáři .diff-files.
Při dokončení zpracování můžete vidět následující zprávy:
(./avrgcc_build_and_install.sh)
(./avrgcc_build_and_install.sh) dokončení instalace nástrojů avr GNU
(./avrgcc_build_and_install.sh) přidání /usr/local/avr/bin do adresáře
avr GNU nástrojů
(./avrgcc_build_and_install.sh) můžete chtít spustit následující
úsporu místa na disku:
(./avrgcc_build_and_install.sh)
(./avrgcc_build_and_install.sh) rm -rf /usr/local/avr/source
/usr/local/avr/build
Pak můžete zpracovat dopuručený příkaz:
rm -rf /usr/local/avr/source /usr/local/avr/build
Tento příkaz zruší dočasné soubory, které už nebudete nikdy potřebovat.
Nyní můžete provést následující krok a nastavit adresář pro proměnné prostředí avr-tools.
Pokud skript skončí nějakou chybovou zprávou, přečtěte si chybové zprávy pozorně (a
posouvejte po obrazovce) – mohou chybět nějaké programy, které se nenainstalovaly
v předchozím kroku (tj. dříve zmíněný program texinfo).
Před zpracováním chybové zprávy, vám můžeme poradit zrušení vygenerovaných souborů ve
standardním instalačním adresáři “/usr/local/avr”. Dále doporučujeme zrušit celý adresář.
Pokud nechtěně uděláte chybu, uložte všechny výstupy příkazových řádků do souboru a
pošlete popis příslušných chyb a testový soubor podpůrnému týmu. Pošlete, prosím, všechny
dostupné informace. Jedině tak můžete získat vyčerpávající pomoc.
31
3.2.3.2. Ruční postup instalace
Pokud preferujete ruční instalaci nebo selže skript automatické instalace, můžete postupovat
podle následujících kroků.
Začněte PDF souborem na straně 240 (respektive 232 podle systému číslování dokumentu).
Tento popis je poze souhrn dokumentu, ale také instalujeme několik důležitých adresářů –
pokud tyto adresáře nevytvoříte, nemusí některé komponenty správně fungovat (například velmi
užiteřčné binární konstanty).
Nejprve musíme vytvořit adresář, ve kterém probíhá instalace všech nástrojů. Adresář by se
měl nazývat: /usr/local/avr.
Následující příkazy ukončí ENTER jako KOŘENOVÝ ADRESÁŘ:
> mkdir /usr/local/avr
> mkdir /usr/local/avr/bin
Pokud tento adresář nepotřebujete, jednoduše definujte proměnnou s názvem $PREFIX tohoto
adresáře:
> PREFIX=/usr/local/avr
> export PREFIX
Nyní do adresáře konečně přidáme proměnné:
> PATH=$PATH:$PREFIX/bin
> export PATH
Binutils pro AVR
Zpracujeme extrahované zdrojové kódy Binutils a vytvoříme několik adresářů. Všechny soubory
můžete kopírovat do základního adresáře ~/RP6:
--disable-nls --disable-libssp –with-dwarf2
> make
> make install
Použitím “\” můžete stisknout Enter a pokračovat v psaní příkazového řádku – tento znak
umožňuje rozdělit řádek a zapsat extrémně dlouhý příkazový řádek přehledně do několika
řádků. Tento znak můžete samozřejmě vynechat a příkaz zapsat jako jediný velmi dlouhý
řádek.
AVR Libc
Nakonec AVR libc:
> cd ~/RP6
> bunzip2 -c avr-libc-1.4.5.tar.bz2 | tar xf >
cd avr-libc-1.4.5
> ./configure --prefix=$PREFIX --build=`./config.guess` --host=avr
> make
> make install
Pozor: V –build=`./config.guess` musíte dát pozor na “zvýraznění” (<-- tenké škrtnutí nad
písmeny. Nesmíte použít normální apostrof, který nebude fungovat.
3.2.3.3. Nastavení adresáře
Nyní dávejte pozor aby byl adresář /usr/local/avr/bin v adresářové proměnné! Jinak nebudete
schopni spustit avr-gcc z terminálu a vytvořit makefiles. Adresář avr-gcc musíte přidat do
souboru /etc/profile nebo /etc/environment nebo podobných souborů (tyto proměnné se liší
podle distribuce). K existujícímu řetězci můžete přidat další adresář, oddělený znakem “:”. Řádek v souboru může obsahovat více adresářů:
Nyní můžete odzkoušet funkčnost instalace vložením příkazu “avr-gcc -–version” na terminál,
jak bylo uvedeno v předchozí části. Pokud dostanete správnou odezvu, byla instalace
dokončena.
33
3.2.4. Java 6
RP6Loader (podrobnosti výše) byl navržen pro prostředí Java a může se používat ve Windows i
Linux (teoreticky může dobře fungovat i pod dalšími operačními systémy jako je OS X, ale
AREXX Engineering je bohužel nepodporuje). V případě RP6Loader musíte instalovat poslední
verzi prostředí Java Runtime Environment (JRE). Možná je na počítači již nainstalované, ale
nejde o nejnovější verzi 1.6 (= Java 6)! Pokud nemáte instalováno nejnovější JRE nebo JDK,
instalujte SUN Microsystems JRE 1.6 z podpůrného CD nebo alternativně z webových stránek
http://www.java.com nebo http://java.sun.com.
3.2.4.1. Windows
V prostředí Windows je JRE 1.6 umístěn v adresáři:
<CD-ROM-Drive>:\Software\Java\JRE6\Windows\
Ve Windows je instalace skutečně jednoduchá – pouze spustíte Setup a sledujete pokyny –
hotovo! Následující část můžete přeskočit.
3.2.4.2. Linux
Instalace Java je v prostředí Linux většinou stejně snadná jako ve Windows, ale některé
distribuce mohou vyžadovat ruční zpracování.
JRE6 můžete najít jako RPM (SuSE, RedHat atd.) a je ve tvaru samo-extraktujícího archivu
“.bin” v adresáři:
<CD-ROM-Drive>:\Software\Java\JRE6\
Naše rada je vyhledat balíček Java pomocí zvláštního manažeru distribuce (vyhledávání pro
“java”, “sun”, “jre” or “java6” ...) a tento balíček použít místo instalace dodávané na CD. Dávejte
pozor, aby jste nainstalovali poslední verzi Java 6 (= JRE 1.6) nebo vyšší.
U Ubuntu nebo Debian nemusí někdy RPM Archiv fungovat – v takovém případě můžete použít
souborový manažer distribuce. Další distribuce jako RedHat/Fedora, SuSE mohou používat
RPM bez využití souborového manažeru.
Pokud není instalace úplná, můžete se ještě pokusit extrahovat soubor JRE ze samo
rozbalovacího archivu (.bin) v adresáři pevného disku (tj. /usr/lib/Java6) a pak ručně nastavit
cestu k JRE (příkazy PATH a JAVA_HOME atd.).
Postupujte podle pokynů instalace Sun, kterou můžete najít ve zmíněném adresáři na
webových stránkách Java.
Vždy zkontrolujte funkčnost instalace příkazem “java -version”. Měla by následovat odezva:
java version "1.6.0"
Java(TM) SE Runtime Environment (build 1.6.0-b105)
Java HotSpot(TM) Client VM (build 1.6.0-b105, mixed mode, sharing)
Pokud je odezva jiná, může být instalace bez podpory nebo může v systému ještě běžet další
Java VM.
34
3.2.5. RP6Loader
RP6Loader jsme vytvořili pro zjednodušení nahrávání nových programů do RP6 a všech
rozšiřujících modulů (pokud tyto moduly obsahují mikroprocesor s kompatibilním
bootloaderem). Navíc jsme implementovali několik užitečných funkcí, například jednoduchý
terminálový program pro sériovou komunikaci.
RP6Loader se nemusí instalovat – místo toho se program jednoduše zkopíruje do nového
adresáře na disku. RP6Loader je umístěn v ZIP archivu na RP6 CD-ROM:
<CD-ROM-Drive>:\Software\RP6Loader\RP6Loader.zip
Rozbalte soubor někam na disk – tj. do nového adresáře C:\RP6\RP6Loader (nebo
podobného). Tento adresář obsahuje spustitelný program RP6Loader.exe.
Ve skutečnosti je RP6Loader umístěn v Java Archive (JAR) RP6Loader_lib.jar. Alternativně
můžete spustit RP6Loader z okna příkazového řádku.
Dlouhá alternativa –D vyžaduje povolení JVM pro umístění všech nezbytných knihoven.
Obvykle nebodeme tuto alternativu potřebovat a jen spustíte soubor .exe. Linux používá skript
“RP6Loader.sh”, který potřebujete pro nastavení spouštění vydáním chmod -x ./RP6Loader.sh.
To vám umožní spuštění “./RP6Loader.sh” z terminálu nebo pracovního prostředí.
Doporučujeme vytvořit odkaz RP6Loader na pracovní ploše nebo nabíce Start. Ve Windows se
to udělá kliknutím pravého tlačítka myši na RP6Loader.exe a výběrem “Přenést do” -->
“Desktop (vytvoření odkazu)”.
3.2.6. Knihovna RP6, knihovna RP6 CONTROL a ukázkové programy
Knihovna RP6 a příslušné ukázkové programy jsou umístěny v ZIP archivu na přiloženém CD:
Rozbalte tento archiv do adresáře na pevném disku, Doporučujeme použít adresář v datové
části. Alternativně můžete použít adresář “My Documents” a vytvořit složku “RP6\Examples\”
nebo použít domácí adresář Linux.
Ukázkové programy podrobně probereme v této příručce později.
Archiv obsahuje také příklady pro rozšiřující modul RP6 CONTROL M32 včetně příslušných
knihovních souborů.
35
3.3. Připojení rozhraní USB – Windows
Uživatelé Linux mohou totu část přeskočit.
Existuje několik způsobů, jak instalovat ovladače USB rozhraní. Nejjednodušší způsob je
instalace ovladače PŘED prvním připojení zařízení. CD nabízí různé instalační programy
ovladače.
Pro 32 a 64 bitové Windows XP, Vista, Server 2003 a 2000:
Nastavení programu bohužel není tak pohodlné jako ve Win98SE/Me – v tomto případě budete
muset ručně instalovat starší verzi ovladače až po připojení zařízení do PC (viz dále).
Spusťte klidně instalační program CDM – program zobrazí krátký informační dialog, který
potvrzuje, že byl ovladač úspěšně nainstalován. To je vše.
Po instalaci můžete připojit USB rozhraní do PC, ALE NEPŘIPOJUJTE JE ZATÍM DO
ROBOTU! Zapojte je pomocí USB kabelu do PC. Destičky se dotýkejte pouze ze stran nebo za
USB konektor, respektive plastový kryt programovacího konektoru (viz bezpečnostní pokyny o
statických výbojech). Dávejte pozor na nežádoucí dotek součástek na destičce, pájecích plošek
nebo spojovacích dílů. To jsou obecná pravidla pro zacházení se všemi elektronickými přístroji
bez krytu.
Již nainstalovaný ovladač se automaticky přiřadí k zařízení a není potřeba další akce.
V operačním systému Windows XP/2k se objeví několik zpráv – poslední zpráva by měla
vypadat takto: “Hardware byl úspěšně instalován a je připraven k používání”!
Pokud připojíte USB rozhraní před instalací ovladače (nebo když používáte Win98/Me) –
nebuďte smutní. Windows se vás zeptá na ovladač, který můžete najít a rozbalit z dodaného
CD. Windows obvykle zobrazí instalační dialog ovladače. Budete požádáni o zadání cesty
k ovladači. V systému Windows 2k/XP musíte nejdříve vybrat “ruční instalaci”. Nevolte
“vyhledání na webu” nebo podobné možnosti, protože ovladač je umístěn na CD ve dříve
specifikovaném adresáři.
Jednoduše vyberte adresář s ovladačem pro vaši verzi Windows a možná dalšími soubory,
které nejsou přímo požadovány systémem (všechny soubory jsou umístěny ve stejných
adresářích, které budou popsány v následující části)…
Obvykle Windows XP nebo novější verze budou nyní pokračovat s upozorněním, ve kterém
Microsoft varuje, že ovladač nemusí být autorizován nebo ověřen – jedná se o irelevantní
výstrahu a můžete ji bez rizika potvrdit. V takovém případě se ovladač FTDI autorizuje a systém
přestane zobrazovat upozornění.
36
Pro 32 a 64 bitové systémy Windows XP, Vista, Server 2003 a 2000:
Několik starších verzí Windows tj. Win98SE vyžadují po instalaci ovladače restart. POZOR: U
Win98/Me můžete instalovat jednu ze dvou verzí ovladače buď D2XX nebo VCP (virtuální COM
port). Pro starší systémy neexistuje ovladač s oběma funkcemi. Obvykle není dostupný virtuální
COM port, protože RP6Loader pro standardní verzi Windows používá ovladač D2XX (ten může
být podle potřeby změněn – pro pomoc můžete kontaktovat podpůrný tým).
3.3.1. Kontrola správné funkce připojeného zařízení
Při kontrole správného připojení zařízení ve Windows XP, Vista, 2003 a 2000 můžete použít
buď RP6Loader nebo Windows správce zařízení:
Klikněte pravým tlačítkem na Tento počítač --> Vlastnosti --> Hardware --> Správce zařízení
nebo alternativně: Start --> Nastavení --> Ovládací panely --> Možnosti a údržba --> Hardware -
-> Správce zařízení. Zkontrolujte zobrazenou větev “Připojení (COM a LPT)” pro "USB-Sériový
Port (COMX)" – kde X představuje číslo portu nebo zkontrolujte “USB - Ovladač” pro “USB
Sériový převodník” a dávejte pozor, aby nebyl do počítače zapojen standardní USB sériový
adaptér.
3.3.2. Odinstalování ovladače
Pokud budete někdy potřebovat odstranit ovladač (ne, nedělejte to právě teď – je to jen pro
informaci): když proběhla instalace pomocí instalačního programu CDM můžete odinstalování
provést nástrojem Start --> Nastavení --> Ovládací panely --> Software. Seznam by měl
obsahovat položku “Ovladač FTDI USB sériového převodníku”. Pouze vyberete tuto položku a
kliknete na odstranit/odinstalovat.
Pokud jste ovladač instalovali ručně, můžete spustit program "FTUNIN.exe" v adresáři USB
ovladače na CD. Pozor: Tento ovladač mohou používat některé adaptéry USB-->RS232, které
používají čipovou sadu FTDI.
37
3.4. Připojení rozhraní USB – Linux
Uživatelé Windows mohou tuto část přeskočit.
Linux Kernel 2.4.20 nebo vyšší již zahrnují ovladač rozhraní USB s obvodem FT232R
(nejnovější typ kompatibilní s předchůdcem FT232BM). Zařízení se rozpozná automaticky a
nemusíte dělat nic dalšího. Jen pokud se objeví potíže, můžete získat ovladač Linux (a podporu
včetně nových verzí ovladačů a dokumentace) přímo od FTDI:
http://www.ftdichip.com/
Po připojení zařízení do počíta če se systémem Linux můžete zkontrolovat správné příjmutí USB
Jen pro informaci: Windows verze RP6Loaderu používá ovladače D2XX a v seznamu portů
bude zobrazovat úplný název USB (tj. “USB0 | RP6 USB Interface | serialNumber”). Naproti
tomu Linux verze programu bude zobrazovat název virtuálního COM portu /dev/ttyUSB0,
/dev/ttyUSB1 nebo podobně. Mohou se zobrazit i další standardní označení COM portu
(“dev/ttyS0” atd.).V takovém případě budete muset zkusit, který port je správný. Linux bohužel
neumožňuje snadnou instalaci ovladače pro obě funkce a z tohoto důvodu preferujeme
používání ovladače virtuálního COM portu, který je obvykle obsažen ve standardním jádru
Linux. Instalace ovladače D2XX může vyžadovat nějaké ruční zásahy.
3.5. Dokončení instalace software
To bylo vše, co se musí udělat pro nastavení software a USB rozhraní.
Na závěr můžete zkopírovat většinu důležitých souborů z CD na pevný disk (speciálně celý
adresář “Dokumentace” a “Příklady”, pokud jste to již neprovedli). Díky tomu nemusíte pokaždé
hledat konkrétní soubor na CD. Adresáře na CD jsou pojmenovány podle obsahu softwarových
balíčků, takže se v nich velice dobře orientujete.
Pokud CD ztratíte, můžete všechny důležité soubory stáhnout z našich webových stránek.
Najdete zde také nejnovější verze dat, které mohou obsahovat důležité odstranění chyb nebo
nové vlastnosti.
38
3.6. Vložení baterií
Je na čase věnovat se vlastnímu robotu. V první řadě musí mít robot 6 baterií.
Doporučujme používat velmi kvalitní NiMH baterie (od známých výrobců tj. Sanyo, Panasonic,
atd.) se specifikovanou reálnou provozní kapacitou větší než 2000 mAh (optimální kapacita
baterií je 2500 mAh). Nepoužívejte, prosím, běžné alkalické baterie, jejich provoz je velmi drahý
a také způsobují nežádoucí znečistění životního prostředí.
Doporučujeme používat předem nabité baterie. Vždy dávejte pozor, aby byly baterie nabité na
stejnou úroveň (všechny baterie jsou buď nabité, nebo vybité) a používejte relativně nové
baterie. Baterie se mohou opotřebovat dlouhým skladováním, počtem nabíjecích cyklů,
způsobem vybíjení a teplotou. Nejlepší je používat nové baterie, protože staré baterie vlivem
dlouhodobého skladování ztrácí původní vlastnosti. Velmi důležité je také používat velmi
shodné články. U jednotlivých článků se může lišit kapacita, stáří, úroveň nabití…
Pokud upřednostňujete externí nabíječku (velmi doporučujeme, ale není
obsažena v balení), můžete baterie instalovat pouze JEDNOU.
Doporučujeme používat nabíječku řízenou mikroprocesorem, která zajistí
optimální nabití baterií. Pro svou vlastní bezpečnost používejte pouze
certifikované a odzkoušené nabíjecí zařízení!
Nepoužívejte externí nabíjecí zařízení se zvláštním adaptérem konektoru, které potřebuje
dlouhodobé nabíjení. Raději vyjměte baterie ze systému, nabijte baterie a znovu je vložte do
systému.
Vkládání baterií:
Nejprve musíte uvolnit čtyři šroubky, které upevňují hlavní desku.
Nyní opatrně zvedněte hlavní desku na boční stranu robotu (viz obrázek).
NEMUSÍTE rozpojovat malý
konektor se třemi kontakty na
destičce nárazníků. Buďte
velmi opatrní při manipulaci
s hlavní deskou. Dotýkejte se
pouze hrany desky plošných
spojů nebo velkých plastových
dílů, aby nedošlo k výboji
statické elektřiny.
Hlavní deska elektroniky je
spojena s motory, enkodéry a
držákem baterie pomocí
svazku zapájených kabelů.
Přesuňte tyto svazky vodičů –
opatrně stranou – podle jejich
umístění.
39
Vyjměte držák baterie dozadu (viz obrázek).
Dávejte pozor, aby byl vypínač
v poloze “OFF”. Páčka vypínače
musí směřovat k nápisu “OFF” a
velkému válcovému kondenzátoru
na hlavní desce (viz obr.)
Před novým spuštěním robotu,
zkontrolujte správnou orientaci
baterií.
Nyní můžete vložit 6 NiMH baterií se
SPRÁVNOU ORIENTACÍ / POLARITOU!
POZOR: Při vložení baterie
s opačnou polaritou se přepálí
tavná pojistka.
V nejhorším případě však můžeme
poškodit součástky elektronických
obvodů.
Nejlepší řešení bude, když hned
vložíte baterie správným způsobem a
vyhnete se všem možným
problémům. V držáku baterie jsou
navíc značky (kladný (+) kontakt je
plochý a záporný (-) pól tvoří pružiny v
držáku), které vám pomáhají s
orientací.
Polaritu baterií kontrolujte raději
třikrát, než rozhodnete, že je vše
v pořádku!
Nyní můžete vložit držák baterií
zpátky do šasi. Dávejte pozor na
kabely. Pozor hlavně na to, aby
nebyly blízko převodovek.
Když už máte otevřený robot, můžete
nyní rychle zkontrolovat obě
převodovky a enkodéry, zda nejsou
poškozené tj, chybějící matičky,
šrouby nebo jiné součástky. Velmi
opatrně a pomalu otočte jednu otáčku
zadními koly.
40
Vždy stačí pootočit půl otáčky dopředu a půl otáčky dozadu. Měli byste cítit jemný odpor, ale
kola se musí otáčet volně. Kola převodovky se pohybují volně. Podívejte se také do dodatku A.
Hlavní desku nyní můžete vrátit na šasi. Pomocí dlouhého nástroje nebo prstů zasuňte kabely
mezi hlavní desku a plastové přepážky tak, aby hlavní deska pěkně ležela na šasi. Před
upevněním ještě zkontrolujte, zda některý kabel není sevřený k šasi nebo převodovce. Nyní
můžeme připevnit desku k šasi dotažením čtyř šroubů – dotahujte je opatrně.
3.7. Nabíjení baterie
Pokud jste nenainstalovali předem nabité baterie, jak jsme doporučovali, měli byste nyní připojit
externí nabíječku. Při nabíjení přepněte hlavní vypínač napájení do polohy “OFF”. Nabíjení
baterie funguje pouze u vypnutého robotu. Hlavní vypínač připojuje baterie buď k elektronickým
obvodům RP6 nebo ke konektoru nabíjení.
Zkontrolujte polaritu přívodu podle konektoru pro připojení nabíječky (označený “Charger”)
umístěného na robotu hned vedle vypínače napájení.
Polaritu vidíte označenou na hlavní desce před konektorem (viz
obrázek). Záporná svorka je umístěna na VNĚJŠÍM
KOVOVÉM KONTAKTU a kladná svorka na VNITŘNÍM
VÝVODU.
Doba nabíjení velmi závisí na typu použité nabíječky a baterie
(mikroprocesorem řízená nabíječka například Voltcraft 1A/2A
rychlá nabíječka, která využívá princip Delta Peak nebo
Ansmann ACS110/410 budou k nabití potřebovat 3 až 4 hodiny,
standardní nabíječky například AC48 potřebuje k nabíjení čas asi
14 hodin) – prostudujte pečlivě návod k používání nabíječky.
Během nabíjení nezapínejte hlavní vypínač robotu do polohy “ON”. Před zapnutím
robotu, vždy odpojte nabíječku.
3.8. První test
POZOR! Před spuštěním testu přečtěte pozorně celou následující část.
Pokud se objeví nějaký rozdíl od následujícího popisu, měli byste
okamžitě vypnout robot a přesně zjistit kde je příčina problému. Když
nedostanete uspokojivou odpověď v kapitole “Lokalizace a odstranění
problémů”, můžete kontaktovat technickou podporu výrobce.
OK – hotovo. Zapněte robot. Dvě stavové LED ve střední části by měly svítit. Po malém
zpoždění zhasnou, další červená LED (SL6) začne blikat a zelená LED (SL1) svítí trvale. Tento
stav signalizuje absenci uživatelského programu v paměti řídícího mikroprocesoru. Pokud je
v paměti funkční uživatelský program, bude pouze blikat zelená stavová LED SL1.
Žlutá LED PWRON by se měla rozsvítit asi jednu sekundu po zapnutí robotu – odpojením
většiny snímačů včetně enkoderů se šetří energie.
Asi po 30 sekundách začne blikat červená LED SL6 a všechny ostatní LED zhasnou.
Mikroprocesor robotu se automaticky přepne do pohotovostního režimu a program se dále
neprovádí. Pohotovostní režim s nízkou spotřebou se může ukončit přes rozhraní USB,
stisknutím tlačítka START/STOP nebo krátkým vypnutím a zapnutím robotu. Během
pohotovostního režimu odebírá robot malé množství energie (maximálně 5 mA) – a pokud
nechcete systém delší dobu používat, nezapomeňte RP6 vypnout úplně. Program v paměti
robotu neprovede automaticky přechod do pohotovostního režimu. Místo toho bude systém
41
pokračovat čekáním na uživatelský příkaz ze sériového rozhraní (jednoduše vyslání “s”), ze
sběrnice I2C nebo tlačítka Start/Stop.
3.8.1. Připojení rozhraní USB a spuštění RP6Loaderu
Následovat bude test aktualizace programu přes rozhraní USB. Připojte, prosím, rozhraní USB
do PC (vždy se začíná tím, že připojíte rozhraní do PC). Pak zapojte rozhraní USB do
konektoru “PROG/UART” umístěného na robotu těsně vedle tlačítka Start/Stop.
Konektor má mechanickou ochranu proti přepólování a 10 vývodovou zástrčku nemůžete bez
hrubého násilí zasunout špatně.
Nyní spustíte RP6Loader.
Podle zvoleného jazyka se mohou lišit názvy
položek v menu.
Snímky obrazovek ukazují anglickou verzi programu
a pokud chcete můžete jazyk změnit v nabídce
“Options->Preferences”, následuje výběr položky
“Language”
(v současné době jsou k dispozici pouze anglická a
německá verze) a stisknutí OK. Po změně jazyka
musíte provést restart RP6Loaderu
Otevření portu – Windows
Nyní můžete vybrat USB port. Pokud váš
počítač nenabízí další USB sériový adaptér
s řadičem FTDI, zobrazí se seznam portů jen
jednou, než jej vyberete. Pokud však existuje
několik portů, můžete ho identifikovat
zaměřením na “RP6 USB Interface” (nebo
“FT232R USB UART”), za kterým následuje
předem určené pořadové číslo.
Pokud se nezobrazí žádný port, obnovte seznam zařízení pomocí “RP6Loader-->Refresh Port
list”.
Otevření portu – Linux
Linux obsluhuje USB – sériové adaptéry
stejně jako ostatní standardní COM porty.
Instalace ovladače D2XX na operační systém
Linux není tak jednoduchá a moderní jádra
Linux již poskytují ovladač pro standardní
virtuální COM port (VCP). Obecně se port
používá stejně jako ve Windows, ale budete
muset zkusit, na kterém portu je právě připojeno USB rozhraní RP6 a nemusíte odstranit USB
port z počítače při odpojení (jinak se musí před otevřením portu znovu spustit RP6Loader).
42
Virtuální COM porty budou označeny “/dev/ttyUSBx”, kde x představuje číslo portu tj.
“/dev/ttyUSB0” nebo “/dev/ttyUSB1”. Zobrazí se také označení standardních COM portů
“/dev/ttyS0”, “/dev/ttyS1”. Program RP6Loader si pamatuje naposledy vybraný port a bude ho
automaticky nabízet při spuštění programu (většinou se pamatuje jediný přítomný a vybraný
port).
Nyní klikněte na tlačítko “Connect”. Program RP6Loader se pokusí otevřít port a zkontroluje
komunikaci s bootloaderem robotu. Pokud vše funguje správně, zobrazí černé “stavové” pole,
které ukazuje zprávu “Connected to: RP6 Robot Base ...”, doprovázenou změřenou hodnotou
napětí baterie. Pokud se spojení nepovede, počkejte chvíli a zkuste to znovu. Pokud selže i
druhý pokus, objeví se řada chyb. V takovém případě okamžitě vypněte robot a prostudujte
kapitolu “Vyhledávání a řešení problémů” v příloze.
Nízké napětí baterie oznámí program varovnou zprávou. Jakmile uvidíte tuto zprávu, měli byste
nabít baterie. Naše rada zní – nabijte baterii, jakmile napětí klesne pod 5,9 V!
Jakmile je tato počáteční kontrola úspěšná, můžete spustit jednoduchý samo testující program,
který zkontroluje, zda dílčí systémy robotu fungují správně. Nejdříve musíte program Selftest
přidat do seznamu souborů typu hex. Může se to udělat tlačítkem “Add” a v adresáři příkladů se
vybere soubor “RP6Base_SELFTEST\RP6Base_SELFTEST.hex”. Vybraný soubor obsahuje
samo testující program v hexadekadickém tvaru – proto se soubor nazývá “soubor HEX”.
43
Zvolený soubor se nyní objeví v seznamu. Tímto způsobem můžete vybrat další soubory typu
HEX ze svých vlastních programů nebo příkladů a přidat je do seznamu. (viz snímek obrazovky,
ve které je již přidáno několik souborů HEX). RP6Loader je schopen spravovat několik souborů
HEX pro pohodlnou aktualizaci. Oceníte to při použití několika rozšiřujících modulů nebo
existenci různých verzí programu. Při ukončení programu se seznam souborů automaticky
uloží. Samozřejmě se uloží včetně názvu cesty. Během vývoj programu musíte přidat soubor
HEX pouze jednou. Po opakované kompilaci, můžete aktualizovat novou verzi, bez
opakovaného přidávání do seznamu (při aktualizaci můžete použít zkratku [STRG+D] nebo
[STRG+Y] pro spuštění programu po přenosu dat). Názvy cest se u jednotlivých operačních
systémů liší, proto RP6Loader používá samostatní seznamy pro Windows a Linux.
Nyní v seznamu vybereme soubor “RP6Base_SELFTEST.hex” a klikneme na “Upload!”
v pravém horním rohu zobrazení se objeví progress bar. Tím se zahájí proces aktualizace
programu v mikroprocesoru MEGA32. Aktualizace by měla být hotová během několika sekund
(u samo testujícího programu maximálně 5 sekund).
Po dokončení aktualizace vyberte, ve spodní části programového okna, záložku “Terminal”
nebo ji můžete alternativně vybrat v nabídce “View”.
Tlačítkem Start/Stop, které je umístěné blízko programovacího
konektoru (viz obrázek), spusťte program. Později můžete používat
tlačítka v software RP6Loader nebo zkrácenou volbu [STRG]+[S].
Ale nyní však použijeme hardwarové tlačítko, protože můžeme zjistit,
zda funguje správně.
Na terminálu se může objevit varovná zpráva, která říká, že
během testu číslo 8 spustí RP6 motory.
POZOR! Pokud běží test číslo 8 (“Test motorů a enkoderů”), zvedněte a
držte RP6 v rukách nebo ho alternativně položte na vhodný předmět –
který zabrání kontaktu pásů s povrchem. Během testu číslo 8 se pásy NESMÍ zatěžovat nebo blokovat. V opačném případě test
pravděpodobně selže. Pokud se RP6 dotýká země, mohou motory
reagovat nepředvídatelně, výsledkem je chyba testu. Nejdůležitější je,
že RP6 může také ujet nějakou vzdálenost. Vyrazí vpřed, dokud mu to
dovolí USB kabel…
RP6 musíte držet v rukách nebo alternativně položit na předmět (malou kostku nebo
dálkový ovladač). Když RP6 umístíte na předmět, držte robot během testu jednou rukou,
aby nečekaně nesklouzl na stůl.
Tato varovná zpráva se zobrazí těsně před testem číslo 8 a musí se před spuštěním testu
potvrdit.
Do terminálového okna vložte malé písmeno 'x' a stiskněte Enter (tento postup můžete
opakovat, kdykoliv se objeví tato zpráva nebo když se test dokončí…).
44
V tomto bodě program
umístí text nabídky na
levou stranu. V dalších
verzích programu se může
text změnit.
Vložením příslušné číslice
nebo písmena a stiskem
Enter můžete vybrat a
spustit různé testovací
programy
Chceme-li spustit všechny standardní testy - napíše '0' a stiskneme Enter!
V terminálovém okně se objeví následující textový výstup:
# 0
#####################################################################
#####################################################################
## Test #1 ##
### POWER ON TEST ###
Please watch the yellow PowerOn LED and verify that it lights up!
(it will flash a few times!)
Sledujte žlutou LED přeron, která několikrát blikne. Pokud nebliká, může test zmizet dříve, než
si všímnete nebo se skutečně objevila chyba. Testovací program však pokračuje, protože
neexistuje automatická metoda pro detekci správné funkce – závisí to jen na vás.
V tomto případě LED zobrazuje stav, kdy jsou aktivovány enkodéry, IR přijímač a snímač
proudu. Tato zařízení společně s LED odebírají rozumný proud okolo 10 mA --> pro úsporu
energie se tato zařízení spínají na dobu nezbytně nutnou.
Program nyní rozbliká stavové LED. Všechny LED několikrát bliknou současně a pak každá
z nich samostatně. Zde můžete pozorovat, zda jednotlivé LED fungují správně nebo je některá
poškozená.
Výstup bude vypadat následovně:
## Test #2 ##
### LED Test ###
Please watch the LEDs and verify that they all work!
Done!
Dále se testuje snímač baterie. Ve skutečnosti byl již snímač otestován, když RP6Loader dříve
ukázal napětí baterie. Kontrola baterie se teď zopakuje s úplným výpisem:
#####################################################################
#####################################################################
## Test #3 ##
### Voltage Sensor Test ###
Be sure that you are using good accumulators!
Tento výstup se vám může zdá být nudný – hodnoty se mohou měnit v celém přípustném
rozsahu od 5,5 V do 9,5 V. Pokud se tyto limity překročí, zobrazí se chyba. Když se objeví
chybové hlášení, zkontrolujte baterie – nemusí být správně nabité nebo jsou poškozené. Pokud
jsou baterie v pořádku, pak může být poškozený snímač (dva rezistory…).
Nyní zkontrolujeme nárazníky. Testujeme je postupně stisknutím mikrospínačů, sledováním
LED a podle zpráv zobrazených na terminálu. Každý “náraz” by se měl promítnout na terminálu
i LED. Výstupní zpráva zobrazí:
## Test #4 ##
Bumper Test
Please hit both bumpers and verify
that both Bumpers are working properly!
The Test is running now. Enter "x" and hit return to stop this test!
OBSTACLE: LEFT!
FREE: LEFT!
OBSTACLE: RIGHT!
FREE: RIGHT!
OBSTACLE: LEFT!
FREE: LEFT!
OBSTACLE: RIGHT!
FREE: RIGHT!
OBSTACLE: LEFT!
OBSTACLE: RIGHT!
FREE: LEFT!
FREE: RIGHT!
Pokud se test dokončil, můžete test opustit vložením 'x' + Enter.
Nyní budeme kontrolovat světelné snímače. Při testu těchto snímačů je postupně zakrývejte
rukou, posouvejte ruku nad snímač a kontrolujte změnu hodnoty a LED – snižování intenzity
světla se musí projevit snižováním naměřené hodnoty. Led se rozsvítí, když na snímač působí
jasné světlo. Denní světlo obvykle vytváří hodnoty v rozsahu od 200 do 900.
Pokud na snímače přímo posvítíme baterkou nebo robot namíříme přímo do slunce, může
naměřená hodnota překročit 1000. Ve tmavé místnosti může hodnota klesnout pod 100.
Test spustíte vložením 'x' + Enter:
## Test #5 ##
### Light Sensor Test ###
Please get yourself a small flashlight!
While the test runs, move it in front of the Robot
and watch if the values change accordingly!
46
Enter "x" and hit return when you are ready!
# x
The Test is running now. Enter "x" and hit return to stop this test!
Performing measurements...:
Left: 0510, Right: 0680
Left: 0511, Right: 0679
Left: 0512, Right: 0680
Left: 0560, Right: 0710
Left: 0630, Right: 0750
Left: 0640, Right: 0760
Left: 0644, Right: 0765
[...]
Po otestování snímačů ukončíte testovací posloupnost vložením 'x'.
Nyní přikročíme k testu ACS. Zde se nic nepotvrzuje a test se okamžitě spustí. Nyní se
oprostíme překážek před robotem, ale pečlivě vyčistíme prostor před robotem, aby nedošlo
k detekci překážky.
Test může zobrazovat následující výstup:
## Test #6 ##
ACS Test
Please move your hand or other obstacles in front of the Robot
and verify that both ACS channels are working properly!
ACS is set to Medium power/range!
You can also send RC5 Codes with a TV Remote Control
to the RP6 - it will display the Toggle Bit, Device Adress
and Keycode of the RC5 Transmission!
Make sure your remote control transmits in RC5 and not
SIRCS or RECS80 etc.! There are several other formats that will NOT work!
The Test is running now. Enter "x" and hit return to stop this test!
OBSTACLE: LEFT!
FREE: LEFT!
OBSTACLE: LEFT!
FREE: LEFT!
OBSTACLE: LEFT!
OBSTACLE: RIGHT!
FREE: RIGHT!
FREE: LEFT!
OBSTACLE: LEFT!
OBSTACLE: RIGHT!
FREE: RIGHT!
FREE: LEFT!
Test také umožňuje příjem zpráv z IR dálkového ovladače kompatibilního se systémem RC5.
V tomto případě přijímá bit TOGGLE a zobrazuje adresu a kód klávesy.
Pokračuje se ukončením testu vložením 'x'.
Následuje testovací procedura IRCOMM, která se může spustit vložením 'x'. Procedura začíná
vysláním IR datových paketů, zobrazením přijatých paketů na terminálu a automatickou
kontrolou správnosti přijatých dat (pomocí relativně výkonných IR LED bude IRCOMM obvykle
přijímat zpět vlastní signály. Pouze při absenci reflexních předmětů nebo zastíněním systému
může dojít k chybě – to jsou však velmi neobvyklé podmínky).
Na závěr provedeme test motoru a enkodéru. RP6 musíte zvednout
do rukou – pásy se nesmí dotýkat podlahy ani jiných předmětů.
V opačném případě se test zřejmě zbortí. Pokud RP6 položíte na
horní část předmětu, jak bylo popsáno, dávejte pozor aby RP6
nesklouzl na stůl.
Tento test nebude trvat dlouho – přibližně 30 sekund. Pečlivě sledujte chybová hlášení tohoto
testu. Může se objevit při jediné chybě měření, výskyt chybové zprávy způsobí ukončení
testovací posloupnosti. Pokud se očekává spuštění motorů a test se ukončí někde uprostřed,
nebuďte z toho smutní. Pokud se to stane, zkuste to znovu – po prostudování kapitoly
“Vyhledávání a odstraňování problémů” v příloze.
Testovací procedura postupně zvyšuje rychlost obou motorů až na 50% maximální rychlosti a
několikrát změní směr otáčení motorů. Systém bude neustále kontrolovat a hlídat naměřené
hodnoty z enkodérů a snímačů proudu. Pokud se během přesunu něco pokazí (tj. zkratuje
některý motor nebo zablokuje převodovka – na které upozornila předchozí fáze testu po vložení
baterie) sledovaný proud prudce roste do vysokých hodnot a způsobí okamžité ukončení testu.
48
Vzorek testovacího protokolu (zkrácený):
#####################################################################
#####################################################################
#### TEST #8 ####
Automatic speed speed regulation test
#####################################################################
### ATTENTION!!! DANGER!!! WARNING!!!
Make sure that the RP6 can __NOT__ move!
The caterpillar tracks should __NOT__ touch the ground!
(hold it in your hands for example...)
THE RP6 WILL START MOVING FAST! YOU CAN DAMAGE IT IF YOU DO NOT
MAKE SURE THAT IT CAN __NOT__ MOVE!
Make sure both crawler tracks are FREE RUNNING! DO NOT BLOCK THEM!
--> OTHERWISE THE TEST WILL FAIL!
#####################################################################
Enter "x" and hit return when TO START THIS TEST!
Make sure the RP6 can not move!
Měřené hodnoty se vypisují v testu (zleva doprava): T – požadovaná rychlost, VL/VR – změřená
rychlost levé/pravé strany, PL/PR – hodnota PWM levé/pravé strany, IL/IR – proud tekoucí do
motoru levé/pravé strany, UB – napětí baterie.
Pokud vypadají výstupní hodnoty stejně jako v předchozím výpisu – pak je vše v pořádku.
Pokud něco nefunguje správně a objeví se chybové hlášení, prostudujte v příloze kapitolu
“Vyhledávání a odstraňování problémů”.
To je vše. Pokud systém prošel všemi testy, můžete pokračovat následující kapitolou.
50
4. Programování RP6
Konečně jsme se dostali k části o programování.
4.1. Konfigurace editoru zdrojového textu
Začneme nastavením malého vývojového prostředí. Takzvané “zdrojové texty” programů
v jazyce C se musí nějakým způsobem vložit do projektu a editovat.
Samozřejmě nebudeme používat rozsáhlé systémy na zpracování textu jako je OpenOffice
nebo Word. Ty zřejmě explicitně nemohou cokoliv zvýraznit. Programový balík Office perfektně
umožňuje napsat příručku podobnou této, ale vůbec není vhodný pro vývoj software. Zdrojový
kód je prostý text – bez jakéhokoli formátování. Velikost textu, fonty a barvy nejsou pro
kompilátor důležité…
Automatické barevné zvýraznění speciálních klíčových slov nebo textových pasáží (tj.
komentářů) je však pro lidi velmi užitečné. Tuto a několik dalších vlastností obsahuje editor
Programmers Notepad 2 (v následujích kapitolách jej budeme jednoduše nazývat “PN2”), který
budeme používat k editaci zdrojových textů (POZOR: Uživatelé Linux budou potřebovat
podobný editor. Distribuce Linux obvykle poskytují několik předem nainstalovaných editorů
například kate, gedit, exmacs a další).
Vedle zvýraznění klíčových slov a příslušných struktur (které se nazývá “zvýrazněná syntaxe”)
nabízí editor elementární správu projektu. V projektu můžete vytvářet balíčky zdrojových
souborů. Dále PN2 umožňuje pohodlné volání programů jako AVR-GCC pro kompilaci
programů kliknutím na jedinou položku v menu. AVR-GCC je jednoduchý program ovládaný
z příkazového řádku zcela bez grafického rozhraní...
Poslední verzi programátorského editoru můžete najít na domovské stránce projektu:
http://www.pnotepad.org/
4.1.1. Vytvoření přístupu do menu
POZOR: Tuto kapitolu můžete přeskočit, pokud má PN2 již vytvořené přístupy do menu
(tyto přístupy označené “[WinAVR] Make All”, atd... můžete najít v menu. Zkontrolujte, prosím,
zda menu obsahuje tyto vstupy). Tuto možnost neobsahují všechny verze PN2. Můžete se také
zajímat o přidání dalších programů do menu.
Spusťte PN2 a v nabídce “Tools” vyberte položku “Add Tools...” (viz snímek obrazovky).
51
Nyní můžete vložit výběrový dialog, který
umožňuje změnit několik nastavení.
Budeme však provádět pouze přidávat
nové vstupy do nástrojového menu.
Přikročte k výběru “C/C++” ze
rozbaleného seznamu “Scheme:”!
Klikněte na “Add”!
Objeví se dialogové okno.
Vložte přesně název podle snímku
obrazovky.
Fráze “%d” odkazuje na adresář
zvoleného souboru a “%d\make_all.bat”
odkazuje na dávkový soubor, který
můžete najít v libovolném ukázkovém
projektu RP6.
Jako příklad klávesové zkratky můžete
z klávesnice vložit [STRG] + [M]!
Tento vstup spustí nástroj “make”,
nazvaný dávkový soubor “make_all.bat”,
který inicializuje kompilaci souborů
v příslušném adresáři zvoleného
souboru. Tuto metodu probereme
v následující kapitole.
52
Jako alternativní metodu k “%d/make_all.bat” můžete do pole “Command” jednoduše vložit
“make” a “all” do pole “Parameters”.
Ve skutečnosti dávkový soubor jednoduše a přesně provádí zadané povely, ale dávkový soubor
zjednoduší spouštění kompilátoru z prostředí Windows Explorer.
Nyní klikněte OK – a nový vstup se zobrazí v seznamu:
...ještě jednou klikněte na “Add”!
Jakmile jste dokončili vstup vytvoření překladu, můžete
vložit vše z vedlejšího snímku obrazovky a pak potvrdit
kliknutím na OK.
V seznamu se vytvoří nový vstup:
“[RP6] MAKE CLEAN”
Tento vstup vám umožňuje pohodlné zrušení všech dočasných souborů, které se vytvoří během
kompilačního procesu. Obvykle nebudeme tyto dočasné soubory. po úspěšném dokončení
překladu, potřebovat. Mimochodem: vytvořený soubor HEX se neodstraní a můžete jej klidně
přenést do robota. Jako obvykle můžete (alternativně k “%d/make_clean.bat”) také vložit “make”
do pole “Command” a do pole “Parameters” položku “clean”.
Nabídku Options opustíte kliknutím na “OK”.
53
4.1.2. Konfigurace zvýraznění syntaxe
Dalším nastavením můžete změnit zvýraznění syntaxe. Do schématu standardního jazyka
C/C++ můžete přidat několik “klíčových slov”. V dialogovém poli můžete přímo použít Copy &
Paste klávesová zkratka ([STRG]+ [C] = kopie, [STRG]+[V] = vložení):
Upozornění: Poslední verze WinAVR a Programmers Notepad (WinAVR-20070525) již
obsahují tato klíčová slova v Programmers Notepad! Nejnovější verze prostředí Programmers
Notepad se také budou mírně lišit od snímků obrazovek uvedených v této příručce.
54
Po přizpůsobení prostředí a otevření ukázkového projektu podle následující části můžete vidět,
že se vzhled PN2 může podobat následujícímu snímku obrazovky:
Na levé straně vidíte náhled adresáře se všemi ukázkovými projekty, editor zdrojových textů
(vlastnosti jsme probrali v předchozím zvýraznění syntaxe) je na pravé straně a výstup nástroje
(v tomto případě výstup překladače) je ve spodní části obrazovky.
Prostředí PN2 můžeme přizpůsobit různými způsoby a vytvořit velké množství užitečných
funkcí.
55
4.1.3. Otevření a kompilace ukázkových projektů
Zkuste, zda všechno funguje správně a otevřte všechny ukázkové
projekty:
V nabídce “File” vyberte položku “Open Project(s)”.
Ve standardním dialogu pro výběr souborů můžete v adresáři
ukázkových projektů vyhledat dílčí adresář “RP6Base_Examples”.
Otevřete soubor “RP6BaseExamples.ppg”, který je projektová skupina
PN2. Tento soubor nahraje všechny ukázkové programy a knihovnu
RP6Library do seznamu projektů. Tímto způsobem můžete pohodlně
brouzdat po ukázkových programech a snadno sledovat funkce
umístěné v knihovně RP6Libary.
Nyní otevřete první ukázkový program na vrcholu náhledu adresáře projektů
(“Example_01_LEDs” a vyberte soubor “RP6Base_LEDs.c”)! Jednoduše dvakrát klikněte na
“RP6Base_LEDs.c” a v editoru se otevře zdrojový soubor!
Ve spodní části obrazovky byste měli vidět výstupní okno PN2. Pokud ne, můžete okno
aktivovat v menu volbou View->Output nebo (pokud je okno příliš malé) přesunutím hran
pomocí myši (kurzor myši na horní hraně výstupního okna změní svůj tvar na dvojitou šipku...).
Zběžně se podívejte, zda se vám líbí zdrojový text v editoru. Samozřejmě nemůžete očekávat,
že budete rozumět celému textu, ale snadno se naučíte, jak s tímto textem zacházet. Pusťte se
do toho: zelené řádky textu jsou komentáře, které nejsou součástí vlastního programu, ale
pouze dokumentují, co program dělá. Vysvětlíme to (existuje další kopie programu bez
komentářů, která ukazuje jak je ve skutečnosti zdrojový text krátký. Komentáře zdrojový soubor
značně rozšiřují, ale jsou velmi užitečné pro dokumentaci programu. Nekomentovaná verze se
může používat ke kopírování částí kódu do vašich vlastních programů!).
Nyní můžeme zkontrolovat funkci kompilátoru.
Nabídka Tools by měla zobrazovat obě přidana vstupní menu
(viz obrázek) nebo alternativně standardní vstupy [WinAVR]
prostředí PN2. Můžete vybrat některé z nich, obvykle budou
fungovat bez problémů.
Nyní prosím klikněte na “MAKE ALL”!
PN2 nyní zavolá výše popsaný dávkový soubor “make_all.bat”,
který spustí “make”. Co znamená pojem “make” vysvětlíme
později.
Ukázkový program se přeloží (=“kompiluje”) a vytvoří se soubor hex, který obsahuje speciální
kód pro mikroprocesor a může se nahrát do aplikace a provádět!
56
Kompilátor vytvoří velké množství dočasných souborů (používají přípony jako “.o, .lss, .map,
.sym, .elf, .dep”). Nedívejte se na tyto soubory a můžete využít nově vytvořený nástroj “make
clean” ke snadnému odstranění těchto souborů! Pro vás je důležitý výsledek překladu pouze
soubor HEX! A “make clean” soubor HEX neodstraní.
Spuštění příkazu MAKE ALL v nabídce způsobí následující výstup (výpis je zkrácený a může se
od této ukázky nepatrně lišit!):
-------- end ------->
Process Exit Code: 0
> Time Taken: 00:01
Důležitý řádek je “Process Exit Code: 0” ve spodní části výpisu. Říká nám, že byl proces
kompilace a linkování dokončen bez chyb. Ostatní kódy signalizují chyby ve zdrojovém textu,
které je třeba před úspěšnou kompilací, nejprve opravit. Pokud jsou ve zdrojovém textu omyly,
vystaví překladač na výstupu několik chybových zpráv, které obsahují podrobnější informace o
tom, co způsobilo chybu.
Musíte si však uvědomit, že zpráva “Process Exit Code: 0” neznamená program bez chyb‘
Kompilátor není samozřejmě schopen detekovat logické chyby ve vašem programu a nebud
chránit robot před nárazem do zdi ;-).
DŮLEŽITÉ: Výstup může obsahovat také upozornění, která mohou být užitečná při identifikaci
vážných problémů! Pečlivě si prohlédněte varovná hlášení a pokuste se řešit problémy, které
z nich přímo vyplývají! Program uvede také seznam čísel řádků odkazujících na chybové
zprávy. Na barevné řádky můžete kliknout a PN2 automaticky skočí na odkazovaný řádek ve
zdrojovém textu.
57
Velmi užitečný je také přehled označený “Využití AVR paměti” na konci výpisu:
Tento přehled ukazuje, že náš program zabírá 6858 byte v paměti a rezervuje 148 byte RAM
pro statické proměnné (seznam samozřejmě neobsahuje dynamické proměnné pro haldu a
zásobník, ale to pochopíte po prostudování této příručky. Měli byste vždy udržovat volných
několik stovek byte na konci RAM). K dispozici máme celkem asi 32 kB (32768 byte) paměti
Flash ROM a 2 kB (2048 byte) RAM. Boot loader potřebuje 2 kB z 32 kB Flash ROM –
k volnému využití zůstává 30 kB. Vždy bedlivě sledujte velikost programu, dávejte pozor, zda se
vejde do dostupné paměti! (Program RP6Loader nedokáže přenést větší programy!).
Předchozí ukázkový program nechá v paměti ROM 23682 volných byte. Ve skutečnosti by mohl
tento relativně krátký program RP6Base_LEDs.c zabírat mnohem méně paměti protože
obsahuje celou knihovnu RP6Library! Netrapte se tím, je zde dostatek místa pro vaše programy
a malé programy nepotřebují příliš mnoho paměti. Knihovna funkcí zabírá více než 6,5 kB
paměti Flash, ale již pro vás obsloužila mnoho důležité práce. Váš program bude obvykle menší
než knihovna RP6Libary.
4.2. Nahrávání programu do RP6
Nyní se může použít program RP6Loader k nahrávání právě přeloženého programu do robotu.
Přidejte, prosím vytvořený soubor HEX do seznamu souborů RP6Loaderu, kliknutím na “Add”,
pečlivě vyberte soubor a pak klikněte na “Upload!”, začněte testovacím programem. Nyní se
přepněte na terminál a zkontrolujte výstup. Program můžete samozřejmě spustit dříve a
sledovat jeho výstup. Na terminálu to snadno provedete stisknutím klávesové zkratky
[STRG]+[S], použitím položky “Start” v nabídce nebo vysláním “s” – po resetu musíte
samozřejmě chvíli počkat na zprávu “[READY]” z Bootloaderu! S výhodou se může použít
kombinace kláves [STRG]+[Y]. Po dokončení nahrávání se touto klávesovou zkratkou okamžitě
spustí program!
První ukázkový program je velmi jednoduchý a spustí blikající LED a výstup nějakého textu přes
sériové rozhraní.
Před zahájením psaní vašich vlastních programů vás v miniaturním kurzu seznámíme
s programovacím jazykem C...
58
4.3. Proč C? A co to je “GCC”?
Používání programovacího jazyka C je velmi rozšířené – ve skutečnosti je C standardní jazyk,
který dříve či později začne používat každý, kdo se zajímá o vývoj software. Kompilátory jazyka
C jsou v současné době dostupné pro téměř všechny mikroprocesory, všechny poslední roboty
firmy AREXX Engineering (ASURO, YETI a RP6) mohou být programovány v C.
Popularita jazyka C přinesla obrovské množství dokumentace na internetu a v literatuře, která
umožní začátečníkům snadné studium programovacího jazyka. Ale pamatujte: C je poměrně
složitý jazyk, který se nedá bez předchozích zkušeností naučit během pár dní (takže
nevyhazujte robot z okna, když nefunguje přímo tak, jak jste chtěli).
Základy se dají naštěstí snadno pochopit a programátor může neustále rozvíjet znalosti a
zkušenosti. Vyžaduje to jisté počáteční úsilí. Jazyk C se nemůžete naučit automaticky – na
rozdíl od výuky cizích jazyků.
Ale není to tak obtížné, protože základní vědomosti C se snadno pochopí po studiu jiných
programovacích jazyků. Základní pojetí je často velmi podobné.
Stejně jako ostatní roboty, potřebuje RP6 speciální verzi kompilátoru C z řady GNU Compiler
Collection (zkráceně: GCC). GCC je univerzální kompilační systém, který podporuje širokou
škálu jazyků včetně C, C++, Java, Ada a FORTRAN.
Cílová platforma podporovaná GCC není omezena na AVR. Může se použít pro mnohem větší
systémy a jsou známé desítky cílových platforem.
Nejvýznamnější projekt, který používá GCC je samozřejmě slavný projekt operačního systému
Linux. Většina programů pro Linux může být kompilována pomocí GCC. Proto je možné tento
kompilátor vnímat jako velmi profesionální a stabilní nástroj, který se vyuřívá v několika velkých
společnostech.
Vysvětlení: Pokud se v této příručce odkazuje na “GCC” nemusí to nezbytně znamenat
kompletní sadu kompilačních nástrojů, ale pouze vlastní kompilátor jazyka C. Původní “GCC”
se může používat jako zkratka “GNU C Compiler” – nový význam nutn ě přišel po nástupu
některých dalších programovacích jazyků.
Pokud se chcete dozvědět více o GCC, navštivte oficiální webové stránky GCC:
http://gcc.gnu.org/
GCC přímo nepodporuje cílovou platformu AVR a musí se jí přizpůsobit. Upravená verze GCC
se nazývá AVR-GCC. Distribuce WinAVR je vytvořena jako uživatelská verze pro používání ve
Windows. Uživatelé systému Unix budou mít obvykle vlastní verzi kompilátoru, která je vždy
přizpůsobena konkrétní verzi operačního systému.
59
4.4. C – Zhuštěný kurz pro začátečníky
Tato kapitola podává pouze krátký úvod do programování v jazyce C, probírá
pouze nezbytné minimum problematiky používané v RP6. Tato část by měla
být přehled obecných možností a metod jazyka C. Představíme několik
příkladů a základních principů, ale další zkoumání těchto pojmů je na čtenáři.
Tato kapitola není nic víc než velmi zhuštěný kurz. Kompletní popis
přesahuje možnosti této příručky a vyžaduje mnohem objemnější knihu.
Obchody naštěstí nabízejí velké množství knih, které se zabývají tímto tématem.
Několik1 z nich si můžete volně prohlížet na internetu.
4.4.1. Literatura
Následující knihy a učebnice popisují programování v jazyce C zejména pro PC a další velké
počítače. Několik drobností z těchto učebnic nelze aplikovat na mikroprocesory AVR – jazyk je
sice stejný, ale většina knihoven pro typické využití v PC je pro malé 8bitové mikroprocesory
příliš rozsáhlá. Nejlepším příkladem může být funkce “printf”, která musí být na PC. Funkce
“printf” je dostupná také pro mikroprocesory, ale vyžaduje velký paměťový prostor a spoustu
strojového času. Proto se používání této funkce nepreferuje. Místo toho uvidíte mnohem
efektivnější alternativy.
Některé učebnice jazyka C/online knihy (skutečně jen malý výběr):
Existuje také řada výborných knih – nebudeme zde uvádět jejich seznam, stačí když navštívíte
knihovnu nebo knihkupectví.
Pokud hodláte udělat jen několik pokusů s robotem, nemusíte kupovat knihu. Hlavní část
zkušenosti s programováním můžete kdykoliv nasbírat při "učení na vlastní práci".
Všechny důležité informace můžete najít na uvedených webových stránkách. Ukázkové
programy dostupné na CD RP6 se dají snadno rozšiřovat a ukazují řadu věcí. Učební text v této
příručce je vhodný také pro první pokusy.
Učebnici pro začátečníky zaměřenou na AVR můžete najít například na:
http://www.avrtutor.com/
Tyto webové stránky zmiňují také některé nástroje (programovací zařízení atd.) a další
skutečnosti, které nebudete u RO6 potřebovat. Přesto se na ně můžete podívat.
1
Webové vyhledávání hesla “c tutorial” přinese výsledek v miliónu odkazů. Samozřejmě není
reálné zpracovat takové množství dat, ale mohou být mezi nimi velmi dobré materiály...
60
Další informace můžete najít na domovských stránkách WinAVR respektive v PDF dokumentaci
WinAVR:
Samozřejmě nemůžete přečíst všechny učebnice a knihy. Tento seznam je pouze průvodce na
cestě k dalším informacím. Učebnice se liší velikostí a podrobností, ale zaručeně pomůže
přečtení více než jedné z nich.
Stránky rozsáhlé komunity uživatelů AVR a studnice informací je:
http://www.avrfreaks.net/
Zde můžete najít velmi krásné fórum vyhrazené mikroprocesorům AVR, mnoho obecných
informací, projekty, učební texty a fragmenty zdrojových textů.
4.4.2. První program
Jak se obvykle říká – učení prací je nejúčinnější způsob výuky jazyka C. Na základěčtení a
zvládnutí všeho, co je uvedeno v tomto zhuštěném kurzu, byste se měli pokusit o vlastní
program.
Napřed samozřejmě probereme několik základů, ale držme se myšlenky, která byla řečena
výše. Začněte jednoduchým programem v jazyku C pro RP6:
Pokud jste nikdy neprogramovali v C, pak se vám může “zdrojový text” jevit jako cizí jazyk, ale
základní pojetí je snadné a lehce zvládnutelné.
Předchozí krátký program je již plně funkční program, ale pouze inicializuje mikroprocesor a
napíše text:
"Hello World!" + CR/LF
do sériového rozhraní. Je to typický příklad programování, který můžete najít ve většině knih
(na začátku samozřejmě nebude volání initRobotBase).
Při seznamování s novým programovacím jazykem, můžete tento malý program zkopírovat do
textového editoru a pokusit se o jeho kompilaci.
61
Někdo může namítnout, že lze v adresáři příkladů RP6 nalézt mnohem atraktivnější program
"Hello World", který obsahuje běžící světlo na LED a nějaké další textové výstupy.
Nyní probereme program z výpisu 1 a vysvětlíme jednotlivé řádky.
Řádek 1 - 3: /* A small and simple "Hello World" C Program for the RP6! */
Jedná se o řádky s komentářem a nebudou interpretovány překladačem. Komentáře se
používají k dokumentaci zdrojového textu; začínají /* a končí */.
Dokumentace pomůže porozumět zápisu programu i ostatním lidem, ale bude užitečný pro
přehlednost vlastních programů, když se k nim po letech vrátíte.
Komentáře mohou být jakkoliv dlouhé nebo “okomentované“ části zdrojových textů budou při
testování jinými programy ignorovány bez ztráty původního kódu. Vedle těchto víceřádkových
komentářů, podporuje GCC také jednořádkové komentáře, které začínají “//”. PO “//” bude
libovolný text, až do konce řádku, interpretován jako komentář.
Řádek 5: #include "RP6RobotBaseLib.h"
Tento řádek vloží do programu knihovnu funkcí RP6, která poskytuje řadu užitečných funkcí a
předem definovaných objektů pro nízkou úroveňřízení hardware. Při vkládání knihoven
používáme takzvané hlavičkové soubory (s příponou “*.h”), které informují kompilátor, kde
hledat příslušné funkce. Hlavičkové soubory se používají pro všechny externí odkazy z
dostupných souborů jazyka C. Pečlivě prostudujte obsah RP6RobotBaseLib.h a
RP6RobotBaseLib.c – mohou objasnit základní principy. V kapitole o pre-procesoru probereme
možnosti direktivy “#include” podrobněji.
Řádek 7: int main(void)
Tento řádek definuje nejdůležitější funkci ukázkového programu: funkci main. Zatím se stále
učíte a podrobně poznáváte funkce, ale právě nyní můžete přijmout myšlenku, že celý program
začíná zde.
Řádek 8 a 12:{ }
V jazyku C se mohou pomocí složených závorek '{' a '}' definovat takzvané “bloky”. Bloky
sdružují několik příkazů.
Řádek 9: initRobotBase();
Zde se volá funkce z knihovny RP6Library. Tato funkce bude inicializovat mikroprocesor AVR a
konfigurovat AVR hardwarové moduly. Většina funkcí napsaných pro mikroprocesor nebude
fungovat správně, pokud neprovedeme inicializaci pomocí funkce initRobotBase(),
nezapomeňte vždy zavolat tuto funkci na začátku programu.
Řádek 10: writeString("Hello World!\n");
Tento řádek volá funkci "writeString" z knihovny RP6Library s parametrem řetězce "Hello
World!\n". Funkce provede výstup textu do sériového rozhraní.
62
Řádek 11: return 0;
Zde končí náš program. Opouštíme funkci main a vracíme hodnotu nula. Návratový kód se
obvykle používá v rozsáhlých systémech (s operačním systémem) jako chybový kód nebo
podobný význam, ale není potřeba v malých mikroprocesorových systémech. Tuto návratovou
hodnotu přidáváme při návratu proto, abychom splnili konvence standardního jazyka C (a jak
uvidíte později, programy pro mikroprocesory nikdy nekončí).
Tento krátký program vám dal první zážitek z programování v jazyce C. Než přejdete k dalším
ukázkovým programům, probereme některé další základy jazyka.
4.4.3. Základy jazyka C
Jak již bylo uvedeno dříve, je program jazyka C napsaný v čistém ASCII textu (ASCII =
americký standard kódování pro předávání informací). Jazyk C je přísně case sensitivní a
pokud se funkce jmenuje "MyFavouriteFunction", budete muset při volání funkce použít přesný
tvar tohoto názvu! Zápis volání funkce "myfavouritefunction" nebude akceptován!
Mezi všechny příkazy a symboly můžete vložit libovolný počet mezer, tabulátorů a ukončení řádků aniž by došlo k zásahu do syntaxe programu. Jak jste mohli vidět v ukázkovém
programu, byly pro zlepšení čitelnosti příkazy členěné pomocí tabulátorů. Členění zdrojového
textu není povinné! Program od řádku 7 můžete vměstnat do jediného řádku tj.:
Je to shodný program, ale text je poněkud matoucí. Nicméně jsme odstranili pouze tabulátory,
mezery a konce řádků! Kompilátor se vůbec nestará o formátovací styl zápisu! Samozřejmě
budeme potřebovat mezeru jako oddělovač mezi klíčovými slovy a proměnnými, jako je třeba
"int" a "main" – a dále se nesmí používat zalomení řádku mezi dvěma uvozovkami (alespoň ne
bez escape sekvence)!
Složené závorky { } nám umožňují kombinovat několik výrazů a příkazů do bloků, které jsou
nezbytné pro sestavení funkce, podmíněných výrazů a cyklů.
Každý výraz musí být ukončen středníkem ';' aby kompilátor rozpoznal jednotlivé příkazy.
Dříve než začnete psát a kopírovat fragmenty programu z tohoto tutoriálu, chtěli bychom vám
dát důležitou radu: většina začátečníků snadno zapomene ukončit příkazy středníkem – nebo
použijte středník na nesprávných místech a pak se diví, že se program chová podivně!
Zapomenutý středník v některé části programu může mít za následek velké množství
chybových zpráv – i když skutečná chyba je pouze jediný omyl. Ve skutečnosti, první chybová
zpráva s největší pravděpodobností, identifikuje pravý výskyt chyby.
K běžným chybám začátečníků patří zapomenuté uzavření jedné z několika dvojic závorek
nebo špatná syntaxe příkazů. Překladače neakceptují žádné syntaktické chyby! Chvíli trvá, než
si zvyknete na všechna tato pravidel, ale metodou pokusů a omylu se budete rychle učit.
Každý program jazyka C začíná hlavní funkcí. V podstatě se budou všechny následující příkazy
postupně provádět krok za krokem od začátku do konce.
Mikroprocesor AVR není schopen zpracovat několik příkazů současně! Toto omezení
nezpůsobuje žádné problémy. Budeme mít dostatek možností, jak řídit tok programu a skákání
do jiných částí programu (toto bude projednáno v následující kapitole).
63
4.4.4. Proměnné
Typ Alternativa
Rozsah hodnot
Poznámky
Nejprve se podíváme na ukládání a čtení dat v paměti RAM. Přístup k datům se provádí pomocí
proměnných. Jazyk C zná pro proměnné několik datových typů. V podstatě budeme používat 8,
16 nebo 32 bitové celočíselné datové typy, které se mohou používat ve tvaru se znaménkem
nebo bez znaménka. Příslušný rozsah hodnot určuje potřebný počet bitů, které se musí vyhradit
pro uložení proměnné.
V programech pro RP6 budeme používat následující datové typy:
signed char int8_t 8 bitů: -128...+127 1 Byte
char uint8_t 8 bitů: 0..255 '' bez znaménka
int int16_t 16 bitů: -32768...+32767 2 Byte
unsigned int uint16_t 16 bitů: 0..65535 '' bez znaménka
long int32_t 32 bitů: –2147483648...+2147483647 4 Byte
unsinged long uint32_t 32 bitů: 0...4294967295 '' bez znaménka
Nedostatečná standardizace dovoluje definici několika různých velikosti stejného datového
typu. Speciálně to platí pro datový typ "int": pro naše mikroprocesory je velikost 16 bitů, ale u
moderních PC je to 32 bitů. Z tohoto důvodu preferujeme moderní standardní definici: int16_t.
Taková definice datového typu je vždy stejná: [u] int N _t
kde: u : unsigned
int: integer
N : počet bitů tj. 8, 16, 32 nebo 64
_t : t je označení pro ”typ”, které zabrání kolizi s jinými symboly
Na malém mikroprocesoru se bude pečlivě počítat každý jednotlivý byte a jednoznačná definice
datových typů pomůže při sledování zabrané paměti. Podle číslice 16 v názvu datového typu
můžete okamžitě rozpoznat 16-bitový datový typ. Písmeno "u" na začátku označí datový typ
jako "bez znaménka".
U běžných (klasických) datových typů se pro typ “signed char” používá
zkrácené označení “signed” viz předchozí tabulka, stejně tak int a long
definují typy se znaménkem a char je bez znaménka, i když to není
explicitně napsáno. Důvod pro tyto definice je AVR-GCC varianta
kompilátoru, které se používá ve většině případů.
Datový typ “char” se bude používat pro řetězce, protože definice "uint8_t"
může vést k nějaké nekompatibilitě se standardními knihovnami jazyka C a
"char" je jasný a logický název pro znak nebo řetězec. Podrobnosti o tomto tématu probereme
v kapitole RP6Library při textových výstupech přes sériové rozhraní.
Nyní prostě vezmeme na vědomí: pro znaky a řetězce budeme vždy používat typ "char",
respektive uintN_t nebo intN_t pro celá čísla!
64
Aby bylo možné používat proměnné v programu, musíme je nejdříve deklarovat definicí
datového typu, názvu a případně počáteční hodnoty této proměnné. Název musí začínat
písmenem (včetně podtržítka "_"), a mohou obsahovat čísla. Nicméně konvence pro názvy
proměnných vylučuje používání velkého množství speciálních znaků, tj. “äöüß#'[]23|*+-
.,<>%&/(){}$§=´°?!^”.
V názvech proměnných se rozlišují malá a velká písmena, to znamená, že názvy aBc a abC
jsou různé proměnné! Programátoři tradičně používají malá písmena – alespoň pro úvodní
znaky proměnných.
Následující klíčová slova jsou již vyhrazená a NEMOHOU se používat jako názvy proměnných,
názvy funkcí nebo jiných symbolů:
auto default float long sizeof union
break do for register static unsigned
case double goto return struct void
char else if short switch volatile
const enum int signed typedef while
continue extern
Dále se v jazyce C používají typy float a double určené pro čísla s plovoucí desetinnou čárkou,
ale na malých typech mikroprocesorů AVR se použití těchto datových typů raději vyhneme.
Desetinná čísla jsou velmi náročná na výpočetní čas i paměť a obvykle si perfektně vystačíme s
celými čísly. Většina programů pro RP6 nebude vyžadovat čísla s plovoucí řádovou čárkou.
Deklarace proměnných je extremně jednoduchá a lze ji předvést na deklaraci proměnné
s názvem x:
char x;
Po vlastní deklaraci je proměnná x na následujících řádcích platná a může se použít například
k přiřazení hodnoty 10:
x = 10;
Alternativně můžeme přiřadit hodnotu do další proměnné y přímo v deklaraci:
char y = 53;
Základní aritmetické operace, které můžeme používat jsou obvykle:
signed char z; // pamatujte prosím, že „signed” je před char!
z = x + y; // z nabývá hodnotu z = x + y = 10 + 53 = 63
z = x – y; // z nabývá hodnotu z = 10 – 53 = -43
z = 10 + 1 + 2 – 5; // z = 8
z = 2 * x; // z = 2 * 10 = 20
z = x / 2; // z = 10 / 2 = 5
Programovací jazyk C také poskytuje nějaké užitečné zkratky:
z += 10; // odpovídá: z = z + 10; to v tomto případě znamená z = 15
z *= 2; // z = z * 2 = 30
z -= 6; // z = z - 6 = 24
z /= 4; // z = z / 4 = 8
65
z++; // zkratka pro z = z + 1; to znamená, že z je nyní 9
z++; // z = 10 // z++ se nazývá „inkrementace z”
z++; // z = 11 ...
z--; // z = 10 // z—- se nazývá „dekrementace z”
z--; // z = 9
z--; // z = 8 ...
V předchozím příkladu jsme použili datový typ “char”. V programech pro RP6 však budeme ve
většině případů preferovat standardní datové typy.
V tomto příkladu jeint8_t x;
shodné sesigned char x;
a takéuint8_t x;
je shodné sunsigned char x; // respektive „char” se skutečně
// používá pouze pro znaky jako
// znaménkový typ, protože je to tak
// nastaveno v kompilátoru.
4.4.5. Podmíněné příkazy
Podmíněné příkazy, které používají konstrukci "if-else", hrají důležitou roli v toku programu. Tyto
výrazy nám umožňují zjistit, zda je podmínka je pravdivá či nepravdivá a rozhodnout, zda se
konkrétní část programu provede nebo ne.
Malý příklad:
Deklarace na řádku 1 definuje 8-bitovou proměnnou x přiřazuje jí hodnotu 10. Podmínka if na řádku 2 bude úspěšná, pokud je x rovno 10. Tato podmínka bude zřejmě vždy pravdivá a
program zpracuje podmíněný blok příkazů. Tento blok vytvoří výstup “x je rovno 10!”. Pokud
naopak proměnnou x inicializujeme hodnotou 231, program nevytvoří žádný výstup!
Obecně bude mít podmínka if vždy následující syntaxi:
Pomocí jednoduché angličtiny můžeme také číst: “pokud X pak dělej Y jinak dělej Z”.
66
Další příklad:
Proměnná “myFavoriteVariable” je nastavena na hodnotu 16447, která způsobí výsledek ve
formě výstupu “myFavoriteVariable is greater than or equal to 16000!“. V tomto příkladu je
obsloužena i nepravdivá část podmíněného příkazu, kdy se provede větvení else.
Jak můžete vidět na názvu proměnné “myFavoriteVariable”, můžete pro název proměnné použít
cokoliv až do délky, kterou povolují konvence jazyka C.
Pomocí konstrukce if – then – else lze vytvořit mnohem složitější podmíněné větvení programu:
V podmíněných příkazech se mohou používat následující porovnávací operátory:
x == y
x != y
x < y
x <= y
x > y
x >= y
Logické porovnání pro shodu
Logické porovnání pro nerovnost
Logické porovnání pro “menší než“
Logické porovnání pro “menší než nebo rovno“
Logické porovnání pro “větší než“
Logické porovnání pro “větší než nebo rovno“
Programovací jazyk dále nabízí logická spojení:
x && y
x || y
!x
pravda, pokud je pravdivý výraz x a zároveň je pravdivý výraz y
pravda, pokud je pravdivý výraz x nebo výraz y
pravd, pokud je výraz x nepravdivý
Tyto struktury můžeme libovolně spojovat, kombinovat a sdružovat pomocí logických spojení a
libovolného počtu dvojic závorek:
Předchozí výpis podmíněného příkazu je pravdivý, pokud se x nerovná nule (x != 0) A
ZÁROVEŇ x není větší než 10 (!(x > 10)) NEBO pokud je y větší nebo rovno 200 (y >= 200).
Pokud je to nezbytné můžeme přidávat libovolný počet dalších podmínek, dokud výraz nesplní
všechny potřeby programu.
67
4.4.6. Switch – Case
Často budeme muset porovnávat proměnnou s velkým množstvím různých hodnot a na základě
výsledku porovnání rozhodnout o dalším provádění programu. Samozřejmě můžeme použít
větší počet podmíněných příkazů if – then – else, ale programovací jazyk C nabízí mnohem
elegantnější metodu pomocí konstrukce switch – else.
Malý příklad:
Tento úryvek programu funguje docela podobně jako předchozí příklad podmíněné struktury
“ifelse – if –else – if – else...”, ale nyní místo ní použijeme větvení case. Je zde jeden základní
rozdíl – pokud je jedna z podmínek pravdivá, provedou se všechny následující případy větvení
case. Pokud nechcete takové chování – jednoduše přidáte instrukci “break” a v tomto místě se
opustí konstrukce switch – case.
Výstup předchozího příkladu by měl vypadat takto (pří výchozí hodnotě x = 3):
x=3
Hello
over
there!
Nastavením x = 1 bude výsledný výstup “x=1\n” a při x = 5 bude výsledek:
over
there!
Nyní jste již možná pochopili, že instrukce “break” ukončí větvení case, program brouzdá přes
následující příkazy, dokud se neobjeví konec konstrukce switch nebo další “break”.
Pokud nastavíme hodnotu x = 7, nebude žádné větvení pravdivé. Program nyní provede větvení
“default”, které má za výsledek výstup: "The value of x is something else!\n".
Textový výstup je samozřejmě pouhý příklad, reálné programy však mohou tyto konstrukce
používat pro vytvoření řady odlišných pohybů robota. Několik ukázkových programů na použití
konstrukce switch – case je uvedeno při realizaci konečných stavových automatů
k implementaci jednoduchého chování základní jednotky robotu.
68
4.4.7. Cykly
Pokud se mají operace provádět opakovaně, několikrát za sebou, potřebujeme k tomu cykly.
Nechte si na následujícím příkladu předvést základní princip:
Úryvek programu očividně obsahuje cyklus s podmínkou “while”, který generuje posloupnost:
“i=0\n”, “i=1\n”, “i=2\n”, ... “i=9\n”. Blok příkazů uzavřený mezi složenými závorkami, který
následuje za podmínkou “while(i < 10)” v hlavičce cyklu, se bude opakovat tak dlouho, dokud
bude podmínka pravdivá. Obyčejnou angličtinou můžeme zápis číst jako: „Opakuj následující
blok tak dlouho, dokud je i menší než 10“ . Jelikož je počáteční hodnota i = 0 a k inkrementaci
dochází v každém průchodu cyklem, provede program tělo cyklu 10 krát a výstupní číslo bude
od 0 do 9. V hlavičce cyklu můžeme používat podmíněné výrazy stejně jako v podmínce if.
Místo cyklu while můžeme použít cyklus “for”, který poskytuje stejnou funkčnost, ale nabízí
rozšířené možnosti definice v hlavičce cyklu.
Ukázkový fragment programu může ilustrovat cyklus for:
Tento cyklus for bude generovat identický výstup jako předchozí cyklus while. V hlavičce cyklu
můžeme implementovat několik dalších věcí.
Základní cyklus for má následující strukturu:
Při práci s mikroprocesory budete často potřebovat nekonečné cykly, které se virtuálně mohou
opakovat stále dokola. Ve skutečnosti většina mikroprocesorových programů obsahuje pouze
jediný nekonečný cyklus – který uvede program pomocí dobře známých stavů pro ukončení
pravidelného průběhu programu nebo neustále provádí činnost, dokud se zařízení nevypne.
69
Nekonečná smyčka se jednoduše vytvoří pomocí cyklu while nebo for:
while(true) { }
nebo
for(;;) { }
V obou případech se bude blok příkazů provádět “neustále“ (respektive dokud mikroprocesor
nepřijme nějaký externí signál reset nebo program neukončí smyčku zpracováním příkazu
“break”).
Pro úplnost přehled dokončíme popisem cyklu “do – while”, který se může považovat za
alternativu standardního cyklu “while”. Na rozdíl od cyklu “while“, provede cyklus “do – while” na
začátku blok příkazů i když není splněna podmínka cyklu.
Struktura tohoto cyklu je následující:
do
{
<blok příkazů>
}
while(<podmínka>);
Nezapomeňte, prosím na ukončovací středník! (Standardní cyklus while se samozřejmě
středníkem neukončuje!)
4.4.8. Funkce
Funkce jsou klíčovým prvkem programovacích jazyků. V předchozích kapitolách jsme již poznali
a dokonce i používali funkce, například “writeString”, “writeInteger” a samozřejmě hlavní funkci
– main.
Funkce jsou extrémně užitečné při používání stejných programových posloupností na několika
místech programu – třeba funkce pro výstup textu, které jsme používali v předchozích
kapitolách. Kopírování stejného kódu programu do všech potřebných míst může být velmi
nepraktické. Tímto způsobem navíc zbytečně zabíráme větší prostor paměti programu. Použití
jedné samostatné funkce nám umožní modifikovat programové moduly na jediném centrálním
místě místo modifikace velkého množství kopií. Používání funkcí zjednoduší tok programu a
pomáhá udržet přehledný zdrojový text.
Proto jazyk C umožňuje kombinovat programové posloupnosti do funkcí, které vždy musí mít
následující strukturu:
Princip si vysvětlíme na malém příkladu se dvěma jednoduchými funkcemi a již známou hlavní
funkcí:
Program zobrazí na výstupním zařízení následující text:
[Funkce 1]
[Funkce 2 – něco jiného]
[Funkce 1]
[Funkce 2 – něco jiného]
[Funkce 2 – něco jiného]
Hlavní funkce obsluhuje vstupní bod a libovolný program v jazyku C bude začínat voláním této
funkce. Proto MUSÍ každý program jazyka C poskytovat hlavní funkci “main“.
V předchozím příkladu hlavní funkce začínala voláním funkce initRobotBase z knihovny
RP6Library, která inicializuje hardwarové prostředky mikroprocesoru. Základem funkce
initRobotBase je struktura velmi podobná dvěma funkcím v tomto příkladu. V hlavní funkci
programu se několikrát volají dvě předem definované funkce a provádí se programový kód
těchto funkcí.
Vedle definice funkcí popsané v předchozím příkladu, můžeme také používat parametry a
návratové hodnoty. V příkladu se používá jako parametr i návratová hodnota výraz “void”, který
znamená, že se zde nepoužívá žádný parametr nebo návratová hodnota. Parametr “void” vždy
označuje funkce bez návratových hodnot respektive bez parametrů.
Ve funkci můžeme definovat velký počet parametrů a jednotlivé parametry se oddělují čárkou.
71
Příklad demonstruje základní princip:
Výstup:
[Touto funkcí byla zpracována následující hodnota: 199]
[Touto funkcí byla zpracována následující hodnota: 10]
[Touto funkcí byla zpracována následující hodnota: 255]
[CALC]
[Touto funkcí byla zpracována následující hodnota: 40]
Knihovna RP6 Library poskytuje celou řadu funkcí. Krátký pohled na kód několika modulů
s ukázkových programů objasní zkladní principy vývoje programů s podporou těchto funkcí.
72
4.4.9. Pole, řetězce, ukazatele...
Na vysvětlení čeká ještě velké množství dalších zajímavostí programovacího jazyka C, ale
podrobnosti necháme na studium dostupné literatury!
Většina ukázkových programů je srozumitelná bez dalšího studování. Ve zbývající části tohoto
stručného kurzu popíšeme pouze krátký přehled několika příkladů a konceptů, které
samozřejmě nejsou příliš podrobné.
Nejprve probereme pole. Pole vám umožňuje uložit předem definovaný počet prvků se stejným
datovým typem. Následující vzorek pole se může použít k uložení 10 byte:
uint8_t myFavouriteArray[10];
Na jediném řádku jsme deklarovali 10 proměnných se stejným datovým typem, které mohou být
adresovány indexem:
Každý prvek pole může být chápán jako standardní proměnná.
Pozor: index vždy začíná od 0 a deklarace pole obsahuje n prvků – z toho plyne rozsah indexu
od 0 do n-1! Ukázkové pole poskytuje 10 prvků s indexy od 0 do 9.
Pole jsou velmi užitečná pro ukládání většího počtu proměnných se stejným datovým typem a
může se s nimi snadno manipulovat v cyklech:
uint8_t i;
for(i = 0; i < 10; i++)
writeInteger(myFavouriteArray[i],DEC);
Předchozí úryvek kódu vytvoří výstup všech prvků pole (v tomto případě bez oddělovačů a
odsazení řádků). Velmi podobný cyklus se může použít pro naplnění pole hodnotami.
V jazyku C jsou řetězce obslouženy velmi jednoduchým konceptem. Standardní řetězce budou
tvořit ASCII znaky, které pro každý znak zabírají jeden byte. Nyní se v jazyku C řetězce
jednoduše definují jako pole, která můžeme chápat jako pole znaků. Tento koncept umožňuje
definovat a ukládat do paměti předem sestavený řetězec "abcdefghijklmno":
uint8_t aSetOfCharacters[16] = "abcdefghijklmno";
Dříve probrané ukázkové programy vždy obsahovaly několik funkcí UART pro výstup řetězců
přes sériové rozhraní. Základem těchto řetězců jsou pole. Nepracuje se však s celým polem.
Tyto funkce se budou pouze vázat na adresu prvního prvku v poli. Proměnná, která obsahuje
adresu tohoto prvního prvku, se nazývá “ukazatel”. Můžeme vytvořit ukazatel na požadovaný
prvek pole zapsáním &MyFavouriteArray[x], kde x odkazuje na indexovaný prvek. Několik
takových výrazů můžeme najít v ukázkových programech, tj.:
Na této úrovni však nemusíme zcela zvládnout tento koncept, přesto porozumíte většině
ukázkových programů nebo psaní vlastních programu.
73
4.4.10. Tok programu a přerušení
Jak bylo probráno dříve, program bude zpracovávat základní instrukce postupně shora dolů.
Vedle tohoto standardního chování existuje řízení běhu programu pomocí podmíněných skoků,
cyklů a funkcí.
Mimo těchto obvyklých prostředků existují takzvaná “přerušení”. Tato přerušení může generovat
několik hardwarových modulů (časovač, TWI, UART, externí přerušení atd.) a vyžadují
okamžitou pozornost od mikroprocesoru. Správnou odezvu mikroprocesor zajistí opuštěním
normálního běhu programu a skokem na takzvanou rutinu pro obsluhu přerušení (ISR). Tato
reakce na přerušení je virtuálně nezávislá na toku programu. Nemějte obavy! Všechny potřebné
ISR byly připraveny do knihovny RP6Library a postarají se o všechny nezbytné události.
Nemusíte implementovat vlastní obsluhu přerušení. V této části rychle probereme všechny
základní věci, které musíte znát o těchto speciálních funkcích přerušení.
Základní struktura ISR je následující:
ISR ( <vektor přerušení> )
{
<blok příkazů>
}
tj. pro levý enkodér, připojený na externí přerušení 0:
ISR (INT0_vect)
{
// Na každé hraně signálu provedeme zvýšení dvou čítačů:
mleft_dist++; // ujetá vzdálenost
mleft_counter++; // měření rychlosti
}
Tyto ISR obsluhy přerušení nemůžeme volat přímo! Volání obslužné ISR se provádí
automaticky a může se vyskytnout kdykoliv! Kdykoliv a v libovolné části programu může volání
obsluhy přerušení zastavit normální běh programu (s výjimkou vlastní rutiny pro obsluhu
přerušení nebo v případě zakázaného přerušení). Při události přerušení se provádí příslušná
funkce ISR a po skončení ISR bude pokračovat provádění programu od místa, kde byl normální
běh opuštěn. Toto chování vyžaduje zařazení všech časově kritických částí programu do funkcí
ISR (nebo zákaz přerušení na krátký okamžik). Pokud se zpoždění nezpracuje jako událost
přerušení, mohou se prodloužit periody zpoždění, které mikroprocesor počítá pomocí
instrukčních cyklů.
Knihovna RP6Library používá přerušení ke generování modulovaného signálu 36kHz pro
infračervené snímače a IR komunikaci. Dále se používají pro dekódování RC5, funkce časování
a zpoždění, měření z enkodérů, obsluhu modulu TWI (sběrnice I2C) a několik dalších aplikací.
74
4.4.11. Preprocesor jazyka C
V této kapitole stručně probereme preprocesor jazyka C, který se již používal v předchozích
ukázkových programech na řádku: #include "RP6RobotBaseLib.h"!
Preprocesor vyhodnotí tento příkaz ještě před spuštěním kompilačního procesu GCC.
Příkazová řádka #include "file" vloží obsah specifikovaného souboru do vkládaného
místa. Náš ukázkový program vloží soubor RP6BaseLibrary.h, který poskytuje definice všech
uživatelsky dostupných funkcí a řídí zpracování překladu. Možnosti preprocesoru mají však
několik dalších voleb a umožňují definici konstant (které mohou obshovat pevné hodnoty
systému):
#define THIS_IS_A_CONSTANT 123
Tento výraz definuje textovou konstantu “THIS_IS_A_CONSTANT“ s hodnotou “123”.
Preprocesor jednoduše nahradí všechny odkazy definovanou hodnotou. Konstanty mohou být
chápány jako náhrada textu! V následujícím výrazu:
writeInteger(THIS_IS_A_CONSTANT,DEC);
bude “THIS_IS_A_CONSTANT” nahrazen hodnotou “123” a shodně:
writeInteger(123,DEC);
(mimochodem: parametr “DEC” ve funkci writeInteger je jen další konstanta – v tomto případě
definiční konstanta číselného základu hodnoty 10 – pro desítkový číselný systém).
Preprocesor také ovládá jednoduché podmínky if:
Textový výstup se vytvoří pouze při definici “DEBUG” (nemusíte do ní přiřazovat hodnotu –
stačí jednoduše definovat DEBUG). To je užitečné při aktivaci několika textových výstupů pro
ladění během vývoje programu, zatímco při normálním překladu můžete odstranit všechny
pomocné textové výstupy úpravou jediné řádky. Bez definice DEBUG v předchozím ukázkovém
programu zabrání preprocesor průchodu obsahu programového řádku 7 do kompilátoru.
Knihovna RP6Library také nabízí makra, které se definují pomocí výrazu #define. Makra
umožňují zpracování parametrů podobně jako funkce. Následující příklad ukazuje typickou
definici makra:
Tato definice vám umožňuje volat makro stejně jako normální funkci (tj.
setStopwatch1(100);).
Důležitý detail: za definicemi preprocesoru se obvykle nevkládá středník!
75
4.5. Makefile
Nástroj “Make“ zjednodušuje proces kompilace automatickým zpracováním velkého počtu
činností, nutných pro kompilaci programů v jazyce C. Automatizované zpracování je definováno
v takzvaném “Makefile“, který obsahuje všechny nezbytné posloupnosti příkazů a informace pro
zpracování kompilace projektu. Tyto makefile poskytujeme pro všechny ukázkové projekty RP6,
ale samozřejmě můžete vytvořit libovolné makefile pro vlastní projekty. Nebudeme podrobně
probírat strukturu souborů makefile, můžete to nastudovat v příslušné příručce. U všech
projektů RP6 se můžete soustředit na následující čtyři přístupy. Další aspekty nejsou pro
začátečníky důležité a můžete je ignorovat.
Naše makefile obsahují mezi příkazovými řádky komentáře. Komentáře v makefile začínají “#” a
budou během zpracování ignorovány.
Ukázkové projekty RP6 poskytují přizpůsobené makefile připravené pro použití a nebudete je
muset měnit, dokud neplánujete vkládání nových zdrojových soubor ů jazyka C do struktury
projektu nebo začnete měnit názvy souborů.
Tvorba makefile začíná specifikací názvu souboru programu, který obsahuje hlavní funkci
v řádku “TARGET”. Název musíte specifikovat bez přípony, nikdy sem prosím nepřidávejte
příponu “.c”! Řadu dalších přípon budete muset bohužel specifikovat a nejlepší bude
prostudovat detaily komentářů u existujících příkladů makefile!
Druhý vstup “RP6_LIB_PATH” umožňuje specifikovat cestu ke knihovním souborům
RP6Library. Definujte, prosím úplnou cestu tj. například “../RP6lib” or “../../RP6lib” (in which “../”
to znamená “o jednu adresářovou úroveň výš”).
Třetí vstup RP6_LIB_PATH_OTHERS se používá ke specifikaci všech dalších adresářů.
Knihovna RP6Library je rozdělena do řady dílčích adresářů a ve svém projektu musíte definovat
cesty ke všem potřebným adresářům.
Na závěr definujete všechny zdrojové soubory jazyka C ve vstupu “SRC” (nevkládejte žádné
hlavičkové soubory s příponou “.h”, které se automaticky vyhledají ve všech specifikovaných
adresářích!), které se používají pod souborem s hlavní funkcí. Dále musíte specifikovat všechny
použité knihovní soubory RP6Library.
Co znamená výraz $(RP6_LIB_PATH)? Dobrá, je to způsob jak používat proměnné v
makefiles! Již jsme definovali “proměnnou” s názvem RP6_LIB_PATH. Jakmile je proměnná
deklarována, může se úspěšně použít obsah proměnné pomocí zápisu $(<proměnná>) v textu
makefile. Tato užitečná vlastnost výrazně zmírní složitost zápisu makefile...
Obvykle nemusíte v RP6 makefile nic měnit. Když se chcete podívat na další informace o této
problematice můžete prostudovat příručku:
http://www.gnu.org/software/make/manual/
76
4.6. Knihovna funkcí RP6 (RP6Library)
Knihovna funkcí RP6 (zkráceně RP6Library nebo RP6Lib) poskytuje velké množství lowlevel
funkcí pro ovládání hardware RP6. S touto knihovnou funkcí se obvykle nemusíte zabývat
všemi detailními parametry hardware robotu a mikroprocesoru. Abyste mohli programovat robot
RP6, nemusíte samozřejmě přečíst 300 stránek katalogového popisu mikroprocesoru
ATmega32. Některé důležité části katalogového listu však prostudovat musíte, pro správné
pochopení knihovny RP6Library.
Ve skutečnosti jsme se úmyslně vyhnuli perfektnímu vyladění všech funkcí RP6Library,
abychom nechali nějakou práci také pro vás! Budete vyzvání k přidání několika funkcí a
k optimalizaci existujících! Pokládejte knihovnu RP6Library jako dobrý výchozí bod, ale ne jako
optimální řešení.
Tato kapitola probírá nejdůležitější funkce a ukazuje krátké příklady. Pokud vás zajímají další
podrobnosti, můžete si přečíst komentáře v knihovních souborech a prostudovat funkce a jejich
použití v příkladech.
4.6.1. Inicializace mikroprocesoru
void initRobotBase(void)
Hlavní funkční blok VŽDY začíná voláním této funkce! Inicializuje hardwarové moduly
mikroprocesoru. Pokud program neprovede inicializaci, nemusí mikroprocesor fungovat
správně. Částečně se hardwarové moduly inicializují bootloaderem, ale ne všechny.
Příklad:
Principielně by měl program pro RP6 vypadat podobně. Nekonečná smyčka na řádku 9
funguje jako předpokládaný konec programu. Přeskočení nekonečné smyčky může
vyvolat neočekávané chování programu!
Připomeňme si opět princip nekonečné smyčky: obvykle se bude nekonečná smyčka používat
k provádění vlastního kódu programu. Takže odstraníte středník na řádku 9 a nahradíte ho
blokem příkazů (uzavřeným ve složených závorkách). Na řádcích před hlavní funkcí můžete
definovat vlastní funkce (v tomto případě na řádku 2) a pak lze tyto funkce volat z libovolného
místa hlavní smyčky.
77
4.6.2. Funkce UART (sériové rozhraní)
V předchozím rychlokurzu jazyka C již bylo použito několik funkcí z knihovny RP6Library,
například funkce UART. Tyto funkce umožňují přenášení textových zpráv přes sériové rozhraní
robotu do a z PC (nebo jiného mikroprocesoru).
4.6.2.1. Vysílání dat
void writeChar(char ch)
Tato funkce vysílá jeden 8-bitový ASCII znak přes sériové rozhraní.
Použití je jednoduché:
writeChar('A');
writeChar('B');
writeChar('C');
To by mělo vytvořit výstup “ABC”. Funkce může také přenášet přímo ASCII kódy tj.:
writeChar(65);
writeChar(66);
writeChar(67);
Výsledkem by měl být výstup “ABC”, protože libovolný ASCII znak může být reprezentován
číslem. Dekadické číslo 65 odpovídá znaku 'A'. Speciální komunikační software může znaky interpretovat přímo v binární hodnotě.
Tyto funkce jsou důležité pro ladění programů, protože umožňují vysílání libovolné textové
zprávy na PC. Užitečné mohou být samozřejmě také pro přenos dat.
Nyní si vysvětlíme rozdíl mezi writeString a writeString_P. S funkcí writeString_P se bude
pracovat pouze, pokud je text uložen v paměti FLASH-ROM (paměť programu) a funkce bude
na výstup postupně vyčítat řetězec z FLASH-ROM. Naproti tomu funkce writeString bude brát
řetězec uložený do paměti RAM. Pamatujte, že mikroprocesor má relativně malou paměť RAM
(2 kB). Takže, když chcete na výstup poslat pevný textový řetězec, preferujte použití funkce
writeString_P. Samozřejmě pro přenos dynamických dat, která jsou nějak dostupná v RAM, se
musí použít writeString.
Používání příslušné funkce je stejně jednoduché jako používání writeChar (pozor místo
apostrofu se používají uvozovky):
writeString("ABCDEFG");
vytvoří výstup “ABCDEFG”, ale jak bylo uvedeno výše, řetězec se nejdříve uloží do paměti
POM a před vysíláním se přesune do RAM.
writeString_P("ABCDEFG");
vytvoří stejný výstup “ABCDEFG”, ale text nebude zabírat prostor v paměti RAM!
Tuto funkci můžete použít kdykoliv budete potřebovat výstup textu s definovanou délkou nebo
posunem.
Například:
writeStringLength("ABCDEFG", 3, 1);
výstup: “BCD”
writeStringLength("ABCDEFG", 2, 4);
výstup: “EF”
Tato funkce však zabírá místo v paměti RAM pro uložení řetězce a je určena pro zpracování
dynamických textů. Tuto funkci například používá writeIntegerLength.
void writeInteger(int16_t number, uint8_t base);
Tato velmi užitečná funkce vytvoří výstup celočíselných hodnot ve tvaru ASCII testu.
Z předchozích příkladů si pamatujeme, že writeChar(65) předá na výstup znak 'A' místo čísla
65...
Proto potřebujeme funkci, které vytvoří výstup čísel ve tvaru textových řetězců.
Příklad:
writeInteger(139, DEC);
výstup: “139”
writeInteger(25532, DEC);
výstup: “25532”
Funkce umožňuje výstup čísel z celého rozsahu 16-bitových celých čísel v rozsahu od -32768
do 32767. Pokud však předpokládáte použití čísel, které překračují tyto meze, musíte funkci
modifikovat nebo vytvořit zvláštní funkci.
Nyní se můžeme zamyslet, proč se používá druhý parametr “DEC”. Odpověď je skutečně
jednoduchá: tento parametr řídí výstupní formát čísla. Místo DEC - dekadický (základ 10)
můžeme samozřejmě používat několik alternativních výstupních formátů například binární (BIN,
základ 2), osmičkový (OCT, základ 8) nebo hexadecimální (HEX, základ 16).
Několik příkladů:
writeInteger(255, DEC);
výstup: “255”
writeInteger(255, HEX);
výstup: “FF”
writeInteger(255, OCT);
výstup: “377”
writeInteger(255, BIN);
výstup: “11111111”
Tyto funkce jsou pro řadu aplikací neobyčejně užitečné. Speciálně pro výstup celých čísel ve
formátu HEX nebo BIN, protože tyto formáty umožňují přímé sledování nastavení jednotlivých
bitů.
Tato funkce je jiná varianta writeInteger, která umožňuje definovat počet (délku) zobrazovaných
číslic, Když je délka čísla pod definovaným počtem, funkce přidá úvodní nuly. Když délka
přesahuje definovaný počet, funkce zobrazí pouze definovaný počet číslic.
Jako obvykle ukážeme chování funkce na několika příkladech:
writeIntegerLength(2340, DEC, 5);
výstup: “02340”
writeIntegerLength(2340, DEC, 8);
výstup: “00002340”
writeIntegerLength(2340, DEC, 2);
výstup: “40”
writeIntegerLength(254, BIN, 12);
výstup: “000011111110”
4.6.2.2. Příjem dat
Příjem dat přes sériové rozhraní je zcela založeno na přerušení. Přijímaná data se automaticky
na pozadí ukládají do takzvaného kruhového registru.
Jednoduchý příjem byte/znaku lze z registru číst pomocí funkce:
char readChar(void)
Funkce vrací následující volný znak v bufferu a po přečtení ho z bufferu zruší.
Pokud je kruhový registr prázdný, funkce vrátí 0. Velikost bufferu můžete kontrolovat pomocí
funkce:
uint8_t getBufferLength(void)
před voláním funkce readChar, jinak nemůžete rozhodnout, zda je 0 skutečnou hodnotou dat
nebo ne.
Skupina znaků se může postupně číst z bufferu pomocí
V parametru této funkce musíte předat ukazatel na pole a počet přijímaných znaků. Funkce
vrací skutečný počet znaků zapsaných do pole. To je užitečné, pokud buffer obsahuje méně
znaků, než je specifikováno parametrem numberOfChars.
Když je buffer úplně plný, nově přijatá data NEPŘEPÍŠOU data v bufferu. Místo toho se nastaví
příznak (UART_BUFFER_OVERFLOW) ve stavové proměnné (uart_status), který signalizuje
přetečení bufferu.
Programy byste měli psát tak, aby se tato situace nenastala. Přetečení bufferu se obvykle
objeví, když je příliš vysoká rychlost přenosu dat nebo dojde k dlouhodobému zaneprázdnění
programu a ten není schopen přečíst data z bufferu. Můžete se vyhnout používání dlouhých
zpoždění mSleep. Pokud potřebujete, můžete zvětšit velikost kruhového registru. Velikost
bufferu je nastavena na 32 znaků. V souboru RP6uart.h, můžete změnit definici
UART_RECEIVE_BUFFER_SIZE.
Rozsáhlejší ukázkový program můžete najít na CD-ROM (Example_02_UART_02).
80
4.6.3. Funkce zpoždění a časovače
Mikroprocesorové programy mají často vytvořit zpoždění nebo musí určitý čas počkat než se
provede nějaká akce.
K tomuto účelu nabízí funkce také knihovna RP6Library. Pro zajištění relativně přesného
zpoždění funkce využívají jeden ze tří časovačů ATmega32, který je nezávislý na běhu
programu nebo přerušení, které by mohlo narušit zpožďovací rutiny.
Při používání těchto funkcí musíte být opatrní! Použití těchto funkcí během automatické
regulace rychlosti a ACS (bude vysvětleno později) může způsobit problémy. Pokud potřebujete
používat automatickou regulaci rychlosti a ACS, používejte pouze velmi krátká zpoždění, menší
než 10 milisekund. Místo blokování programu pomocí zpoždění, můžete upřednostnit funkci
“stopky”, která bude probrána v následující části.
void sleep(uint8_t time)
Tato funkce zastaví normální provádění programu na definovanou časovou periodu. Zpoždění
se specifikuje s rozlišením 100µs (100µs = 0,1ms = 0.0001s, což je pro vnímání lidskými smysly
příliš krátký čas...). Použití proměnné s velikostí 8 bitů umožňuje nastavení zpoždění až 25500
µs = 25,5 ms. Zatímco normální program “spí”, přerušení se stále zpracovává. Tato funkce
pouze zpozdí zpracování normálního programu. Jak bylo uvedeno dříve, využívá funkce
hardwarový časovač a příliš neovlivňuje další události přerušení.
Pokud však potřebujete delší zpoždění, můžete preferovat funkci mSleep, která umožňuje
definovat periodu zpoždění v milisekundách. Maximální perioda zpoždění je 65535 ms, neboli
Problém těchto standardních zpožďovacích funkcí je v tom, že zcela zastaví běh normálního
programu. To lze akceptovat pouze, když určitá část programu musí čekat určitou časovou
periodu, zatímco u jiné části se předpokládá, že pokračují ve zpracování úkolu...
Jedna z hlavních výhod používání hardwarových časovačů je nezávislost na běhu normálního
programu. Pomocí těchto časovačů implementuje RP6Library univerzální takzvané “Stopky”.
Autor si vybral tento neobvyklý název pro podobnost se skutečnými stopkami.
Tyto “Stopky” budou jednoduše zvyšovat počet zpracování. obvykle se funkce časovače
přizpůsobuje potřebám jednotlivých programů, ale stopky umožňují “současné” zpracování
několika úloh – aspoň z vnějšího pohledu na mikroprocesor.
81
RP6 poskytuje osm 16-bitových stopek (Stopwatch1 až Stopwatch8), které lze spustit, zastavit,
nastavit a číst. Stejně jako u funkce mSleep můžeme počítat s rozlišením jedné milisekundy,
které znamená zvyšování čítače v intervalech po 1 ms. Tato metoda se nedá použít pro velmi
kritické časování, protože kontrola obsahu čítače není příliš přesná.
Následující příklad předvádí použití stopek:
Program je skutečně jednoduchý. Každou sekundu se pošle obsah čítače přes sériové rozhraní
a zvýší čítač (řádky 29 až 36). Zároveň se provádí zpracování jednoduchého programu
běžícího světla na LED (řádky 19 až 26) s intervalem obnovy 100 ms.
Zde se používají Stopwatch1 a Stopwatch2, které začínají na řádku 9 respektive 10. Pak se
rozběhnou čítače ve stopkách. Nekonečná smyčka (na řádcích 16 až 37) trvale kontroluje, zda
stopky nepřekročily definovanou úroveň. Podmínka na řádku 19 například řídí běhání světla a
kontroluje, zda na stopkách uběhl od posledního vynulování čas 100 ms. Pokud je tato
podmínka splněna, rozsvítí se následující LED, vynuluje se čítač (řádek 25) a čeká se dalších
100ms. Stejný postup se používá u druhého časovače, který naopak kontroluje intervaly
1000ms, respektive 1 sekundy.
82
Na CD můžete najít mírně rozšířenou verzi tohoto programu Je to jen malý příklad, ale můžete
sestavit mnohem složitější systémy se stopkami, které spolehlivě spouští a zastavují různé
události...
Ukázkový program na CD také obsahuje běžící světlo a čítač (v programu jsou celkem 3 čítače...), ale je zde implementovaná samostatná funkce, která se bude volat z nekonečné
smyčky.
Rozdělení kódu programu do samostatných funkcí pomáhá udržet přehlednost složitých
programů a také je jednoduší opakované používání programových modulů pomocí Kopíruj a
Vlož. Takže například kód běžícího světla se může, bez větších změn, použít v dalších
programech...
Pro řízení stopek bylo implementováno několik maker.
startStopwatchX()
Spustí stopky X. Příkaz neprovede nulování stopek a ty pokračují ve zvyšování hodnoty
posledního obsahu čítače.
Příklady:
startStopwatch1();
startStopwatch2();
stopStopwatchX()
Zastaví stopky X.
Příklady:
stopStopwatch2();
stopStopwatch1();
uint8_t isStopwatchXRunning()
Vrací informaci, zda stopky X běží.
Příklad:
if(!isStopwatch2Running) {
// Stopky byly zrusene, zde se to muze napravit...
}
setStopwatchX(uint16_t preset)
Toto makro nastavuje čítač stopek X na zadanou hodnotu.
Příklady:
Tato funkce umožňuje ovládání 6 stavových LED. Místo obvyklých dekadických čísel se mohou
jednoduše používat binární konstanty. Binární konstanty jsou uváděny ve tvaru: 0bxxxxxx. LED
potřebují binární číslou pouze se 6 číslicemi.
Příklady:
setLEDs(0b000000); // zhasne vsechny LED
setLEDs(0b000001); // blikne StatusLED1 a vypne vsechny ostatni LED
setLEDs(0b000010); // StatusLED2
setLEDs(0b000100); // StatusLED3
setLEDs(0b001010); // StatusLED4 a StatusLED2
setLEDs(0b010111); // StatusLED5, StatusLED3, StatusLED2 a StatusLED1
setLEDs(0b100000); // StatusLED6
Alternativní možnosti jsou:
statusLEDs.LED5 = TRUE; // blikne LED5 v registru LED
statusLEDs.LED2 = FALSE; // zhasne LED2 v registru LED
updateStatusLEDs(); // provede zmeny
Zde se blikne StatusLED5 a zhasne StatusLED2, ale nezmění se stav ostatních LED! Na rozdíl
od jiných částí programu je toto řízení LED jednodušší.
Pozor: statusLEDs.LED5 = TRUE; NEROZSVÍTÍ přímo LED5! Tento příkaz pouze nastaví
příslušný bit v proměnné. LED5 bude svítit po provedení funkce updateStatusLEDs();!
Dva vývody portu s LED se dále používají ke kontrole stavu nárazníků. V případěčtení stavu
nárazníků mikroprocesor rychle přepne směr vývodů do vstupního režimu a zkontroluje, zda
jsou sepnuté připojené mikrospínače. Pro kontrolu nárazníků poskytujeme dvě funkce. První
funkce:
uint8_t getBumperLeft(void)
bude číst stav levého nárazníku, zatímco:
uint8_t getBumperRight(void)
bude číst spínač pravého nárazníku.
Mikroprocesor zpracuje tyto funkce velmi rychle, tak ani nepostřehnete, že LED zhasly,
přestože je několik instrukčních cyklů Pin nastaven na vstup. Samozřejmě nemůžete tuto funkci
volat opakovaně bez vložení několika milisekundového zpoždění.
Vývody portu s LED by měly být ovládány pouze pomocí předem definovaných funkcí! Porty
s nárazníky jsou chráněny rezistory, ale pokud se vývody nastaví na výstup s nízkou úrovní a
zároveň se sepne spínač nárazníku, poteče do portu větší proud. Takový proud je samozřejmě
nežádoucí (obvody AVE mají třístavové výstupy – při nastavení do plovoucího stavu LED
zhasnou).
84
Příklad:
if(getBumperLeft() && getBumperRight()) // oba narazniky...
escape(); // zde definujte vlastni funkci tj. coufnuti a otoceni
else if(getBumperLeft()) // levy...
escapeLeft(); // opet couvani a otaceni doprava
else if(getBumperRight()) // pravy...
escapeRight(); // opet couvani a otaceni doleva
mSleep(50); // rychlost kontroly narazniku 20 krat za sekundu (20Hz)...
Stisknutí nárazníku rozsvítí LED 6 a 3. Je to záměrné a nelze odstranit. Nárazníky se však
neaktivují příliš často, takže nás to příliš neruší.
Na číslicové výstupy se čtyřmi zbývajícími LED můžeme připojit další
snímače. Přes tranzistorové pole se také mohou spínat větší zátěže, jako jsou
LED nebo motory. To je pouze krátký výčet věcí, které mohou být, pomocí
příslušných funkcí, ovládány pomocí těchto čtyř portů, ale pamatujte na
existující funkce pro LED a nárazníky.
Pozor: porty mikroprocesoru vždy chraňte rezistorem pro omezení proudu s hodnotou
minimálně 470Ω, který vložíte mezi vývod portu a snímač nebo spínač!
Během bootovací fáze umožňuje RP6 zhasnout LED. To je užitečné pro potlačení aktivity portu
během probíhajícího bootování, zejména pokud je na port s LED připojeno další zařízení.
První byte vnitřní EEPROM (adresa 0) je vyhrazen pro ovládání režimu LED. Nepoužívejte
tento byte pro vlastní programy (přepsání tohoto byte nic nepoškodí, ale může vás znepokojit,
že se po zapnutí RP6 dlouho nerozsvítí LED...).
Na robotu RP6 existuje řada věcí, které se musí neustále sledovat, pokud mají fungovat
správně. Například ACS musí vysílat IR impulsy v přesných intervalech a kontrolovat příjem.
K tomu nemůžeme použít automatickou funkci přerušení, protože obsluha přerušení musí být
co nejrychlejší. Nezbývá než opakované volání několika funkcí z hlavního programu. V dobře
navrženém programu se bude zdát, že tyto úlohy běží na pozadí.
V této kapitole probereme všechny funkce pro ACS a podobné systémy a poskytneme další
podrobnosti. Předpokládáme však, že nejjednodušší bude uvést několik podrobností, které
usnadní zvládnutí funkce nárazníků a jejich implementaci v programu.
Nyní, když řešíme úlohy na pozadí, mohou vedle velkých věcí běžet nějaké další (menší) úlohy
– například sledování nárazníků. Je to jednoduchá a rychlá úloha, kterou můžete provádět
v hlavní smyčce. Při automatické kontrole nárazníků můžete v hlavní smyčce opakovaně volat
tuto funkci:
void task_Bumpers(void)
(v předchozí kapitole byly probrány podrobnosti ovládání). Tato funkce bude automaticky,
v intervalu 50ms, kontrolovat stav snímačů nárazníků (stisknutý nebo ne) a jejich aktuální stav
zapíše do proměnných
bumper_left a bumper_right
Tyto proměnné můžete použít kdekoliv v programu tj. v podmíněných příkazech, cyklech atd.
nebo je přiřazovat do dalších proměnných.
85
Příklad:
Ukázkový program používá, ke zobrazení stavu nárazníků, stavové LED. Stisknutí levého
nárazníku rozsvítí LED6 a zhasne LED4. Naopak uvolnění levého nárazníku zhasne LED6 a
rozsvítí LED4. Stisknutí levého nárazníku rozsvítí LED6 kdykoliv, ale zde chceme ukázat
obecné používání LED a vy můžete řízení LED použít jinde. Příklad funguje stejně pro pravý
nárazník LED3 a LED1. Stisknutí obou nárazníků rozsvítí LED2 a LED5.
Výbava automatické kontroly nárazníků byla evidentně vytvořena nějakým voláním samostatně
definované funkce, které pokaždé automaticky zjistí změnu stavu nárazníků. Obvykle se budou
nárazníky spínat jen zřídka a jejich sledování v hlavním programu se provádí jen, když je to
nezbytné.
Jazyk C nám umožňuje definovat ukazatele na funkce a volat tyto funkce bez předchozí
definice funkce v knihovně. Obvykle s při překladu vyžaduje definice funkcí ve vlastní knihovně,
jinak dojde ke zkolabování kompilátoru.
Tato metoda nám umožňuje používat samo definované funkce - takzvanou “Obsluhu událostí”.
Výsledkem stisknutí nárazníku bude automatické volání předem definované vyhrazené funkce
(během 50ms). Tato speciální funkce musí být registrována jako obsluha události a bude
poskytovat specifickou vlastnost: funkce nesmí vracet žádnou hodnotu a nemá parametr
(návratová hodnota i parametr musí být “void”). Proto se funkce označuje jako: void
bumpersStateChanged(void). Měli byste například registrovat obsluhu události na samém
začátku hlavní funkce. Registrace obsluhy události se může provést následující funkcí:
Tento příkaz nemusíte přesně chápat – je to dlouhý příběh s krátkým významem pro tuto funkci.
Parametrem je ukazatel na funkci...
86
Vysvětlíme to na tomto jednoduchém příkladu:
Program bude reagovat na změnu stavu nárazníků pouze jednou výstupem okamžitého stavu
nárazníků. Například při stisknutí pravého nárazníku může být výstup:
Stavy nárazníku se změnily:
- levý nárazník nebyl stisknutý,
- pravý nárazník byl stisknutý.
Stisknutí obou snímačů nárazníků způsobí:
Stavy nárazníku se změnily:
- levý nárazník byl stisknutý,
- pravý nárazník byl stisknutý.
Zřídka se stane, aby se oba nárazníky stisknuly současně, většinou dostanete zprávu, že se
stisknul jen jeden nárazník. Pokud jej stisknete větší silou, pravděpodobně se ukáže pouze
jedna zpráva. Je to kvůli intervalu 50 ms.
Můžete poznamenat, že ukázkový program nikdy nevolá přímo funkci bumpersStateChanged.
Knihovna RP6Library to zařídí automaticky při každé změně stavu nárazníků z funkce
task_Bumpers. Ve skutečnosti task_Bumpers nejdříve nezná naši funkci
bumpersStateChanged a tato fukce se musí volat pomocí ukazatele, který se správně nastaví
na řádku 24.
87
Obsluha události se může samozřejmě vedle textového výstupu dále rozšiřovat – tj. domníváme
se, že robot zastaví a couvá/zatáčí. To se však neprovádí ve vlastní obsluze události, ale někde
jinde v programu. V obsluze události možná nastavíte proměnno příkazu, která se kontroluje
v hlavním programu pro identifikaci možného pohybu. Vždy se snažte, aby byla obsluha
události co nejkratší.
V obsluze události můžete použít všechny funkce z knihovny RP6Library, ale u funkcí “otáčení”
a “pohyb” musíte být opatrní – probereme to v dalších kapitolách. V obsluze události NIKDY
nepoužívejte režim blokování těchto funkcí (opakované stisknutí nárazníků například nebude
příliš pracné).
Základní myšlenka obsluhy událostí se také používá v řadě dalších funkcí. Například ACS –
které má velmi podobné používání voláním obsluhy události při každé změně stavu snímač
předmětů.
Obsluhu události používáme také při příjmu kódů RC5 z dálkového ovladače. Libovolný příjem
signálu kódovaného systémem RC5 inicializuje volání příslušné funkce obsluhy události. Pro
tuto činnost není třeba používat obsluhu události – samozřejmě můžete pro kontrolu změn
jednoduše použít podmíněný příkaz, ale obsluha události zjednoduší návrh programu.
Opakování je matka moudrosti.
Doporučení: CD nabízí řadu podrobných ukázkových programů na toto téma.
4.6.5. Čtení ADC hodnot (baterie, proud motorů a snímače osvětlení)
Jak bylo popsáno v kapitole 2, je k ADC (analogověčíslicový převodník) připojeno několik
snímačů. Knihovna RP6Library samozřejmě poskytuje funkci pro čtení naměřených ADC
hodnot:
uint16_t readADC(uint8_t channel)
Tato funkce vrací 10-bitovou hodnotu (0...1023) a pro hodnoty snímačů vyžaduje 16-bitovou
proměnnou. Je možné číst následující kanály:
ADC_BAT --> Snímač napětí baterie
ADC_MCURRENT_R --> Snímač proudu pravého motoru
ADC_MCURRENT_L --> Snímač proudu levého motoru
ADC_LS_L --> Levý snímač osvětlení
ADC_LS_R --> Pravý snímač osvětlení
ADC_ADC0 --> Volný ADC kanál pro individuální snímače
ADC_ADC1 --> Volný ADC kanál pro individuální snímače
Doporučení: dva konektory volných ADC kanálů nejsou obsazeny. Můžete
sem zapájet konektory se standardní roztečí 2,54 mm a možná přidat dva
kondenzátory 100 nF a pokud snímač (např. IR snímač vzdálenosti SHARP)
potřebuje vyšší napájecí proud, tak ještě velký elektrolytický kondenzátor
470µF.
To vyžaduje určité zkušenosti s pájením! Pokud zkušenosti nemáte, může být
lepší řešení v použití rozšiřujícího modulu.
Jako reference se používá základní napájecí napětí 5 V, ale funkce se může modifikovat tak, že
se použije vnitřní referenční napětí 2,56V obvodu ATmega32 (viz katalogový list MEGA32).
Standardní snímače RP6 to obvykle nepotřebují.
Před dalším zpracováním ADC výstupu se provede posloupnost několika měření, výsledky se
uloží do pole a vypočítá střední nebo minimální/maximální hodnota.
Zpracování několika hodnot může snížit chybu měření. Předpokládáme, že metoda “střední
hodnoty” je například potřeba při měření napětí baterie. Napětí baterie se velmi mění podle
zátěže, zvláště při změně podmínek zatížení vlivem motorů.
Analogicky můžeme snímače nárazníků realizovat pomocí ADC měření a v hlavním programu
jednoduše použít pohodlnou funkci:
void task_ADC(void)
která během krátkého času vyhodnotí všechny ADC kanály. Volání této funkce provede
postupné čtení všech ADC kanálů “na pozadí” (tím se ušetří čas, měření se automaticky spustí i
přečte...) a výsledky se uloží v předem definovaných proměnných.
Každé ADC měření vyžaduje určitý čas a funkce readADC může blokovat průběh programu.
Vlstní měření nepotřebuje programový zásah, během tohoto času můžeme provádět něco
jiného (ADC je samostatný hardwarový modul).
Měření z jednotlivých kanálů se uloží do následujících 16-bitových proměnných, které mohou
být kdykoliv použity na libovolném místě programu:
Jak vidíte, na rozdíl od funkce readADC, musíte při volání funkce task_ADC() používat tyto
proměnné.
89
Příklad:
Na výstupu tohoto programu budou v intervalu 300 ms hodnoty změřené na obou snímačích
osvětlení a napětí baterie. Jak uvidíte, program při poklesu napětí baterie pod cca 6 V, vydá
varování.
4.6.6. ACS – Anti kolizní systém
Na rozdíl od CCRP5, který používá malý koprocesor, byl anti kolizní systém robotu RP6
implementován přímo na základním mikroprocesoru ATmega32. Tato architektura vyžaduje o
něco větší programovací úsilí, ale na druhé straně umožňuje modifikaci a přizpůsobení
zákazníkem. Konstrukce RP5 neumožňovala žádnou změnu software koprocesoru.
Rozsah detekce ACS, respektive vysílací výkon obou IR LED lze ovládat pomocí následujících
funkcí:
void setACSPwrOff(void) --> Zrušení ACS IR-LED
void setACSPwrLow(void) --> Krátký dosah
void setACSPwrMed(void) --> Střední dosah
void setACSPwrHigh(void) --> Dlouhý dosah
90
Jelikož je ACS kompletně implementován v software, vyžaduje časté volání následující funkce
z hlavní smyčky:
void task_ACS(void)
Tato funkce zcela ovládá ACS. Další zpracování se může provádět podobným způsobem jaký
byl předveden u nárazníků.
Knihovna RP6Lib poskytuje dvě proměnné:
obstacle_left a obstacle_right
Každá z nich se nastaví na TRUE, jakmile ACS detekuje překážku. Pokud se na TRUE nastaví
obě proměnné, překážka bude umístěna přímo před robotem.
Tato funkce registruje obsluhu události, která musí mít následující tvar:
void acsStateChanged(void)
Funkci můžete pojmenovat libovolně.
Ukázkový program demonstruje, jak se funkce používá. Začínáme registrací obsluhy události
(řádek 44), pak aktivujeme všechny snímače včetně IR přijímače (řádek 46 – bez toho to
samozřejmě nefunguje) a nastavíme výkon vysílače pro ACS IR LED (řádek 47). Hlavní smyčka
opakovaně volá funkci task_ACS().
Další vyhodnocení se provede automaticky. Funkce acsStateChanged způsobí volání, jakmile
dojde ke změně stavu ACS, který se objeví při detekci překážky nebo když zase zmizí. Program
zobrazí okamžitý stav ACS textovou zprávou na terminálu a pomocí LED.
91
Ukázkový program také demostruje, jak se blikají a zhášejí jednotlivé LED.
92
Robot byste měli připojit k PC a sledovat výstup na terminálu a také pozorovat LED. A pak už
jenom posouvejte ruku nebo jiný předmět přímo před robot.
Jsou známé zdroje rušení, které ovlivňují ACS. Některé typy zářivkových
svítidel a podobných světelných zdrojů může virtuálně oslepit robot nebo
rapidně snížit citlivost. Pokud zjistíte nějaké problémy, můžete zaít zhášet
všechny rušivé zdroje osvětlení (doporučení: robot můžete umístit přímo před
obrazovku, která se může pokládat za potenciální zdroj problémů stejně jako
zářivky použité v podsvícení).
Dosah detekce samozřejmě velmi závisí na povrchu překážky. Černé povrchy
obvykle neodrážejí stejné množství světla jako jasně bílý povrch. ACS může
ignorovat tmavé předměty.
Kritická situace může nastat při podpoře ACS uttrazvukovými snímači nebo dokonalými IR
snímači.
Dříve než pustíte robot na výlet po místnosti, měli byste provést několik jednoduchých testů
ACS zkouškou schopnosti detekovat několik různých předmětů. Speciálně zkuste najít
předměty, které NEJDE správně detekovat. Tento test vám umožní odstranit nevhodné
překážky před zahájením provozu robotu ... ale ve srovnání s koprocesorem CCRP5,
nezpůsobí chyba ACS žádné problémy, protože nárazník chrání před poškozením IR LED.
4.6.7. Funkce IRCOMM a RC5
IR přijímač umožňuje robotu RP6 přijímat
signály ze standardního televizního
dálkového ovladače, ale program je
omezen na používání kódování RC5.
Většina univerzálních dálkových
ovladačů (viz obrázek) může být na tento
kód naprogramována – prostudujte
návod vašeho dálkového ovladače, zda
může nastavit kód RC5. Pokud v tabulce
kódů chybí kód RC5, můžete jednoduše
otestovat ovladač od jiného výrobce.
Systém ACS bude vysílání dálkového
ovládání RC5 ignorovat a tento signál
obvykle neruší detekci překážek. Systém bude stále schopen detekce překážek, ale může
reagovat pomaleji, protože je provoz ACS omezen na přestávky mezi vysíláním povelů RC5.
Pokud dálkové ovládání nepoužívá RC5, může ACS fungovat chybně.
Vhodný software umožňuje ovládání RP6 libovolným infračerveným dálkovým ovladačem.
Vysílání IR signálů lze s výhodou použít také pro IRCOMM. Ob ě vysílací diody na předním
panelu robotu jsou umístěny nahoře a míří na strop. Odrazy od stropu a dalších předmětů nebo
přímý dosah umožňují vzájemnou komunikaci mezi roboty nebo základnovou stanicí.
Komunikace je relativně pomalá (přenos datového paketu zabírá přibližně 20 ms plus krátkou
mezeru), ale umožňuje vysílání krátkých příkazů a jednotlivých naměřených hodnot. Dosah
vysílače je omezen na vzdálenost okolo 2 až 4 metrů uvnitř jediné místnosti (závisí na
světelných podmínkách, překážkách, povrchu stropu i umístění horní rozšiřující desky).
Komunikační dosah budete moci rozšířit přidáním další IR LED (řízené například dalším
tranzistorem typu MOSFET s větší kapacitou a menším sériovým rezistorem).
93
Synchronizace činnosti ACS se řídí funkcí task_ACS(), která se musí opakovaně volat z hlavní
smyčky pro zajištění pracování příjmu IR signálů – a dále pro správu přenosu přes IRCOMM.
Datové pakety RC5 tvoří adresa zařízení, kód tlačítka a přepínací bit. Pěti bitová adresa
zařízení říká, které zařízení se ovládá – například televize, video, Hi-Fi systém atd. Pro naši
aplikaci se může adresa zařízení použít pro adresování několika jednotlivých robotů. Šest bitů
kódu tlačítka odpovídá tlačítku stisknutému na dálkovém ovladači, ale může dobře posloužit
k přenosu dalších údajů. Umožňuje sice přenos pouze šesti bitů, ale 8-bitová data lze předávat
dvěma samostatnými přenosy nebo se dva bity použijí k adresaci či přepínání významu.
Standardní dálkové ovladače používají přepínací bit k rozlišení trvalého stisknutí nebo
opakovaného stisknutí stejného tlačítka. My však využíváme přepínací bit pro další funkčnost
komunikace mezi roboty.
Datový paket RC5 se může vyslat následující funkcí:
void IRCOMM_sendRC5(uint8_t adr, uint8_t data)
ve které adr odpovídá adrese zařízení a data je kód tlačítka respektive hodnota dat. Parametr
adr vám umožní nastavit přepínací bit na nejvýznamnějším bitu (MSB) následující aplikací
konstanty TOGGLEBIT:
IRCOMM_sendRC5(12 | TOGGLEBIT, 40);
Tento příkaz vyšle datový paket RC5 do zařízení s adresou 12, aktivuje přepínací bit a hodnota
dat je 40.
IRCOMM_sendRC5(12, 40);
Toto je stejná situace bez aktivace přepínacího bitu.
Stejně jako u nárazníků a ACS, je možné příjem RC5 dat řešit jako obsluhu události. Jakmile se
přijmou RC5 data, bude obsluha události automaticky volat funkci task_ACS(). To například
umožňuje sestavení programu, který otočí robot doleva při příjmu kódu 4 a otočení doprava při
kódu 6...
Jeden ukázkový program nabízí tuto funkčnost: veškeré pohyby se ovládají pomocí IR
dálkového ovladače.
Předepsaný tvar obsluhy události musí odpovídat:
void receiveRC5Data(RC5data_t rc5data)
ale funkci můžete samozřejmě libovolně přejmenovat.
Tato funkce umožňuje registraci předem definované obsluhy události tj.:
IRCOMM_setRC5DataReadyHandler(receiveRC5Data);
Po této definici se bude příslušná funkce volat při každém příjmu platného kódu RC5.
Další možnosti: RC5data_t je zvláštní, předem definovaný datový typ, který obsahuje adresu
zařízení typu RC5, přepínací bit a kód tlačítka (respektive datovou hodnotu). Tato data můžete
použít stejně jako ostatní ordinální proměnné pomocí následujících identifikátorů:
CD poskytuje ukázkový program, který ukazuje použití těchto proměnných.
Pozor: Nikdy neaktivujte trvale výstup IRCOMM! IR LED a budící obvod
MOSFET jsou navrženy pro pulzní provoz a umožňují přenos pouze
impulsů s periodou kolem jedné milisekundy! V opačném případě dojde
při nabité baterii k velkému nárůstu spotřeby proudu. Neupravujte funkce
IRCOMM, pokud neovládáte celou související problematiku. Zvláště se nesmí
modifikovat obsluha přerušení pro řízení infračerveného obvodu.
4.6.8. Funkce snižování spotřeby
V předchozích kapitolách jsme používali funkci powerON(), ale nepopsali jsme její význam. RP6
může ušetřit část energie vypnutím ACS, odměřovacího systému, proudových snímačů a LED
PowerON. Vypnutí těchto snímačů uspoří 10 mA.
Zapnutí snímačů se může provést voláním makra:
powerON()
a pro úsporu energie a vypnutí snímačů můžete zavolat:
powerOFF()
Obě makra pouze nastaví I/O vývody.
Před používáním ACS, IRCOMM nebo ovládání motorů se musí provést makro
powerON()! Jinak nebudou napájeny příslušné obvody snímačů. Snímače
musí fungovat, protože rutiny ovládání motorů vyžadují zpětnovazební signály
z enkodérů a proudových snímačů.
Pokud byste zapomněli volat powerON(), motory se, okamžitě po spuštění,
zastaví. Tento chybový stav se indikuje blikáním čtyřčervených stavových
LED.
4.6.9. Funkce pohonného systému
Knihovna RP6Library poskytuje pohodlné funkce pro ovládání pohonného systému robotu.
Některé funkce budou automaticky regulovat rychlost motoru pomocí zpětné vazby z enkodérů,
kontrolovat proud tekoucí do motorů, automaticky ujedou přesnou vzdálenost a zpracují řadu
dalších úkolů. Tyto možnosti jsou velmi pohodlné – ale jen podobné jako u jiných robotických
systémů – při náročném používání musíme předpokládat nějaké mimořádné vlastnosti.
Momentální stav vývoje nesplňuje optimálně naše představy. Existuje řada věcí, které lze
vylepšit!
void task_motionControl(void)
Funkci task_motionControl budeme opakovaně volat z hlavní smyčky programu, jinak nebude
automatická regulace fungovat! Opakované volání z hlavního programu sebou přináší volání
této funkce při každém průchodu hlavní smyčky. Volání funkce v intervalu 10 až 50 milisekund
95
bude dostatečné, ale lepší je volání funkce v mnohem kratších intervalech. Častější volání
funkce nezpůsobí žádné problémy, protože časování je řízené hardwarem. Ze stejného důvodu
můžeme měnit interval volání funkce v rozsahu od 1ms do více než 10ms. Velmi časté volání
funkce nezabírá příliš mnoho strojového času, jelikož se funkce celá zpracuje v předem
definovaném minimálním intervalu.
Pokud se funkce používá správně, bude automatická regulace udržovat požadovanou velikost
konstantních otáček motoru.
Regulace rychlosti je zajištěna přesnou regulační odchylkou, zjištěnou při každém měřicím
cyklu a jejich sčítáním (takzvaný integrační regulátor). Tato chybová hodnota se používá pro
nastavení napětí motoru pomocí PWM modulu mikroprocesoru. Pokud je rychlost příliš nízká,
bude regulační chyba kladná a napětí motoru by se mělo v určitém poměru zvýšit. Když je
rychlost příliš vysoká, musí se napětí snížit. Tato metoda bude svižně nastavovat rychlost RP6
na relativně konstantní hodnotu PWM (ve které se malé odchylky považují za normální).
Regulace umožňuje stabilizaci rychlosti nezávislou na napětí baterie, zátěži (hmotnost,
povrchové podmínky, sklon atd.) a výrobní toleranci. Pokud se budete pokoušet pohánět robot
pevnou hodnotou PWM, může rychlost robotu velmi záviset na účinnosti motorů, zátěži a napětí
baterie. V rozdílné rychlosti levého a pravého motoru se mohou dále projevit důsledky
výrobních tolerancí.
Rutina regulace rychlosti odpovídá také za reverzní chod motoru, který se musí otáčet jedním
směrem a kdykoliv změnit směr otáčení i při rychlosti 15cm/s bez poškození motorů a
převodovek. Pokud se má provést změna směru otáčení, rychlost robotu se automaticky sníží
na nulu, následuje změna směru a následně zvýšení otáček na nastavenou rychlost.
Řídící systém rychlosti a směru otáčení musí dále sledovat spotřebu proudu v motorech. Při
překročení proudových podmínek systém automaticky zastaví motory. Toto bezpečnostní
opatření chrání motory před přetížením a přehřátím, které může trvale zničit motory.
Pokud se během 20 sekund objeví tři události překročení proudu, provede ochranný systém
nouzové zastavení a spustí blikání čtyř stavových LED. Před další činností se musí robot
resetovat.
Dále systém monitoruje poškození enkodérů nebo motorů (které se může projevit, pokud se
v nich budete často šťourat...). Pokaždé, když se to stane, může funkce řízení pohybu zvedat
hodnotu PWM až na maximum a robot se stane neřiditelný ... a samozřejmě musíte
předpokládat nežádoucí zkušenosti! V každém případě se v takovém případu robot úplně
zastaví.
Musíme také stručně uvést, že řízení pohybu také obsahuje funkce pro pohyb na definovanou
vzdálenost a otáčení o definovaný úhel.
Jak můžete vidět, je funkce velmi důležitá pro automatickou regulaci motoru. Klíčová skutečnost
je, že vlastní funkce motionControl nemá žádný parametr jako například požadovanou rychlost.
Provozní parametry se musí nastavovat přes další funkce, které nyní podrobně probereme.
Tato funkce nastavuje provozní rychlost. Jednotlivé parametry budou definovat požadovanou
rychlost levého a pravého motoru. Opakované volání funkce motionControl (jak bylo popsáno
v předchozí kapitole) zajistí nastavení hodnot pro regulaci rychlosti. Nastavení této hodnoty na
nulu vyvolá zpomalování následované úplným vypnutím modulu PWM.
getDesSpeedLeft() a getDesSpeedRight()
Tato makra umožňují čtení okamžitého nastavení hodnoty rychlosti. Jak můžete vidět
v následujícím ukázkovém programu, používá se velmi jednoduše:
... a nyní se začne RP6 pohybovat! Robot samozřejmě nebude reagovat na některé překážky a
pohybuje se pouze dopředu! Systém se bude pouze pokoušet regulovat rychlost a automaticky
nastavovat výkon motorů – tj. stoupání a sjíždění svahu.
BUĎTE OPATRNÍ: Toto chování může být velmi nebezpečné pro vaše
vlasní prsty – dávejte pozor, aby se prsty nedotýkali pásové dráhy a
hnacích kol. Udržujte v čistotě desku plošných spojů a vedení pásů.
Existuje velké nebezpečí úrazu! Jak jsme již zmínili, výkon motoru se při
zátěži automaticky zvýší a motory jsou poměrně výkonné!
Parametry rychlosti pro funkci moveAtSpeed nejsou specifikovány v cm/s nebo ekvivalentních
jednotkách, ale v jednotkách rychlosti otáčení.
Rychlost robotu závisí především na reálném obvodu pásů a kol neboli jinak řečeno na rozlišení
enkodérů. Můžeme zde uvažovat toleranci od 0,23 do 0,25 mm na každý segment enkodéru.
Proto se má rozlišení enkodérů měřit.
Systém bude měřit rychlost otáčení v intervalech 200ms, který odpovídá rychlosti 5 krát za
sekundu. Takže jednotkou je “počet segmentů enkodéru za 200ms”. Hodnota 70, která se
používá v příkladu na předchozí stránce, může být interpretována jako 70 • 5 = 350 započítání
97
segmentů enkodéru za sekundu (což odpovídá rychlosti cca 8 až 8,7 cm/s – podle reálného
rozlišení enkodéru). Minimální regulovatelná rychlost otáčení je kolem 10 • 5 = 50 a maximální
rychlost otáčení je přibližně 200 • 5 = 1000. Kapitola 2 již zmiňovala příčinu tohoto omezení
rychlosti, ale přesto doporučujeme omezit hodnotu na 160 při trvalém pohybu a hodnotu 200
používat pouze na krátký čas!
getLeftSpeed() a getRightSpeed()
Tato makra umožňují čtení měřené hodnoty rychlosti otáčení. Budou vracet hodnoty ve stejných
jednotkách jak bylo popsáno výše.
void changeDirection(uint8_t dir)
Tato funkce nastaví směr otáčení motorů. Jak již bylo probráno, robot nejdříve zpomalí, pak
změní směr a nakonec zrychlí na předchozí nastavení rychlosti.
Podporuje následující parametry:
FWD – dopředu
BWD – dozadu
LEFT – otáčení doleva
RIGHT – otáčení doprava
Makro:
getDirection()
umožňuje čtení okamžitého směru.
Příklad:
98
V tomto ukázkovém programu RP6 se nejprve rozjede dopředu – to je výchozí nastavení
pohybu po reset. Použijeme jedny stopky pro měření 4 sekundového čekání a pak obrátíme
směr. Na řádku 16 a 18 se určí okamžitý směr otáčení a určí příslušné změny. To se opakuje
ve 4 sekundových intervalech, které způsobí, že se robot stále pohybuje dopředu a dozadu.
Je jasné, že robot stále ignoruje jakékoliv překážky!
Pomocí funcí, které jsme dosud probrali, není snadné ujet specifikovanou vzdálenost. K tomuto
Funkce move umožňuje, aby robot ujel specifikovanou vzdálenost. Musíme předat
požadovanou rychlost, směr (FWD nebo BWD) a vzdálenost v počtu enkodérových přírustků.
Makro:
DIST_MM(DISTANCE)
je užitečné pro převod vzdálenosti z milimetrů na přírustky enkodéru. Nejdříve samozřejmě
musíte kalibrovat rozlišení enkodéru (viz dodatek). Následující ukázkový příklad ukazuje, jak se
makro používá.
Robot se pokusí ujet požadovanou vzdálenost co nejpřesněji. Funkce motionControl začne
zrychlovat na nastavenou rychlost a krrátce před dosažením požadované vzdálenosti zpomalí,
aby ji nepřejel. Přesnost je kolem 5 mm, což můžeme obvykle považovat za docela dobrou.
Funkce nepodporuje pohyb na velmi krátkou vzdálenost pod 5 cm, ale to lze samozřejmě
zlepšit!
Parametr dráhy, nazvaný “blokování” je speciální vlastnost, kterou není třeba podrobně
popisovat.
Funkce obvykle nastaví pouze několik proměnných a okamžitě se vrátí do programu. Robot je
pak ovládán “na pozadí” funkcí motionControl. To je užitečné pro provádění dalších úkolů, jako
je například vyhýbání překážek. Jenomže když má robot pouze sledovat předem určenou
geometrický obrazec, můžete to změnit parametrem blokování.
Nastavení parametru na “TRUE” (to znamená 1), bude funkce ve smyčce volat funkci
motionControl dokud se nedosáhne zadaná vzdálenost. Program nedokáže tuto funkci opustit –
místo toho bude na potřebnou dobu “blokovat” normální průběh programu.
Nastavení parametru na “FALSE” způsobí, že funkce bude provádět vše, co již bylo popsáno.
Po nastavení příkazu “zahájení přesunu do definované vzdálenosti“ se okamžitě vrátí do
hlavního programu. Pokud zavoláte další funkce, které nastavují rychlost nebo dávají další
pohybové příkazy, nemusí se program chovat korektně. Raději počkejte na dokončení
původního pohybového příkazu nebo můžete alternativně zrušit příkaz.
99
Funkce:
uint8_t isMovementComplete(void)
se může používat ke kontrole, zda byl dokončen pohybový příkaz. Pokud není pohybový příkaz
dokončen, bude návratová hodnota “FALSE”.
Kdykoliv byl pohybový příkaz překažený, tj. například při detekci překážky, můžete ukončit
všechny pohyby voláním funkce:
void stop(void)
který zastaví všechny pohyby.
Někdy může být výhodné použít pohybovou funkci pro otáčení jednoduchým nastavením
směrového parametru na LEFT nebo RIGHT místo FWD nebo BWD a zadáním vhodné
hodnoty vzdálenosti, která odpovídá úhlu natočení. Tato metoda je poněkud neohrabaná a není
příliš výkonná. Z tohoto důvodu nabízíme specializovanou funkci pro otáčení na místě:
Tato funkce se chová stejně jako příkaz “move”, pouze se místo vzdálenosti určí úhel natočení.
Parametr blokování se může používat také v této funkci.
Následující program ukazuje, jak se používají obě funkce:
Robot se pojede 30 cm dopředu, otočí se o 180° doleva, přejede 30 cm dozadu, otočí se o 180°
doprava a začne od začátku. Pokud byste nastavili blokování všech parametrů na FALSE,
program nemusí vůbec fungovat. Hlavní smyčka nevolá funkci task_motionControl a všechny
pohybové funkce se zavolají v jediné posloupnosti. Změna pouze jednoho blokovacího
parametru na FALSE způsobí, že program více měně nefunguje tak, jak jste zamýšleli. Jedna
pohybová fáze se úplně přeskočí.
100
Loading...
+ hidden pages
You need points to download manuals.
1 point = 1 manual.
You can buy points or you can get point for every manual you upload.