VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ Diplomová práce

Transkript

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ Diplomová práce
VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ
Fakulta strojního inženýrství
Ústav mechaniky těles, mechatroniky a biomechaniky
Diplomová práce
Návrh a realizace autonomního robotu pro kategorii IEEE Micromouse
Diplomant: Tomáš Paseka
Vedoucí práce: Ing. Tomáš Marada, Ph.D.
Brno, květen 2006
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Abstrakt
Diplomová práce je zaměřena na návrh řídicího softwaru pro autonomního robota
třídy IEEE Micromouse. Jejím cílem je navrhnout a ve vhodném programovacím jazyce
implementovat řídící software pro jednotlivé moduly robotu, kterými jsou modul hlavního
CPU, modul senzorů a modul motorů.
Práce se zabývá řízením krokových motorů a odometrií robotu s diferenciálním
podvozkem. Dále měřením vzdálenosti pomocí senzorů pracujících na principu odrazu
infračerveného světla. Práce se také zabývá návrhem a realizací strategie na prohledávání a
mapování bludiště a nalezením optimální cesty bludištěm. Všechny navržené algoritmy
byly realizovaný v programovacím jazyce C.
-2-
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Prohlášení
Prohlašuji, že jsem diplomovou práci na téma „Návrh a realizace autonomního
robotu pro kategorii IEEE Micromouse“ vypracoval samostatně bez cizí pomoci,
na základě rad a pokynů vedoucího diplomové práce. Vycházel jsem přitom ze svých
znalostí, odborných konzultací a literárních zdrojů.
…........................................
Tomáš Paseka
-3-
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Poděkování
Na tomto místě bych rád poděkoval všem, kteří mi byli nápomocni při tvorbě
diplomové práce. Především bych rád poděkoval vedoucímu diplomové práce Ing. Tomáši
Maradovi Ph.D. za odbornou pomoc a cenné rady.
Dále bych rád poděkoval svým přátelům a především rodině za všestrannou
podporu po celou dobu mého studia.
-4-
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
1 Obsah
2 Úvod...............................................................................................................7
2.1 Cíle práce....................................................................................................................7
2.2 O micromouse............................................................................................................7
2.3 Pravidla soutěže.........................................................................................................8
3 Současný stav problematiky ve světě........................................................12
3.1 Robot Edgar B..........................................................................................................12
3.2 Robot Maisie............................................................................................................12
3.3 Robot MITEE 7.......................................................................................................13
3.4 Robot MITEE 8.......................................................................................................13
3.5 Danger Mouse..........................................................................................................14
3.6 AIRAT 2....................................................................................................................14
4 Používané typy robotů v soutěži Micromouse.........................................16
4.1 Robot s diferenciálním podvozkem (differential drive).......................................16
4.2 Robot se synchronním podvozkem (synchro drive)..............................................17
4.3 Robot s tříkolovým uspořádáním (tricykle drive)................................................18
4.4 Robot s Ackermanovým podvozkem (Ackerman steering nebo kingpin
steering)..........................................................................................................................19
4.5 Podvozky se všesměrovými koly.............................................................................21
5 Robot vyvíjený na UAI FSI VUT v Brně..................................................23
5.1 Popis architektury...................................................................................................23
6 Komunikace mezi moduly.........................................................................25
6.1 Popis paketu.............................................................................................................25
6.2 Realizace komunikace pro mikrokontroléry ATMega.........................................26
6.2.1 Popis struktury CommInfo.................................................................................26
6.2.2 Odesílání paketu.................................................................................................29
6.2.3 Přijímání paketu.................................................................................................30
6.2.4 Timeout komunikace..........................................................................................32
6.2.5 Synchronizace....................................................................................................32
6.2.6 Odlišnosti v implementaci pro procesory s dvěma periferiemi USART...........32
6.3 Realizace komunikace pro PC................................................................................33
6.3.1 Popis třídy CSerialPort a CSerialBuffer............................................................34
6.3.2 Popis třídy CSerialPortMM a CPaket................................................................39
7 Modul Senzoriky.........................................................................................42
7.1 Vlastnosti senzoru GP2D120..................................................................................42
7.2 Zapojení senzoru GP2D120....................................................................................43
7.3 Software modulu senzorů........................................................................................43
7.3.1 Měření napětí.....................................................................................................44
7.3.2 Převod napětí na vzdálenost...............................................................................44
7.4 Popis všech paketů modulu.....................................................................................45
7.5 Testovací software na PC........................................................................................48
8 Modul Motoru.............................................................................................50
-5-
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
8.1 Hardware motoru....................................................................................................50
8.2 Odometrie manévrů modulu..................................................................................51
8.2.1 Akcelerace motorů.............................................................................................52
8.2.2 Ujetí požadované vzdálenosti............................................................................52
8.2.3 Otočení na místě o zadaný úhel.........................................................................53
8.2.4 Zatáčka o 90˚ během jízdy.................................................................................54
8.3 Software modulu......................................................................................................56
8.3.1 Řízení krokových motorů..................................................................................56
8.3.2 Výpočet nové rychlosti a nastavení Output Compare registru .........................57
8.3.3 Hlídání ujeté vzdálenosti....................................................................................59
8.3.4 Řízení jízdy zatáčkou.........................................................................................59
8.4 Popis všech paketů modulu.....................................................................................61
8.5 Testovací software modulu pro PC.........................................................................65
9 Modul hlavního CPU..................................................................................66
9.1 Hardware..................................................................................................................66
9.2 Software....................................................................................................................66
9.2.1 Základní myšlenka softwaru..............................................................................66
9.2.2 Hlavní řídící proměnné modulu.........................................................................67
9.3 Základní funkce programu.....................................................................................68
9.3.1 Hlídání okamžiku začátku startu do zatáčky.....................................................69
9.3.2 Měření napájení.................................................................................................70
9.3.3 Regulace směru jízdy.........................................................................................71
9.3.4 Mapování bludiště..............................................................................................71
9.4 Řízení jízdy...............................................................................................................75
9.4.1 Prohledávání bludiště.........................................................................................75
9.4.2 Nalezení optimální cesty....................................................................................77
9.4.3 Řízení naplánované jízdy bludištěm..................................................................78
9.5 Popis všech paketů modulu.....................................................................................80
9.5.1 Usart 0................................................................................................................80
9.5.2 Usart 1................................................................................................................80
9.6 Testovací software na PC........................................................................................82
10 Závěr..........................................................................................................83
Použitá literatůra...........................................................................................84
Seznam příloh................................................................................................85
-6-
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
2 Úvod
Diplomová je zaměřena na návrh a realizaci autonomního robotu pro kategorii
IEEE Micromouse, který je vyvíjený na Ústavu automatice a informatiky FSI VUT v Brně,
pro ověřování metod umělé inteligence. Při jeho návrhu byl kladen důraz na univerzální
a jednoduchou konstrukci a také na nejnižší cenu.
Robot je složen z několika samostatných modulů, a to z modulu hlavního CPU,
modulu senzorů a modulu motorů. Práce se zabývá návrhem a realizací komunikace mezi
jednotlivými moduly. Dále se zabývá návrhem řídícího softwaru pro každý modul,
odometrií robotu s diferenciálním podvozkem a řízením krokových motorů. Dále se zabývá
měřením vzdálenosti pomocí senzorů pracujících na principu odrazu infračerveného světla.
Další část práce je zaměřena na návrh algoritmů prohledávání a mapování bludiště
a nalezení optimální cesty v bludišti.
Všechny algoritmy jsou realizovány v programovacím jazyce C a jejich funkčnost
je experimentálně ověřena v bludišti.
2.1 Cíle práce
Tato práce si klade za cíl:
●
Ověřit funkčnost a případně navrhnout úpravy hardwarové části robotu.
●
Navrhnout a realizovat komunikaci mezi jednotlivými části robotu.
●
Navrhnout a realizovat software pro modul senzorů.
●
Navrhnout a realizovat software pro modul motorů.
●
Navrhnout a realizovat software pro modul hlavního CPU.
2.2 O micromouse
Micromouse je soutěž autonomních robotů, která probíhá od roku 1970. Princip
soutěže spočívá v prozkoumání bludiště a nalezení optimální trasy ze startovního bodu
do středu bludiště, v nejkratším možném čase. Provedení bludiště i robotu stanovují
pravidla soutěže, která jsou popsána níže.
-7-
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
2.3 Pravidla soutěže
Tato kapitola vychází z [8].
Soutěžní úloha
Navrhnout a sestrojit mikropočítačem řízený autonomní robot, který dokáže projet
bludištěm v co nejkratším čase.
Bludiště
Bludiště se skládá ze sítě základních čtverců o velikosti 18 x 18 cm, maximální
rozměr bludiště je omezen na 16 x 16 základních čtverců. Stěny bludiště jsou 5 cm vysoké
a 1,2 cm tlusté a mají povolenou odchylku ±5%. Z toho plyne, že chodbičky bludiště jsou
16,8 cm široké. Vnější stěna uzavírá celé bludiště. Stěny bludiště jsou z boku bílé, horní
strana stěn je červená. Podlaha bludiště je ze dřeva nebo z podobného materiálu, natřená
matnou černou barvou. Povrch bočních stěn bludiště by měl odrážet infračervené světlo
a povrch podlahy by ho naopak měl pohlcovat.
Start se nachází v jednom ze čtyřech rohů bludiště. Ve středu bludiště je otevřená
část, tvořená čtyřmi základními čtverci. Tento centrální čtverec je cílem, vchod do tohoto
čtverce je jen jeden. Je možné, že do cíle povede více než jedna cesta.
V bludišti se dá použit pravidlo pravé respektive levé ruky, oba směry nemusí být
rovnocenné. Zároveň to ale není nejkratší cesta do cíle. Záměrem tohoto zjednodušení
je umožnit účast i začátečníkům, kteří se obvykle potřebují více soustředit na konstrukci
robotu než na algoritmus.
Celkové rozměry bludiště musí být dodržené s přesností 5% nebo 2 mm, vždy
menší z obou hodnot. Spoje na podlaze nesmí vytvářet schůdky větší než 1 mm. Změna
sklonu nesmí být větší než 4 stupně. Mezery mezi souvisejícími stěnami jsou menší
než 2 mm.
Robot - myš
Myš musí být autonomní. Nesmí používat zdroj energie, který využívá spalovací
proces. Délka a šířka nesmí překročit 25 cm. Pokud myš mění v průběhu jízdy svoje
rozměry, v žádném okamžiku nesmí překročit 25 x 25 cm, výška není omezená. Myš nesmí
během cesty bludištěm nic odhodit ani ztratit. Myš nesmí skákat, překračovat nebo lozit
po stěnách. Také nesmí žádnou svou činností poškodit bludiště.
-8-
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Senzorika
Na typ a počet senzorů nejsou kladeny žádné speciální omezení, pokud neporušují
jiná pravidla. Soutěžící nesmí použít žádné vnější pomůcky pro zlepšení navigace
(nálepky, značky, zrcadla).
Elektronika
Žádná část robotu nesmí pracovat s napětím vyšším než 24V. Celková spotřeba
by neměla překročit víc než 20A. Vyjímky z tohoto pravidla povoluje porota.
Klimatické podmínky
Soutěž probíhá v běžných klimatických podmínkách (T = 270-310K, p = 90 –
120kPa, 0-90%RH). Není možné předem zaručit úroveň osvětlení, ale před každou soutěží
je vyhrazený čas, který soutěžící může využít na optimální nastavení citlivosti snímačů.
Hodnocení
Základní úlohou je dojet ze startovního čtverce do cílového. Tuto cestu nazveme
„pokus“ a čas, který zabere nazveme „čas pokusu“. Cesta zpět z cílového čtverce
do startovního se nepovažuje za pokus. Měří se i celkový čas strávený v bludišti, který je
pro každého soutěžícího omezený na 10 minut. Pokud bude myš v průběhu jízdy
vyžadovat zásah soutěžícího, bude to považováno za „dotknutí“.
Soutěžní čas myši v jednom pokusu se vypočítá jako součet času pokusu, 1/30
času stráveného v bludišti a třísekundové penalizace za jakékoliv dotknutí. Hodnotí
se pouze nejkratší soutěžní čas ze všech pokusů, který daná myš dosáhne.
Když myš dosáhne středu bludiště (cíl), může ji soutěžící zdvihnout a restartovat,
nebo se může samostatně vrátit na start. Zdvihnutí je samozřejmě považováno za dotknutí
a soutěžící dostane tří sekundovou penalizaci. Po dosáhnutí cíle může myš pokračovat
ve zkoumání bludiště a hledat optimální cestu.
Soutěžící nesmí mít při aktivaci myši možnost volit ani ovlivnit strategii.
Po odkrytí bludiště ani při restartu nesmí vložit myši žádnou informaci.
Čas pokusu bude naměřený od okamžiku, kdy myš opustí startovní čtverec,
po okamžik, kdy vjede do cílového čtverce. Celkový čas bludiště bude měřený
od okamžiku aktivování myši. Myš se nemusí začít okamžitě po aktivaci pohybovat, ale
musí být položená do startovního čtverce a připravená na pokus. Pokud se myš vrátí
na start bez dosáhnutí cíle, tento pokus se zastaví a po opakovaném startu začne měření
dalšího pokusu.
-9-
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Čas potřebný na průzkum bludiště bude měřený buď ručně organizátorem, nebo
infračervenými senzory na startu a v cíli. Infračervený paprsek bude vodorovný, na hranici
mezi prvním a druhým čtvercem a při vchodu do cílového čtverce cca 10 mm
nad podlahou.
Pokud myš přestane správně fungovat, může soutěžící požádat porotu o možnost
zrušit pokus a restartovat myš, ne však v případě že myš udělala špatný obrat, nebo
se vydala špatnou cestou.
Pokud soutěžící v průběhu soutěže vymění libovolnou část myši (baterie,
EPROM, atd.), nebo provede jinou podstatnou úpravu, musí vymazat všechny informace
o bludišti, které myš do té doby získala. Malé úpravy (např. nastavení citlivosti snímačů)
jsou povolené pod dohledem poroty. Úpravy rychlosti nebo strategie jsou bez vymazání
informaci o bludišti zakázané.
Žádná část myši s výjimkou baterií nesmí být použita na jinou myš. Například
pokud je použito jedno šasi a dva různé řídící obvody, potom se považují za jednu myš
a nesmí překročit 10 minutový čas bludiště. Před výměnou řídící jednotky je nutno
vymazat paměť. Myš nesmí být v průběhu soutěže odlehčována, např. odstraněním
nepotřebných senzorů po prozkoumání bludiště.
Mezi dokončeným pokusem a startem dalšího pokusu musí myš zůstat alespoň
1 sekundu na startovním čtverci. Během této sekundy nesmí robot zakrývat infrasenzor
pro měření času pokusu.
Hodnocení
Vítězem se stane robot s nejnižším dosaženým soutěžním časem. Pokud
v průběhu soutěže nedosáhne žádná myš cíle, porota určí vítěze na základě celkové
úspěšnosti, např. jak blízko k cíli se podařilo dostat, nebo jestli byl pohyb v bludišti
koordinovaný nebo náhodný apod.
Diskvalifikace
Všeobecně platí, že při každém porušení předpisů je robot vyloučený ze soutěže.
To platí zejména v těchto situacích:
•
nebezpečné chování
•
poškození dráhy
- 10 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Bezpečnost
Robot musí dodržovat tři zákony robotiky:
1. Robot nesmí ublížit člověku, nebo svojí nečinností dopustit, aby bylo člověku
ublíženo.
2. Robot musí poslechnout příkaz člověka, s vyjímkou pokud je příkaz v rozporu
s prvním zákonem.
3. Robot musí chránit sám sebe před zničením, s vyjímkou rozporu s prvním
a druhým zákonem.
- 11 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
3 Současný stav problematiky ve světě
Tato kapitola vychází z [9] a [10].
3.1 Robot Edgar B
Edgar je mikromyš postavená Petem
Harrisonem. Myš má klasický dvoukolový
podvozek, který je poháněný dvojicí krokových
motorů, které jsou řízeny relativně výkoným
procesorem 80C196.
V současné době je myš vybavena
třemi detektory pro měření vzdálenosti, které
jsou umístěny po jednom na každé straně
Obr. 3.1: Robot Edgar
a jeden vpředu. Senzory jsou schopny detekovat
zeď v rozmezí 2 – 13cm. Senzory jsou závislé na odrazu aktuálního povrchu a proto musí
byt zkalibrované pro každé bludiště.
3.2 Robot Maisie
Obr. 3.3: Robot Maisie
Obr. 3.2: Robot Maisie
Masie je robot, kterého postavil C. Kanesalingham z Univerzity of East London.
Masie je od počátku velmi úspěšným robotem v soutěži, který nevyniká vysokými
rychlostmi, ale vysokou spolehlivostí.
Masie je založena na diferenciálním podvozku, který je osazen dvěma krokovými
motory. Pro spolehlivou detekci zdí, autor vybavil myš šesti infračervenými snímači, které
jsou umístěný po dvou na každém z bočních ramen a dvě vpředu a dvěma mikrospínači pro
- 12 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
detekci kolizí. Velkou zvláštností je použití olověné baterie, která je umístěna vzadu nad
motory, díky niž robot vyniká velkou hmotností.
Během soutěže Masie jednoduše jezdí podél zdí, dokud se nedostane do středu
bludiště. Tím často poráží své podstatně sofistikovanější soupeře, kteří se často ztratí nebo
uváznou.
3.3 Robot MITEE 7
MITEE 7 je robot kterého postavil
Dave
Otten's
z Massachusetts
a
Institute
Tony
Caloggero
of
Technology.
Podvozek robotu je tvořen čtyřmi poháněnými
a zároveň řiditelnými koly, konstrukce je dobře
vidět na Obr. 3.4.
Toto řešení je poněkud složitější
než diferenciální nebo tříkolové uspořádání,
ale přináší sebou několik výhod. Při akceleraci
Obr. 3.4: MITEE 7
je váha robotu přenášena na zadní nápravu, to u dvoukolového uspořádání vede
k odlehčení nápravy a tím k možnému prokluzu, u čtyřkolového uspořádání se všemi
hnanými koly je možnost prokluzu minimální. Další výhodou je natáčení všech čtyř kol,
díky němuž je myš schopna projíždět zatáčky o velmi malém poloměru poměrně vysokou
rychlostí.
Robot je vybaven osmi DC motory, čtyři slouží k pohonu kol a zbylé čtyři k jejich
natáčení. Pro orientaci v bludišti jsou použity infračervené senzory pro měření vzdálenosti
v každém směru.
3.4 Robot MITEE 8
MITEE
8
je
další
robot
vyvinutý
na Massachusetts Institute of Technology stejnými
autory jako MITEE 7, ale na rozdíl od svého
předchůdce má klasické dvoukolové diferenciální
uspořádání.
Myš je poháněna dvěma DC motory Obr. 3.5: MITEE 8
- 13 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
se šesti 225mAh NiCd akumulátory, díky ním je hmotnost myši jen 200g. Pro určování
polohy v bludišti je myš vybavena infračervenými senzory pro měření vzdálenosti.
Na spodní straně je umístěn inkrementální čítač, který je spojený s koly robotu a vytváří
tak zpětnou vazbu pro řízení motorů.
3.5 Danger Mouse
DangerMouse je robot, kterého postavil Finbarr Mc Carthy student University
of Limerick.
Podvozek
má
klasické
dvoukolové uspořádání a pro pohon jsou
použity dva krokové motory typu H546,
které jsou použity u komerční mikromyši
AIRAT. Pro řízení motorů je použito obvodů
ULN5804.
Pro orientaci v bludišti je myš vybavena
infračervenými snímači QRB1134 od firmy
Obr. 3.6: DangerMouse
Fairchild Semiconductor, které jsou umístěny
na dvojici ramen, vždy čtyři senzory na jednom rameni. Další senzor je umístěn vpředu,
pro měření vzdálenosti ke zdi. Myš je osazena procesorem Analog Devices ADuC831.
3.6 AIRAT 2
Robot AIRAT 2 je komerčně prodávaná
mikromyš, velice pokročilé konstrukce. Robot
je navržen jako nástroj pro výzkum metod
umělé inteligence. Myš má standardizované
rozměry, které stanovil Institute of Electricial
and Electronic Engineers (IEEE).
Robot je postaven na diferenciálním
podvozku, který je vyroben z hliníku a je
poháněn dvojicí krokových motorů typu H546. Obr. 3.7: Robot AIRAT 2
Myš je vybavena procesorem AT89C51 od firmy Atmel, který běží na frekvenci
22,11MHz, procesor disponuje 16KB flash paměti. Pro orientaci v bludišti myš používá
šest infračervených senzorů, dva směřují dopředu, dva do stran pod úhlem 90° a dva také
do stran, ale pod úhlem 45°. Senzory umístěné pod úhlem 45° umožňují spolehlivou jízdu
- 14 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
diagonálním směrem. Pro komunikaci s uživatelem je myš vybavena LCD displayem
a třemi ovládacími tlačítky.
K robotu je dodáváno CD se simulačním programem, jak pro simulování různých
operací myši tak pro simulování jízdy bludištěm.
- 15 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
4 Používané typy robotů v soutěži Micromouse
Tato kapitola vychází z [3] a [11]
I když pravidla soutěže přímo neurčují typ podvozku robotů, v soutěži
se používají výhradně kolové podvozky. Je to především díky jejich snadné mechanické
konstrukci, snadného řízení a tím pádem finančně nejméně náročné. Z tohoto důvodu
se dále budu zabývat pouze kolovými podvozky.
4.1 Robot s diferenciálním podvozkem (differential drive)
Jedná se patrně o nejjednodušší a nejpoužívanější typ podvozku pro mobilní
roboty, který je často používán u malých a levných strojů. Je to asi nejoblíbenější řešení
u amatérů
a nadšenců,
především
díky
jednoduché
konstrukci a snadnému řízení. Schématické uspořádání je
dobře vidět na obrázku Obr. 4.1
Jak je vidět na Obr. 4.1 podvozek obsahuje dvě
aktivní kola s jedním stupněm volnosti. Jako pohon jsou
nejčastěji používány malé stejnosměrné motory s enkodéry
Obr. 4.1: Schématický nákres
diferenciálního podvozku
či
krokové
motory.
mechanické
Při
konstrukci
nesmí být opomenuty opěrné body, nejčastěji třecí elementy
nebo kola s jedním čí lépe se dvěma stupni volnosti.
Mezi největší výhody diferenciálního podvozku
patří kromě jednoduché a robustní konstrukce a nízké ceny
také velmi jednoduchá a přesná odometrie pro navigaci
robotu. Tato výhoda je často používána i u poměrně
sofistikovaných robotů, kde je však odometrie doplňována
nějakou
další
metodou
bez
chyby
s
integračním
charakterem. Další velkou výhodou tohoto podvozku je
velmi dobrá manévrovatelnost. Robot s diferenciálním
podvozkem je schopen otočit se na místě, tato vlastnost
bývá ještě posílena tím, že roboty s diferenciálním
Obr. 4.2: Model diferenciálního
podvozkem mívají válcovitý tvar, což eliminuje možnost robotu
uvíznutí robotu v rozích místnosti a podobně.
- 16 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Odometrie robotu s diferenciálním podvozkem
Základem řízení diferenciálního robotu je rozdíl rychlosti jednotlivých kol. Pokud
se obě kola otáčí stejnou rychlostí a stejným směrem, robot jede rovně a naopak, pokud
se kola otáčí opačným směrem, robot se otáčí na místě kolem středu nápravy, tzv.
referenční bod.
Pokud je rozdíl rychlostí kol nenulový a obě nápravy se točí stejným směrem,
robot se pohybuje po kružnici, jejíž poloměr je dán poměrem rychlostí obou kol. Vše je
popsáno následujícími rovnicemi.
Poloměr kružnice zatáčky je dán Rov. 4.1, kde je R – poloměr zatáčky [m], b –
rozchod robotu [m], vl – rychlost levého kola [m/s], vr – rychlost pravého kola [m/s].
b v l v r 
R= ⋅
2 v l −v r 
Rov. 4.1
Úhel natočení robotu je dán Rov. 4.2, kde je φ – úhel natočení robotu [rad], Δsl –
dráha ujetá levým kolem [m], Δsr – dráha ujetá pravým kolem [m].
=
 s l  s r 
2
Rov. 4.2
Dráha ujetá robotem je popsána Rov. 4.3, kde je s – ujetá dráha [m], sl – dráha
ujetá levým kolem, sr – dráha ujetá pravým kolem [m].
s=
 sl s r 
2
Rov. 4.3
Rychlost referenčního bodu je vyjádřena rovnicí Rov. 4.4, kde je vref – rychlost
referenčního bodu [m/s], vl – rychlost levého kola [m/s], vr – rychlost pravého kola [m/s].
v ref =
v l v r 
2
Rov. 4.4
4.2 Robot se synchronním podvozkem (synchro drive)
U synchronního podvozku má každé kolo dva stupně volnosti. Typická
konfigurace tohoto podvozku obsahuje tři kola uspořádaná do tvaru rovnostranného
trojúhelníku. Tvar robotu bývá obvykle válcový, uspořádání je znázorněno na Obr. 4.3.
Všechna kola se vždy otáčí stejným směrem a stejnou rychlostí a míří také vždy na stejnou
stranu.
- 17 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Synchronizace pohybů jednotlivých kol lze
dosáhnout buď elektronicky pomocí vhodně navrženého
senzoricko-regulačního systému, nebo častěji pomocí
vhodného
mechanického
Pochopitelnou
nevýhodou
v
uspořádání
podvozku.
případě
elektronické
synchronizace je potřeba dvou motorů na každé kolo.
Při mechanickém provázání pohybů kol je sice složitější
Obr. 4.3: Schématický nákres
synchronního podvozku
mechanická konstrukce, postačí však pouze dva motory
pro libovolný počet kol.
Odometrie se synchronním podvozkem
Odometrie robotu se synchronním podvozkem je velice jednoduchá, protože
natočení všech kol je stejné, je i stejná jejich ujetá vzdálenost, vše je popsáno rovnicemi
Rov. 4.5 a Rov. 4.6, kde je βi – úhel natočení i-tého kola [°], Δβ – změna orientace [°], Δd i –
vzdálenost uhetá i-tým kolem [m], Δd – celková ujetá vzdálenost[m].
1=2=3= 
Rov. 4.5
 d 1= d 2= d 3= d
Rov. 4.6
4.3 Robot s tříkolovým uspořádáním (tricykle drive)
U tohoto podvozku jsou zpravidla hnaná zadní
kola a přední kolo je motoricky pouze natáčené, zatímco
ve směru pohybu je obvykle pasivně odvalováno.
Výhodou podvozku je jednoduché řízení, opět ovládáme
jedním motorem směr pohybu a druhým motorem
rychlost jízdy. Typické uspořádání je znázorněno na Obr.
4.4
Tento podvozek je již možno používat v těžším
Obr. 4.4: Schématický nákres
tříkolového podvozku
terénu a navíc umožňuje použití poměrně jednoduché
odometrie. Je však nutné počítat s poměrně značnou
chybou odometrického měření v případě pohybu v terénu, nárůst chyby způsobí i použití
nafukovacích pneumatik. Další nevýhodou tříkolového podvozku je, že není možná rotace
na místě, jako u předchozích typů. Hrozí tedy uvíznutí robotu v úzkých a komplikovaných
prostorách, rovněž autonomní řízení v takových prostorách představuje komplikovanou
úlohu.
- 18 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Odometrie robotu s tříkolovým uspořádáním
V závislosti na natočení řiditelného kolečka se tříkolka pohybuje buď po přímce
nebo po kružnici, pro zjištění pozice je
třeba dvou údajů – orientace řiditelného
kolečka a jeho ujetá vzdálenost. Nechť
je referenčním
bodem
střed
nápravy
pevných kol. Předpokládáme-li nenulové
natočení řídícího kolečka a tedy pohyb
po kružnici, bude střed této kružnice ležet
na ose hnaných kol, jak je vidět na Obr.
Obr. 4.5: Model tříkolového podvozku
4.5.
Poloměr kružnice je dán rovnicí Rov. 4.7, kde je R – poloměr kružnice [m], l –
vzdálenost náprav [m], ω -úhel natočení řídícího kolečka [˚].
R=
l
tan 
Rov. 4.7
Úhel, který tříkolka urazí po kružnici, a který bude zároveň odpovídat i změně její
orientace, se spočte podle Rov. 4.8, kde je φ – změna orientace [˚], dF – vzdálenost ujetá
řiditelným kolečkem [m], ω – úhel natočení řídicího kolečka [˚], R – poloměr zatáčky [m].
=
dF⋅cos 
R
Rov. 4.8
Změna pozice referenčního bodu je dána Rov. 4.9, kde je dx – změna pozice v ose
x [m], dy – změna pozice v ose y [m], φ – změna orientace [˚].
dx= R− R⋅cos  , dy =R⋅sin  
Rov. 4.9
4.4 Robot s Ackermanovým podvozkem (Ackerman steering nebo
kingpin steering)
Jde o typ známý z automobilů. V robotice bývá nejčastější uspořádání, kdy jsou
hnaná pouze zadní kola a přední jsou natáčena každé jiným úhlem, protože každé kolo
opisuje kružnici o jiném poloměru. Schématický nákres je na Obr. 4.6. Je možno použít
i podvozek se stejně natáčenými koly, je však nutno počítat s většími prokluzy při zatáčení.
Problémy se objeví zejména při vyšších rychlostech robotu.
- 19 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Ackermanův podvozek bývá používán zejména
u větších vozidel u kterých se předpokládá činnost
na běžných silnicích s požadovanou velkou nosností nebo
činnost v těžším terénu. I zde je možno použít odometrii,
v praxi však její použití nebývá příliš běžné. Nevýhodou
tohoto podvozku je nemožnost otáčky na místě.
Odometrie robotu s Ackermanovým podvozkem
Pokud má být střed otáčení dobře definován (tj. Obr. 4.6: Schématický nákres
žádné kolečko nebude ve smyku), je nutné, aby vnitřní Ackermanova podvozku
kolo zatáčelo více než vnější. Úhly natočení kol popisují rovnice Rov. 4.10 pro vnější kola
a Rov. 4.11 pro vnitřní kolo, kde je βin – úhel natočení vnitřního kola [°], βout – úhel
natočení vnějšího kola [°], R – poloměr zatáčky [m], l – vzdálenost náprav [m], b –
rozchod robotu [m].
l
R
Rov. 4.10
l
R−b
Rov. 4.11
tan out =
tan in =
Pokud nahradíme přední kola tzv.
virtuálním kolem, můžeme použít odometrii
pro tříkolový podvozek. Virtuální kolo je
umístěno ve středu přední nápravy (viz Obr.
4.7), jeho úhel natočení je závislý na natočení
kol přední nápravy a spočte se podle rovnice
Rov. 4.12, kde je βvr – úhel natočení virtuálního
kola [°], βin – úhel natočení vnitřního kola [°],
Obr. 4.7: Model Ackermanova řízení
βout – úhel natočení vnějšího kola [°], b –
rozchod robotu [m], l – vzdálenost náprav [m].
cotan vr =cotan out −
b
b
=cotanin 
2⋅l
2⋅l
- 20 -
Rov. 4.12
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
4.5 Podvozky se všesměrovými koly
Obr. 4.9: Všesměrové kolo
Obr. 4.8: Schéma robotu s
všesměrovými koly
Jako alternativa k běžně používaným kolům vznikla tzv. všesměrová či složená
kola, která umožňují pohyb ve dvou osách. Při vhodném použití takovýchto kol, je možno
zkonstruovat tzv. všesměrové mobilní platformy. Všesměrová kola jsou v zásadě běžná
kola, která mají na svém obvodu řadu pasivních válečků (viz Obr. 4.9). Kdyby byly dané
válečky zablokovány chovalo by se takové kolo jako běžné kolo s jedním stupněm
volnosti. Kdyby byla naopak zablokovaná hlavní osa kola, kolo by se mohlo pohybovat
pouze v kolmém směru. Kombinací těchto mechanizmů a vhodným uspořádáním
podvozku vzhledem k danému typu kol, je možno
dosáhnout
libovolného
pohybu
podvozku,
tj.
podvozek se může pohybovat jedním libovolným
směrem a libovolně rotovat, případně vykonávat oba
tyto pohyby současně. Každé kolo je poháněno
jedním motorem, ale celkově je nutné použít alespoň
tři motory. Jde o obecný princip – chceme-li
při pohybu
měnit
tři
prostorové
souřadnice,
potřebujeme k tomu alespoň tři zdroje pohybu.
Odometrie podvozku s všesměrovými koly
Obr. 4.10: Model všesměrového podvozku
Informace potřebné k výpočtu změny pozice obsahují jednotlivé enkodéry
a vzdálenost kol od středu robotu. Potom změnu pozice lze vypočítat ze soustavy rovnic
Rov. 4.13, kde je di – ujetá vzdálenost i-tého kola [m], dx – změna polohy v ose x, dy –
změna polohy v ose y, φ -změna úhlu natočení robotu [°], R – vzdálenost kola od středu
robotu [m].
- 21 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
d 1=d x ⋅R
d 2=−d x⋅sin 30d y⋅cos30⋅R
d 3 =−d x⋅sin 30−d y⋅cos 30⋅R
Rov. 4.13
Analogicky lze spočítat rychlost pole soustavy rovnic Rov. 4.14, kde je vi –
rychlost i-tého kola [m], vx – změna rychlosti v ose x, vy – změna rychlosti v ose y,
φ - změna úhlu natočení robotu [°], R – vzdálenost kola od středu robotu [m].
v 1=v x ⋅R
v 2 =−v x⋅sin 30v y⋅cos30⋅R
v 3=−v x⋅sin 30−v y⋅cos 30⋅R
- 22 -
Rov. 4.14
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
5 Robot vyvíjený na UAI FSI VUT v Brně
Jak již bylo popsáno výše, robot slouží k ověřování metod umělé inteligence.
Robot je navržen tak, aby ho bylo možno použít v soutěži kategorie IEEE Micromouse,
případně po výměně desky senzorů v kategorii Path-Follower. Při návrhu robotu byl
největší důraz kladem na univerzální a jednoduchou konstrukci a co nejnižší cenu.
Obr. 5.2: Pohled na robot zepředu
Obr. 5.1: Pohled na robot zezadu
5.1 Popis architektury
Robot je postaven na diferenciálním podvozku, pro pohon je použita dvojice
krokových motorů. Změna směru pohybu je realizována různou rychlostí otáčení kol. Aby
se robot nepřevrátil, je vybaven dvěma kulovými podpěrami. Základní technické parametry
robotu jsou v Tab 5.1.
Parametr
Hodnota
Podvozek
Diferenciální
Dvě hnaná kola
Dvě podpěry
Pohon
2x krokový motor TEAC KP39HM2-025
Senzory
3x senzor SHARP GP2D120
Napájení
4x akumulátor LiIon CGR18650/4,2V
Komunikace
2x RS323/TTL/38400Bd
Délka
130mm
Šiřka
105mm
Výška
80mm
Rozteč kol
95mm
- 23 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
Parametr
Hodnota
Hmotnost
990g
TOMÁŠ PASEKA
Tab 5.1: Základní technické parametry robotu
Řídící systém se skládá z jednotlivých modulů, které spolu komunikují
po společné sběrnici. Díky tomuto řešení lze snadno modifikovat robot pro danou úlohu.
V současné době je robot vybaven třemi základními moduly a to modul hlavního CPU,
modul senzoriky, modul řízení motorů, dále je možno připojit modul displeje a tlačítek,
pro zobrazování informací a nastavování parametrů robotu. Do budoucna se plánuje ještě
modul bezdrátového přenosu dat mezi robotem a PC, pro ověřování algoritmů umělé
inteligence, které vyžadují výkonnější CPU. Blokové schéma robotu je na Obr. 5.3
Moduly používají mikrokontroléry ATMega od firmy Atmel. Jedná se o procesory
s osmi bitovou architekturou, které mohou pracovat v rozsahu frekvencí 1-16MHz.
Tyto mikrokontroléry jsou dobrým kompromisem mezi výkonem a cenou, jsou k dostání
v mnoha provedeních, které se liší velikostí programové paměti a počtem periferií.
Proto je možné zvolit vždy optimální procesor pro daný modul.
Obr. 5.3: Blokové schéma robotu
Napájení všech modulů je zajištěno čtyřmi články LiIon CGR18650/4,2V
zapojených sériově, výsledné napětí je tedy cca. 16,8V. Napětí z baterií je přímo připojeno
do modulu hlavního CPU, který ho ještě stabilizuje na napětí 3V a 5V a rozvádí
do ostatních modulů pomocí jednotného konektoru.
- 24 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
6 Komunikace mezi moduly
Komunikace mezi moduly je založena na posílání paketů pomocí rozhraní
USART, které obsahují procesory ATMega (viz [5] a [6]). Jedná se o rozhraní pro sériový
přenos dat. Toto rozhraní lze snadno připojit na port RS232. Pro připojení stačí pouze
napěťový převodník, který převádí 5V logiku na 12V.
Architektura jednotlivých modulů je typu master/slave. Modul hlavního CPU
je typu master a všechny ostatní moduly (modul senzoriky, modul řízení motorů a modul
tlačítek a displeje) jsou typu slave. Drobnou nevýhodou této architektury může být fakt,
že moduly typu slave spolu nemohou komunikovat přímo, ale veškerá komunikace musí
nejprve směřovat do modulu master a teprve odtud do modulu slave. To může neúměrně
vytěžovat linku i CPU mastera. Protože ale většina komunikace v našem případě probíhá
jen mezi mastrem (modul hlavního CPU) a slavem (ostatní moduly), je pro náš případ
vyhovující.
6.1 Popis paketu
Pakety jsou složeny ze čtyř hlavních částí:
•
startovní byty
•
hlavička
•
data
•
CRC součet
Jsou použity dva startovní byty, jako rozumný kompromis mezi pravděpodobností
výskytu a jejich velikostí. Hlavička obsahuje adresu příjemce, adresu odesílatele, velikost
přenášených dat a typ dat. Každá z těchto informací má velikost 1 byt, tudíž hlavička
má celkem 4 byty. Za hlavičkou již přímo následují posílaná data. Konec paketu uzavírá
kontrolní součet o velikosti 2 byty, slouží k odhalení případné chyby v paketu. Schéma
paketu je na Obr. 6.1
Obr. 6.1: Schéma paketu
- 25 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Celková velikost paketu včetně startovních bytů, hlavičky a CRC součtu je
omezena na 256 bytů. Při velikosti paketů je nutno brát v úvahu velikost paměti
jednotlivých mikrokontrolérů, protože většina modulů používá ATMegu 8, která
má jen 1KB SRAM paměti.
6.2 Realizace komunikace pro mikrokontroléry ATMega
Komunikace je nezávislá na konkrétní aplikaci, její kód se nachází
v samostatných souborech, které stačí vždy přilinkovat k aplikaci. Komunikace využívá
dvě přerušení USART Recieve Complete a USART Transmit Complete (viz [5] a [6]).
Komunikace je řízena strukturou CommInfo, která je globální proměnou celé
aplikace. Struktura uchovává všechny potřebné informace a statistiku komunikace.
Kód komunikace je obsažen v souborech:
•
„Communic.h“ - hlavičkový soubor pro mikrokontroléry s jednou periferií
USART (např. ATMega 8, ATMega 16, ATMega 32)
•
„Communic.c“ - implementační soubor pro mikrokontroléry s jednou periferií
USART
•
„Communic2.h“ - hlavičkový soubor mikrokontroléry se dvěma periferiemi
USART (např. ATMega 64, ATMega 128)
•
„Communic2.c“ - hlavičkový soubor pro mikrokontroléry se dvěma periferiemi
USART
6.2.1 Popis struktury CommInfo
Struktura je deklarována takto:
struct CommInfo
{
volatile ComState_t
pData_t
pData_t
Size_t
Size_t
Adr_t
Adr_t
Adr_t
DataType_t
RecComplete_t
SendComplete_t
uint16_t
ComState_t
uint8_t
State;
pBuf;
pRecBuf;
nBytes;
nTotalBytes;
nCPUAdr;
nAdr;
nLastSender;
nLastType;
pfRecComplete;
pfSendComplete;
iLastCRC;
nTimeOutState;
nCRCCount;
- 26 -
ÚMTMB VUT V BRNĚ
uint8_t
volatile uint8_t
};
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
nTimeOutCount;
nSynchro;
State
Proměnná je typu uint8_t, popisuje stav komunikace. Pomocí této proměnné
se řídí příjímání a odesílání paketu viz kap. 6.2.2 a 6.2.3. Může nabývat hodnot:
•
COM_ST_READY – linka je volná, neprobíhá příjem ani odesílání paketu
•
COM_ST_RECIEVING – probíhá příjem dat
•
COM_ST_TRANSMITING – probíhá odesílání dat
•
COM_ST_WAIT_SEC_ST – příjem druhého startovního bytu
•
COM_ST_WAIT_REC_ADR – příjem adresy příjemce paketu
•
COM_ST_WAIT_SEN_ADR – příjem adresy odesílatele
•
COM_ST_WAIT_SIZE – příjem bytu reprezentující velikost dat, která budou
poslána
•
COM_ST_WAIT_TYPE – příjem bytu reprezentující typ dat
•
COM_ST_REC_PROCESS – zpracování dat
•
COM_ST_REC_CRC1 – příjem dolního bytu CRC součtu
•
COM_ST_REC_CRC2 – příjem horního bytu CRC součtu
pBuf
Proměnná typu char*. Dynamicky alokovaný buffer pro odesílaný paket. Alokuje
se při volaní SendData(...) viz kap. 6.2.2 a uvolňuje se po odeslání paketu.
pRecBuf
Proměnná typu char*. Dynamicky alokovaný buffer pro přijímaný paket. Alokuje
se při začátku příjmu bytu reprezentujícího velikost přijímaných dat a uvolňuje
se po návratu z funkce pfRecComplete, viz kap. 6.2.3.
nBytes
Proměnná typu uint8_t. Počet aktuálně přijatých nebo odeslaných bytů.
nTotalBytes
Proměnná typu uint8_t. Celkový počet bytů pro odeslání nebo přijímání.
nCPUAdr
Proměnná typu uint8_t. Adresa mikrokontroléru.
- 27 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
nAdr
Proměnná typu uint8_t. Proměnná pro dočasné uložení adresy příjemce paketu,
viz kap. 6.2.3.
nLastSender
Proměnná typu uint8_t. Proměnná pro dočasné uložení adresy odesílatele,
viz kap. 6.2.3.
nLastType
Proměnná typu uint8_t. Proměnná pro dočasné uložení typu paketu,
viz kap. 6.2.3.
pfRecComplete
Ukazatel na funkci, která se má vykonat po úspěšném přijetí paketu,
viz kap. 6.2.3. Funkce má prototyp:
void _název_(Adr_t From, DataType_t Type, pData_t pData, Size_t Size);
pfSendComplete
Ukazatel na funkci, která se má vykonat po úspěšném odeslaní paketu,
viz kap. 6.2.2 Funkce má prototyp:
void _název_(void);
iLastCRC
Proměnná typu uint16_t. Proměnná pro dočasné uložení CRC součtu,
viz kap. 6.2.3.
nTimeOutState
Proměnná typu uint8. Proměnná pro detekci timeoutů v průběhu komunikace.
nCRCCount
Proměnná typu uint8_t. Počet CRC chyb v průběhu celé komunikace.
nTimeOutCount
Proměnná typu uint8_t. Počet timeoutů v průběhu celé komunikace.
nSynchro
Proměnná typu uint8_t. Proměnná pro potřeby synchronizace komunikace,
viz kap. 6.2.5.
- 28 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Nastavení komunikační struktury lze provést pomoci funkce:
void SetCommInfoStruct(Adr_t Adr, RecComplete_t pfRecComplete, SendComplete_t,
pfSendComplete);
kde:
•
Adr – adresa mikrokontroléru
•
pfRecComplete – ukazatel na funkci, která se má volat po úspěšném přijetí paketu
•
pfSendComplete – ukazatel na funkci, která se má volat po úspěšném odeslání
paketu
Pozn. Tuto funkci je nejlepší volat na začátku běhu programu.
6.2.2 Odesílání paketu
Odesílání je založeno na přerušení USART Transmit Complete (viz [5] a [6]), které
nastává vždy po odeslání registru UDR. Odesílání paketu zajišťuje funkce:
void SendData(Adr_t Rec, DataType_t Type, pData_t pData, Size_t Size, uint8_t wait);
kde:
•
Rec - adresa příjemce paketu
•
Type – typ paketu
•
pData – ukazatel na buffer obsahující data, která mají být poslána
•
Size – velikost posílaných dat v bytech
wait – pokud je parametr roven 1, funkce čeká dokud nedojde k odeslání
předchozího paketu. Pokud se nerovná 1, funkce skončí aniž by paket byl odeslán
•
Funkce SendData() nejdříve otestuje, zda neprobíhá jiný přenos pomocí proměnné
CommInfo.nState. Pokud zjistí že přenos probíhá, rozhodne podle parametru wait,
zda bude čekat na jeho ukončení nebo se ukončí aniž by odeslala paket. Pokud je linka
volná, vypočítá CRC součet, alokuje buffer pro paket a do něj vloží startovní byty,
hlavičku, data a CRC součet. Dále vyplní do struktury CommInfo informace nezbytné
pro přenos a zahájí přenos, vložením prvního bytu do registru UDR. Vše je znázorněno
na zjednodušeném vývojovém diagramu Obr. 6.2.
Odesílaní dalších znaků probíhá v přerušení USART Transmit Complete, vždy
se otestuje zda byly odeslány všechny byty, pokud ne, vloží do registru UDR další byt
paketu. Pokud už byly odeslány všechny byty, uvolní se buffer a volá se funkce
- 29 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
CommInfo->pfSendData. Průběh přerušení popisuje Obr. 6.3.
Funkce CommInfo->pfSendData musí mýt prototyp:
void _název_(void);
Obr. 6.2: Zjednodušený vývojový diagram funkce SendData()
Obr. 6.3: Zjednodušený vývojový diagram přerušení USART Transmit
Complete
6.2.3 Přijímání paketu
Příjímání paketu je realizováno pomocí přerušení USART Recieve Complete (viz
[5] a [6]), které nastává při přijetí bytu do registru UDR.
Na začátku přerušení se vyhodnotí proměnná CommInfo.nState. Pokud proměnná
CommInfo.nState je rovna COM_ST_READY, což znamená, že neprobíhá žádný přenos
a byt v registru UDR je roven prvnímu startovnímu bytu, nastaví proměnou
CommInfo.nState na COM_ST_WAIT_SEC_ST a ukončí se obsluha přerušení. Jakmile
- 30 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
se přijme další byte opět ho otestuje, zda odpovídá druhému startovnímu bytu, pokud ano,
nastaví se proměnná CommInfo.nState na COM_ST_WAIT_REC_ADR. Dále se přijímají
jednotlivé byty hlavičky paketu a ukládají se do struktury CommInfo, jakmile je přijata
hlavička, přijmou se vlastní data paketu a CRC součet. Vše je popsáno na zjednodušeném
vývojovém diagramu Obr. 6.4.
Obr. 6.4: Zjednodušený vývojový diagram přerušení USART Transmit Complete
Jakmile se přijmou všechny byty paketu, zkontroluje se adresa, když nesouhlasí
paket se zahodí. Pokud souhlasí, provede se kontrola dat pomocí CRC součtů. Když byl
paket přijat v pořádku, volá se funkce CommInfo->pfRecComplete. Funkce musí být
deklarována takto:
void _název_(Adr_t From, DataType_t Type, pData_t pData, Size_t Size);
- 31 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
kde:
•
From – je adresa odesílatele paketu
•
Type – typ paketu
•
pData - ukazatel na pole přijatých dat
•
Size – velikost přijatých dat v bytech
Jakmile je funkce vykonána, uvolní se buffer CommInfo.pRecBuf a proměnná
CommInfo.nState se nastaví zpět na COM_ST_READY, to znamená že komunikace je opět
připravená na příjem nebo odeslání paketu.
Pokud CRC součet nesouhlasí, tzn. že paket nebyl přijat v pořádku, uvolní
se buffer aniž by se volala funkce CommInfo->pfRecComplete a přičte se jednička
k proměnné CommInfo.nCRCCount, která vyjadřuje počet chybně přijatých paketů.
6.2.4 Timeout komunikace
Timeout komunikace zajišťuje funkce ComTimeOut(void). Funkci je nutno volat
pravidelně např. v časovači. Funkce porovnává, zda od minulého průběhu došlo ke změně
proměnné CommInfo.nState, pokud ne, uvolní všechny použité buffery, nastaví proměnnou
CommInfo.nState
na
COM_ST_READY
a
přičte
jedničku
k
proměnné
CommInfo.nTimeOutCount.
Interval volání funkce ComTimeOut() musí být delší než čas potřebný k přenosu
paketu s maximální možnou délkou, jinak by docházelo k timeoutu dřív, než byl paket
přijat nebo odeslán.
6.2.5 Synchronizace
Synchronizaci zajišťují dvě funkce:
•
void CommWaitForReady(void) - tato funkce čeká, dokud není komunikace
volná, resp. dokud není proměnná CommInfo.nState rovna COM_ST_READY.
•
uint8_t CommWaitForRecieve(uint16_t MaxCount) – funkce čeká, dokud není
přijatý další paket, např odpověď na dotaz. Parametr MaxCount určuje maximální
dobu čekaní krát 10ms. Pokud vyprší čas čekání, aniž by byl přijat paket funkce
vrací 0 jinak 1.
- 32 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
6.2.6 Odlišnosti v implementaci pro procesory s dvěma periferiemi USART
Algoritmus funkcí je stejný jako v předchozím případě, liší se pouze jména funkcí
příp. jejich parametry tak, aby bylo možno určit se kterou periferií USART pracují.
Struktura CommInfo obsahuje informace pro každou periferii zvlášť, jména
proměnných se liší pouze tím, že na konci mají číslo periferie, ke které se vztahují. Funkce
pro nastavování informační struktury je deklarována takto:
void SetCommInfoStruct(Adr_t Adr_0, Adr_t Adr_1, RecComplete_t pfRecComplete_0,
RecComplete_t pfRecComplete_1, SendComplete_t pfSendComplete_0, SendComplete_t
pfSendComplete_1);
kde:
•
Adr_0 – adresa periferie USART0
•
Adr_1 – adresa periferie USART1
•
pfRecComplete_0 - ukazatel na funkci, která se má volat po úspěšném přijetí
paketu na USART0
•
pfRecComplete_1 - ukazatel na funkci, která se má volat po úspěšném přijetí
paketu na USART1
•
pfSendComplete_0 - ukazatel na funkci, která se má volat po úspěšném odeslání
paketu na USART0
•
pfSendComplete_1 - ukazatel na funkci, která se má volat po úspěšném odeslání
paketu na USART1
Funkce pro odesílaní paketu SendData() má navíc jeden parametr, který určuje
číslo periferie, která se má použít pro odeslání. Funkce je deklarována takto:
void SendData(Adr_t Rec, DataType_t Type, pData_t pData, Size_t Size, uint8_t wait,
uint8_t USART)
•
vše jako v kap. 6.2.2.
•
uint8_t USART – číslo periferie USART, po které se mají data odeslat.
Funkce pro synchronizaci mají stejný význam, parametry a návratové hodnoty
jako v 6.2.5, mají pouze jiná jména:
•
CommWaitForReady_0 – pro USART0
•
CommWaitForReady_1 – pro USART1
- 33 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
•
CommWaitForRecieve_0 – pro USART0
•
CommWaitForRecieve_1 – pro USART1
TOMÁŠ PASEKA
6.3 Realizace komunikace pro PC
Na PC se pro přijímání dat používá sériový port RS232, protože ten ale pracuje
s 12V logikou je nutné použít napěťový převodník. V našem případě je použit integrovaný
obvod MAX232 od firmy MAXIM.
Pro obsluhu portu je použito přímo Win32 API (application programming
interface), jež zapouzdřuje třída CSerialPort, která využívá MFC verze 7 (Microsoft
Foundation Class).
Třída CSerialBuffer, byla navržena jako základní třída pro práci se sériovým
portem, proto nepracuje přímo s pakety. Slouží jako rodičovská třída pro třídu
CSerialPortMM, která již pracuje přímo s pakety.
Třída CSerialPort zajišťuje veškerou práci s portem tzn. otevření portu, nastavení
parametrů, příjem dat, odesílání dat a jejich ukládání do vstupního bufferu. Příjem dat lze
provádět dvěma způsoby. Buď přijmout předem zadaný počet bytů nebo spuštěním
threadu, automaticky přijímat příchozí byty, tyto byty jsou ukládány do třídy CSerialBuffer.
Třída CSerialBuffer obsahuje vždy všechny přijaté byty, ale uchovává
si informace o tom, které byty už byly přečteny. Dále zajišťuje synchronizaci mezi
zapisováním a čtením dat, které nesmí nikdy probíhat současně.
Výše uvedené třídy byly navrženy pouze pro potřebu testovaní jednotlivých
modulů pomocí PC, proto se nehodí k zajištění nepřetržité komunikace, např. pro přímé
řízení jízdy bludištěm. Ale jsou navrženy tak, aby je bylo možno rozšířit. Jedná
se především o třídu CSerialPortMM, ve které nejsou implementovány všechny nezbytné
funkce.
6.3.1 Popis třídy CSerialPort a CSerialBuffer
Třída CSerialPort je deklarována takto:
class CSerialPort
{
private:
CString
DWORD
BYTE
m_sPort;
m_dwBaudRate;
m_nStopBits;
- 34 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
HANDLE
m_hPort;
HANDLE
m_hRecThread;
HANDLE
m_evEndRecTh;
static UINT __stdcall
RecieveThread(LPVOID pParam);
public:
CSerialBuffer
m_sbBuffer;
CSerialPort(void);
~CSerialPort(void);
inline DWORD ReadAll(LPVOID pBuffer, DWORD dwMaxLen);
inline DWORD ReadAvailable(LPVOID pBuffer, DWORD dwMaxLen);
inline size_t GetBufferSize();
inline size_t GetBufferAvailable();
inline void ClearBuffer();
inline void ResetBufReadStatus();
inline void LockBuffer();
inline void UnLockBuffer();
LPCSTR GetPort();
DWORD GetBaudRate();
BYTE GetStopBits();
DWORD OpenPort(LPCSTR sPort,DWORD dwBaudRate, BYTE nStopBits)
bool ClosePort();
bool IsOpen();
DWORD Transmit(LPVOID pData, DWORD dwLength,DWORD dwTimeOut =
1000 )
DWORD Receive(char* pBuffer, WORD dwMaxLen, LPDWORD
pdwReadBytes);
DWORD ReceiveW(char* pBuffer, DWORD dwLength, LPDWORD
dwReadBytes, DWORD dwTimeOut = 2000);
void StartAutoReceive();
void StopAutoReceive();
void ClearRXBuffer();
};
m_sPort
Název portu, ke kterému je třída připojena (com1, com2, atd.).
m_dwBaudRate
Rychlost přenosu dat v baudech.
m_nStopBits
Počet stop bitů.
m_hPort
Handle otevřeného portu.
m_hRecThread
Handle threadu pro automatické přijímání.
m_evEndRecTh
Handle události zajištující ukončení threadu m_hRecThread.
- 35 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
m_sbBuffer
Vstupní buffer.
static UINT __stdcall RecieveThread(LPVOID pParam)
Pracovní funkce threadu pro automatický příjem.
CSerialPort(void)
Konstruktor.
~CSerialPort(void)
Destruktor.
LPCSTR GetPort()
Funkce vrátí ukazatel na CString s názvem otevřeného portu.
DWORD GetBaudRate()
Funkce vrátí rychlost přenosu v baudech.
BYTE GetStopBits();
Funkce vrátí počet stop bitů, otevřeného portu.
DWORD OpenPort(LPCSTR sPort, DWORD dwBaudRate, BYTE nStopBits)
Funkce otevře port:
•
sPort – název portu (com1, com2, atd.)
•
dwBaudRate – rychlost přenosu dat v baudech
•
nStopBits – počet stop bitů
návratové hodnoty:
•
R_OK – vše proběhlo v pořádku
•
R_COM_NOT_FOUND – port nenalezen
•
R_COM_ACC_DENIED – port není přístupný, nejspíše ho používá jiná aplikace
•
R_SET_COM_TIMEOUTS_FAILED – selhalo nastavení timeoutů
•
R_GET_COM_STATE_FAILED – selhalo nastavení parametrů portu
•
R_ERR_SET_COMM_MASK – selhalo nastavení událostí portu
•
R_ERR_SETUP_COM – nezdařila se fuknce SetupComm viz [12]
bool ClosePort();
Funkce zavře port, vrací true pokud vše proběhlo v pořádku.
- 36 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
bool IsOpen();
Funkce testuje zda je port otevřený, pokud ano vrací true jinak false.
DWORD Transmit(LPVOID pData, DWORD dwLength, DWORD dwTimeOut =
1000 )
Funkce odešle byty na sériový port.
•
pData – Ukazatel na buffer bytů pro odeslání
•
dwLength – velikost bufferu pData v bytech
•
dwTimeOut – čas ve kterém se musí byty odeslat v ms
Návratové hodnoty:
•
R_OK – odeslání proběhlo v pořádku
•
R_ERR_TIMEOUT – nezdařilo se odeslat data v zadaném čase
•
R_ERR – odeslání selhalo
DWORD Receive(char* pBuffer, WORD dwMaxLen, LPDWORD
pdwReadBytes)
Funkce přijme byty z bufferu sériového portu.
•
pBuffer – ukazatel na buffer pro přijaté byty
•
dwMaxLen – maximální počet přijatých bytů
•
pdwReadBuffer – ukazatel na proměnnou, do které se uloží počet přijatých bytů
Návratové hodnoty:
•
R_OK – funkce proběhla bez chyb
•
R_BUFFER_IS_SMALL – buffer je malý, na port bylo přijato více bytů
než je velikost buffer pBuffer
DWORD ReceiveW(char* pBuffer, DWORD dwLength, LPDWORD
dwReadBytes, DWORD dwTimeOut = 2000)
Přijme data ze sériového portu, funkce na rozdíl od předchozí skončí buď
po přijetí dwLength bytů, nebo po vypršení času dwTimeOut.
•
pBuffer – ukazatel na buffer pro přijatá data
•
dwLenght – počet bytů kolik bude přijato
•
dwReadBytes – ukazatel na proměnou do které se uloží počet přijatých bytů
•
dwTimeOut – čas v ms ve kterém musí být data přijata
- 37 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Návratové hodnoty:
•
R_OK – funkce proběhla bez chyb
•
R_ERR_TIMEOUT – vypršel čas pro příjem dat
void StartAutoReceive()
Zahájí automatické příjímání dat z otevřeného portu, přijatá data ukládá
do m_sbBuffer.
void StopAutoReceive()
Zastaví automatické příjímání dat z otevřeného portu.
void ClearRXBuffer()
Vymaže vstupní buffer portu.
Následující funkce zprostředkovávají pouze volání funkcí proměnné m_sbBuffer:
•
inline DWORD ReadAll(LPVOID pBuffer, DWORD dwMaxLen)
•
inline DWORD ReadAvailable(LPVOID pBuffer, DWORD dwMaxLen);
•
inline size_t GetBufferSize();
•
inline size_t GetBufferAvailable();
•
inline void ClearBuffer();
•
inline void ResetBufReadStatus();
•
inline void LockBuffer();
•
inline void UnLockBuffer();
Třída CSerialPort je deklarována takto:
class CSerialBuffer
{
private:
CRITICAL_SECTION
m_csLock;
DWORD
m_dwReadBytes;
DWORD
m_dwSize;
char*
m_pBuffer;
public:
CSerialBuffer(void);
~CSerialBuffer(void);
inline void Lock();
inline void UnLock();
size_t
GetSize();
size_t GetAvailable();
DWORD ReadAll(LPVOID pBuffer, DWORD dwMaxLen);
DWORD ReadAvailable(LPVOID pBuffer, DWORD dwMaxLen);
bool Add(LPVOID pBuffer, DWORD dwLength);
void ResetReadBytes();
- 38 -
ÚMTMB VUT V BRNĚ
void
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Clear();
};
m_csLock
Kritická sekce pro synchronizaci čtení a zápisu dat.
m_dwReadBytes
Počet přečtených bytů z m_pBuffer.
m_dwSize
Celkem bytů v m_pBuffer.
m_pBuffer
Ukazatel na buffer s přijatými daty.
CSerialBuffer(void)
Konstruktor.
~CserialBuffer(void)
Destruktor.
inline void Lock()
Uzamče kód při ukládání dat do bufferu pomocí m_csLock.
inline void UnLock()
Odemkne kód po uložení dat do bufferu pomocí m_csLock.
size_t GetSize()
Vrátí počet bytů v m_pBuffer.
size_t GetAvailable()
Vrátí počet nepřečtených bytů z m_pBuffer.
DWORD ReadAll(LPVOID pBuffer, DWORD dwMaxLen)
Zkopíruje byty z m_pBuffer do pBuffer, ale maximálně dwMaxLen.
DWORD ReadAvailable(LPVOID pBuffer, DWORD dwMaxLen)
Zkopíruje doposud nepřečtené byty z m_pBufferu, ale maximálně dwMaxLen,
a aktualizuje proměnnou m_dwReadBytes.
bool Add(LPVOID pBuffer, DWORD dwLength)
Připojí dwLength bytů z pBufferu do m_pBufferu.
- 39 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
void ResetReadBytes()
Vynuluje počet přečtených bytů, tzn. nastaví m_dwReadBytes = 0.
void Clear()
Vymaže m_pBuffer.
6.3.2 Popis třídy CSerialPortMM a CPaket
Třída CSerialPortMM je deklarovaná takto:
class CSerialPortMM: public CSerialPort
{
public:
char m_cStartBytes[2];
CSerialPortMM(void);
~CSerialPortMM(void);
DWORD TransmitPaket(Adr_t From, Adr_t To, Size_t Size,
DataType_t Type, pData_t pData, DWORD dwTimeOut =
1000);
DWORD ReceiveWPaket(CPaket* paket, Size_t Size, DWORD
dwTimeOut = 2000);
};
m_cStartBytes[2]
Startovní byty.
CSerialPortMM(void)
Konstruktor.
~CSerialPortMM(void)
Destruktor.
DWORD TransmitPaket(Adr_t From, Adr_t To, Size_t Size, DataType_t Type, pData_t
pData, DWORD dwTimeOut = 1000)
Odešle paket na otevřený port.
•
From - adresa odesílatele
•
To - adresa příjemce
•
Size - kolik bytů odeslat
•
Type - typ odeslaných dat
•
pData - ukazatel na data, která odeslat
dwTimeOut – čas, do kterého musí být data odeslána, jinak se odesílaní přeruší
•
Návratové hodnoty jsou stejné jako v CSerialPort.Transmit().
- 40 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
DWORD ReceiveWPaket(CPaket* paket, Size_t Size, DWORD dwTimeOut = 2000)
Příjme paket určité velikosti
•
paket - ukazatel na proměnnou typu CPaket pro uložení přijatých dat.
•
Size - velikost přijímaných dat v bytech
•
dwTimeOut - doba v ms, do které se data musí přijmout
Návratové hodnoty jsou stejné jako v CSerialPort.RecieveW()
Třída CPaket je deklarovaná takto:
class CPaket
{
private:
Size_t
m_Size;
public:
Adr_t
m_From;
Adr_t
m_To;
DataType_t m_Type;
pData_t
m_pData;
inline void AllocData(Size_t Size);
inline void FreeData();
inline Size_t GetSize()
CPaket(void);
~CPaket(void);
};
m_Size
Počet bytů alokovaných pro m_pData.
m_From
Adresa odesílatele.
m_To
Adresa příjemce.
m_Type
Typ dat.
m_pData
Ukazatel na pole bytů obsahující data.
inline void AllocData(Size_t Size)
Alokuje pamět pro m_pData o velikosti Size.
inline void FreeData()
Uvolní paměť alokovanou pro m_pData.
- 41 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
inline Size_t GetSize()
Vrátí proměnou m_Size.
CPaket(void)
Konstruktor.
~CPaket(void)
Destruktor.
- 42 -
TOMÁŠ PASEKA
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
7 Modul Senzoriky
Pro zjednodušení stavby řídícího programu s ohledem na časování, byla zvolena
koncepce samostatného systému senzorů s vlastním procesorem. Jako řídící procesor
je použit ATMega8, který pracuje na frekvenci 11,0592MHz. Frekvence krystalu byla
zvolena tak, aby časovač periferie USART měl nulovou odchylku od požadované
frekvence. Jako senzory jsou použity tři kusy senzorů GP2D120 od firmy SHARP. Senzory
jsou rozmístěny tak, aby jeden měřil vzdálenost překážky před robotem a zbylé dva
po stranách.
7.1 Vlastnosti senzoru GP2D120
Senzor GP2D120 používá pro měření vzdálenosti metodu optické triangulace, kdy
světelný paprsek vytváří na měřeném objektu nepatrný
světelný bod. Detekcí úhlu odrazu tohoto světelného
bodu je vypočtena vzdálenost senzorů od měřeného
objektu. Princip této metody je na Obr. 7.1. Velkou
výhodou této metody je malý rozdíl v měření při bílé
nebo černé překážce. Parametry senzoru jsou shrnuty
Obr. 7.1: Metoda optické triangulace
v Tab 7.1.
Parametr
Hodnota
Výrobce
SHARP
Název
GP2D120
Napájecí napětí
4,5 až 5,5V
Výstupní napětí
1,95 až 2,55V
Pracovní teplota
-10 až +60°C
Rozsah měřené vzdálenosti
4 až 30cm
Doba měření
38,3±9,6ms
Tab 7.1: Technické parametry senzoru SHARP – GP2D120
Závislost výstupního napětí na měřené vzdálenosti je zobrazena na Obr. 7.2.
Překážka byla vyrobena z bílého materiálu (kancelářský papír). Senzor vykazuje pro malé
vzdálenosti cca od 3 do 10 cm velmi vysoké přesnosti měření. Pro větší vzdálenosti
cca od 30 cm je změna výstupního napětí senzoru příliš malá, proto na větší vzdálenosti
není tento senzor vhodný. Protože v našem případě potřebujeme přesně měřit hlavně
- 43 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
vzdáleností do 20 cm, je senzor vyhovující. Pro měření větších vzdáleností by bylo možné
modul vybavit ještě senzorem SHARP GP2Y0A02YK, který měří v rozsahu od 20 do 120
cm. Nebo je možno použít ultrazvukové senzory.
Obr. 7.2: Závislost výstupního napětí na měřené vzdálenosti senzoru GP2D120
7.2 Zapojení senzoru GP2D120
Senzor
je
připojen
na
A/D
převodník
mikrokontroléru, podle doporučení výrobce. I když výrobce
uvádí výstupní napětí na senzoru 1,95 až 2,55V, měření
ukázalo že v našem případě se pohybuje v podstatně vyšším
rozmezí, a to od 0,5 do 3V, jak je vidět na Obr. 7.2. Protože
vnitřní referenční napětí A/D převodníku je 2,56V, bylo
nutné použít odporový dělič napětí. Kompletní zapojení
senzoru k A/D převodníku je vidět na Obr. 7.3.
Obr. 7.3: Zapojení senzoru
GP2D120
7.3 Software modulu senzorů
Software je navržen tak, aby neustále měřil napětí na všech třech senzorech
a výsledek na požádání převedl na mm nebo kroky motoru a poslal paket s naměřenými
vzdálenostmi. Modul posílá buď přímo hodnotu z ADC registru, nebo převádí napětí
na milimetry, nebo kroky motorů.
- 44 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
K měření napětí je použit A/D převodník, který má šest přepínatelných kanálů.
Zapojení senzorů na kanály převodníku je v Tab 7.2. Převodník je nastaven tak,
aby používal vnitřní referenční napětí, které je 2,56V. Převodník má nastavenou
předděličku na 128, takže jeden převod trvá přibližně 150μs.
Senzor
Kanál
pravý
ADC0
přední
ADC1
levý
ADC2
Tab 7.2: Zapojení senzorů
7.3.1 Měření napětí
Měření napětí probíhá v přerušení ADC Conversion Complete, které nastává
po dokončení
převodu,
více
viz
[5]. A/D
převodník běží v tzv. Free Running modu,
kdy se další
převod
zahájí
automaticky
po zpracování přerušení.
Na začátku přerušení se vyhodnotí
proměnná
nAdcChannel,
která
vyjadřuje,
který senzor se právě měří. Naměřená hodnota
napětí se uloží do příslušné globální proměnné.
Přepne se kanál A/D převodníku na další senzor
a ukončí
se
zpracovávání
přerušení,
čimž
se automaticky zahájí další převod. Algoritmus je
znázorněn na vývojovém diagramu Obr. 7.4
Obr. 7.4: Vývojový diagram přerušení ADC
Conversion Complete
7.3.2 Převod napětí na vzdálenost
Převod napětí na vzdálenost je z důvodů nelineární závislosti realizován pomocí
tabulky. Řádky tabulky jsou tvořeny dvojicí hodnot napětí a jemu odpovídající vzdálenosti.
Tabulka je kvůli velikosti uložena v programové paměti. Nevýhodou použití programové
paměti je několikanásobně delší doba přístupu, ale protože senzory mají nízkou vzorkovací
frekvenci, je toto řešení vyhovující.
- 45 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Hodnoty tabulky i jejich počet je volen tak, aby co nejlépe popisovaly závislost
z Obr. 7.2. Při volbě počtu hodnot musel být brán ohled na dobu prohledávání tabulky.
Jako kompromis mezi přesností popisu a dobou prohledávání bylo zvoleno 36 hodnot.
Převod realizuje funkce:
uint16_t GetDistanceMM(uint16_t Adc)
kde parametr Adc je hodnota A/D převodníku získaná z registru ADC, funkce vrací
vzdálenost v milimetrech.
Funkce
prohledává
tabulku,
která
je seřazena od nejmenšího napětí po největší.
Vývojový diagram je znázorněn na Obr. 7.5.
Prohledávání zajišťuje cyklus, který postupně načítá
hodnoty z programové paměti. Jakmile je nalezena
hodnota,
která
je
větší
než
proměnná Adc,
prohledávání se ukončí. Načte se z programové
paměti vzdálenost, která ji odpovídá. Dále se načte
předchozí napětí, a jemu odpovídající vzdálenost.
Poté se provede výpočet vzdálenosti, odpovídající
napětí Adc, pomocí lineární interpolace viz Rov. 7.1,
kde je A – aktuálně změřené napětí, A1 – napětí i-tého
řádku z tabulky, A2– napětí (i-1)-tého řádku z
tabulky, d1 – vzdálenost odpovídající napětí A1, d2 –
Obr. 7.5: Vývojový diagram funkce pro
převod napětí na vzdálenost
vzdálenost odpovídající napětí A2, d – vzdálenost
odpovídající napětí A.
d=
d 1−d 2 ⋅ A−A2 
d 2
A1−A2
Rov. 7.1
7.4 Popis všech paketů modulu
DT_ECHO
Při přijetí tohoto paketu modul vrátí stejný paket.
DT_GET_STATUS
Žádost o poslání statistiky komunikace. Modul vrátí paket typu DT_STATUS,
velikost dat je 3 byty.
- 46 -
ÚMTMB VUT V BRNĚ
•
byte 0 – rezervovaný
•
byte 1 – počet CRC chyb
•
byte 2 – počet TimeOutů
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
DT_SEN_GET_LEFT
Žádost o poslání výstupního napětí pravého senzoru. Modul vrátí paket typu
DT_SEN_LEFT, velikost dat je 2 byty.
•
byte 0 – horní byte 16-bit čísla
•
byte 1 – dolní byte 16-bit čísla
DT_SEN_GET_RIGHT
Žádost o poslání výstupního napětí levého senzoru. Modul vrátí paket typu
DT_SEN_RIGHT, velikost dat je 2 byty
•
byte 0 – horní byte 16-bit čísla
•
byte 1 – dolní byte 16-bit čísla
DT_SEN_GET_CENTER
Žádost o poslání výstupního napětí prostředního senzoru. Modul vrátí paket typu
DT_SEN_CENTER, velikost dat je 2 byty
•
byte 0 – horní byte 16-bit čísla
•
byte 1 – dolní byte 16-bit čísla
DT_SEN_GET_ALL
Žádost o poslání výstupního napětí všech senzorů. Modul vrátí paket typu
DT_SEN_ALL, velikost dat je 6 bytů.
•
byte 0 – horní byte 16-bit čísla, levý senzor
•
byte 1 – dolní byte 16-bit čísla, pravý senzor
•
byte 2 – horní byte 16-bit čísla, přední senzor
•
byte 3 – dolní byte 16-bit čísla, přední senzor
•
byte 4 – horní byte 16-bit čísla, pravý senzor
•
byte 5 – dolní byte 16-bit čísla, pravý senzor
DT_SEN_GET_LEFT_MM
Žádost o poslání naměřené vzdálenosti na levém senzoru v milimetrech. Modul
vrátí paket typu DT_SEN_LEFT_MM, velikost dat je 2 byty.
- 47 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
•
byte 0 – horní byte 16-bit čísla
•
byte 1 – dolní byte 16-bit čísla
TOMÁŠ PASEKA
DT_SEN_GET_RIGHT_MM
Žádost o poslání naměřené vzdálenosti na pravém senzoru v milimetrech. Modul
vrátí paket typu DT_SEN_RIGHT_MM, velikost dat je 2 byty.
•
byte 0 – horní byte 16-bit čísla
•
byte 1 – dolní byte 16-bit čísla
DT_SEN_GET_CENTER_MM
Žádost o poslání naměřené vzdálenosti na prostředním senzoru v milimetrech.
Modul vrátí paket typu DT_SEN_CENTER_MM, velikost dat je 2 byty.
•
byte 0 – horní byte 16-bit čísla
•
byte 1 – dolní byte 16-bit čísla
DT_SEN_GET_ALL_MM
Žádost o poslání naměřené vzdálenosti na všech senzorech. Modul vrátí paket
typu DT_SEN_ALL_MM, velikost dat je 6 bytů.
•
byte 0 – horní byte 16-bit čísla, levý senzor
•
byte 1 – dolní byte 16-bit čísla, pravý senzor
•
byte 2 – horní byte 16-bit čísla, přední senzor
•
byte 3 – dolní byte 16-bit čísla, přední senzor
•
byte 4 – horní byte 16-bit čísla, pravý senzor
•
byte 5 – dolní byte 16-bit čísla, pravý senzor
DT_SEN_GET_CENTER_ST
Žádost o poslání naměřené vzdálenosti na prostředním senzoru v krocích motoru.
Modul vrátí paket typu DT_SEN_CENTER_ST, velikost dat je 2 byty.
•
byte 0 – horní byte 16-bit čísla
•
byte 1 – dolní byte 16-bit čísla
DT_SEN_GET_LEFT_ST
Žádost o poslání naměřené vzdálenosti na v levém senzoru v krocích motoru.
Modul vrátí paket typu DT_SEN_LEFT_ST, velikost dat je 2 byty.
•
byte 0 – horní byte 16-bit čísla
- 48 -
ÚMTMB VUT V BRNĚ
•
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
byte 1 – dolní byte 16-bit čísla
DT_SEN_GET_RIGHT_ST
Žádost o poslání naměřené vzdálenosti na v pravém senzoru v krocích motoru.
Modul vrátí paket typu DT_SEN_RIGHT_ST, velikost dat je 2 byty.
•
byte 0 – horní byte 16-bit čísla
•
byte 1 – dolní byte 16-bit čísla
DT_SEN_GET_ALL_ST
Žádost o poslání naměřené vzdálenosti na všech senzorech v krocích motoru.
Modul vrátí paket typu DT_SEN_ALL_ST, velikost dat je 6 bytů.
•
byte 0 – horní byte 16-bit čísla, levý senzor
•
byte 1 – dolní byte 16-bit čísla, pravý senzor
•
byte 2 – horní byte 16-bit čísla, přední senzor
•
byte 3 – dolní byte 16-bit čísla, přední senzor
•
byte 4 – horní byte 16-bit čísla, pravý senzor
•
byte 5 – dolní byte 16-bit čísla, pravý senzor
7.5 Testovací software na PC
Pro možnost testování správné funkce hardwaru modulu senzorů a pro měření
jejich charakteristik byly vytvořeny dva programy na PC:
•
Senzors Test – testovaní funkce senzorů
•
Senzors Char – měření charakteristiky senzorů (vyžaduje i modul motorů)
Senzors Test
Modul využívá pro komunikaci třídu CSeriálPortMM popsanou v kap. 6.3.
Aplikace posílá modulu všechny podporované pakety popsané v kap. 7.4 a zobrazuje jejich
odpovědi. Lze ji použít na získání statistiky komunikace, nebo na ověřování přesnosti
měření senzorů.
Tato aplikace nevyžaduje, aby byl modul připevněn k podvozku a spojen
s modulem hlavního CPU (lze jej připojit naprosto nezávisle).
Senzors Char
Tato aplikace opět využívá CSeriálPortMM popsanou v kap. 6.3. Aplikace
vyžaduje, aby byl modul připevněn k podvozku robotu a podvozek byl také osazen
- 49 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
modulem motorů. K PC je nutno připojit oba moduly, proto musí být PC vybaveno dvěma
sériovými porty. Aplikace podle nastavení provede několik měření vzdálenosti
před předním senzorem, ty zprůměruje a uloží. Potom pošle modulu motorů příkaz, aby
ujely nastavenou vzdálenost a měření opakuje, dokud není dosaženo požadovaného počtu
měření.
Naměřené hodnoty ukládá do textového souboru typu csv, kde jsou jednotlivé
hodnoty odděleny středníkem. Tento soubor lze snadno importovat to tabulkových
procesorů, jako je Microsoft Excel nebo OpenOffice Calc.
- 50 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
8 Modul Motoru
Pro řízení krokových motorů, byla opět zvolena koncepce samostatného systému
motorů s vlastním procesorem. Jako řídící procesor je použit ATMega8 s krystalem
14,7456 Mhz. Frekvence krystalu byla zvolena tak, aby časovač periferie USART měl
nulovou odchylku od požadované frekvence. Pohon robotu je zajištěn dvěma krokovými
motory TEAC KP39HM2-025 z disketových mechanik. Řízení motorů je bez zpětné
vazby, tudíž se jedná o řízení v otevřené smyčce.
8.1 Hardware motoru
Ovládání motorů zajišťují integrované obvody SLA7051 firmy ALLEGRO, které
umožňují jedno-fázové i dvou-fázové řízení unipolárních krokových motorů. Obvod dále
umožňuje řídit i proud do vinutí krokového motoru PWM modulací. Samozřejmostí
je i použití polovičního kroku. Základní technické parametry obvodu SLA7051 jsou v Tab
8.1 a technické parametry motoru jsou v Tab 8.2
Paramter
Hondnota
Výrobce
ALLEGRO
Název
SLA7051
Max výstupní napětí
46V
Max proud
2A
Max logické napětí
7V
Pracovní teplota
-20 až 85˚C
Tab 8.1: Zakladní tech. parametry obvodu SLA7051
Parametr
Hodnota
Výrobce
TEAC
Název
KP39HM2-025
Typ motoru
Unipolární
Délka kroku
1,8“
Počet kroků na otáčku
200
Počet vinutí
4
Napájecí napětí
12V
Jmenovitý proud
0,2A
- 51 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Parametr
Hodnota
Opor vinutí
75Ω
Indukčnost cívky
70mH
Rozměry
39x39x33mm
Hmotnost
130g
Tab 8.2: Technické parametry krokových motorů TEAC - KP39HM2-025
8.2 Odometrie manévrů modulu
Modul nezajišťuje jen samotné řízení rychlosti krokových motorů. Aby
nedocházelo k nadměrnému zatěžování hlavního modulu, umožňuje provádět základní
manévry:
•
ujetí požadované vzdálenosti
•
otočení na místě o zadaný úhel
•
zatáčka o 90˚ během jízdy
Dále měří ujetou vzdálenost každého kola a zajišťuje regulaci směru na příkaz
hlavního modulu.
Protože řízení probíhá bez zpětné vazby, u všech níže popsaných manévrů, musí
být zrychlení i rychlost taková, aby nedocházelo k prokluzu. Parametry, které limitují
rychlost a zrychlení, jsou součinitel tření mezi vozovkou a pneumatikou, kroutící moment
motoru (nesmí dojít ke ztrátě kroku), a hmotnost robotu. Hmotnost robotu ovlivňuje třecí
sílu a setrvačnost .
Maximální hodnoty parametrů jsou shrnuty v Tab 8.3, tyto parametry byly
zjištěny experimentálně a jsou spíše orientační, protože výrazně závisí na povrchu
vozovky.
Parametr
Hodnota
Max rychlost
0,5 ms-1
Max zrychlení
1ms-2
Max rychlost průjezdu zatáčkou o
poloměru 70mm
0,12ms-1
Max rychlost průjezdu zatáčkou o
poloměru 100mm
0,2ms-1
Tab 8.3: Orientační maximální hodnoty rychlosti a zrychlení
- 52 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
8.2.1 Akcelerace motorů
Pro potřeby akcelerace krokových motorů je nutno odvodit vztah pro novou
rychlost v závislosti na změně ujeté vzdálenosti, která reprezentuje jeden krok.
Při odvozování vyjdeme ze základní rovnice:
a=
Rov. 8.1
ds
ds
rovnici rozšíříme zlomkem
a=
protože
dv
dt
dv ds
⋅
dt ds
Rov. 8.2
ds
=v můžeme psát
dt
dv
a=v⋅
ds
Rov. 8.3
Po dosazení mezí a integrací získáme následující vztah, který upravíme tak, aby
v2 bylo na levé straně a všechno ostatní na straně pravé:
s2
v2
s1
v1
Rov. 8.4
∫ sds=∫ vdv
v 22−v 21
a  s 1−s 2=
2
Rov. 8.5
v 2 =2a  sv 1
Rov. 8.6
2
Rov. 8.6 již vyjadřuje naši hledanou závislost rychlosti na změně dráhy, kde Δs je
ujetá dráha na jeden krok motoru.
8.2.2 Ujetí požadované vzdálenosti
Tento manévr lze rozdělit na tři části,
jak je vidět na Obr. 8.1:
•
zrychlování
•
jízda konstantní rychlostí
•
brzdění
Obr. 8.1: Závislost rychlosti na dráze
- 53 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Nejdříve je potřeba vypočítat teoretickou maximální možnou rychlost vmaxt, kterou
lze na dané vzdálenosti dosáhnout. K tomu lze využít Rov. 8.6, kde za Δs dosadíme
požadovanou vzdálenost a v1 = 0. Protože ale musíme počítat také s bržděním je třeba
požadovanou vzdálenost podělit dvěmi:

v maxt = 2 a
s poz
2
Rov. 8.7
Námi spočítaná rychlost vmaxt může být větší než maximální rychlost motorů vmaxm,
proto maximální rychlost, kterou lze na požadované vzdálenosti dosáhnout se rovná:
v max=min v maxt , v maxm 
Rov. 8.8
Dále je potřeba vypočítat dráhu potřebnou k zrychlení na vmax. K tomu lze opět
využít Rov. 8.6. Kterou upravíme tak, aby na levé straně byla dráha s a na pravé zbytek:
s zrych=
v 22−v 21
2a
Rov. 8.9
Protože ale v našem případě se v1 = 0 lze psát:
v 2max
s zrych=
2a
Rov. 8.10
Dráha potřebná pro zabrzdění je stejná jako dráha pro zrychlení. Proto dráha
po které se robot pohybuje konstantní rychlostí je:
s konst =s poz −2 s zrych
Rov. 8.11
8.2.3 Otočení na místě o zadaný úhel
Jedná se o stejný problém jako v předešlé kapitole, pouze se každé kolo musí
otáčet jiným směrem. Pro tento problém je nutné vypočítat, jakou vzdálenost musí každé
kolo urazit, aby se robot otočil o požadovaný úhel.
Při tomto manévru se robot otáčí okolo středu nápravy a kola opisují kružnici
o poloměru r, který lze vypočítat:
r=
H
2
kde H je rozchod robotu.
- 54 -
Rov. 8.12
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Ujetá vzdálenost každého kola je rovna kruhové výseči o požadovaném úhlu,
to lze vypočítat podle vztahu:
s=
2 r
⋅
360
Rov. 8.13
kde je s – vzdálenost, kterou musí urazit každé kolo, φ – úhel, o který se má robot
otočit.
8.2.4 Zatáčka o 90˚ během jízdy
Zatáčka o 90˚ během jízdy je nejsložitějším manévrem, který modul realizuje. Lze
ji rozdělit do pěti úseků:
•
Nájezd do zatáčky (A)– obě kola se otáčí stejnou rychlostí, robot jede rovně.
•
Změna rychlosti kol při nájezdu (B)– vnější kolo zrychluje a vnitřní zpomaluje,
robot se začíná otáčet.
•
Jízda zatáčkou (C)– obě kola se otáčí konstantní rychlostí, robot se pohybuje
po kružnici.
•
Změna rychlosti kol při výjezdu (D)– vnější kolo zpomaluje a vnitřní zrychluje,
robot se přestává otáčet.
•
Výjezd ze zatáčky (E)– obě kola se otáčí stejnou rychlostí, robot se pohybuje
rovně.
Vše ze znázorněno na Obr. 8.2 a Obr. 8.3.
Obr. 8.2: Rychlosti otáčení kol během průjezdu
zatáčkou
Obr. 8.3: Úseky průjezdu zatáčkou
- 55 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Nejdříve je potřeba spočítat dráhu, kterou musí urazit střed nápravy a jednotlivá
kola v průběhu celé zatáčky:
2R
4
Rov. 8.14
2  R−w
4
Rov. 8.15
2 Rw 
4
Rov. 8.16
s str =
s in=
s out =
kde je sstr – dráha, kterou urazí střed nápravy, sin – dráha, kterou urazí vnitřní
kolo, sout – dráha, kterou urazí vnější kolo, R – poloměr zatáčky a w – je vzdálenost kola
od středu nápravy.
Čas potřebný k průjezdu zatáčkou se vypočítá podle následujícího vztahu:
t=
s str
v str
Rov. 8.17
kde je sstr – dráha středu nápravy, vstr – námi zvolená rychlost středu nápravy,
jedná se vlastně o rychlost kterou najíždíme do zatáčky.
Protože obě kola musí projet zatáčku ve stejném čase, lze pomocí času t spočítat
rychlost vnějšího a vnitřního kola v úseku C.
v in =
s in
t
Rov. 8.18
v out =
s out
t
Rov. 8.19
kde je vin – rychlost vnitřního kola, vout – rychlost vnějšího kola, sin – dráha
vnitřního kola, sout – dráha vnějšího kola.
Pokud je změna rychlosti v úsecích B a D dostatečně malá, lze ujetou dráhu
v těchto úsecích zanedbat. Dráha ujetá v úseku C se potom rovná celkové dráze. Pokud
je ale změna rychlosti taková že ji nemůžeme zanedbat, dráha ujetá v úseku C se rovná:
sCstr =s str −s Bstr −s Dstr
Rov. 8.20
s Cin=s in −s Bin −s Din
Rov. 8.21
s Cout=s out−s Bout−s Dout
Rov. 8.22
- 56 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
2
TOMÁŠ PASEKA
2
v str −v in
s Bin =s Din =
2a
Rov. 8.23
s Bin s Bout
2
Rov. 8.24
v 2out −v 2str
s Bout =s Dout =
2a
Rov. 8.25
s Bstr =s Dstr =
kde je sCstr - dráha středu nápravy v úseku C, sBstr - dráha středu nápravy v úseku
B, sDstr - dráha středu nápravy v úseku D, sCin - dráha vnitřního kola v úseku C, sBin dráha vnitřního kola v úseku B, sDin - dráha vnitřního kola v úseku D, sCout - dráha
vnějšího kola v úseku C, sBout - dráha vnějšího kola v úseku B, sDout - dráha vnějšího kola
v úseku D.
8.3 Software modulu
Aby došlo k ušetření výpočetního času, modul používá jako jednotku vzdálenosti
místo milimetrů kroky motoru, stejně tak rychlost je krok/s a zrychlení je krok/s2.
Délka jednoho kroku závisí na obvodu kola:
s kt =
2 r
nkr
Rov. 8.26
kde je skr - délka jednoho kroku, r - poloměr kola robotu, nkr - počet kroků
na otáčku.
Po dosazeni dostaneme:
s kt =
2 r 2 60
=
=0,942 mm
nkr
200
Rov. 8.27
z toho plyne že 1krok = 0,942mm.
8.3.1 Řízení krokových motorů
Řízení rychlosti krokových motorů je realizováno pomocí časovače Timer1, viz
[5]. Jedná se o 16-bit časovač, který umožňuje vykonávat mimo jiné dvě přerušení Timer1
Compare A a Timer1 Compare B. Přerušení nastávají, když je registr časovače roven
registru Output Compare 1A resp. 1B.
Pro řízení pravého motoru je použito přerušení Timer1 Compare A, a pro levý
motor přerušení Timer1 Compare B. Dále uvedu popis řízení pouze jednoho motoru,
protože druhý motor je naprosto totožný.
- 57 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Průběh přerušení je vidět na Obr. 8.4.
Nejdříve se nastaví příslušný pin do logické
jedničky,
do řídícího
čímž
se
obvodu
začne
vysílat
SLA7051.
impulz
Provede
se
výpočet nové rychlosti podle vztahů uvedených
v kap. 8.2.1. Po výpočtu rychlosti se nastaví
příslušný pin do logické nuly, čímž je ukončeno
vysílání impulzu a motor provede krok. Poté se
provede výpočet hodnoty, kterou je nutno přičíst
k Output Comapre Registru. Jedná se vlastně
o dobu, za kterou se má vyslat další impulz.
Potom v závislosti na typu manévru, který je Obr. 8.4: Zjednodušený vývojový diagram
realizován, se může provádět hlídání ujeté přerušení Timer Compare
vzdálenosti nebo řízení jízdy zatáčkou.
8.3.2 Výpočet nové rychlosti a nastavení Output Compare registru
Rychlost se nastavuje vždy v proměnné nTargetSpeed, která vyjadřuje cílovou
rychlost. Ostatní manévry pouze hlídají ujetou vzdálenost a podle ní nastavují
nTargetSpeed, tímto je vždy zaručena správná dynamika motorů.
Obr. 8.5: Vývojový diagram řízení rychlosti
- 58 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Algoritmus řízení je zjednodušeně zobrazen na Obr. 8.5. Na začátku řízení
rychlosti se porovná proměnná nCurSpeed, která vyjadřuje aktuální rychlost motorů,
s cílovou rychlostí (nTargetSpeed). Pokud je cílová rychlost menší než aktuální rychlost
motorů, provede se výpočet nové rychlosti pomocí funkce Deccel(), která vypočítá novou
rychlost při zrychlení nAccel za vzdálenost jednoho kroku. Analogicky vše probíhá pokud
je cílová rychlost větší než aktuální, pouze se použije funkce Accel(). Funkce pro výpočet
rychlosti používají vztahy, které byly odvozeny v kap. 8.2.1.
Výpočty nové rychlosti jsou velice náročné na výpočetní čas CPU. Pro zrychlení
výpočtu jsou simulována čísla s pevnou desetinnou čárkou, s přesností na tří desetinná
místa. To se ukázalo jako dostačující přesnost. Díky tomu je výpočet nové rychlosti 5 až 6
krát rychlejší než za použítí čísel s plovoucí desetinou čárkou. I přesto, je ale maximální
rychlost motorů omezena na 700 kroků/s, při překročení této rychlosti už nelze zajistit,
že výpočet bude proveden v potřebném čase. Řešením by mohlo být použití krystalu
o větší frekvenci.
Jakmile je vypočítána nová rychlost, je nutno nastavit Output Compare Register.
Výpočet doby, za kterou je nutno vykonat další krok motorů se provádí podle vzorce:
comp=
f tim
v kr
Rov. 8.28
kde je comp - hodnota přičítaná ke Output Compare registru, ftim - frekvence
časovače, vkr - rychlost v krocích za sekundu.
Řízení rychlosti nijak nekontroluje překročení maximální dovolené rychlosti
nastavené pomocí proměnné nMaxSpeed. Tato kontrola se provádí už při nastavování
proměnné nTargetSpeed, např. po přijetí paketu DT_MOT_SPEED.
Nastavování všech parametrů pro řízení rychlosti jízdy, zrychlení a maximální
rychlosti, se děje pomocí paketů popsaných v kap. 8.4, defaultní nastavení je uvedeno
v Tab 8.4.
Parametr
hodnota
Zrychlení [krok/s2]
1027
Maximální rychlost [krok/s]
200
Tab 8.4: Defaultní parametry řízení rychlosti
- 59 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
8.3.3 Hlídání ujeté vzdálenosti
Hlídání ujeté vzdálenosti je využíváno pro dva manévry, a to ujetí požadované
vzdálenosti a otáčku na místě.
Hlídání ujeté vzdáleností využívá dvou proměnných nTargetDis a nTargetBrDis.
Proměnná nTargetDis vyjadřuje celkovou vzdálenost, která má být ujeta. Pokud se rovná
nule, hlídaní ujeté vzdálenosti se neprovádí. Proměnná nTargetBrDis vyjadřuje vzdálenost,
za kterou je nutno začít brzdit, aby došlo k zastavení na požadované vzdálenosti.
nTargetDis je buď přímo zadaná pomoci paketu DT_MOT_GO_DISTANCE, nebo
vypočítaná při otáčce na místě za pomoci vztahů odvozených v kap. 8.2.3. Proměnnou
nTargetBrDis vypočítá, podle vztahů v kap. 8.2.2,
funkce CalcDisToBreak(). Cílovou rychlost, kterou
je možno na daném úseku dosáhnout, počítá funkce
CalcMaxSpeed(), opět podle vztahů odvozených
v kap. 8.2.2, takto vypočítaná rychlost je dosazena
do
proměnné
nTargetSpeed.
Funkce
počítají
z okamžitou rychlostí, proto nemusí být na začátku
robot v klidu.
Hlídání ujeté vzdálenosti probíhá podle
algoritmu na Obr. 8.6. Pokud se proměnná
nTargetDis
nerovná nule,
přičte se jednička
k proměnné nDistance, která vyjadřuje ujetou
Obr. 8.6: Zjednodušený vývojový diagram
hlídání ujeté vzdálenosti
vzdálenost.
Dále se testuje,
zda byla ujeta
vzdálenost, po které se má začít brzdit. Pokud ano,
nastaví se nTargetSpeed na nulu, což znamená, že motor začne zpomalovat dokud
nezastaví. Jakmile se ujede celá požadovaná vzdálenost, jsou vynulovány použité
proměnné a motor stojí.
Pokud je v průběhu hlídání ujeté vzdálenosti obdržen jiný příkaz, např.
DT_MOT_SPEED nebo jiný, jsou proměnné vynulovány a manévr je ukončen.
8.3.4 Řízení jízdy zatáčkou
Jízda zatáčkou požívá několik parametrů, které jsou vypočítány pomocí vztahů
odvozených v kap. 8.2.4. Tyto parametry jsou bud přednastaveny nebo se počítají po přijetí
- 60 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
paketu DT_MOT_SET_TURN_PARAM, který je popsaný v kap. 8.4. Defaultní hodnoty
parametrů jsou v Tab 8.5, pro rychlost nájezdu 100 krok/s a poloměr 75 kroků.
Parametr
Proměnná
Hodnota
Rychlost středu nápravy
nTurnVcen
100 krok/s
Rychlost vnitřního kola
nTurnVin
32 krok/s
Rychlost vnějšího kola
nTurnVout
168 krok/s
Dráha vnitřního kola
nDisInner
28 kroků
Dráha vnějšího kola
nDisOuter
180 kroků
Tab 8.5: Defaultní parametry jízdy zatáčkou
Jízda zatáčkou je odstartována po přijetí paketu DT_MOT_TURN, který je
popsaný v kap. 8.4. Podle směru zatáčky, se do proměnné nTargetSpeed příslušného
motoru vloží rychlost vnějšího nebo vnitřního kola. Analogicky se do proměnné nTurnDis
příslušného motoru vloží dráha vnitřního nebo vnějšího kola. Dále se nastaví proměnná
nRouteType na hodnotu MRT_TURN_DECCEL, která vyjadřuje, že se motory nachází
v nájezdu do zatáčky. Vlastní řízení probíhá jen v přerušení Timer1 Compare.
Proměnná nRouteType vlastně popisuje, ve které oblastí podle Obr. 8.2 a Obr. 8.3
se motory nachází. Oblasti A a E odpovídá hodnota MRT_DIRECTLY, oblasti B
MRT_TURN_DECCEL, oblasti C MRT_TURN a oblasti D MRT_TURN_ACCEL.
Algoritmus řízení je zobrazen na Obr. 8.7. Pokud je proměnná nRouteType rovna
MRT_TURN_DECCEL, testuje se, jestli bylo dosaženo požadované rychlosti kola. Pokud
bylo dosaženo požadované rychlosti, proměnná nRouteType se nastaví na MRT_TURN,
to znamenná že motory se nachází v oblasti s konstantní rychlostí a provádí se test ujeté
vzdálenosti.
Každý
krok
se
inkrementuje
proměnná
nDistance
a
porovnává
se z požadovanou vzdáleností nTurnDis. Jakmile je požadovaná vzdálenost ujetá,
nTargetSpeed se nastaví na rychlost středu nápravy, která byla zároveň vstupní rychlostí
do zatáčky, proměnná nRouteType se nastaví na MRT_TURN_ACCEL, která znamená,
že motory se nachází na výjezdu ze zatáčky. Jakmile motory dosáhnou zadaných rychlostí,
proměnná nRouteType se nastaví na hodnotu MRT_DIRECTLY, která vyjadřuje, že zatáčka
byla ukončena a motory se pohybují rovně.
- 61 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Obr. 8.7: Zjednodušený vývojový diagram řízení jízdy zatáčkou
Je nezbytné, aby v době kdy modul obdrží příkaz k vykonání zatáčky během jízdy
(paket DT_MOT_TURN), byla rychlost obou motorů rovna zadané rychlosti středu
nápravy, resp. rychlosti nájezdu do zatáčky, pokud tomu tak není, rychlost je změněna
skokově.
Pokud
je
v
době
vykonávání
manévru
obdržen
jiný
příkaz
např.
DT_MOT_SPEED, je manévr přerušen.
8.4 Popis všech paketů modulu
DT_ECHO
Pří přijetí tohoto paketu modul vrátí stejný paket
DT_GET_STATUS
Žádost o poslání statistiky komunikace. Modul vrátí paket typu DT_STATUS,
velikost dat je 3 byty.
•
byte 0 – rezervovaný
•
byte 1 – počet CRC chyb
•
byte 2 – počet TimeOutů
- 62 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
DT_MOT_EN
Zapne/Vypne motory.
Data:
•
byte 0 - 0 - vypne, vše ostatní zapne
DT_MOT_DIR
Nastaví směr otáčení motorů.
Data:
•
byte 0 - 1- vpřed, 2 vzad.
DT_MOT_STEP
Nastaví krok motoru
byte 0 - 0 - Full step, 1 - Half step.
DT_MOT_SPEED
•
Nastaví rychlost motorů.
Data:
•
byte 0 - horní byte 16-bit čísla, rychlost pravého motoru
•
byte 1 - dolní byte 16-bit čísla, rychlost pravého motoru
•
byte 2 - horní byte 16-bit čísla, rychlost levého motoru
•
byte 3 - dolní byte 16-bit čísla, rychlost levého motoru
DT_MOT_GO_DISTANCE
Nastaví vzdálenost, kterou mají motory urazit.
Data:
•
byte 0 - horní byte 16-bit čísla, vzdálenost pro pravý motor
•
byte 1 - dolní byte 16-bit čísla, vzdálenost pro pravý motor
•
byte 2 - horní byte 16-bit čísla, vzdálenost pro levý motor
•
byte 3 - dolní byte 16-bit čísla, vzdálenost pro levý motor
DT_MOT_ACCEL
Nastaví zrychlení motoru.
Data:
•
byte 0 - horní byte 16-bit čísla, zrychlení
•
byte 1 - dolní byte 16-bit čísla, zrychlení
- 63 -
TOMÁŠ PASEKA
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
DT_MOT_MAX_SPEED
Nastaví maximální rychlost motorů
Data:
•
byte 0 - horní byte 16-bit čísla, max. rychlosti.
•
byte 1 - dolní byte 16-bit čísla, max. rychlosti.
DT_MOT_GET_INFO
Žádost o poslání parametrů moru. Modul vrátí paket DT_MOT_INFO, velikost dat
je 27 bytů.
•
byte 0 - rezervováno
•
byte 1,2 – 16-bit číslo, aktuální rychlost pravého motoru
•
byte 3,4 – 16-bit číslo, aktuální rychlost levého motoru
•
byte 5,6 – 16-bit číslo, cílová rychlost pravého motoru
•
byte 7,8 – 16-bit číslo, cílová rychlost levého motoru
•
byte 9,10 – 16-bit číslo, konstanta pro výpočet zrychlení
•
byte 11,12 – 16-bit číslo, zrychlení motoru
•
byte 13,14 – 16-bit číslo, maximální rychlost motorů
•
byte 15,16 – 16-bit číslo, cílová vzdálenost pro pravé kolo
•
byte 17,18 – 16-bit číslo, cílová vzdálenost pro levé kolo
•
byte 19,20 – 16-bit číslo, cílová vzdálenost, po které začne brždění pravého
motoru
•
byte 21,22 – 16-bit číslo, cílová vzdálenost po které začne brždění levého motoru
•
byte 23,24 – 16-bit číslo, vzdálenost ujetá pravým motorem
•
byte 25,26 – 16-bit číslo, vzdálenost ujetá levým motorem
Pozn. tento paket slouží především pro testování a ladění modulu
DT_MOT_EMER_STOP
Nouzové zastavení. Motory se okamžitě zastaví, ale nevypnou se.
DT_MOT_TURN_PLACE
Otáčka na místě.
Data:
•
byte 0 – horní byte 16-bit čísla, úhel otočení
•
byte 1 - dolní byte 16-bit čísla, ůhel otočení
- 64 -
ÚMTMB VUT V BRNĚ
•
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
byte 2 – směr otáčení, 0-doleva/1-doprava
DT_MOT_TURN
Zatáčka o 90° během jízdy
Data:
•
byte 0 – směr zatáčky, 0 – doleva/1 - doprava
DT_MOT_GET_TURN_PARAM
Žádost o poslání parametrů zatáčky. Modul vrátí paket DT_MOT_TURN_PARAM,
velikost dat je 10 bytů.
•
byte 0,1 – 16-bit číslo, rychlost průjezdu zatáčkou
•
byte 1,2 – 16-bit číslo, rychlost vnitřního kola
•
byte 3,4 – 16-bit číslo, rychlost průjezdu zatáčkou
DT_MOT_SET_TURN_PARAM
Nastavení parametrů zatáčky.
Data:
•
byte 0 – horní byte 16-bit čísla, rychlost průjezdu zatáčkou
•
byte 1 – dolní byte 16-bit čísla, rychlost průjezdu zatáčkou
•
byte 2 – horní byte 16-bit čísla, poloměr zatáčky
•
byte 3 – dolní byte 16-bit čísla, poloměr zatáčky
DT_MOT_GET_MAIN_INFO
Žádost o poslání informací pro hlavní modul. Modul vrátí paket typu
DT_MOT_MAIN_INFO, velikost dat je 5 bytů.
v levé kol v pravé kol
)
2
•
byte 0 – horní byte 16-bit čísla, výsledná rychlost (
•
byte 1 - dolní byte 16-bit čísla, výsledná rychlost
•
byte 2 - horní byte 16-bit čísla, výsledná ujetá vzdálenost (
•
byte 3 - dolní byte 16-bit čísla, výsledná ujetá vzdálenost
•
byte 4 – 8-bit číslo, typ cesty (proměná nRouteType)
DT_MOT_NULL_COVER_DIS
Nuluje ujetou vzdálenost.
- 65 -
s levé kol s pravé kol
)
2
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
DT_MOT_GET_COVER_DIS
Žádost
o
poslání
ujeté
vzdálenosti.
Modul
vrátí
paket
typu
DT_MOT_COVER_DIS, velikost dat je 4byty.
•
byte 0 – horní byte 16-bit čísla, vzdálenost ujetá levým kolem
•
byte 1 – dolní byte 16-bit čísla, vzdálenost ujetá levým kolem
•
byte 2 – horní byte 16-bit čísla, vzdálenost ujetá pravým kolem
•
byte 3 – dolní byte 16-bit čísla, vzdálenost ujetá pravým kolem
DT_MOT_DIR_REG
Regulace směru jízdy
Data:
•
byte 0 – horní byte 16-bit znaménkového čísla, velikost akčního zásahu
•
byte 1 – dolní byte 16-bit znaménkového čísla, velikost akčního zásahu
Pokud je parametr kladný regulace na pravou stranu jinak na levou.
8.5 Testovací software modulu pro PC
Tento modul má také svoji testovací aplikaci. Ta opět využívá pro komunikaci
třídy CSeriálPortMM. Aplikace se jmenuje Motor Test a umožňuje posílat modulu
všechny pakety popsané v kap. 8.4 a zobrazovat jejich odpovědi.
Pokud je modul připevněný na podvozek robotu a jsou k němu připojeny motory,
lze
testovat
jednotlivé
manévry
s
různými
parametry
bez
nutností
zapojení
a přeprogramování hlavního modulu. To je velice užitečné k nalezení správného nastavení,
při kterém nedochází k prokluzu kol.
- 66 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
9 Modul hlavního CPU
Modul hlavního CPU je navržen tak, aby co nejlépe využíval dostupný prostor
robotu. Modul zajišťuje především vlastní navigaci v bludišti a prohledávací strategii.
Další jeho funkcí je výroba stabilizovaného napětí pro ostatní moduly, také hlídá aby
napětí v bateriích nekleslo pod stanovenou mez a nedošlo ke zničení baterií.
9.1 Hardware
Jako řídící procesor byl zvolen ATMega 64 s krystalem 11,0592 Mhz. Frekvence
krystalu byla zvolena tak, aby časovač periferie USART měl nulovou odchylku
od požadované frekvence. Procesor je vybaven 4KB pamětí SRAM a 64KB paměti
EPROM pro programy. Velikost této paměti se jeví jako plně dostačující pro všechny
programy. Procesor je také vybaven dvěma periferiemi USART. Kdy jedna slouží pro
komunikaci s ostatními moduly a druhá je vyhrazena pro připojení k PC.
Modul je vybaven třemi dvoubarevnými LED diodami, které slouží k signalizaci
činností robotu, signalizaci chybových stavů a vybité baterie. Měření napětí v bateriích
je realizováno pomocí A/D převodníku procesoru ATMega. Převodník používá vnitřní
referencí 2,56V, proto jsou k němu baterie připojeny přes odporový dělič napětí.
9.2 Software
9.2.1 Základní myšlenka softwaru
Software je možné rozdělit do dvou nezávislých částí. Jedna zajišťuje základní
funkce a druhá řízení jízdy. Každá část programu je vykonávána při jiném přerušení,
základní funkce při přerušení Timer0 Overflow a řízení jízdy při Timer1 Overflow.
Mezi základní funkce programu patří aktualizace stavových proměnných,
mapování bludiště, hlídání okamžiku startu do zatáčky, regulace jízdy rovně a měření
napětí baterií. Stavové proměnné jsou aktuální rychlost středu nápravy, ujetá vzdálenost
a naměřené vzdálenosti překážek od senzorů. Tyto hodnoty jsou uloženy v globálních
proměnných programu. Další funkci je regulace směru jízdy pomocí PID regulátoru.
Řízení jízdy obstarává jen vlastní rozhodování, kterou cestou se robot vydá.
Rozhoduje se podle typu pole, na kterém se robot nachází. Příkazy ke změně směru
se předávají prostřednictvým proměnné g_nRouteType. Vlastní odeslaní paketu s příkazem
se již provádí v základních funkcích, které hlídají správný okamžik startu.
- 67 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Tato koncepce byla zvolena proto, aby se daly jednoduše vytvářet nové strategie
pro prohledávání a projíždění bludiště, aniž by bylo nutné řešit problémy spjaté
se správným najetím do zatáček, mapováním a pod.
9.2.2 Hlavní řídící proměnné modulu
Základní činnost hlavního modulu je řízena proměnou g_nStrategy, která popisuje
právě prováděnou činnost. Proměnná může nabývat hodnot:
•
ST_TEST – modul je v režimu testovaní připravenosti před jízdou
•
ST_SCAN – modul je v režimu prohledávání bludiště
•
ST_ERROR – modul je v nějakém chybovém stavu
•
ST_ROUTE – modul jede už prohledaným bludištěm na střed
Na startu programu je proměnná g_nStrategy rovna ST_TEST. V tomto případě
se robot nepohybuje, motory jsou vypnuté a neprobíhá aktualizace stavových proměnných.
Každému modulu je poslán pouze jeden paket DT_ECHO, kterým se testuje, zda je modul
připojen. Pokud se zjistí, že jsou připojeny všechny moduly, proměnná g_nStrategy
se nastaví na ST_SCAN a zapnou se motory. V tomto okamžiku je robot připraven
na prohledávání bludiště. Pokud některý z modulů není správně připojen, je nastaven
chybový stav ST_ERROR a LED2 se rozsvítí červeně.
Pokud je proměnná g_Strategy rovna ST_SCAN, probíhá mapování bludiště.
Stavové proměnné jsou pravidelně aktualizovány a robot prohledává bludiště zadaným
algoritmem. Jakmile robot dosáhne opět startovního pole, je celé bludiště zmapované.
Proměnná g_nStrategy je nastavena na ST_ROUTE. V tomto režimu již robot jede znáním
bludištěm do cílového pole, umístěného ve středu bludiště. Jakmile ho dosáhne, soutěžní
úloha skončila.
Další důležitou proměnnou je g_nRouteType, která vyjadřuje manévr, který
se realizuje nebo který se má realizovat. Právě na základě této proměnné a typu pole,
na kterém se robot nachází rozhoduje řízení jízdy, zda se má zatočit nebo jet rovně.
Proměnná může nabývat hodnot:
•
RT_STOP – robot stojí
•
RT_DIRECTLY – robot se pohybuje rovně ( pouze v tomto režimu probíhá
regulace jízdy rovně )
- 68 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
•
RT_TURN – robot zatáčí, kontrolu nad robotem má modul motorů, po dokončení
zatáčky je automaticky nastaven stav RT_DIRECTLY
•
RT_FOR_BARRIER – bariéra těsně před robotem
•
RT_START_TURN_LEFT – robot bude v aktuálním poli zatáčet doleva, pouze
se čeká na správný okamžik startu, jakmile nastane je poslán příkaz motorům a je
nastaveno RT_TURN
•
RT_START_TURN_RIGHT – totéž co předchozí, ale do leva
•
RT_WAIT – robot čeká na další činnost. Tento stav je nastaven při otočení
ve slepé uličce
•
RT_TURN_PLACE – probíhá otáčka na místě, kontrolu nad robotem má modul
motorů, po skončení zatáčky je nastaven stav RT_WAIT
9.3 Základní funkce programu
Obr. 9.1: Vývojový diagram Timer0
Základní funkce programu jsou vykonávány při přerušení časovače Timer0
Overflow, viz [6]. S ohledem na vzorkovací frekvenci senzorů a rychlost komunikace
- 69 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
je optimální frekvence aktualizace stavových proměnných od 10 do 20 Hz. Protože
časovač Timer0 je jen 8-bitový, nelze dosáhnout menší frekvence než 42Hz. Proto při
každém přerušení proběhne aktualizace jen některých stavových veličin. Vše popisuje
vývojový diagram na Obr. 9.1.
9.3.1 Hlídání okamžiku začátku startu do zatáčky
Správné načasovaní startu do zatáčky je pro její přesné projetí velice důležité.
Při časování startu se nelze řídit bočními senzory, protože v době kdy detekují zatáčku,
se kola robotu nachází daleko před zatáčkou viz Obr. 9.2a.
Správný okamžik startu je také závislí na poloměru zatáčky. V ideálním případě
je poloměr roven polovině délky pole, jak je vidět na Obr. 9.2b. Tento případ je ale velice
náchylný na přesnost nájezdu. Pokud se robot nepohybuje ve středu pole, dochází
na výjezdu k velkým nepřesnostem, to způsobuje velké problémy pokud na sebe navazují
dvě zatáčky. Lepších výsledku je dosaženo pokud je poloměr zatáčky menší viz Obr. 9.2c.
Poloměr musí být zvolen tak, aby bylo zaručeno, že zatáčka vždy skončí na stejném poli,
na kterém začala.
Obr. 9.2: Start zatáčky
Start do zatáčky lze provádět dvěma způsoby, první je na základě ujeté
vzdáleností od místa detekce zatáčky a druhý na základě vzdálenosti ke zdi před robotem.
Start na základě ujeté vzdálenosti lze použít vždy, ale nedosahuje takové přesnosti
jako druhý způsob. Největší slabinou tohoto způsobu jsou nepřesnosti při detekci zatáček.
Dalším problém je sčítání chyb, pokud na sebe navazuje více zatáček .
Start na základě vzdálenosti zdi před robotem, je velice přesný. Nedochází
ke sčítání chyb při navazujících zatáčkách. Při experimentech bylo dosaženo podstatně
spolehlivějších průjezdů než v předchozím případě. Velkou nevýhodou této metody je,
že nelze použít na křižovatkách typu T, kde se před robotem nenachází žádná zeď.
- 70 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Alogritmus startu do zatáčky je zjednodušeně znázorněn na Obr. 9.3.
Pokud je proměnná
g_nRouteType
rovna
RT_START_TURN_LEFT
nebo
RT_START_TURN_RIGHT, rozhodne se podle typu pole, na kterém se robot nachází,
zda se použije startování podle ujeté vzdáleností nebo startování podle vzdálenosti robotu
od zdi. Potom pokud robot ujel potřebnou vzdálenost nebo je dostatečně blízko zdi,
se pošle příkaz motorům a proměnná g_nRouteType se nastaví na RT_TURN. Jakmile
je zatáčka
skončena
proměnná
g_nRouteType
je
automaticky
nastavena
na RT_DIRECTLY.
Obr. 9.3: Zjednodušený vývojový diagram startu do zatáčky
9.3.2 Měření napájení
Měření napájení je realizováno pomocí A/D převodníku mikrokontroléru
ATMega64. Pro měření je použito vnitřní referenční napětí 2,56V. A/D převodník běží
v tvz. Single Conversion Modu, viz [6], kdy je převod odstartován, zapsáním bitu ADCS
v řídícím registru převodníku. Po ukončení měření je vyvoláno přerušení ADC Conversion
Complete.
Při přerušení je hodnota registru ADC přepočtena na napětí pomocí funkce
CalcAdcToMv(..). Ale protože jsou baterie k A/D převodníku připojeny pomocí
odporového děliče napětí, je nutno ještě spočítat výsledné napětí. Přepočet zajišťuje funkce
CalcResDivU1(..).
- 71 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Pokud napětí klesne pod minimální hodnotu, stanovenou pomocí proměnné
g_nBatteryMinADC, rozsvítí se LED1 červeně, jinak svítí zeleně.
Aktuální napětí lze také získat pomocí paketu DT_MAIN_GET_BATTERY
popsaného níže.
9.3.3 Regulace směru jízdy
K regulaci jízdy rovně je použit softwarově řešený PID regulátor. Regulační
odchylka je rozdíl naměřené vzdálenosti levého a pravého senzoru a akční zásah
je parametr pro paket DT_MOT_DIR_REG, popsaného v 8.4.
Obr. 9.4: Regulace směru
případ 2
Obr. 9.5: Regulace směru
případ 1
Regulaci směru můžeme rozdělit do dvou případů, jak ukazují obrázky Obr. 9.4
a Obr. 9.5. První případ je, když jsou zdi po obou stranách. Regulační odchylka se počítá
jako:
e=l P−l L
Rov. 9.1
V druhém případě, je zeď jen na jedné straně. Potom je vzdálenost k chybějící zdi
nahrazena ideální vzdáleností, která se vypočítá podle:
l ideal =
H pole
−h senz
2
Rov. 9.2
kde je lideal – ideální vzdálenost od zdi, Hpole – šířka pole, hsenz – vzdálenost senzoru
od osy robotu.
Pro zrychlení výpočtu jsou simulována čísla s pevnou desetinou čárkou s přesností
na dvě desetinná místa. To se ukázalo jako dostačující přesnost.
Protože není znám přenos soustavy, nastavení PID regulátoru bylo provedeno
experimentálně.
- 72 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
9.3.4 Mapování bludiště
Pro mapování bludiště je nejdříve nutno popsat jeho uložení v paměti. Bludiště
je uloženo jako dvourozměrné pole, jehož prvky jsou tvořeny 8-bitovým číslem
bez znaménka. Zdi jsou potom reprezentovány příslušným bitem. Počátek souřadného
systému je umístěn v levém horním rohu. Bludiště je uloženo v proměnné g_arMaze.
Způsob uložení bludiště, orientace globálních směrů a označení zdí je zobrazen na Obr.
9.6.
Bity reprezentující zdi:
•
MAZE_GL_TOP – bit 0
•
MAZE_GL_RIGHT – bit 1
•
MAZE_GL_BOTTOM – bit 2
•
MAZE_GL_LEFT – bit 3
•
MAZE_GL_UNKNOWN – bit 4, nezmapované pole.
Obr. 9.6: Způsob uložení bludiště
Dále bylo nutné definovat globální směry v bludišti, ty vyjadřují směr pohybu
robotu v bludišti. Směr se vždy aktualizuje po dokončení zatáčky, pomocí funkce
UpdateGlobalDir(..).
Globální směr je uložen v proměnné g_nGlobDir, jedná se o 8-bitové bez
znaménkové číslo, nabývá hodnot:
•
GL_RIGHT = 1
•
GL_BOTTOM = 2
•
GL_LEFT = 4
•
GL_TOP = 8
- 73 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Na začátku programu je pro všechny prvky pole nastaven bit DIR_UNKNOWN
a pro krajní pole jsou nastaveny bity reprezentující okraj bludiště.
Dalším klíčovým prvkem pro mapování je zjištění typu pole, na kterém se robot
nachází. Typ pole, které je možno detekovat je omezen množstvím senzorů, v aktuální
konfiguraci, lze detekovat zeď vpředu a
po stranách robotu, případně zeď vpředu
na následujícím poli, jak ukazuje Obr. 9.7.
Typ aktuálního pole je uložen v proměnné
g_nCellType, která je typu 8-bitové bez
znaménkové
číslo,
kde
jsou
zdi
opět
reprezentovány příslušným bitem. Umístění
zdí je v tomto případě popsáné vzhledem
k souřadnému systému, který je spojený
s robotem.
Obr. 9.7: Typ pole na kterém se robot nachází
•
DIR_LEFT – bit 0, zeď na levé straně
•
DIR_RIGHT – bit 2, zeď na pravé straně
•
DIR_FORWARD - bit 1, zeď před robotem
•
DIR_NEXT_FOR – bit 4, zeď před robotem na následujícím poli.
•
DIR_BARRIER – bit 5, překážka těsně před robotem (používá se jako pojistka
proti nárazu robotu)
Pro mapování se používají pouze první tři bity, ostatní slouží k navigaci jízdy
bludištěm.
Transformaci typu pole ze souřadného systému robotu do globálního souřadného
systému bludiště, zajišťuje funkce TranCellLcToGL(..).
Algoritmus vlastního mapování lze rozdělit do dvou častí. Mapování rovného
úseku a mapování zatáčky. Mapování rovného úseku je prováděno na základě ujeté
vzdálenosti. Mapování zatáčky se děje vždy při jejím startu. Úkolem mapování je také
aktualizovat polohu robotu v bludišti. Ta je uchovávána v proměnných g_nMousePos_x
a g_nMousePos_y.
Algoritmus mapování rovného úseku je zjednodušeně zobrazen na Obr. 9.8.
Nejdříve se provede test zda byla ujeta minimální vzdálenost, kdy budou senzory již
- 74 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
v novém poli. Pokud ano musí se otestovat, zda pole již nebylo mapováno. Pokud nebylo,
namapuje se pomocí funkce MapRoute(..). Potom se čeká dokud se neujede maximální
vzdálenost pro dosažení nového pole. Pokud je ujeta, vynuluje se ujetá vzdálenost a proces
se opakuje.
Funkce MapRoute(..) nejdříve vypočítá novou polohu robotu na základě směru,
kterým se robot pohybuje, pomocí proměnné g_nGlobDir, která byla popsána výše. Takto
vypočítaná poloha je vložena do proměnných g_nMousePos_x a g_nMousePos_y. Potom
vybere první tři bity z proměnné g_nCellType, která vyjadřuje typ pole na kterém se robot
nachází, takto získané informace transformuje do globálních souřadnic a uloží
je do proměnné g_arMaze.
Obr. 9.8: Zjednodušený algoritmus mapování rovného úseku
Význam minimální a maximální vzdálenosti je zobrazen na Obr. 9.9. Toto rozmezí
vzdáleností zajistí správné mapování při nepřesných nájezdech nebo výjezdech ze zatáček
nebo vjetí do slepé uličky, kdy robot nemusí vždy urazit vzdálenost celého pole. Volba
těchto vzdáleností je poměrně složitou úlohou. Zejména je třeba dbát na správné nastavení
minimální vzdálenosti. Pokud je minimální vzdálenost příliš velká, dojde k tomu,
že senzory robotu se nachází v jiném poli než kola robotu, to vede k namapování
následujícího pole na aktuální. Maximální vzdálenost by v ideálním případě měla být
doplňkem do velikosti pole, ale experimenty ukázaly, že se dosahuje lepších výsledků
pokud je o několik procent menší ( asi 5÷8% ). Pokud je maximální vzdálenost příliš malá
dochází na dlouhých rovinkách ke špatnému počítání ujetých polí.
- 75 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Obr. 9.9: Význam max. a min. vzdálenosti pro mapovaní
bludiště
Mapování zatáčky je nutné proto, že v době okamžiku startu do zatáčky nebyla
uražena minimální vzdálenost, ale přitom je zaručeno že robot se již nachází na novém
poli. Mapování je prováděno pouze funkcí MapRoute(..), která vypočítá novou polohu
a namapuje pole. Při výjezdu ze zatáčky se již vše mapuje předchozím algoritmem.
9.4 Řízení jízdy
Řízení jízdy je vykonáváno při přerušení Timer1 Overflow. Algoritmus jízdy
se vybírá podle proměnné g_nStategy, která byla popsaná výše.
9.4.1 Prohledávání bludiště
Jak již bylo popsáno v pravidlech soutěže, bludiště nesmí obsahovat osamocené
ostrůvky, tudíž ho lze projet pravidlem pravé nebo levé ruky. Zjednodušený algoritmus
prohledávání je na Obr. 9.10.
Pokud
se
robot
pohybuje
rovně
(proměnná
g_nRouteType
se
rovná
RT_DIRECTLY), vyhodnotí se podle proměnné g_nCellType tvar pole na kterém se robot
nachází. Pokud je před robotem překážka, robot zastaví a proměnná g_nRouteType
je nastavena na RT_FOR_BARRIER. Pokud se robot nachází na poli na kterém může jet
doprava, proměnná g_nRouteType se nastaví na RT_START_TURN_RIGHT. Start
do zatáčky potom proběhne při přerušení Timer0 Overflow. Jakmile je zatáčka dokončena
je opět automaticky nastaven stav RT_DIRECTLY. Pokud se robot nachází na poli,
na kterém nemůže jet doprava ani rovně, zatočí se obdobným způsobem doleva.
- 76 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Když se robot pohybuje v zatáčce, tzn proměnná g_nRouteType se rovná
RT_TURN, hlídá se pouze aby robot nenarazil do zdi. Pokud se k ní přiblíží příliš, je poslán
příkaz k zastavení.
Obr. 9.10: Zjednodušený vývojový diagram algoritmu prohledávání
- 77 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Pokud se nachází před robotem zeď a robot stojí, tzn. že g_nRouteType je rovna
RT_FOR_BARRIER, testuje se zda jde o slepou uličku. Pokud ano pošle se příkaz
pro otočení na místě.
Vše probíhá tak dlouho dokud se robot nevrátí zpět na místo startu.
9.4.2 Nalezení optimální cesty
Po prohledání bludiště je třeba nelézt optimální cestu. Pro nalezení optimální
cesty existuje několik algoritmů, v našem případě je použit algoritmus, který je popsaný
na Obr. 9.11.
Algoritmus spočívá v ohodnocení polí bludiště, kdy ohodnocování probíhá
od cílového pole ke startovnímu. Cílové pole ohodnotíme jedničkou viz Obr. 9.11a,
v našem
případě
v prostředním
cílové
čtverci
pole
bludiště.
leží
Potom
ohodnotíme sousední pole, na které je
možné dojet číslem větším o jedničku, viz
Obr. 9.11b. Takto postupujeme tak dlouho,
dokud nedosáhneme startovního pole které
je v našem případě v levém horním rohu,
viz Obr. 9.11c. Nejkratší cestu potom
nalezneme tak, že od startovního pole
vybíráme vždy následující pole, které je
menší než aktuální, viz Obr. 9.11d.
Tento algoritmus nám zajistí vždy
nalezení nejkratší cesty, pokud nějaká Obr. 9.11: Nalezení optimální cesty bludištěm
existuje. Pokud existují dvě totožné cesty,
jsou nalezeny obě. Tento algoritmus je rychlý a nenáročný na pamět. Požadavky na paměť
jsou závislé na velikosti bludiště. V případě že je bludiště 16x16 polí, potřebuje pouze 256
bytů.
Ohodnocení bludiště zajišťuje funkce SolveMaze(), která na základě zmapovaného
bludiště (g_arMaze), ohodnotí pole reprezentované proměnnou g_arMazeSol. Vývojový
diagram funkce je na Obr. 9.12.
- 78 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Obr. 9.12: Vývojový diagram nalezení optimální cesty
bludištěm
Na začátku funkce je nastavené cílové pole na hodnotu 1. K procházení
dvourozměrného pole je použito dvou cyklů. Pokud je nalezeno pole, které se právě
expanduje, provede se ohodnocení sousedních polí. Vše se opakuje dokud není
ohodnoceno startovní pole.
9.4.3 Řízení naplánované jízdy bludištěm
V případě, že máme nalezenou optimální cestu bludištěm, je nutno vytvořit mapu,
podle které se robot bude pohybovat. Mapa je také tvořena dvourozměrným polem.
Na základě hodnot jednotlivých prvků pole se rozhoduje, zda robot pojede rovně nebo
zatočí. Směr zatáčky je v lokálních souřadnicích robotu. Prvky pole mohou nabývat
hodnot:
- 79 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
•
0 – pokračovat ve směru jízdy
•
1 – zatočit doleva
•
2 – zatočit doprava
TOMÁŠ PASEKA
Mapa pro případ bludiště, které bylo popsané v kap. 9.4.2.
je na Obr. 9.13.
Vytvoření
mapy
zajišťuje
funkce
CreateRoute(). Obr. 9.13: Mapa cesty
Pro úsporu paměti lze pro ohodnocené bludiště a mapu použit stejné pole. Ale protože
mikrokontrolér ATMega 64 má paměti dostatek pro snadnější testování se mapa ukládá
do dalšího dvourozměrného pole, které je reprezentováno proměnnou g_arRoute.
Obr. 9.14: Vývojový diagram jízdy podle mapy
Jakmile je mapa vytvořena robot se podle ní pohybuje pomocí algoritmu, který je
na Obr. 9.14. Pokud robot jede přímo, proměnná g_nRouteType se rovná RT_DIRECTLY
- 80 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
a lze zatočit vlevo nebo vpravo, rozhodne se podle pozice robotu v bludišti a podle mapy,
zda se zatočí vlevo nebo vpravo. V okamžiku detekce zatáčky je ale nutné přičíst jedno
pole, podle směru, jízdy k aktuální pozici, protože senzory se již nachází na jiném poli,
než kola robotu. Proces se opakuje dokud není dosaženo cíle. Pokud se robot nachází
v zatáče, proměnná g_nRouteType se rovná RT_TURN, je nutné provádět ochranu proti
nárazu robotu do zdi.
9.5 Popis všech paketů modulu
9.5.1 Usart 0
DT_ECHO
Pří přijetí tohoto paketu modul vrátí stejný paket
9.5.2 Usart 1
DT_ECHO
Pří přijetí tohoto paketu modul vrátí stejný paket
DT_MAIN_GET_BATTERY
Žádost o poslaní napětí na baterii. Modul vrátí paket typu DT_MAIN_BATTERY
velikost dat je 2 byty.
•
byte 0 – horní byte 16-bitového čísla, napětí v mV
•
byte 1 – dolní byte 16-bitového čísla, napětí v mV
DT_MAIN_GET_STATUS
Žádost
o
poslání
statistiky
komunikace.
Modul
vrátí
paket
typu
vrátí
paket
typu
DT_MAIN_STATUS, velikost dat jsou 4 byty.
•
byte 0 – 8-bitové číslo, počet CRC chyb na USART 0
•
byte 1 – 8-bitové číslo, počet timeoutů na USART 0
•
byte 2 – 8-bitové číslo, počet CRC chyb na USART1
•
byte 3 – 8-bitové číslo, počet timeoutů na USART1
DT_MAIN_GET_STATE_VAR
Žádost
o
poslání
stavových
proměnných.
Modul
DT_MAIN_STATE_VAR, velikost dat je 10 bytů.
•
byte 0 – horní byte 16-bitového čísla, rychlost motorů [krok/s]
- 81 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
•
byte 1 – dolní byte 16-bitového čísla, rychlost motorů [krok/s]
•
byte 2 – horní byte 16-bitového čísla, ujetá vzdálenost
•
byte 3 – dolní byte 16-bitového čísla, ujetá vzdálenost
•
byte 4 – horní byte 16-bitového čísla, vzdálenost naměřená levým senzorem
•
byte 5 – dolní byte 16-bitového čísla, vzdálenost naměřená levým senzorem
•
byte 6 – horní byte 16-bitového čísla, vzdálenost naměřená prostředním
senzorem
•
byte 7 – dolní byte 16-bitového čísla, vzdálenost naměřená prostředním
senzorem
•
byte 8 – horní byte 16-bitového čísla, vzdálenost naměřená pravým senzorem
•
byte 9 – dolní byte 16-bitového čísla, vzdálenost naměřená pravým senzorem
DT_MAIN_GET_ERROR_REP
Žádost o poslání hodnot klíčových proměnných. Modul vrátí paket typu
DT_MAIN_ERROR_REP, velikost dat je 6 bytů.
•
byte 0 – 8-bitové číslo, proměnná g_nModulesInfo
•
byte 1 – 8-bitové číslo, proměnná g_nRouteType
•
byte 2 – 8-bitové číslo, proměnná g_nCellType
•
byte 3– 8-bitové číslo, proměnná g_nGlobDir
•
byte 4 – 8-bitové číslo, rezervováno
•
byte 5 – 8-bitové číslo, rezervováno
DT_MAIN_SET_DIR_PID
Nastavení PID regulátoru pro jízdu rovně
Data:
•
byte 0 - horní byte 16-bit čísla, proporcionální složka
•
byte 1 - dolní byte 16-bit čísla, proporcionální složka
•
byte 2 - horní byte 16-bit čísla, integrační složka
•
byte 3 - dolní byte 16-bit čísla, integrační složka
•
byte 4- horní byte 16-bit čísla, derivační složka
•
byte 5 - dolní byte 16-bit čísla, derivační složka
- 82 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
DT_MAIN_GET_DIR_PID
Žádost o poslání nastavení PID regulátoru. Modul vrátí paket typu
DT_MAIN_DIR_PID, velikost dat je 6 bytů.
•
byte 0 - horní byte 16-bit čísla, proporcionální složka
•
byte 1 - dolní byte 16-bit čísla, proporcionální složka
•
byte 2 - horní byte 16-bit čísla, integrační složka
•
byte 3 - dolní byte 16-bit čísla, integrační složka
•
byte 4- horní byte 16-bit čísla, derivační složka
•
byte 5 - dolní byte 16-bit čísla, derivační složka
DT_MAIN_GET_POSITION
Žádost
o
poslání
pozice
robotu
v
bludišti.
Modul
vrátí
paket
DT_MAIN_POSITION, velikost dat je 2 byty.
•
byte 0 – 8-bit číslo, souřadnice x
•
byte 1 - 8-bit číslo, souřadnice y
DT_MAIN_GET_MAZE
Žádost o poslání bludiště. Modul vrátí paket DT_MAIN_MAZE, velikost dat
je závislá na velikosti pole.
DT_MAIN_GET_MAZE_SOL
Žádost
o
poslání
ohodnoceného
bludiště.
Modul
vrátí
paket
DT_MAIN_MAZE_SOL, velikost dat je závislá na velikosti pole.
DT_MAIN_GET_MOT_COMST
Žádost o poslání statistiky komunikace motorů, modul vrátí paket popsaný
v kap. 8.4.
DT_MAIN_GET_SEN_COMST
Žádost o poslání statistiky komunikace senzorů, modul vrátí paket popsaný
v kap. 7.4.
- 83 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
9.6 Testovací software na PC
Modul hlavního CPU má jako všechny ostatní svoji testovací aplikaci. Aplikace
pro komunikaci využívá třídu CseriálPortMM. Jméno aplikace je MainBoard Test.
Aplikace umožňuje posílání všech popsáných paketů a zobrazování jejich
výstupů. Také umožňuje stažení namapovaného a ohodnoceného bludiště a jeho vykreslení
včetně číselných hodnot polí. Lze pomoci ní také nastavovat PID regulátor pro regulaci
jízdy rovně.
- 84 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
10 Závěr
Tento první model autonomního robotu ukázal, že zvolená koncepce je dobrá.
Podařilo se sestavit robot s dobrým poměrem cena / výkon. Jediným problémem který
se zatím vyskytl je schopnost senzorů měřit pouze do vzdálenosti od 4 do 30cm. Tento
nedostatek lze odstranit přidáním senzorů.
Funkčnost jednotlivých řídících programů modulů byla experimentálně ověřena
v bludišti. Navržené algoritmy se ukázaly jako dobré, s výjimkou mapování bludiště, které
někdy vykazuje chyby při detekci typu pole. Chyba je nejspíše způsobena sčítáním
nepřesností při navazujících zatáčkách. Pro odstranění tohoto nedostatku by bylo dobré,
robot vybavit bezdrátovým modulem pro připojení k PC, nebo vytvořit vhodný simulační
software, aby bylo možno sledovat hodnoty stavových veličin v průběhu jízdy.
Poděkování
Tato práce je podporována projektem MSM 0021630518 „Simulační modelování
mechatronických soustav“.
- 85 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Použitá literatůra
[1] David Matoušek: Práce s mikrokontroléry ATMEL AVR, Technická literatura
BEN 2003
[2] Vladimír Váňa: Mikrokontroléry ATMEL AVR a jazyce C, Technická literatura
BEN 2003
[3] Doc. Ing. František Šolc Csc, Ing. Zdeněk Žalud Ph.D.: Robotika, VUT v Brně
FEKT 2002
[4] Dirk Louis, Petr Mejzlík, Miroslav Virius: Jazyky C a C++ podle normy
ANSI/ISO., Grada 1999
[5] Datasheet: ATMega8(L), Atmel Corporation 2004
[6] Datasheet: ATMega64(L), Atmel Corporation 2004
[7] David J. Kruglinski: Mistrovství ve Visual C++, Computer Press 1999
[8] Robotika.sk, http://www.robotika.sk
[9] Peter Harrison: Micromouse Information Centre,
http://micromouse.cannock.ac.uk
[10] Microrobot Corporation, http://www.microrobot.com/
[11] Zbyněk Winkler: Odometrie, http://robotika.cz/guide/odometry/cs
[12] MSDN Library, Microsoft 2003
[13] Ing. Tomáš Marada Ph.D., Ing. Pavel Houška Ph.D., Tomáš Paseka: SMALL
AUTONOMOUS ROBOT FOR PRACTICAL VERIFYING OF ARTIFICIAL
INTELLIGENCE METHODS, Svratka 2006
- 86 -
ÚMTMB VUT V BRNĚ
DIPLOMOVÁ PRÁCE
TOMÁŠ PASEKA
Seznam příloh
Přílohou je CD ROM se zdrojovými soubory, elektronickou podobou této práce a
vývojovými nástroji. CD ROM obsahuje:
Zdrojové soubory
•
pro komunikační protokol
•
pro modul motorů
•
pro modul senzorů
•
pro modul hlavního CPU
•
pro aplikaci Motor Test
•
pro aplikaci Senzors Test
•
pro aplikaci Senzors Char
•
pro aplikaci MainBoard Test
Aplikace
•
Motor Test
•
Senzors Test
•
Senzors Char
•
MainBoard Test
Vývojové nástroje
•
WinAVR
•
PSPad
Pzn. Všechny přiložené vývojové nástroje jsou volně šiřitelné.
- 87 -

Podobné dokumenty

Dokumentace

Dokumentace signálu USB na paralelní sběrnici mikroprocesoru s možností využití některých z převodníků USB na sériový nebo pararelní(FIFO) port, protože zpracování signálů v mikroprocesoru je mnohonásobně jedn...

Více

Ovladače v OS a v ŘS REX

Ovladače v OS a v ŘS REX V případě ovladače bez vlastní úlohy OS musí funkce nastavit výstupy do daného zařízení, jinak nastavuje hodnoty výstupů do vyrovnávací paměti cache Pro bloky STDOUTR, QUADOUTR, OCTOUTR a HEXDOUTR,...

Více

BEGA220A

BEGA220A 3.4.1 How to Control GPIO for BEGA220A .....................................................................................................59 3.4.2 GPIO Control Function for BEGA220A.................

Více

Návrh webového systému řízení malé společnosti

Návrh webového systému řízení malé společnosti Obor: Výpočetní technika květen 2007

Více

31 SCS - České vysoké učení technické v Praze

31 SCS - České vysoké učení technické v Praze strojovému cyklu. Procesor obsahuje 32 osmibitových registrů. Programová paměť má velikost 1kB, paměť EEPROM pro ukládání dat a konstant pak 64B. Vzhledem k použitému pouzdru je k dispozici jen 6 v...

Více

- Katedra technické a informační výchovy PdF UP v

- Katedra technické a informační výchovy PdF UP v Objektové typy se zavádějí ve Visual Basicu pro objekty, s nimiž se v něm pracuje. S jejích pomocí lze deklarovat jednotlivé instance. Existují obecné objektové typy z nich odvozené i objektové typ...

Více

Zde - Martin Uhlík

Zde - Martin Uhlík Nejčastěji využívané obvody jsou právě teplotní čidla. Tato čidla jsou digitální a poskytují výstup přímo jako číslo ve stupních Celsia, není tedy v mikroprocesoru nutné provádět přepočet. Celkově ...

Více