RP6-ZÁKLAD ©2007 AREXX Engineering www.arexx.
Robotický systém RP6 Příručka - Čeština Version RP6-BASE-CZ-20071029 PŘEDBĚŽNÁ VERZE DŮLEŽITÁ INFORMACE! Prosím, čtěte pozorně! 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.
Právní aspekty ©2007 AREXX Engineering Nervistraat 16 8013 RS Zwolle The Netherlands Tel.: +31 (0) 38 454 2028 Fax.: +31 (0) 38 452 4482 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: "Robotický systém RP6" je obchodní známka http://www.
Obsah 1. Úvod .........................................................................................................................................6 1.1. Technická podpora .............................................................................................................7 1.2. Obsah balení ......................................................................................................................7 1.3. Vlastnosti a technické údaje .....................................................
4. Programování RP6 .................................................................................................................51 4.1. Konfigurace editoru zdrojového textu ...............................................................................51 4.1.1. Vytvoření přístupu do menu........................................................................................51 4.1.2. Konfigurace zvýraznění syntaxe .................................................................................54 4.1.3.
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.
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.
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.
◊ • 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.
• 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.
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.
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.
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.
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č.
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).
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.
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.
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.
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.
2.3.6. Enkodéry 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.
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).
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.
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.
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.
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.
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.
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.
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.
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.
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.
Důležité instalační soubory pro avr-gcc, avr-libc a binutils můžete najít v adresáři: :\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 /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.
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ů. Popis byl odvozen z následujícího materiálu: http://www.nongnu.org/avr-libc/user-manual/install_tools.html V dokumentaci AVR Libc na CD můžete najít také PDF dokument: :\Software\Documentation\avr-libc-user-manual-1.4.5.pdf Začněte PDF souborem na straně 240 (respektive 232 podle systému číslování dokumentu).
Podle výkonu PC to zabere několik minut – to platí také pro následující kroky – zvlášť pro GCC! GCC for AVR Používá podobný postup jako Binutils, GCC musí být kompilována a instalováno do správných adresářů: > > > > > > > > > > > > \ cd ~/RP6 bunzip2 -c gcc-4.1.1.tar.bz2 | tar xf > cd gcc-4.1.1 patch -p0 < ../gcc-patch-0b-constants.diff patch -p0 < ../gcc-patch-attribute_alias.diff patch -p0 < ../gcc-patch-bug25672.diff patch -p0 < ../gcc-patch-dwarf.diff patch -p0 < ../gcc-patch-libiberty-Makefile.in.
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.
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: :\Software\RP6Loader\RP6Loader.
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: :\Software\USB_DRIVER\Win2k_XP_Vista\CDM_Setup.
Pro 32 a 64 bitové systémy Windows XP, Vista, Server 2003 a 2000: :\Software\USB_DRIVER\Win2k_XP_Vista\FTDI_CDM2.02.04\ Pro starší Windows 98SE/Me: :\Software\USB_DRIVER\Win98SE_ME\FTDI_D2XX\ 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.
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.
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.
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í s opačnou polaritou se tavná pojistka. baterie přepálí V nejhorším případě však můžeme poškodit součástky elektronických obvodů.
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.
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.
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.
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.
V tomto bodě program umístí text nabídky na levou stranu. V dalších verzích programu se může text změnit.
Potvrďte vložením 'x'. # x Performing 10 measurements: Measurement #1: 07.20V --> Measurement #2: 07.20V --> Measurement #3: 07.20V --> Measurement #4: 07.20V --> Measurement #5: 07.20V --> Measurement #6: 07.20V --> Measurement #7: 07.20V --> Measurement #8: 07.20V --> Measurement #9: 07.20V --> Measurement #10: 07.20V --> Done! OK! OK! OK! OK! OK! OK! OK! OK! OK! OK! 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.
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í.
Výstup může vypadat takto: #### TEST #7 #### IRCOMM Test [...] TX RC5 RX RC5 TX RC5 RX RC5 TX RC5 RX RC5 TX RC5 RX RC5 TX RC5 RX RC5 [...
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...
T: 100 |VL: 104 Speed Left: OK Speed Right: OK T: 080 |VL: 086 T: 080 |VL: 000 T: 080 |VL: 004 T: 080 |VL: 079 T: 080 |VL: 082 T: 080 |VL: 081 T: 080 |VL: 080 T: 080 |VL: 082 T: 080 |VL: 077 Speed Left: OK Speed Right: OK T: 060 |VL: 082 T: 060 |VL: 079 T: 060 |VL: 082 T: 060 |VL: 069 T: 060 |VL: 064 T: 060 |VL: 058 T: 060 |VL: 059 T: 060 |VL: 060 T: 060 |VL: 057 T: 060 |VL: 058 Speed Left: OK Speed Right: OK T: 040 |VL: 045 T: 040 |VL: 000 T: 040 |VL: 002 T: 040 |VL: 038 T: 040 |VL: 044 T: 040 |VL: 038 T:
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.
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++” rozbaleného seznamu “Scheme:”! ze 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 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.
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”.
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í.
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ů.
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!): > "make" all -------- begin ------[...
Velmi užitečný je také přehled označený “Využití AVR paměti” na konci výpisu: Size after: AVR Memory Usage ---------------Device: atmega32 Program: 6858 bytes (20.9% Full) (.text + .data + .bootloader) Data: 148 bytes (7.2% Full) (.data + .bss + .noinit) 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.
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.
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.
Další informace můžete najít na domovských stránkách WinAVR respektive v PDF dokumentaci WinAVR: http://winavr.sourceforge.net/ http://winavr.sourceforge.net/install_config_WinAVR.pdf Speciálně zaměřená dokumentace AVR-LibC: http://www.nongnu.org/avr-libc/user-manual/index.html kterou můžete v PDF tvaru najít také na CD RP6. 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.
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čí */.
Řá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.
4.4.4. Proměnné 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é.
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|*+.,<>%&/(){}$§=´°?!^”.
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.
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.
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...
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á.
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”.
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 [Funkce [Funkce [Funkce [Funkce 1] 2 – něco jiného] 1] 2 – něco jiného] 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“.
Příklad demonstruje základní princip: Výstup: [Touto [Touto [Touto [CALC] [Touto funkcí byla zpracována následující hodnota: 199] funkcí byla zpracována následující hodnota: 10] funkcí byla zpracována následující hodnota: 255] 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í.
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.
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.
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.
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.
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.
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”.
void writeStringLength(char *data, uint8_t length, uint8_t offset); 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 writeIntegerLength(uint16_t number, uint8_t base, uint8_t length); 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.
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.
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ý.
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.
getStopwatchX() Makro vrací obsah čítače stopek X. Příklady: if(getStopwatch2() > 1000) { ... } if(getStopwatch6() > 12324) { ... } 4.6.4. Stavové LED a nárazníky void setLEDs(uint8_t leds) 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ří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.
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.
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ý.
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ší.
Příklady: uint16_t ubat = readADC(ADC_BAT); uint16_t iMotorR = readADC(ADC_MCURRENT_R); uint16_t iMotorL = readADC(ADC_MCURRENT_L); uint16_t lsL = readADC(ADC_LS_L); uint16_t lsR = readADC(ADC_LS_R); uint16_t free_adc0 = readADC(ADC_ADC0); uint16_t free_adc1 = readADC(ADC_ADC1); if(ubat < 580) writeString_P("Warning! Low battery level!"); 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ý
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.
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. Volitelně můžete použít obsluhu události ACS.
Ukázkový program také demostruje, jak se blikají a zhášejí jednotlivé LED.
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.
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ů.
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.
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.
void moveAtSpeed(uint8_t desired_speed_left, uint8_t desired_speed_right) 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.
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í.
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.
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.
Při požadavku na provádění posloupnosti, musíme vždy nastavit parametr blokování na TRUE! Můžete ještě provést elementární reakci na překážku s parametrem blokování nastaveným na TRUE – pomocí obsluhy události. Tyto obsluhy událostí volané z libovolného místa nezávisí na nastavení parametru blokování na TRUE! Tato metoda však může v některých složitějších situacích zkolabovat.
4.6.11. Funkce sběrnice I2C Na konci této kapitoly se zaměříme na funkce sběrnice I2C, které mohou být využity pro komunikaci s dalšími mikroprocesory a rozšiřujícími moduly. Existují dvě verze funkcí sběrnice I2C – jedny pro režim slave a druhé pro režim master. Pozor: nemůžete používat obě verze funkcí současně! Vložit můžete pouze jednu ze dvou verzí a musíte dávat pozor, aby byla uvedena v makefile.
Pole a proměnné se obecně nazývají: I2CTWI_readRegisters, I2CTWI_writeRegisters a I2CTWI_genCallCMD Registry pro čtení se nazývají I2CTWI_readRegisters a registry pro zápis I2CTWI_writeRegisters. Do proměnné I2CTWI_genCallCMD se ukládá většina zbývajících přijatých příkazů General Call. Výměna dat v režimu slave kompletně pracuje s těmito registry. V případě, že máte data dostupná na sběrnici vložíte je do pole I2CTWI_readRegisters.
Tento příklad ukazuje, jak jednoduchý může být program I2C slave: Vlastní program nebude nic dělat (evidentně) a tak potřebujete master pro ovládání zařízení typu slave. V tomto případě je slave na sběrnici I2C dostupný na adrese 10 (viz řádek 10). Program poskytuje dva registry pro zápis a jeden registr pro čtení dat. První registr (= registr číslo 0) se používá pro příjem příkazů. Tento zjednodušený příklad používá příkaz “3” pro nastavení LED (může to být libovolné číslo).
4.6.11.2. I2C master V režimu master se může používat TWI modul mikroprocesoru ATmega32 k ovládání dalších zařízení, mikroprocesorů nebo snímačů přes sběrnici I2C. void I2CTWI_initMaster(FREQ) Tato funkce inicializuje modul TWI jak master. Režim master samozřejmě nevyžaduje adresu – ale pro TWI modul máme definovat kmitočet datového přenosu. Kmitočet definujete v kHz pomocí parametru FREQ. Obvyklá hodnota je 100 kHz, která se může nastavit parametrem 100. Přenosová rychlost může používat hodnoty až do 400.
void I2CTWI_transmitBytes(uint8_t targetAdr,uint8_t *msg,uint8_t numberOfBytes) Základem této funkce bude přenos maximálně 20 byte na specifikovanou adresu. Pro přenos větších bloků dat můžete v hlavičkovém souboru zvětšit konstantu I2CTWI_BUFFER_SIZE. Při zadání registru pro přenos dat můžete jednoduše použít první byte bufferu.
Následující funkce umožňuje čtení několika byte: void I2CTWI_readBytes(uint8_t targetAdr, uint8_t *messageBuffer, uint8_t numberOfBytes); Příklad: I2CTWI_transmitByte(10, 22); uint8_t results[6]; I2CTWI_readBytes(10,results,5); Tento útržek programu přečte 5 byte z registru 22 zařízení slave s adresou 10. Pokud jsou data skutečně přečtena z registru 22, tak je slave změní.
void I2CTWI_setTransmissionErrorHandler(void (*transmissionErrorHandler) (uint8_t)) Obsluha musí mít tvar: void I2C_transmissionError(uint8_t errorState) parametr funkce definuje kód chybového stavu. Přehled chybových kódu “režimu I2C master” najdete v hlavičkovém souboru. Ve skutečnosti můžete obsluhu události použít k detekci chyb všech funkcí běžících na pozadí, v hlavním programu a blokovacích funkcí.
4.7. Ukázkové programy CD obsahuje docela dost krátkých ukázkových programů, které demonstrují základní funkčnost robotu. Většina těchto příkladů je skutečně jednoduchá a bez složitě optimalizovaných řešení. Předpokládá se, že většina příkladů bude výchozím bodem pro vaše vlastní programy. Původní záměr je ponechat některé zajímavé úlohy na vás – můžete klidně znuděně nahrát předem sestavené programy do robotu, nebo ne? Několik ukázkových programů je více či méně určeno pro zkušené uživatele.
Drobný detail je, že se světlo pomocí operátoru “posuv doleva” – který se použil v předchozích příkladech bez vysvětlení: Význam operátoru vysvětlíme hned. Základ operace posun doleva “<<” (viz řádek 2) je umožnění posunu bitů v proměnné o definovaný počet míst doleva. Samozřejmě můžeme také používat ekvivalentní operátor posun doprava “>>”. To znamená, že výraz runningLight <<= 1; posouvá všechny bity v proměnné runningLight o jedno místo doleva.
Příklad 4: Ukázkový program Stopky Adresář: \RP6BaseExamples\Example_03_Stopwatches\ Soubor: RP6Base_Stopwatches.c Tento program vysílá hlášení na sériové rozhraní V tomto ukázkovém programu se robot nepohybuje! V tomto programu se používají čtvery stopky. První z nich vytváří běžící světlo s obnovovacím intervalem 100ms a další se použily pro tři zvyšování počítadel v různých intervalech a jejich hodnoty se vysílají přes sériové rozhraní.
Příklad používá blokovaný režim funkcí pro jízdu a otáčení, který bude automaticky volat task_RP6System. Proto nemusíme tuto funkci volat opakovaně. Příklad 8: Pohyb robotu po čtverci Adresář: \RP6BaseExamples\Example_05_Move_03\ Soubor: RP6Base_Move_03.c POZOR: Robot se bude v tomto programu pohybovat! Nyní se robot pokusí pohybovat po čtverci s délkou strany 30cm. Po dokončení jízdy se otočí a pohybuje se opačným směrem.
Podívejte se na jednoduchý příklad: 113
Ukažme si tento příklad zredukovaný do nezbytného základního principu. Stavový automat obsahuje různé stavy a přechody mezi nimi. V našem příkladu máme čtyři stavy: STATE_START a STATE_1 až SATE_3. Stavový automat můžeme znázornit také následujícím stavovým diagramem: “S” je počáteční stav. Není zde použitý žádný podmíněný stav, proto bude systém postupně měnit stavy až do stavu 3 a restart v kterémkoliv kroku začne posloupnost od stavu S.
Příklad 10: Konečný stavový automat, část 2 Adresář: \RP6BaseExamples\Example_05_Move_04_FSM2\ Soubor: RP6Base_Move_04_FSM2.c POZOR: Robot se bude v tomto programu pohybovat! Nyní vyzkoušíme konečný stavový automat s pohyblivým robotem! Program je skutečně jednoduchý. Nejdříve bliká LED 5. Přitom robot po nás požaduje: “Můžete, prosím, někdo stisknout levý nárazník?”. Když to uděláte, přesune se RP6 asi o 15 cm dozadu a začne blikat stavová LED 2.
Pomocí těchto dvou velmi elementárních chování, robot obvykle začne projížďkou a bude zkoumat okolní prostředí. Jednoduchý senzorický systém tvoří dva snímače pro detekci kolizí. Samozřejmě se nejedná o příliš složité chování. Představte si situaci, ve které se můžete pohybovat uvnitř vašeho domu a vaše vnímání se omezí na dva prsty – žádné oči, žádné uši, žádné další smysly nepomáhají, máte jen tyto dva prsty, kterými se můžete stále dotýkat pouze věcí přímo před sebou...
Příklad 13: LDR – snímače osvětlení Adresář: \RP6BaseExamples\Example_06_LightDetection\ Soubor: RP6Base_LightDetection.c Tento program bude vysílat hlášení na sériové rozhraní. V tomto ukázkovém programu se robot nepohybuje. Tento ukázkový program demonstruje, jak se používají dva světelné snímače. Pro indikaci snímače, na který dopadá více světla (nebo zda je osvětlení obou snímačů stejné) používáme stavové LED. Vedle toho bude program také neustále hlásit tyto informace na sériové rozhraní.
Příklad 15: Dálkové ovládání pomocí univerzálního IR dálkového ovladače RC5 Adresář: \RP6BaseExamples\Example_08_TV_REMOTE\ Soubor: RP6Base_TV_REMOTE.c POZOR: Robot se bude v tomto programu pohybovat! Tento ukázkový program vám dovolí ovládat robot podobně jako dálkově ovládané autíčko pomocí běžného televizního dálkového ovladače s kódováním RC5. Ve srovnání s běžnou funkčností většiny RC autíček, přidáme několik zvláštních pohybů.
Příklad 17: Rozhraní sběrnice I2C – režim Master Adresář: \RP6BaseExamples\Example_I2C_MASTER_02\ Soubor: RP6Base_I2C_MASTER_02.c Tento program demonstruje, jak se používá režim Master sběrnice I2C. Před spuštěním programu musíte mít samozřejmě na sběrnici I2C připojené vhodné zařízení typu slave. V tomto ukázkovém programu přidáme rutiny pro PCF8591.
Příklad 20: Rozhraní sběrnice I2C – režim Slave Adresář: \RP6BaseExamples\Example_I2C_SLAVE\ Soubor: RP6Base_I2C_SLAVE.c Na začátku program nebude předvádět žádnou viditelný výstup. K robotu musíte přidat rozšiřující modul, který dokáže ovládat robot a chová se jako I2C master Systém vytváří senzorický systém robotu pomocí několika přídavných mikroprocesorů. Ve většině případů je to dobrým řešením ponechat jeden přídavný mikroprocesor na řízení celého robotu.
5. Experimentální deska Pro sestavování vašich vlastních obvodů již existuje rozšiřující experimentální modul, který se dodává společně s robotem. Modul se dodává jako stavebnice. Musíte si SPRÁVNĚ zapájet propojovací konektory. Zvláštní pozornost musíte věnovat správné polaritě konektorů – zkontrolujte bílý potisk desky plošných spojů. Sestavování vlastních obvodů z vývodových součástek vyžaduje určitou zkušenost s pájením a elementární znalosti o elektronice.
6. Závěrečné slovo Na tomto místě tento malý úvod do světa robotiky končí. Doufáme, že jste si naplno užili všechny aktivity s robotem RP6! Všechny začátky jsou těžké, obzvláště v této složité oblasti, ale jakmile jste zvládli první překážky, zažijete s robotikou spoustu legrace a snadno zvládnete řadu nových věcí. Pokud jste se spřátelili s programováním v jazyku C, můžete začít sestavovat své vlastní zajímavé projekty.
PŘÍLOHY A – Vyhledávání a odstraňování problémů V této příloze je souhrn řady problémů a možných příčin, řešení a návrhů, jak se těmto problémům vyhnout. Seznam může být postupně čas od času rozšiřován a aktualizován! 1. Robot nelze zapnout - žádná LED nesvítí a robot nereaguje na tlačítko Start/Stop! • USB rozhraní je zapojeno do robotu, ale ne do PC! Toto spojení bude držet mikroprocesor MEGA32 v režimu reset, který mikroprocesoru znemožňuje bliknutí libovolné LED diody.
3. Během pohybu robot opakovaně generuje RESET a zastavuje program! • Baterie neposkytuje dostatečnou energii pro napájení systému! • Baterie selhává (nekvalitní nebo příliš stará baterie) a během provozu způsobuje poklesy napětí, které automaticky vedou k vyvolání resetu. V takovém případě použijte v robotu čerstvé baterie a zkuste ho spustit znovu! • Baterie nejsou pevně vloženy v držáku nebo je špatný kontakt v kabeláži napájení. • Přetížení baterie může způsobovat rozšiřující modul! 4.
Nemažte, prosím, tímto olejovým způsobem převodovky! To může zničit systém snímače otáčení! Přestože ropa nemůže poškodit elektronické součástky, může kapalina poškodit nalepená snímací kola, na které se nesmí dostat žádná tekutinu, protože výrazně ovlivňuje odrazivost! Navíc může otáčení ozubených kol rozstříknout tyto tekutiny a maziva kamkoliv uvnitř interiéru robota! Použití mazacího tuku (ne tekutiny!) je omezen pouze na hřídele (!) obou převodových ústrojí! Mazací tuk obvykle vůbec nezlepší hlučnost .
7.
• ACS bude často špatně rozpoznávat černé nebo velmi tmavě překážky. Černé objekty mají více či méně tendenci zcela absorbovat IR světlo. Toto je normální fyzikální chování! Pro spolehlivou detekci objektů můžete navíc použít jiné typy snímačů (například ultrazvukový měřič vzdálenosti...)! • Robot se provozuje v prostředí s jasným osvětlením, např. s přímým slunečním světlem, zářivkami nebo na podsvícením plochých obrazovek. Tyto světelné zdroje mohou rušit IR-komunikaci a ACS. 10.
změnit názvy adresářů v souboru makefile! Jinak se kompilátoru nepodaří najít tyto soubory! o Zapomněli jste někde v programu středník? o Chybí v programu něco důležitého nebo je nadbytečné? o Dodržovali jste správnou syntaxi jazyka C? Kromě komentářů a obvyklých formátovacích pravidel pro mezery a tabulátory, psaní různých variant symbolů je pro kompilátor jazyka C vše ostatní relevantní.
15. Potýkáte se s jinými problémy? • Zkuste znovu přečíst důležité části příručky! To může často pomoci, ale někdy to nic nepřinese ... • Máte již staženu nejnovější http://www.arexx.com/ nebo http://www.arexx.com/rp6? verzi software a poslední verze manuálu z z domovských webových stránek RP6 • Použiváte vyhledávací funkci na našem fóru --> http://www.arexx.com/forum/ • Navštívili jste webové stránky AVRFreaks věnované programovacímu jazyku C, systému AVR nebo problematice mikroprocesorů? --> http://www.
B – Kalibrace enkodérů Účinné rozlišení snímače polohy závisí na reálném průměru kol a gumových pásů. Housenky gumových pásů se zatlačují do povrchu, nebo se deformují dovnitř. Výrobní tolerance navíc způsobují změny velikosti průměru. Pro kompenzaci těchto odchylek budeme muset provést několik měření a kalibrovat rozlišení snímačů (enkoderů). Rozlišení je vzdálenost ujetá s každým krokem snímače.
Dokonalejší metody měření vzdálenosti a polohy Měření vzdálenosti pomocí encodéru nikdy nedostane 100% přesnost. Pokud potřebujete lepší navigaci, budete muset použít další senzory. Například na Michiganské Universitě v USA navrhli malý přívěs, který nese ekodérové snímače polohy pro jeden ze svých velkých pásových robotů. Robot táhne přívěs, který byl připojen pomocí otočné kovové tyče. Kola encodéru na nápravě přívěsu poskytují, po provedení několika výpočtů, přesné údaje o poloze.
C – Rozmístění kontaktů na konektorech Tento přehled vám poskytuje nejdůležitější rozložení kontaktů na konektorech základní desky. Seznam jsme dále rozšířili o řadu detailů pro používání. Pro úplnost opět začneme definicí kontaktů konektoru pro rozšiřující moduly (viz kapitola 2): Na hlavní desce je vývod 1 umístěn na straně bílého popisu s nápisy XBUS1 a XBUS2, respektive na značce "1" vedle konektoru.
Konektory AD převodníku: Obrázek ukazuje uspořádání kontaktů konektoru obou volných kanálů AD převodníku. Tyto konektory jsme neosadili a můžete je využívat pomocí konektorů se třemi kontakty s roztečí 2,54 mm. Při pájení buďte opatrní, abyste nezničili základní desku! Pokud nemáte zkušenosti s pájením, vynechejte prosím, pájení na desce spojů a raději začněte pokusy pomocí rozšiřovací desky! Na tyto volné ADC kanály můžete volně připojit dva analogové nebo digitální snímače.
D – Recyklace a bezpečnostní pokyny Recyklace Likvidace RP6 v domovním odpadu není povoleno! Při likvidaci musí být robot doručen do místního recyklačního centra nebo jiných recyklačních center pro elektroniku! Podrobnosti zjistíte u místního prodejce elektroniky. Bezpečnostní pokyny pro baterie Baterie (akumulátory a alkalické články) musí být uchováván mimo dosah dětí! Nedovolte, aby baterie ležely na místech, která jsou přístupná pro každého, jejich části mohou spolknout děti nebo zvířata.