Mendelova univerzita v Brně Provozně ekonomická fakulta
Návrh a realizace komunikačního protokolu mezi robotem a senzorickou soustavou Bakalářská práce
Vedoucí práce:
Autor práce:
Ing. Jan Kolomazník
Josef Kolaja
Brno 2013
Touto cestou bych rád poděkoval vedoucímu mé bakalářské práce panu Ing. Janu Kolomazníkovi za odborné rady, připomínky a trpělivost, kterou mi při zpracování této práce věnoval.
Prohlašuji, že jsem bakalářskou práci na téma „Návrh a realizace komunikačního protokolu mezi robotem a senzorickou soustavou“ vypracoval samostatně, na základě vlastních zjištění a materiálů, které cituji a uvádím v seznamu literatury. V Brně dne 23. května 2013
__________________ Josef Kolaja
Abstract KOLAJA, J. Design and implementation of the communication protocol between the robot and the sensory system. Bachelor thesis. Brno: Mendel University in Brno, 2013. Main target of my bachelor thesis is the design and implementation of communication protocol for mobile robot. The communication protocol ensures that the control unit sends commands to motor system and receives all necessary information from the sensory system. The first part is theoretical – a literary research. This section contains an explanation of terms from robotics, especially mobile robots. There are explained the main parts of the mobile robot and communication protocol. Next part is main part, which introduce how to implement communication protocol. Keywords Mobile robot, communication protocol, sensory system, motor system, Arduino, Java.
Abstrakt KOLAJA, J. Návrh a realizace komunikačního protokolu mezi robotem a senzorickou soustavou. Bakalářská práce. Brno: Mendelova univerzita v Brně, 2013. Cílem bakalářské práce je návrh a realizace komunikačního protokolu pro mobilní robot. Komunikační protokol zajišťuje, aby řídicí jednotka posílala příkazy pohonné soustavě robotu a aby dostávala všechny potřebné informace od senzorické soustavy. První část bakalářské práce je teoretická část neboli literární rešerše. Tato část se zabývá vysvětlením pojmů z oblasti robotiky, zvláště mobilních robotů. Jsou zde vysvětleny hlavní části mobilního robotu a komunikační protokol. Další část je vlastní práce, ve které je uveden postup při realizaci komunikačního protokolu. Klíčová slova Mobilní robot, komunikační protokol, senzorická soustava, pohonná soustava, Arduino, Java.
Obsah
6
Obsah 1
Úvod
8
2
Cíl práce
9
3
Teoretická část 3.1
10
Robotika, rozdělení robotů ......................................................................10
3.1.1
Pohonný subsystém ......................................................................... 12
3.1.2
Senzorická soustava ......................................................................... 13
3.1.3
Řídicí jednotka ................................................................................. 14
3.1.4
Zdroj energie .................................................................................... 14
3.2
Komunikační protokol ............................................................................. 14
3.2.1
TCP protokol .................................................................................... 15
3.2.2
Formát dat........................................................................................ 16
3.2.3
Protokol mobilních robotů .............................................................. 16
3.3
Charakteristika robotu ............................................................................. 17
3.3.1
Konstrukce ....................................................................................... 17
3.3.2
Arduino – řídicí jednotka ................................................................18
3.3.3
Kompas ............................................................................................ 19
4
Metodika
20
5
Vlastní práce
21
5.1
Zvolený přístup, prostředky .................................................................... 21
5.2
Stanovení parametrů komunikace ......................................................... 22
5.3
Implementace softwaru pro Arduino ..................................................... 23
5.3.1
Ovládání serv .................................................................................. 23
5.3.2
Testování programu pro IRC senzory ............................................ 24
5.3.3
Testování kompasu ......................................................................... 25
5.3.4
Komunikační protokol – software pro Arduino ............................. 26
5.4
Zapouzdření komunikačního protokolu do Java knihovny ................... 29
5.5
Testovací jízdy ......................................................................................... 29
Obsah
7
6
Diskuse, návrhy a doporučení
31
7
Závěr
32
8
Seznam literatury a zdrojů
33
9
Seznam tabulek
35
10 Seznam obrázků
36
11
Seznam použitých zkratek
37
A
Program pro IRC senzory
39
Úvod
8
1 Úvod Tato bakalářská práce, je součástí projektu, který vznikl na Provozně ekonomické fakultě Mendelovy univerzity. Cílem tohoto projektu je postavit mobilní robot, který autonomně projede arboretum Mendelovy univerzity a fotograficky ho zdokumentuje. Na projektu pracují jak studenti, tak i vyučující. Do budoucna bychom se chtěli zúčastnit robotických soutěží. Věřím, že tento robot bude přínosný nejen pro tým, který na něm pracuje, ale i pro Mendelovu univerzitu. Lidé si od nepaměti snaží ulehčovat namáhavou práci a sestrojit stroj, který by tuto činnost za ně vykonával. Ke splnění tohoto snu lidem pomohl velký rozvoj informačních technologií a hlavně robotiky. Zpočátku byly roboty pomalé, nemotorné a používaly se na jednoduché práce. To ale bylo v polovině minulého století. Dnes je robotika o velký kus napřed a roboty mají velké uplatnění v mnoha odvětvích. V průmyslu jsou roboty často využívány na takové činnosti, na které člověk nestačí, jsou příliš monotónní nebo jsou pro něj nebezpečné. Nasazení robotů do výroby zpravidla zvýší kvalitu a produktivitu, protože robot zvládne vykonávat činnost, pro kterou je naprogramován, mnohem rychleji a precizněji než člověk. Roboty našly své uplatnění i ve vojenství, kde se používají na přepravu nebezpečného materiálu a průzkum oblastí jak ze vzduchu (bezpilotní letouny), tak po zemi, kde mohou být vyslány na průzkum do zaminovaných oblastí. S tím souvisí speciální roboty, které jsou určeny pro deaktivaci bomb, díky nimž lidé nemusí riskovat své životy. V lékařství roboty pomáhají doktorům při operacích na dálku nebo při manipulaci v laboratořích. Kromě toho se rozšířili i umělé orgány a končetiny, které dokáže člověk ovládat pomocí svého mozku. Roboty nás doslova obklopují a dostaly se už i do domácností přes kuchyňský robot až po autonomní roboty na vysávání, čištění bazénů či sekání trávy.
Cíl práce
9
2 Cíl práce Cílem této bakalářské práce je navrhnout a realizovat komunikační protokol mezi robotem a jeho senzorickou a pohonnou soustavou. Teoretická část práce se zabývá vytvořením přehledu o mobilních robotech, jejich senzorické soustavě, pohonné soustavě a řídicí jednotce. Dále je práce zaměřena na komunikační protokol a problematiku s ním spojenou. Praktická část bakalářské práce se zabývá realizací komunikačního protokolu, který zajistí, aby řídicí jednotka robotu byla schopna zasílat příkazy pohonné jednotce robotu a aby senzorická soustava poskytovala vyššímu softwaru informace o okolí robotu. To zahrnuje navrhnutí formátu komunikačních parametrů, definování způsobu komunikace, seznámení se s Arduinem a jeho programovacím prostředí, ve kterém se používá speciální Arduino programovací jazyk (založený na jazyku Wiring, který je podobný C). S tím souvisí i řízení serv, které obstarává pulzní šířková modulace (PWM), ovládání kompasu, u kterého je nutno si osvojit práci s jeho knihovnou. Software pro Arduino bude zajišťovat i sběr dat z inkrementálních senzorů. Dalším podmínkou pro splnění cíle práce je vytvoření modulu v programovacím jazyce Java, který bude odesílat data Arduinu, jenž tato data zpracuje a zajistí příslušné chování akčních členů, tzn. natočení kol a nastavení rychlosti motoru. Tento modul bude přijímat data od Arduina, která budou informovat vyšší software o stavu robotu. Tato data budou obsahovat natočení robotu, které získá Arduino z kompasu, vzdálenost získanou pomocí inkrementálních senzorů a aktuální rychlost motoru a natočení kol. Nakonec druhé části bude ověřena funkčnost realizovaného komunikačního protokolu. V závěru práce budou prodiskutovány výhody a nevýhody vytvořeného komunikačního protokolu. Nakonec budou uvedena případná možná vylepšení tohoto protokolu.
Teoretická část
10
3 Teoretická část Tato část bakalářské práce je zaměřena na teoretické vysvětlení pojmů souvisejících s mobilním robotem a jeho komunikačním protokolem. Budou objasněny pojmy, jako například pohonný soustava, senzorická soustava, řídicí jednotka.
3.1 Robotika, rozdělení robotů Robotika se zabývá studiem, výzkumem, návrhem a konstrukcí mobilních robotů. Robot (McKerrow, 1991) je stroj, který může být naprogramován k vykonávání různých činností. Roboty se dělí na stacionární, což jsou zejména výrobní automaty a manipulátory. A mobilní roboty, které patří do oblastí robotiky, jenž se zabývá roboty schopnými se přemisťovat v čase a okolním prostředí. Existuje řada kritérií, na základě kterých se dají mobilní roboty dělit. Novák rozděluje roboty na autonomní a dálkově řízené (Novák, 2005). Autonomní roboty mají schopnost vykonat zadanou úlohu samostatně. Může to být např. sledování čáry, případné vyhnutí se překážce a pokračování v jízdě. Nebo zmapování neznámého prostředí a následné dosažení požadovaného cíle. Naopak dálkově řízené roboty jsou závislé na operátoru, který je řídí. Ten má většinou vizuální informaci o okolí robotu. Dále můžeme roboty dělit podle prostředí, ve kterém se pohybují: na souši, vnitřní/vnější prostředí, ve vodě, ve vzduchu, ve vesmírném prostoru, hybridní Podle účelu nasazení je lze dělit: manipulační, montážní, servisní, inspekční, průzkumné, vojenské, zdravotnické, určené pro zábavu. Specifičtější rozdělení je u mobilních robotů pohybujících se po souši. Tyto roboty lze dělit podle pohybového subsystému: Kolové Pásové Kráčející Plazivé Šplhající Skákající Hybridní Podle Nováka jsou nejrozšířenější kolové, pásové a kráčející. Kola mobilních robotů jsou aktivní (hnaná) nebo pasivní (vlečná) a můžou být různého konstrukčního typu – standartní, všesměrové a článkové (Novák, 2005). U kol je důležitým faktorem stupeň volnosti pohybu, který určuje, okolo kolika os se může kolo otáčet. Nejpoužívanější je jeden nebo dva stupně volnosti. Kola s jedním stupněm volnosti, se pohybují okolo jedné osy (hřídele) rovnoběžné s povrchem. Kola s více stupni volnosti se mohou pohybovat okolo více os. Typickým příkladem je osobní auto, které má zadní kola s jedním stupněm volnosti a přední kola
Teoretická část
11
se dvěma. V tomto případě jsou osy předních kol na sebe vzájemně kolmé, ale mohou být i rovnoběžné (analogie kuličky mechanické počítačové myši). Kolové roboty lze dále dělit podle počtu kol na jednokolové, dvoukolové, tříkolové, čtyřkolové, šestikolové, osmikolové a další zvláštní konstrukce. Tříkolový podvozek je nejjednodušším typem, se kterým se lehce manévruje. Dvě nezávisle hnaná zadní kola a jedno pasivní přední směrové kolo zajišťuje, že robot zatáčí pouhou změnou rychlosti zadních kol. Díky tomu se dokáže otočit na místě kolem osy. (Novák, 2005)
Obr. 1
Šestikolový mobilní robot Sojourner
Zdroj: National Air and Space Museum
Další možností je Ackermanův podvozek, který je používán u dvou nebo čtyřkolových vozidel. Tento podvozek zajišťuje správné natočení směrových kol, při průjezdu zatáčkou. To znamená, že vnitřní kolo, které opisuje při zatáčení menší kružnici, má větší úhel natočení, než vnější kolo, které opisuje větší kružnici. (RcTek, 2009) Dle Nováka tvoří podvozky se všesměrovými koly speciální skupinu. Roboty s tímto podvozkem jsou schopny se pohybovat ve všech směrech, otáčet se na velmi malém prostoru a měnit směr s nulovým poloměrem zatáčení (Novák, 2005). Nevýhodou těchto podvozků je vyšší cena, která zapříčiněna složitější konstrukcí a malá schopnost zdolávání překážek. Praktické využití lze vidět u robotu PANAMA, který slouží k přepravě hlavic raket na některých amerických bitevních lodích.
Teoretická část
12
Novák dále zmiňuje, že pásové podvozky jsou využívány u buldozerů, vojenských nosičů a různých robotů specializovaných na průzkum terénu, odminování či dekontaminaci. Mobilní roboty s pásovým podvozkem snáze zdolávají terén a ve vnitřním prostředí se mohou uplatnit pro jízdu do schodů nebo ze schodů. Nevýhoda u tohoto typu podvozku je otáčení doprovázené smykem, při kterém vzniká nežádoucí teplo. (Novák, 2005) Mobilní roboty s kráčejícím podvozkem mají stejně jako pásové podvozky výhodu při zdolávání členitého terénu. Tyto roboty můžeme dělit podle počtu noh (nejrozšířenější robot šestinohý) a podle stupňů volnosti. Nevýhodou je konstrukční složitost, větší počet akčních členů a složitější řízení. (Novák, 2005) 3.1.1
Pohonný subsystém
V oblasti mobilních robotů se používají nejčastěji rotační elektromotory nebo výkonnější elektrohydraulické pohony. Používají se zejména stejnosměrné komutátorové motory, které mají dobrý poměr výkon/hmotnost. Ale v současné době se vyskytují i bezkomutátorové stejnosměrné a střídavé motory. Často využívaným typem motoru je stejnosměrný motor. Novák uvádí, že jeho výhodou je relativně snadné řízení otáček, cena a široká nabídka (Novák, 2005). Ale v porovnání s krokovým motorem má složitější polohové a rychlostní řízení a kvůli komutátoru je zdrojem elektromagnetického rušení. Za další nevýhodu může být považováno, že stejnosměrný motor má vysoké otáčky a nízký moment, ale tento problém se dá řešit pomocí převodovky, která může být již součástí motoru. Podle Nováka existuje pro menší mobilní roboty alternativa v podobě krokových motorů, které vynikají nízkou cenou, snadným ovládáním a v poslední řadě nepotřebují převodovku. Také se dají využít modelářská serva, které se opět snadno ovládají a převodovku mají již zabudovanou. (Novák, 2005) Autoři Bezdíček a Grepl udávají, že způsob nastavení polohy serv se zadává v mikrosekundách PWM (šířkově modulovaný signál). (Bezdíček, Grepl, 2008) Pro neutrální polohu se zadává do příslušných bitů hodnota 1500 (šířka signálu 1,5ms). Pokud chceme maximální otočení proti směru hodinových ručiček, zadáme hodnotu 1000 a pro maximální otočení po směru hodinových ručiček 2000. (Arduino, 2009). Toto platí pro standartní rozsah serva, který je 1–2ms, ale některá serva mohou mít rozsah až 0,5–2,5ms.
Teoretická část
Obr. 2
13
Šířka pulsu
Zdroj: ServoCity
U kontinuálního serva ovlivňuje zadaná hodnota rychlost, kterou se servo otáčí a také směr otáčení. Nula znamená maximální rychlost v jednom směru a 2000 maximální rychlost v opačném směru.
Obr. 3
Příklad nastavení serv v Arduino
Zdroj: (Arduino, 2009)
3.1.2
Senzorická soustava
Senzory lze rozdělit podle vztahu k robotu na interní a externí. Interní měří parametry robotu (stav baterie, monitorování komunikace, kontrola teploty robotu, informace o poloze a rychlosti) a externí měří parametry okolí. Senzory sloužící k navigaci a diagnostice robotu jsou nejdůležitější a mobilní robot se bez nich neobejde. Mezi tyto senzory patří dotykové senzory – taktilní. Nebo bezdotykové senzory – infračervené senzory, sonary. Pomocí těchto senzorů robot detekuje překážky a udržuje od nich požadovanou vzdálenost. Jedná se o lokální navigaci a senzory poskytují řídicímu systému informace o blízkém okolí robotu. Inkrementální senzor slouží k měření polohy, posuvu, rychlosti a případně zrychlení. Princip činnosti je založen na otáčivém mezikruží, kde se střídají prů-
Teoretická část
14
hledné a neprůhledné rysky, které přerušují emitované světlo LED diody, jež je detekováno fototranzistorem. Foto-senzor detekuje světlo, pokud prochází přes průhledné rysky. U neprůhledných rysek je detekované světlo minimální nebo žádné. (Novák, 2005) 3.1.3
Řídicí jednotka
Novák definuje řídicí jednotku jako „Mozek“ mobilního robotu, který je tvořen řídicím systémem a programem. Hardwarová část musí být schopna přijímat data ze senzorů a program je musí zpracovat, vyhodnotit a zajistit příslušné chování akčních členů. Při rozhodování, který řídicí systém použijeme, většinou rozhoduje cena, hmotnost a rozměry. (Novák, 2005) Dále Novák uvádí, že řídicí jednotka se nemusí skládat pouze z jednoho počítače, mikropočítače nebo mikro-kontroléru, ale lze použít tzv. Distribuovaný model. Tento princip je založen na tom, že jednoduché mikro-kontroléry ovládají senzory (sonar, kompas) a pohybový subsystém a výpočetně náročnější úlohy (tvorba map, zpracování obrazu) provádí PC, které může a nemusí komunikovat bezdrátově. Výhoda tohoto řešení je, že není kladen důraz na výkon (a tím pádem vyšší cenu) mikro-kontroléru, protože výkonově náročnější operace provádí PC. (Novák, 2005) 3.1.4
Zdroj energie
Každý mobilní robot potřebuje zdroj energie, který bude napájet jak řídicí subsystém, tak i senzorický a pohonný subsystém. Poslední zmíněný mívá většinou největší spotřebu. Novák zmiňuje, že napájení mobilního robotu z externího zdroje je z praktického hlediska nevhodné (Novák, 2005). Takové napájení můžeme použít pro oživení robotu, ale pro jeho činnost je již nutný vlastní energetický zdroj. U mobilních robotů jsou nejvíce používané primární články (baterie) nebo akumulátory. Podle Nováka patří mezi nejdůležitější parametry velikost vnitřního odporu, rychlost samovybíjení, životnost, kapacita a teplotní podmínky, ve kterých bude robot pracovat a samozřejmě hmotnost a rozměry. Dále je nutné zvážit, jestli postačí baterie, která se dá použít jen jednou nebo bude lepší použít akumulátor (sekundární článek), který lze opakovaně vybíjet a nabíjet. (Novák, 2005)
3.2 Komunikační protokol Protokol jsou určitá předem definovaná pravidla, která by měla být známá všem stranám, které mezi sebou komunikují. Například při odtahu auta, si řidiči předem určí, jak se budou mezi sebou dorozumívat, aby věděli kde odbočit, kdy přibrzdit a podobně. Tímto si mezi sebou vytvořili protokol, pomocí kterého budou komunikovat. (Computer Press, 2009)
Teoretická část
15
V počítačové vědě je protokol sada pravidel nebo postupů pro přenos dat mezi elektronickými zařízeními, jako jsou např. počítače. Pro přenos informací musí být předem definovaný formát dat, a jakým způsobem je bude každá strana vysílat nebo přijímat. Pokud by protokol neexistoval, mohla by nastat situasituace, že první zařízení bude přijímat data v jiném formátu, než byla odeslána druhým zařízením a vznikaly by chyby v komunikaci. (Britannica, 2013) 3.2.1
TCP protokol
Jako příklad bude uveden TCP protokol (Transmission Control Protocol), který je jeden ze základních internetových protokolů a je používán v transportní vrstvě TCP/IP. TCP garantuje doručení zpráv, které doručuje v pořadí, v jakém byly zasílány. Poskytuje nanejvýš jednu kopii každé zprávy, ale ta může být libovolně velká. Podporuje také synchronizaci mezi vysílačem a přijímačem. (Charles Clancy, 2009)
Obr. 4
Formát segmentu protokolu TCP
Zdroj: Charles Clancy
Na obrázku č. 4 lze vidět segment protokolu TCP, který je popsán následně. Source port – označuje zdrojový aplikační proces Destination port – označuje cílový aplikační proces Sequence number – je číslo prvního Bytu v segmentu Acknowledgment number – identifikuje další Byte, který očekává jako následující Data offset – specifikuje délku záhlaví Resvd – rezerva pro další příznakové bity
Teoretická část
16
Flags – příznakové bity Window size – velikost zprávy, kterou odeslat bez potvrzení Checksum – kontrolní součet TCP segmentu Urgent pointer – poslední Byte urgentních dat Options – volitelné položky, např. maximální velikost segmentu Mezi příznakové bity patří URG (ukazatel naléhavých dat), ACK (potvrzení), PSH, RST (žádost o opětovné navázání spojení), SYN (žádost o navázání spojení), FIN (žádost o ukončení spojení). (Charles Clancy, 2009) Komunikace vždy probíhá ve třech krocích – navázání spojení, přenos dat a ukončení spojení. Navázání spojení probíhá také ve třech krocích. Odesílatel nejdříve odešle SYN segment, který druhá strana přijme a odešle segment s potvrzením o přijetí (ACK) a žádostí o navázání spojení (SYN). Následně odesílatel pošle potvrzení o přijetí tohoto segmentu a tím je spojení navázáno. Poté, co skončí přenos dat, pošle jedna strana FIN segment, kterým žádá o ukončení spojení. Druhá strana pošle potvrzení o přijetí tohoto segmentu a následně pošle také FIN segment. Poté, co první strana pošle potvrzení o přijetí tohoto segmentu, je spojení ukončeno. (Kristoff, 2000) 3.2.2
Formát dat
Definovaný formát dat souvisí se způsobem jejich odesílání. Pokud budeme data odesílat postupně za sebou bez jakéhokoli oddělení, nastává problém, jak druhá strana rozezná, kde jedna hodnota končí a kde druhá začíná. Tento problém se dá řešit pomocí tzv. fixed-length, který definuje velikost jedné odeslané hodnoty a tím i rozlišení jednotlivých hodnot. Jestliže jsou odesílaná data kratší, než tato velikost, jsou doplněna předem definovanými znaky, např. mezerami u řetězců a nulami u čísel. Pokud se tato situace často opakuje, dochází k plýtvání daty a je vhodné zvolit jiný protokol, který bude více vyhovovat daté komunikaci. (Computer Press, 2009) Dalším způsobem je tzv. variable-length, u kterého má každá hodnota proměnnou délku. Nicméně i u tohoto způsobu musí být definován znak (např. středník, mezera), který bude rozdělovat jednotlivé hodnoty, aby je bylo možno od sebe rozeznat. (Computer Press, 2009) 3.2.3
Protokol mobilních robotů
Komunikační protokol u mobilního robotu musí zajišťovat komunikaci mezi řídicí jednotkou robotu a jeho akční soustavou. Ta zahrnuje senzorickou soustavu a pohonnou jednotku robotu. Pohonná jednotka požaduje od řídicí jednotky příkazy, které poté provede. Řídicí jednotka naopak vyžaduje informace o okolí, které získá od senzorické soustavy. Tato komunikace musí být plynulá, aby nevznikaly prodlevy, kvůli kterým by robot nesprávně pracoval.
Teoretická část
17
3.3 Charakteristika robotu Moje bakalářská práce, je součástí projektu, který vznikl na Provozně ekonomické fakultě Mendelovy univerzity. Cílem tohoto projektu je postavit mobilní robot, který autonomně projede arboretum Mendelovy univerzity a fotograficky ho zdokumentuje. Na projektu pracují jak studenti, tak i vyučující. Do budoucna bychom se chtěli zúčastnit robotických soutěží. 3.3.1
Konstrukce
Robot se skládá z podvozku, který pochází z RC modelu a nosné desky. Podvozek má náhon na všechny čtyři kola, z nichž přední jsou směrová, ovládají se pomocí serva a jsou na nich nainstalovány IRC snímače. Stejnosměrný motor je ovládán přes regulátor otáček Smart Control 20 jako kontinuálně se otáčející servo a je napájen z 7.2V baterie, která je umístěna vespod podvozku. Nosná deska má rozměry 44x31 cm a jsou na ní upevněny „nárazníky“ ze stavebnice tetrix. Ve výsledku má robot rozměry 51x41,5 cm. Na nosné desce se nachází řídicí jednotka robotu, tzn. arduino a mini-notebook EEE PC, které se stará o řízení a vyšší logiku. Dále zde jsou baterie pro napájení IRC a záložní baterie pro EEE. Vepředu na nosné desce je 29 centimetrů vysoká „věžička“ z tetrixu, na které je umístěn kompas a kamery snímající cestu.
Teoretická část
Obr. 5
18
Foto robotu
Zdroj: Aistorm
3.3.2
Arduino – řídicí jednotka
„Arduino je otevřená elektronická platforma, založená na uživatelsky jednoduchém hardware a software.“ Arduino zvládá přijímat data z různých senzorů pomocí vstupních pinů a ovládat motory a další výstupní periferie. Mezi hlavní výhody patří programování mikroprocesoru ATMega328, které je jednoduché díky programovacímu jazyku, který je založen na jazyku Wiring (podobný programovacímu jazyku C). Vše se programuje ve vlastním Arduino vývojovém prostředí. Nízká cena, jednoduché zapojení, spousta návodů a platformní nezávislost jsou další výhody platformy Arduino. Existuje mnoho vývojových desek Arduino, které se liší počtem vstupních, výstupních pinů, mikroprocesorem a dalšími specifickými vlastnostmi. K Arduinu lze pořídit rozšíření na ovládání DC motorů, krokových motorů a serv nazývané „Shield“. (CzechDuino, 2012)
Teoretická část
Obr. 6
19
Arduino Duemiloanove (předchůdce Arduino Uno)
Zdroj: Josef Navrátil
3.3.3
Kompas
Kompas LSM303DLM kombinuje digitální 3D akcelerometr a 3D magnetometr. Tato kombinace je ideální pro kompas s kompenzací náklonu. Tab. 1
Specifikace kompasu
Specifikace LSM303DLM Rozměry 13 × 23 × 3 mm Váha 0,8 g Rozhraní I2C Minimální provozní napětí 2.6 V Maximální provozní napětí 5,5 V Zdroj: Pololu
Metodika
20
4 Metodika V teoretické části jsou obsaženy literární rešerše se všemi podstatnými pojmy a objasněnou problematikou využívanou v praktické části. Na úvod je objasněn pojem robotika a základní rozdělení robotů. Dále se literární rešerše zabývá pohonným subsystémem robotu, popisuje senzorickou soustavu a uvádí příklad řídicí jednotky. Závěr teoretické části je věnován komunikačního protokolu a charakteristice robotu, pro který je protokol vytvářen. Úvod praktické části práce se nejdříve zaměřuje na zvolené prostředky a na parametry komunikace. Podle požadavků od vyššího softwaru jsou stanoveny příkazy, které bude komunikační protokol schopen zajišťovat. Na základě toho je stanoveno, jak bude Arduino (řídicí jednotka) data přijímat, která data bude odesílat zpět a v jakém formátu budou. Další část je věnována implementaci softwaru pro Arduino. To zahrnuje ovládání motorů přes Shield pomocí serv, testování programu pro IRC senzor a kompas. Je zde řešena plynulost softwaru v Arduinu, aby byl robot schopen reagovat v požadovaný čas bez zpoždění. Dále je popsána realizace komunikačního protokolu na straně PC v Javě. Implementace metod na zasílání příkazů, testování komunikace po USB portu a řešení přijímání dat od Arduina. Závěr praktické části popisuje vytvoření programu, pomocí kterého bylo provedeno měření pro statistické vyhodnocení přesnosti jízdy, a byla jím otestována funkčnost protokolu. Nakonec je uvedeno měření, při kterém bylo otestováno přijímání dat.
Vlastní práce
21
5 Vlastní práce V této části práce je popsán postup při realizaci komunikačního protokolu. To zahrnuje stanovení parametrů komunikace, seznámení se Arduinem a jeho programovacím prostředím, implementace programu pro Arduino a programu v Javě. Konec kapitoly je věnován testování protokolu.
5.1
Zvolený přístup, prostředky
Jak už bylo zmíněno, pro ovládání senzorické soustavy a pohonné soustavy bude použito Arduino Uno s Motor/Stepper/Servo Shield KIT v1.0., který slouží jako rozšíření Arduina. Tento Shield byl zvolen pro jednodušší řízení motoru, který se ovládá přes servo. Jak už z označení Shieldu vyplývá, poskytuje nám možnost připojení dvou serv, čtyř DC motorů a dvou krokových motorů. Komunikace s EEE PC bude probíhat přes sériovou linku (COM), Arduino je připojeno přes USB port. Tab. 2
Specifikace Arduino Uno
Arduino Uno Mikroprocesor Provozní napětí Doporučené vstupní napětí Maximální rozmezí vstupního napětí Digitální V/V Piny Analogové vstupní piny DC proud na V/V Pin DC proud na 3.3 V Pin Flash paměť SRAM EEPROM Taktovací frekvence
ATmega328 5v 7–12 V 6–20 V 14 6 40 mA 50 mA 32 KB (ATmega328) 2 KB (ATmega328) 1 KB (ATmega328) 16 MHz
Zdroj: Arduino – ArduinoBoardUno
Arduino Uno může být napájeno přes USB port nebo z externího zdroje napájení. Pro kontrolu komunikace po USB portu jsou na desce dvě LED označené jako RX a TX. RX se rozsvítí, pokud jsou data přijímána přes USB port a TX se rozsvítí při odesílání dat. Jakýkoli z digitálních vstupů může být použit jako vstup nebo výstup pomocí speciálních funkcí. Na desce je tlačítko RESET, které lze použít pro restart nahraného programu. Struktura programu programovacího jazyka Arduino se skládá z: Deklarace proměnných a funkcí, které budeme používat.
Vlastní práce
22
Funkce setup(). Tato funkce se provede pouze jednou po nahrání programu do Arduina, nacházejí se zde inicializace proměnných a nastavení pinů na vstup/výstup atd. Funkce loop(), která se spustí po funkci setup(), zde je hlavní program. Tato funkce probíhá v nekonečné smyčce, dokud Arduino nerestartujeme pomocí tlačítka RESET nebo neodpojíme od zdroje napětí.
5.2 Stanovení parametrů komunikace Aby byl robot schopen se pohybovat po určité dráze, musí dostávat příkazy o nastavení rychlosti motoru a natočení kol. Proto bylo stanoveno, že vyšší software bude mít k dispozici dvě metody setSpeed() a setDirection(), které budou implementovány v Javě. Metoda setSpeed() bude nastavovat rychlost motoru a jako parametr bude dostávat hodnotu 0–100, což znamená 0 až 100 % rychlosti. Rozdělení jízdy dopředu a dozadu je řešeno pomocí zadání kladného (jízda vpřed) nebo záporného (jízda vzad) parametru. Parametr 100 tedy určuje jízdu dopředu maximální rychlostí a parametr -100 jízdu vzad maximální rychlostí. Metoda setDirection() bude určovat natočení kol robotu a parametrem této metody bude počet stupňů, o které se kola natočí. Rozlišení zatočení doleva nebo doprava je opět řešeno pomocí kladného či záporného parametru. Kladný parametr zajistí natočení kol doprava a záporný doleva. Nejjednodušší způsob komunikace s Arduinem po USB portu je posílat zprávy o maximální délce jeden Byte. Tento způsob komunikace byl zvolen, z důvodu, že Arduino je schopné přijímat naráz jen jeden Byte a složitější komunikace by vyžadovala bufferování. To by zbytečně zpomalovalo běh programu a IRC senzory by mohly podávat nepřesné informace. Rozmezí posílaných hodnot bude tedy 0 až 255. Proto budou hodnoty 0–99 určeny pro metodu setDirection() a 200–250 pro metodu setSpeed(). Toto rozmezí nám plně pokryje dostatečně jemné nastavení natočení kol a rychlosti robotu. Podrobnější řešení těchto metod bude popsáno v kapitole, která je zaměřena na implementaci programu v Javě. Hodnoty 100–199 jsou rezervovány pro rozšiřující metodu setDistance(), která slouží pro nastavení vzdálenosti, kterou má robot ujet. Tato metoda byla implementována pouze pro otestování komunikačního protokolu a kvůli měření přesnosti jízdy robotu, protože podle požadavků vyššího software je pro robot nadbytečná. Podrobnější informace budou v kapitole testování. Tímto byla vyřešena komunikace zajišťující řízení motoru a natočení kol. Vyšší software však požaduje i informace od senzorické soustavy a informace o aktuálním stavu robotu. Tyto informace získá Arduino, které se stará o senzorickou soustavu. Celkem bude posílat pět parametrů, z toho tři budou od senzorické soustavy a zbylé dva budou informace o aktuálním natočení kol a nastavení rychlosti motoru. Informace od senzorické soustavy zahrnují data od kompasu a data od dvou inkrementálních senzorů (senzory jsou na předních
Vlastní práce
23
kolech). Aby bylo zajištěno, že Arduino pošle informace ve správný čas, je pro tuto komunikaci zarezervována hodnota 251. V okamžiku, kdy Arduino přijme po sériovém portu tuto hodnotu, pošle nazpět všechny informace.
5.3 Implementace softwaru pro Arduino 5.3.1
Ovládání serv
Zpočátku bylo nutno naučit se ovládat serva, pomocí kterých je řízen motor a zatáčení kol. Zapojení serv bylo jednoduché díky Shieldu, který má nachystané piny pro dvě serva (2x zem, +5V a řídicí signál), což je dostačující, protože je potřeba zapojit jedno servo pro řízení motoru a druhé pro zatáčení. Zapojení lze vidět na ilustračním obrázku.
Obr. 7
Ilustrační obrázek – zapojení serva na Shield
Zdroj: ElecFreaks
Pro otestování bylo nejdříve použito obyčejné modelářské servo, na kterém se vyzkoušely předpřipravené programy pro základní pohyb serv a poté již byly zapojeny serva z robotu. První, které řídí motor a funguje jako kontinuálně otáčející se servo a druhé, jenž zajišťuje natočení kol. První testování odhalilo, že pro ovládání těchto serv je funkce write() z knihovny Servo.h nevyhovující. Tato funkce dostává jako parametr úhel natočení serva a u serva ovládající motor na-
Vlastní práce
24
stavuje tento parametr směr a rychlost otáček. Tento parametr může nabývat jen hodnot 0 až 180, což neposkytuje dostatečně jemné ovládání serv. Z tohoto důvodu byla použita funkce writeMicroseconds(), která jako parametr dostává šířku PWM signálu v mikrosekundách. Pomocí této funkce se již daly serva ovládat s požadovanou přesností. Po seznámení s potřebnými funkcemi jsem naprogramoval jednoduchý program, který měl otestovat jízdu robotu po učebně. Program se skládal z jednoduchých příkazů, které nastavovali rychlost motoru a natočení kol. Mezi nimi bylo časové zpoždění, které zajišťovala funkce delay(ms), jenž pozastaví program na daný počet milisekund. Při tomto testování se občas stávalo, že robot přestal vykonávat program a motor se rozjel naplno. Chyba byla způsobena regulátorem otáček Smart Control 20, který nepracoval, jak měl. Vyřešení tohoto problému vyžadovalo nastavit přepínač regulátoru na pozici „OFF“. Poté se již tyto anomálie nevyskytovaly. 5.3.2
Testování programu pro IRC senzory
Testovací program pro IRC senzory (příloha A) mi poskytl kolega, který se mnou spolupracuje na stejném projektu. Každý IRC senzor je k Arduinu připojen na jeden digitální pin a jeden pin zem. Společný mají pin pro napájení +5V. Na začátku programu je deklarace potřebných proměnných. Ve funkci setup() se nachází inicializace digitálních pinů jako vstup a nastavení počáteční hodnoty pro každé IRC, podle toho jestli se jedná o neprůhlednou, či průhlednou rysku. Ve funkci loop() se v každé smyčce testuje první IRC, poté druhé IRC a nakonec se hodnoty se ukládají do proměnných a vypisují pomocí příkazu Serial.println(). Podrobnějšímu popisu se bude věnovat další kapitola. Při testování se řešila chyba pomalého běhu programu. Program nestíhal číst dostatečně rychle z digitálních pinů a výsledky byly nepřesné. Po jednom otočení kola, by měly proměnné ukazovat hodnotu cca 100 (počet neprůhledných rysek u IRC senzoru), ale hodnota dosahovala průměrně 50. Tento problém způsoboval výpis hodnot na sériový port. Funkce println() zabírala příliš mnoho času mikroprocesoru, který nestíhal číst stavy z digitálních pinů. Pro řešení tohoto problému bylo nutno zamezit výpisu hodnot v každé smyčce funkce loop(). Pokud byly hodnoty vypisovány jen každou vteřinu, mikroprocesor se nezahlcoval a IRC senzory poskytovaly přesné hodnoty. Proměnné pocet_otoceni_IRC1 a pocet_otoceni_IRC2 slouží k ukládání počtu dílků, o které se otočí kolo. Po jednom otočení kola se do těchto proměnných uloží hodnota cca 100 a kvůli tomu vznikl problém s vhodně zvoleným datovým typem. Datový typ Integer má v programovacím jazyku Arduino velikost 16 bitů (rozsah hodnot -32 768 až 32 767) a proto by mohlo nastat, že proměnná přeteče. Z tohoto důvodu byl zvolen datový typ unsigned long, který má velikost 32 bitů (rozsah 0 až 4 294 967 295) a poskytne tak dostatečnou rezervu. Pro přetečení této proměnné by se kolo muselo otočit cca 42 949 673 krát. To by při obvodu kola 40 cm, odpovídalo vzdálenosti cca 17 179 869 m a to je více než dostačující.
Vlastní práce
5.3.3
25
Testování kompasu
Pro práci s kompasem LSM303DLM je potřeba naimportovat knihovnu LSM303.h, která je volně dostupná ke stažení na stránkách výrobce Pololu a knihovnu Wire.h, která umožňuje komunikovat přes sběrnici I²C. Zapojení kompasu lze vidět na obrázku.
Obr. 8
Zapojení kompasu
Zdroj: DFRobot
V knihovně LSM303.h už jsou předem připravené programy pro základní ovládání kompasu a jeho kalibraci. Nejdříve je potřeba zjistit a nastavit kalibrační hodnoty kompasu a poté již můžeme kompas testovat. Na začátku programu, který lze vidět na obrázku 9, je deklarace proměnné compas. Ve funkci setup() je příkaz Serial.begin(9600), který otevře sériový port a nastaví komunikační rychlost pro přenos dat na 9600 bitů za sekundu. Příkaz Wire.begin(), který inicializuje knihovnu Wire.h a připojí sběrnici I²C jako „master“ pokud jinak neurčíme. Funkce init() inicializuje knihovnu kompasu a funkce enableDefault() zapne akcelerometr a magnetometr ve standartním nastavení. Další příkazy nastavují kalibrační hodnoty kompasu. V hlavní funkci loop() je volána funkce read(), která přečte a uloží hodnoty od akcelerometru a magnetometru. Následující příkazy zajistí uložení hodnoty z kompasu, která je ve stupních a její odeslání na sériový port. S testováním programem nebyly žádné problémy a kompas poskytoval dostatečně přesné data.
Vlastní práce
Obr. 9
26
Testovací program kompasu
Zdroj: GitHub
5.3.4
Komunikační protokol – software pro Arduino
Po seznámení se se všemi potřebných perifériemi a jejich otestování bylo možno začít programovat software pro Arduino. V programu nebylo možné používat funkci delay(), která byla použita při testování serv. Tato funkce by způsobila, že by Arduino nebylo schopno přijímat data po sériovém portu v reálném čase. Proto byla využita funkce millis(), pomocí které bylo vytvořeno časové zpoždění, jenž nepozastavuje celý běh programu, jen kontroluje, zda již uběhl daný časový interval. Pro využití všech periférií je tedy potřeba naimportovat tři knihovny. Servo.h pro ovládání serv, Wire.h pro komunikaci po sběrnici I²C a LSM303.h pro práci s kompasem. Nyní budou popsány všechny použité proměnné níže v tabulce č. 3. První tři proměnné jsou vytvořeny pro řízení kompasu (compass) a serv (wheel, motor). Proměnná incomingByte slouží pro ukládání hodnoty, kterou Arduino přijme přes sériový port. Proměnná initial_impuls je použita pro spuštění jednorázového počátečního impulsu motoru, který bude zmíněn dále. Proměnné direction_print a speed_print slouží jako pomocná proměnná pro uložení příchozích hodnot (příkazů). Tyto proměnné jsou odesílány zpět a informují vyšší software o aktuálním natočení kol a nastavení rychlosti motoru. Jako parametr funkcí, které nastavují rychlost motoru a natočení kol jsou použity proměnné speed_motor a direction_wheel. V proměnné initial_speed je uložena hodnota nejnižší rychlosti vpřed. Pro volbu digitálních pinů IRC senzorů jsou určeny proměnné IRC1_port a IRC2_port. Proměnné number_of_turns_IRC1
Vlastní práce
27
a number_of_turns_IRC2 slouží k ukládání počtu dílků, o které se otočí kolo. Počáteční hodnota přečtená z digitálních pinů IRC senzorů je uložena do proměnné line_IRC1 a line_IRC2. Proměnné previousMillis, interval, previprevious_impuls a interval_impuls slouží pro časové zpoždění. Tab. 3
Seznam proměnných a jejich datových typů
Datový typ LSM303 Servo Servo int boolean int int int int int int int unsigned long unsigned long boolean boolean long long long long
Seznam proměnných Název proměnné compass wheel motor incomingByte initial_impuls direction_print speed_print speed_motor direction_wheel initial_speed IRC1_port IRC2_port number_of_turns_IRC1 number_of_turns_IRC2 line_IRC1 line_IRC2 previousMillis interval previous_impuls interval_impuls
Zdroj: Vlastní zpracování
Ve funkci setup() proběhnou všechny nezbytné inicializace. Pomocí metody pinMode() se nakonfigurují digitální piny IRC senzorů jako vstupní, ze kterých je poté přečtena hodnota, která je uložena do proměnných line_IRC1 a line_IRC2. Dále se přes funkci attach() připojí Servo proměnné wheel a motor k příslušným pinům. Následně jsou nastaveny výchozí hodnoty pro serva, aby motor stál a kola byla rovně. Nakonec proběhne inicializace kompasu, zapnutí akcelerometru a magnetometru a nastavení kalibračních hodnot kompasu. Funkce loop() by se dala rozdělit na tři základní bloky – měření IRC senzorů, přijímání dat po sériovém portu a impulsy motoru. Část kódu s IRC senzory je založen na rozhodovací operaci if–else. Pokud byl předchozí stav přečtený z digitálního pinu false (neprůhledná ryska) a aktuální stav je true (průhledná), proměnná number_of_turns_IRC1 se inkrementuje a do line_IRC1 se uloží aktuální stav. Mohou nastat i opačné stavy, v tom případě se proměnná
Vlastní práce
28
number_of_turns_IRC1 opět inkrementuje a do line_IRC1 se uloží opačný stav, než v předchozím případě. Stejným způsobem je provedeno testování pro IRC druhého kola.
Obr. 10
Časové zpoždění bez funkce delay()
Zdroj: Vlastní zpracování
Další část zajišťuje přijetí dat ze sériového portu a příslušné chování akčních členů. Aby nebyl mikroprocesor zbytečně vytěžován, je celá část kódu obalena do bloku, který obstará vykonání kódu jen po určitém časovém intervalu. Jak lze vidět na obrázku č. 10, do proměnné currentMillis se uloží počet milisekund od startu programu, který vrací funkce millis(). Následně je testováno, jestli rozdíl mezi currentMillis (aktuální čas) a previousMillis (předchozí čas, po startu programu je hodnota 0) přesáhl námi stanovenou proměnnou interval, jenž určuje, po jakém časovém intervalu bude blok příkazů proveden. Pokud je rozdíl větší, uloží se aktuální čas do previousMillis a dále proběhne kód v tomto bloku. Tento blok obsahuje kontrolu, jestli přichází data ze sériového portu. Příchozí data jsou uložena do proměnné incomingByte. Jak bylo zmíněno v kapitole stanovení parametrů, příchozí data se budou dělit do tří skupin 0–99 (natočení kol), 200–250 (nastavení rychlosti motoru) a 251 (příkaz, aby Arduino poslalo všechny informace o robotu). Pokud je tedy příchozí hodnota menší než 100, je proveden kód zajišťující natočení kol, podle příchozí hodnoty. Hodnota menší než 50 je určena pro natočení kol doprava a hodnota 50–99 pro natočení kol doleva. Tato hodnota je ve stupních, a proto je nutné přepočítání na odpovídající hodnotu PWM signálu. Hodnota v rozmezí 200–250 je zpracována pro nastavení rychlosti motoru. 200–225 je určena pro jízdu vpřed a 226–250 je určeno pro jízdu vzad. Opět jsou nutné přepočty na PWM signál. Na konci funkce loop() jsou dva bloky kódu, které zajišťují počáteční a v intervalu opakovaný impuls motoru. Tento impuls je natolik slabý, že se kola robotu ani nepohnou, ale je nutný z důvodu zasekávání motoru, jenž přestal reagovat vždy po 60 sekundách nečinnosti od posledního příkazu. Proto byl pro impuls motoru zvolen časový interval 50 sekund. Chyba byla v regulátoru otáček Smart Control 20, který musí dostávat „synchronizační“ impulsy. Podobné řešení lze pozorovat u RC modelů. Pokud RC model stojí na místě, motor vydá po určitém okamžiku zvuk, jakoby se chtěl rozjet.
Vlastní práce
29
5.4 Zapouzdření komunikačního protokolu do Java knihovny Pro otestování komunikace po sériovém portu jsem vyhledal stejnojmenné téma na fóru Arduino.cc. Zde jsem nalezl program, který splňoval požadované nároky (program dostupný z http://arduino.cc/forum/index.php?topic=38389.0). Pro jeho spuštění je nutné používat knihovnu RXTXcomm.jar a do složky projektu vložit soubor rxtxSerial.dll. Po přidání nezbytného zpoždění při čtení dat z Arduina byl program funkční. Dalším bodem bylo upravit tento program, aby odpovídal stanovené komunikaci a měl metody požadované od vyššího softwaru. Důležité bylo změnit datový typ odesílaných dat ze String na Integer, protože tato data nebudou řetězce, ale čísla. Dále bylo nutno přepsat příkazy z metody main() do konstruktoru třídy, aby se tyto příkazy provedly současně s vytvořením instance třídy. Poté byla pozměněna metoda run(), způsob přijímání dat a v neposlední řadě bylo vytvořeno zapouzdření. Třída implementuje rozhraní Runnable a SerialPortEventListener. Konstruktor třídy zajistí otevření sériové komunikace, nastavení potřebných parametrů a spustí vlákno pro čtení dat. Metody setSpeed() a setDirection() převedou zadané parametry na stanovené parametry komunikace a uloží je. Metoda initwritetoport() inicializuje výstupní stream, abychom mohli odesílat data. Metodě run() v cyklu kontroluje, jestli jsou připravená data k odeslání a pokud ano, zajistí jejich odeslání pomocí metody writetoport(). Tato metoda odešle data nastavená metodou setMessageInt(int message). Metoda getInfo() pošle Arduinu požadavek na odeslání informací o robotu a počká, než metoda serialEvent(SerialPortEvent event) zajistí přijetí těchto dat. Poté metoda getInfo() rozparsuje StringBuffer, do kterého byly uloženy přijatá data a uloží je do pole integerů, které vrátí. Přijímání dat bylo nejdříve řešeno přes ukládání do pole, které příslušná metoda vrátila, ale toto řešení nebylo efektivní, protože vyžadovalo příliš velké časové zpoždění. Proto byl zvolen způsob ukládání do StringBufferu, který je méně časově náročný.
5.5 Testovací jízdy Protože bylo potřeba naměřit data pro aplikaci Ackermanova řízení na mobilním robotu, musel být program přizpůsoben jízdě na určitou vzdálenost. Přesto tyto jízdy posloužili jako ověření funkčnosti naprogramovaného komunikačního protokolu. Pro tyto potřeby byla v Javě doimplementována metoda setDistance(), pomocí které se odesílaly data o vzdálenosti, jenž měl robot ujet. Arduino program byl také mírně pozměněn, aby zajistil jízdu na vzdálenost. Musely být také provedeny testovací jízdy na jeden metr, aby byla zjištěna hodnota z IRC senzorů
Vlastní práce
30
odpovídající této vzdálenosti. Pro usnadnění odesílání dat, bylo vytvořeno jednoduché grafické okno pro zadávání parametrů. Okno lze vidět na obrázku č. 11.
Obr. 11
Grafické okno pro zadávání parametrů
Zdroj: Vlastní zpracování
Bylo odměřeno celkem 250 měření vždy na vzdálenost jeden metr. Měřila se jízda rovně, maximální úhel natočení kol doleva a doprava a poloviční úhel natočení kol doleva a doprava. Při těchto měřeních pracoval komunikační protokol podle požadavků a robot vykonával zadané příkazy s mírnou odchylkou. Ta byla nejspíše zapříčiněna konstrukcí podvozku. Kola mají určitou vůli, která je způsobena opotřebením podvozku. Druhé měření testovalo sběr dat ze senzorů robotu. Požadavkem bylo v intervalu jedné sekundy odesílat data z kompasu a IRC senzorů, které se logovaly do textového souboru. Ovládání robotu bylo realizováno přes řídicí jednotku (kostka) NXT, gamepad a modul pro řízení serv. Měření probíhalo v pořádku až do chvíle, kdy zklamala konstrukce jednoho z IRC senzorů, který se porouchal. Data naměřená do této chvíle byla v pořádku.
Diskuse, návrhy a doporučení
31
6 Diskuse, návrhy a doporučení Hlavním cílem bakalářská práce je návrh a realizace komunikačního protokolu pro mobilní robot, který zajistí sběr dat ze senzorické soustavy a příslušné chování akčních členů Začátek vlastní práce spočíval v seznámení se se zvolenou řídicí jednotkou Arduino Uno a strukturou programu v Arduino programovacím prostředí. Následně bylo provedeno stanovení parametrů komunikace. To zahrnovalo definování metod setSpeed() a setDistance(), které obstarávají nastavení rychlosti motoru a natočení kol robotu. Po definování těchto metod byl stanoven jednobytový způsob komunikace mezi Arduinem a PC. Tento způsob povoluje posílání hodnot jen v rozmezí 0–255 (velikost jednoho Bytu) a proto bylo určeno, že hodnoty 0–99 budou rezervovány pro metodu setSpeed(), hodnoty 200– 250 pro metodu setDistance() a hodnota 251 bude signalizovat požadavek o odeslání informací o robotu. Tyto informace zahrnují data ze senzorické soustavy a informace o aktuálním stavu robotu. Další kapitola byla věnována testování senzorické a pohonné soustavy. Pro ovládání serv bylo zvoleno řízení pomocí PWM signálu, přes který lze serva ovládat s požadovanou přesností. Při testování byla zjištěna a následně vyřešena chyba motoru, který chvílemi nevykonával zadané příkazy. Příčinou byl regulátor otáček Smart Control 20. Testování programu pro IRC senzory odhalilo, že odesílání hodnot na sériový port v každé smyčce zabírá příliš mnoho času mikroprocesoru. Následkem toho bylo, že IRC senzory podávaly nepřesné informace. Aby nebyl mikroprocesor tolik zatěžován, bylo zajištěno odesílání hodnot v určitém časovém intervalu (jedna vteřina). Poté již byly hodnoty z IRC senzorů dostatečně přesné. Testování kompasu proběhlo úspěšně a nenastaly žádné problémy. Po otestování všech periférií byl implementován software pro Arduino. Bylo nutno nepoužívat funkci delay(), která by znemožnila Arduinu reagovat v požadovaný čas. Jedinou výjimkou bylo použití této funkce v bloku kódu, jenž zamezoval chybě, při které motor přestal reagovat na příkazy. Bylo zvoleno zpoždění jen 50 milisekund, aby nezpomalovalo běh programu. Pro vytvoření softwaru v Javě byl vyhledán program, kterým byla otestována komunikace po sériovém portu s Arduinem. Po odstranění chyby v přijímání dat byly doimplementovány metody setSpeed() a setDistance() požadované vyšším softwarem a byly provedeny další úpravy, aby program zajišťoval požadované funkce. To mimo jiné zahrnovalo implementaci metody pro přijímání dat z Arduina. Nakonec vlastní práce proběhly dvě testování. Při prvním bylo provedeno 250 měření jízdy na jeden metr, které ověřilo funkčnost při zasílání příkazů pohonné soustavě robotu a druhé otestovalo přijímání dat ze senzorů. Vytvořený komunikační protokol, zajišťuje požadované funkce a testování ověřilo, že pracuje správně. Jako rozšíření by bylo možné použít složitější 16bitovou komunikaci nebo přidání zmiňované metody setDistance().
Závěr
32
7 Závěr Cílem této bakalářské práce bylo navrhnout a realizovat komunikační protokol mezi robotem a jeho senzorickou a pohonnou soustavou. Protokol byl vytvořen, tedy cíl bakalářské práce byl splněn. Vypracování bakalářské práce zahrnovalo objasnění pojmů, jež jsou s tímto tématem spojeny a které byly využity v praktické části. Ta zahrnovala seznámení se s Arduinem, které je řídicí jednotkou robotu a jeho programovacím prostředím. Další kapitola byla zaměřena na stanovení parametrů a způsobu komunikace. Poté bylo testováno ovládání serv, IRC senzorů a kompasu. Při testování serv byly řešeny problémy s regulátorem otáček Smart Control 20, který způsoboval nežádoucí chování motoru. Tento problém i nepřesnost IRC senzorů byly vyřešeny a proto bylo možné splnit část cíle bakalářské práce – implementaci softwaru pro Arduino. Dále byla práce zaměřena na splnění další části, jenž zahrnovala vytvoření softwaru v Javě, který bude zajišťovat komunikaci s Arduinem a vyššímu softwaru poskytne metody na nastavení rychlosti motoru a natočení kol robotu. Závěr vlastní práce byl věnován testování vytvořeného protokolu. Z výsledků provedených testování lze usoudit, že je vytvořený komunikační protokol funkční, to znamená, že zajišťuje požadované chování pohonné soustavy a sběr dat ze senzorické soustavy.
Seznam literatury a zdrojů
33
8 Seznam literatury a zdrojů BEZDÍČEK, MILAN A ROBERT GREPL. Mechatronika: vybrané problémy. Brno: Tribun, 2008, 148 s. ISBN 978-80-214-3804-0. MCKERROW,P. Introduction to robotics. Sydney 1991; Reading, Mass.: Addison-Wesley Pub. Co. ISBN 0201182408 9780201182408 NOVÁK, PETR. Mobilní roboty: pohony, senzory, řízení. Praha: BEN – technická literatura, 2005, 243 s. ISBN 80-7300-141-1. Internetové zdroje: AISTORM. Dokumentace/2012-10-23 – AiStorm. Aistorm [online]. 2012 [cit. 2013-05-08]. Dostupné z: http://aistorm.mendelu.cz/trac/wiki/dokumentace/2012-10-23 ARDUINO. ArduinoBoardUno. Arduino.cc [online]. 2013 [cit. 2013-05-08]. Dostupné z: http://arduino.cc/en/Main/ArduinoBoardUno ARDUINO. ServoWriteMicroseconds. Arduino.cc [online]. 2009 [cit. 2013-0502]. Dostupné z: http://arduino.cc/en/Reference/ServoWriteMicroseconds BRITANNICA. Protocol (computer science). Encyclopedia Britannica [online]. ©2013 [cit. 2013-04-22]. Dostupné z: http://www.britannica.com/EBchecked/topic/410357/protocol COMPUTER PRESS. Protokol. Živě.cz: Principy programování [online]. 2009 [cit. 2013-05-05]. Dostupné z: http://principyprogramovani.blog.zive.cz/2009/10/protokol/ CZECHDUINO. Co je to Arduino. CzechDuino [online]. 2012 [cit. 2013-05-02]. Dostupné z: http://www.czechduino.cz/?co-je-to-arduino,29 DFROBOT. LSM303 Tilt Compensated Compass. DFRobot [online]. 2012 [cit. 2013-05-08]. Dostupné z: http://www.dfrobot.com/wiki/index.php/LSM303_Tilt_Compensated_Co mpass%28SEN0079%29 ELECFREAKS. Arduino Motor/Stepper/Servo Shield. ElecFreaks – Wiki [online]. 2012 [cit. 2013-05-08]. Dostupné z: http://www.elecfreaks.com/wiki/index.php?title=Arduino_Motor/Stepper /Servo_Shield GITHUB. Pololu/LSM303. GitHub [online]. © 2013 [cit. 2013-05-09]. Dostupné z: https://github.com/pololu/LSM303/blob/master/LSM303/examples/Hea ding/Heading.ino CHARLES CLANCY. Communication Networks. ENEE 426 [online]. 2009 [cit. 2013-05-16]. Dostupné z: http://www.cs.umd.edu/~clancy/enee426/
Seznam literatury a zdrojů
34
JOSEF NAVRÁTIL. Arduino Duemilanove. Lego & Modely Josef Navrátil [online]. 2010 [cit. 2013-05-08]. Dostupné z: http://www.josefnav.cz/Arduino.html KRISTOFF, JOHN. The Transmission Control Protocol. DePaul [online]. 2000 [cit. 2013-05-16]. Dostupné z: http://condor.depaul.edu/jkristof/technotes/tcp.html NATIONAL AIR AND SPACE MUSEUM. Exploring The Planets – Tools of Exploration – Rovers. National Air and Space Museum [online]. ©2002 [cit. 2013-0508]. Dostupné z: http://airandspace.si.edu/etp/tools/tools_rover.html POLOLU. LSM303DLM 3D Compass and Accelerometer Carrier with Voltage Regulators. Pololu Robotics and Electronics [online]. © 2001–2013 [cit. 2013-05-03]. Dostupné z: http://www.pololu.com/catalog/product/1273 RCTEK. The Ackerman Steering Principle. RcTek [online]. © 2001, 2009 [cit. 2013-04-29]. Dostupné z: http://www.rctek.com/technical/handling/ackerman_steering_principle.h tml SERVOCITY. How do servos work?. ServoCity [online]. 1999–2013 [cit. 2013-0508]. Dostupné z: http://www.servocity.com/html/how_do_servos_work_.html
Seznam tabulek
35
9 Seznam tabulek Tab. 1 Tab. 2 Tab. 3
Specifikace kompasu ...................................................................................... 19 Specifikace Arduino Uno................................................................................ 21 Seznam proměnných a jejich datových typů .................................................. 27
Seznam obrázků
36
10 Seznam obrázků Obr. 1 Obr. 2 Obr. 3 Obr. 4 Obr. 5 Obr. 6 Obr. 7 Obr. 8 Obr. 9 Obr. 10 Obr. 11
Šestikolový mobilní robot Sojourner .............................................................. 11 Šířka pulsu ...................................................................................................... 13 Příklad nastavení serv v Arduino .................................................................... 13 Formát segmentu protokolu TCP .................................................................... 15 Foto robotu ...................................................................................................... 18 Arduino Duemiloanove (předchůdce Arduino Uno) ...................................... 19 Ilustrační obrázek – zapojení serva na Shield ................................................. 23 Zapojení kompasu ........................................................................................... 25 Testovací program kompasu ........................................................................... 26 Časové zpoždění bez funkce delay() .............................................................. 28 Grafické okno pro zadávání parametrů ........................................................... 30
Seznam použitých zkratek
11 Seznam použitých zkratek IRC
Inkrementální rotační snímač
37
Přílohy
38
Přílohy
Přílohy
A Program pro IRC senzory 1. int IRC1_port = 2; 2. int IRC2_port = 7; 3. int pocet_otoceni_IRC1 = 0; 4. int pocet_otoceni_IRC2 = 0; 5. boolean cara_IRC1; 6. boolean cara_IRC2; 7. void setup(){ 8. Serial.begin(9600); 9. pinMode(IRC1_port, INPUT); 10. pinMode(IRC2_port, INPUT); 11. 12. if(digitalRead(IRC1_port) == 1){ 13. cara_IRC1 = true; 14. }else{ 15. cara_IRC1 = false; 16. } 17. 18. if(digitalRead(IRC2_port) == 1){ 19. cara_IRC2 = true; 20. }else{ 21. cara_IRC2 = false; 22. } 23. } 24. 25. 26. void loop(){ 27. if(digitalRead(IRC1_port) == 1 && cara_IRC1 == false){ 28. pocet_otoceni_IRC1++; 29. cara_IRC1 = true; 30. }else if (digitalRead(IRC1_port) == 0 && cara_IRC1 == true){ 31. pocet_otoceni_IRC1++; 32. cara_IRC1 = false; 33. } 34. if(digitalRead(IRC2_port) == 1 && cara_IRC2 == false){ 35. pocet_otoceni_IRC2++; 36. cara_IRC2 = true; 37. }else if (digitalRead(IRC2_port) == 0 && cara_IRC2 == true){ 38. pocet_otoceni_IRC2++;
39
Přílohy
39. 40. 41. 42. 43. 44. 45. 46. 47.
40
cara_IRC2 = false; } Serial.print("IRC1:"); Serial.println(pocet_otoceni_IRC1); Serial.print("IRC2:"); Serial.println(pocet_otoceni_IRC2); }