Mendelova univerzita v Brně Provozně ekonomická fakulta
Identifikační modul polohy pro řídicí jednotku robota NXT Bakalářská práce
Vedoucí práce: Dr. Ing. Radovan Kukla
Adam Svoboda
Brno 2012
Rád bych poděkoval vedoucímu bakalářské práce, panu Dr. Ing. Radovanu Kuklovi a Bc. Marcelovi Vytečkovi, za jejich rady a za čas, který mi věnovali.
Prohlašuji, že jsem tuto bakalářskou práci vypracoval samostatně a v seznamu literatury uvedl veškeré informační zdroje, které jsem použil pro její tvorbu. V Brně dne 25. května 2012
__________________
Abstract Svoboda, A. Identification module of position for control unit of NXT robot. Bachelor thesis. Brno: Mendel university, 2012. This bachelor thesis deals with the issue of design and construction of identification module of position for NXT robot control unit. Theoretical part contains of information about used hardware and integrated development environment. Practical part contains construction design of module and program design used for module. Designed module is used for purpose of control for robot of Lego Mindstorms system. Keywords Arduino, NXT, Mindstorm, position.
Abstrakt Svoboda, A. Identifikační modul polohy pro řídicí jednotku robota NXT. Bakalářská práce. Brno: Mendelova univerzita, 2012. Bakalářská práce se zabývá návrhem a konstrukcí identifikačního modulu polohy pro řídicí jednotku robota NXT. V teoretické části obsahuje informace o použitém hardwaru a použitém vývojovém prostředí. Praktická část obsahuje návrh konstrukce modulu a návrh programu použitého pro modul. Navrhovaný modul je použit v aplikaci řízení robota systému Lego Mindstorm. Klíčová slova Arduino, NXT, Mindstorm, poloha.
Obsah
5
Obsah 1
2
Úvod a cíl práce
8
1.1
Úvod .......................................................................................................... 8
1.2
Cíl práce .................................................................................................... 8
Teoretická část
9
2.1
Systém Arduino ........................................................................................ 9
2.2
Modely hardwaru systému Arduino ......................................................... 9
2.3
Arduino Uno ............................................................................................10
2.3.1
Napájení desky Arduino Uno...........................................................10
2.3.2
Popis vývodů na desce Arduino Uno ...............................................10
2.3.3
Komunikace desky Arduino Uno ..................................................... 11
2.3.4
Mikrokontroler ATmega328 a jeho parametry ............................... 12
2.4
Vývojové prostředí pro systém Arduino .................................................. 12
2.4.1
Popis vývojového prostředí Arduino ............................................... 12
2.4.2
Obsah kořenového adresáře vývojového prostředí Arduino ........... 13
2.4.3
Programovací jazyk ve vývojovém prostředí Arduino ..................... 13
2.4.4
Kompilace a nahrání programu do desky Arduino ......................... 14
2.5
Komunikace I2C ....................................................................................... 14
2.5.1
Protokol sběrnice I2C ....................................................................... 15
2.5.2
Sekvence start, stop a časování sběrnice ......................................... 15
2.6
Stavebnice LEGO Mindstorms NXT ....................................................... 16
2.6.1
Řídicí jednotka NXT ........................................................................ 16
2.6.2
Servomotory stavebnice NXT .......................................................... 17
2.6.3
Možné způsoby programování řídicí jednotky NXT .......................18
2.7
Navigace ...................................................................................................18
2.7.1
Relativní navigace ............................................................................18
2.7.2
Absolutní navigace ...........................................................................18
2.8
Optický snímač v myši ............................................................................. 19
2.8.1
CMOS technologie ........................................................................... 19
Obsah
6
3
Metodika
21
4
Vlastní práce
22
4.1
Konstrukce modulu ................................................................................ 22
4.3
Úlohy modulu ......................................................................................... 25
4.4
Čtení dat a řízení senzoru ....................................................................... 25
4.4.1
Operace zápisu ................................................................................ 26
4.4.2
Operace čtení .................................................................................. 26
4.4.3
Power down mód senzoru ............................................................... 27
4.5
Program v Arduino Uno ......................................................................... 27
4.6
Měření vzdálenosti modulem ................................................................. 28
4.7
Program pro komunikaci v řídicí jednotce LEGO NXT ......................... 30
4.8
Využití modulu v konstrukci mobilního robotu ..................................... 30
4.8.1
Pracovní plocha ................................................................................ 31
4.8.2
Program robotu ............................................................................... 32
5
Diskuze
34
6
Závěr
35
7
Literatura
36
A
Seznam obrázků
39
B
Seznam tabulek
40
C
Schéma desky Arduino Uno Rev 2
41
D
Program v desce Arduino
42
Obsah
7
Seznam zkratek I2C (Inter–Integrated Circuit) – počítačová sériová sběrnice USART (Univercal Synchronous Asynchronous Receiver Transmitter) – zařízení pro asynchronní a synchronní sériovou komunikaci UART (Univercal Asynchronous Receiver Transmitter) – zařízení pro asynchronní sériovou komunikaci SPI (Serial Peripheral Interface) – sériové periferní rozhraní CMOS (Complementary Metal–Oxide Semiconductor) – technologie používaná při výrobě integrovaných obvodů
Orientace v textu Příklad kódu – takto jsou v práci značeny ukázky kódu, funkce, názvy knihoven
Úvod a cíl práce
8
1 Úvod a cíl práce 1.1
Úvod
V dnešní době patří obor robotiky k předním oborům lidské činnosti. Propojení s výrobním, vojenským, lékařským a dalšími odvětvími je stále silnější. Mobilní roboti se uplatňují stále častěji např. ve vojenství jako bezpilotní letouny, v lékařství jako pomocníci při péči o pacienty. Každý mobilní robot by měl mít schopnost vypočítat svou polohu s potřebnou přesností, v prostředí ve kterém se pohybuje. Prostředky, které robot využívá pro svou lokalizaci, by měli odpovídat druhu pracovního prostředí. Pro roboty, kteří se pohybují ve venkovním prostředí, je například vhodné požití navigace pomocí GPS. K zjištění pozice v uzavřeném prostoru se využívají různé druhy senzorů. Výběr senzorů závisí na tom, zda je pracovní prostředí nějak ohraničeno či definováno pomocí referenčních bodů. Pokud je pracovní prostředí neznámé musíme s tímto faktem počítat při výběru senzorů a konstrukci robota. V tom případě by měl robot obsahovat systém pro lokalizaci překážek v blízkosti robota. Také je vhodné si tento prostor mapovat.
1.2 Cíl práce Cílem této práce je navrhnout a zkonstruovat identifikační modul polohy pro řídicí jednotku NXT. Zvolit vhodný hardware a software. Navrhnout aplikaci pro vyhodnocení polohy a přenos informace do řídicího systému NXT. Použít tento modul v konstrukci mobilního robotu a zhodnotit navržené řešení.
Teoretická část
9
2 Teoretická část 2.1 Systém Arduino Systém Arduino je mikrokontrolérový systém zabudovaný na jedné desce plošného spoje. Tvůrci jej označují jako open-source hardware, tedy je možné si vytvořit vlastní obvod založený na systému Arduino. Výpočetní platforma Arduino je založena na osmi bitových mikrokontrolérech Atmel AVR řady ATmega. Systém komunikuje s PC pomocí sériové komunikace, standardně pomocí USB rozhraní. Existuje několik modelů systému Arduino, liší se od sebe použitým mikrokontrolerem a konstrukcí. Dále je možné k systému připojit moduly (nazývající se shield), které jsou s většinou modelů kompatibilní. Tyto moduly rozšiřují možnosti použití např. modul pro připojení do sítě pomocí ethernetu, či modul pro bezdrátové propojení více desek systému Arduino. Systém je vhodný pro použití např. řízení fyzických zařízení (motory), ovládání obrazovek, vyhodnocování dat ze senzorů. Systém Arduino je vhodný pro výuku robotiky, vývojové prostředí je prosté a programovací jazyk je postaven na základech jazyků C/C++ (Arduino, 2012).
2.2 Modely hardwaru systému Arduino Základní model systému Arduino je model Arduino Uno. Používá mikrokontroler Atmel ATmega328. Tento modul je vhodný pro prototypování a použití pro výukové potřeby. Jedná se o kompaktní řešení. Model Arduino Mega 2560 obsahuje mikrokontroler Atmel ATmega2560. Tento model je výkonnější a rozměrově větší než model Arduino Uno. Má více analogových vstupů a digitálních výstupů. Model Arduino ADK vychází z modelu Arduino Mega 2560, je rozšířen o možnost propojení s mobilním zařízením se systémem Android pomocí USB rozhraní. Model Arduino LilyPad obsahuje mikrokontroler ATmega168V nebo ATmega328V. Tento model je zaměřen pro použití v inteligentním textilu. Modely Arduino Pro Mini, Mini a Nano obsahují mikrokontroler ATmega 168 nebo ATmega328. Tyto modely vynikají malými rozměry a nízkou spotřebou energie. Jsou vhodné pro specifické použití (Arduino, 2012).
Teoretická část
Obr. 1
10
Arduino Mini (Arduino, 2012)
2.3 Arduino Uno Jedná se o základní model mikropočítačového systému Arduino. Obsahuje mikrokontroler Atmel ATmega328. Momentálně existují tři revize a typ SMD. Deska má rozměry 68,6 mm × 53,3 mm. Obsahuje 6 analogových vstupů, 14 digitálních vstupně/výstupních vývodů z toho 6 se dá použít jako PWM výstupy (modulace šířkou pulzu). Na desce se ještě nalézá krystal, operující na frekvenci 16 MHz, konektor USB, napájecí konektor, tlačítko reset a ISCP konektor. Od ostatních desek se Arduino Uno odlišuje použitým převodníkem pro komunikaci přes USB. Místo FTDI čipu používá ATmega16U2 (do verze R2 ATmega8U2) (Arduino, 2012). 2.3.1
Napájení desky Arduino Uno
Arduino Uno je napájeno přes USB propojení nebo pomocí externího napájení. Může být napájeno adaptérem nebo baterii. Adaptér je připojen do souosého konektoru s vnitřním průměrem 2,1 mm. Také může být prostřednictvím vývodů Vin a Gnd. Doporučený rozsah napájení je 7–12 V. Pokud je použité menší napětí než 7 V, může dojít k nestabilitě desky. Při použití vyššího napětí než 12 V, by mohlo dojít k přehřátí napěťového regulátoru a ke zničení desky (Oxert, 2008). 2.3.2
Popis vývodů na desce Arduino Uno
Deska obsahuje digitální, analogové, napájecí a speciální vývody (obrázek č. 2). K digitálním a analogovým vývodům jsou připojeny pull-up rezistory, které zajišťují správné úrovně napětí logických úrovní. Na desce se také nalézají LED pro signalizaci funkčnosti desky. Napájecí vývody se nacházejí u nápisu POWER. Pomocí vývodu Vin lze desku napájet, nacházejí se zde dva vývody GND, napájecí vývody na 5 V a 3,3 V.
Teoretická část
11
Vývod RESET slouží k resetování desky, pokud je na něj přivedena logická nula. Vývod AREF slouží k připojení referenčního napájení pro analogové vstupy. U nápisu ANALOG IN se nacházejí analogové vývody označené A0-A5. Slouží nejčastěji k připojení analogových senzorů. Umožňují měřit v rozsahu od 0 až 5 V, rozsah je možné změnit přivedením referenčního napětí na vývod AREF, které by nemělo být menší než 0V a větší než 5V (nastavení zajišťuje funkce analogReference()). Vývody jsou připojeny k 10 bitovému A/D převodníku s 6 kanály. Vstupy A4 a A5 podporují komunikaci prostřednictvím dvou drátové rozhraní nebo I2C rozhraní (zajišťuje knihovna Wire). U nápisu DIGITAL (PWM~) se nalézají digitální vývody označené od 0 po 13. Digitální vývody pracují na 5V a proud, který do vývodu vede, nesmí přesahovat 40 mA. Vývody označené číslem a ~ mohou být použity jako 8 bitové PWM výstupy. Vývody 0 (RX) a 1 (TX) jsou připojeny k ATmega16U2 (ATmega8U2) a slouží pro vysílání a přijímání TTL sériových dat. Vývody 2 a 3 mohou být nastaveny na spuštění přerušení pomocí externího vstupu (funkce attachInterrupt()). Vývody 10-13 je možné použít pro SPI komunikaci (zajišťuje knihovna SPI). K vývodům 1, 2, 13 je připojena LED (Arduino, 2012).
Obr. 2
Arduino Uno (Arduino, 2012)
2.3.3
Komunikace desky Arduino Uno
Mikrokontroler ATmega328 podporuje UART TTL sériovou komunikaci, která je přístupná na digitálních vývodech 0 (RX) a 1 (TX). Tuto komunikaci využívá ATmega16U2 (ATmega8U2) pro převod na USB sériovou komunikaci. Deska
Teoretická část
12
Arduino Uno také podporuje komunikaci prostřednictvím I2C (TWI) a SPI komunikaci (Arduino, 2012). 2.3.4
Mikrokontroler ATmega328 a jeho parametry
Mikrokontroler ATmega328 obsahuje 8 bitový AVR mikroprocesor s instrukční sadou typu RISC. Obsahuje 32 KB ISP flash paměť. Z toho je 0,5 KB použita pro bootloader. Dále paměti SRAM o velikosti 2 KB a EEPROM o velikosti 1 KB. Maximální operační frekvence je 20 Mhz. Má 23 vstupně/výstupních vývodů, 32 pracovních registrů, SPI sériový port, sériový programovatelný USART, dvouvodičové sériové zohraní. Obsahuje 6 kanálový 10 bitový A/D převodník a programovatelný watchdog časovač s vnitřním oscilátorem. Mikrokontroler operuje na napětí mezi 1,8–5,5 V (Atmel, 2012).
2.4 Vývojové prostředí pro systém Arduino Ve vývojovém prostředí se programuje v programovacím jazyce Arduino, který bere základ z projektu Wiring. Jazyk Wiring je založen na syntaxi jazyků C/C++. Vývojové prostředí vychází z prostředí Processing, který je naprogramován v jazyce Java. Umožňuje jednoduché psaní kódu a načtení programu do mikrokontroleru. Prostředí obsahuje funkci pro zvýraznění kódu. Program napsaný a kompilovaný ve vývojovém prostředí pro Arduino se nazývá sketch. Uložené programy mají příponu .ino. Vývojové prostředí podporuje operační systémy Windows, Mac OS X a Linux (Arduino, 2012). 2.4.1
Popis vývojového prostředí Arduino
Vývojové prostředí obsahuje textový editor pro psaní kódu, oblast vypisování zpráv z průběhu kompilace, nahrání programu do paměti a výpis chyb v kódu. Prostředí podporuje funkci highlight pro zvýraznění kódu. Struktury, funkce a definice typů proměnných jsou zvýrazněny hnědou barvou, standardní konstanty barvou modrou. V horní části se vyskytuje několik záložek menu. Záložka File, obsahuje základní příkazy, jako např. vytvoření, uložení, nahrání souboru či nahrání základních a ukázkových programů. V záložce Edit se vyskytují příkazy pro práci s textovým editorem, ve kterém se píše program. V záložce Sketch se nalézají příkazy pro ladění, kompilaci napsaného programu, příkaz pro importování knihoven do programu. Záložka Tools obsahuje příkazy Auto Format pro automatické formátování kódu, příkaz Programmer pro změnu programovacího zařízení. Dále příkaz Board pro výběr modelu desky Arduino, do které se bude program nahrávat. Nastavení na používaný hardware je důležité z důvodů správné komunikace mezi deskou a PC. Pod záložkami menu se nacházejí tlačítka pro rychlé vyvolání příkazů. Na levé straně je tlačítko pro spuštění ladění a kompilace programu. Od něj napravo se nachází tlačítko, které spouští příkaz pro nahrání programu na desku Arduino. Další tři tlačítka slouží k vytvoření, načtení a uložení programu. Tlačítko
Teoretická část
13
na pravé straně okna spouští příkaz Serial Monitor. Tento příkaz otevře dialogové okno, ve kterém se zobrazují data ze sériové komunikace, která jsou vysílána z desky Arduino. Toto okno slouží také pro zaslání dat do desky Arduino (Arduino, 2012).
Obr. 3
Okno vývojového prostředí
2.4.2
Obsah kořenového adresáře vývojového prostředí Arduino
Pro správnou instalaci a použití vývojového prostředí pro Arduino, je nutná základní znalost o kořenovém adresáři vývojového prostředí systému Arduino. Adresář drivers obsahuje drivery pro nainstalování funkčních driverů po připojení desky Arduino k PC. Adresář examples obsahuje funkční výukové programy a ukázku programů, které pracuji se standardními knihovnami systému Arduino. V adresáři hardware se nachází bootloader pro různé modely systémů Arduino, firmware, knihovny AVR. Adresář libraries obsahuje standardní knihovny pro rozšíření funkcionality programů např. knihovny pro řízení servomotorů, krokových motorů, LCD, knihovny pro práci se standardními moduly systému Arduino (Arduino, 2012). 2.4.3
Programovací jazyk ve vývojovém prostředí Arduino
Programy v systému Arduino se dají rozdělit na základní části a to struktury, proměnné a funkce. Syntaxe jazyku vychází z jazyků C/C++. Každý funkční program, musí obsahovat dvě dané struktury. Funkce setup() je volána
Teoretická část
14
v momentě, kdy se program spustí. Tato funkce se provede pouze jednou po připojení napájení Arduino desky nebo po resetu desky. Tato funkce slouží pro inicializaci proměnných, nastavení stavů vývodů desky a inicializaci použitých knihoven. Ve funkci loop() se provádí napsaný kód ve smyčce. Použití obou funkcí je ukázáno v následujícím kódu (Arduino, 2012). void setup() { // nastavení digitálního vývodu 13 jako výstup pinMode(13, OUTPUT); } void loop() { digitalWrite(13, HIGH);//rozsvícení LED delay(1000);// vyčkání jednu sekundu digitalWrite(13, LOW);// zhasnutí LED delay(1000);// vyčkání jednu sekundu } 2.4.4
Kompilace a nahrání programu do desky Arduino
Po spuštění operace ladění a kompilace, prostředí zkontroluje, zda je kód správně napsán v syntaxi C nebo C++. Pokud je program laděn a kompilován tak se přeloží do dočasného adresáře. Pokud je kompilován a nahráván, tak se uloží do applet/ podadresáře. Program je kompilován knihovnou avr-gcc. Soubory typu .c a .cpp cíle jsou kompilovány a linkovány se statickými knihovnami. Jsou použity jenom ty části knihoven, které jsou v kódu používány. Výsledný Intel HEX soubor je načten na desku, pomocí knihovny avrdude (Arduino, 2012).
2.5 Komunikace I2C Komunikace byla vyvinuta v 90. letech firmou Phillips, pro účely komunikace nízko-rychlostních periferií. Jedná se o druh sériový komunikace. Komunikace probíhá pomocí dvojvodičové rozhraní. Jeden vodič slouží pro zasílání dat (SDA) a druhý slouží pro přenos hodinového signálu (SCL). Ve standardním módu (Sm) může být komunikace až 100 kbit ∙ s-1, v rychlém módu (Fm) až 400 kbit ∙ s-1, v rychlém módu plus (Fm+) až 1 Mbit ∙ s-1 a v módu high speed (Hsmode) až 3,4 Mbit ∙ s-1 (NXP Semiconductors, 2012). Komunikace se v jeden okamžik uskutečňuje pouze jedním směrem. Zařízení se podle druhu úlohy při komunikaci dělí na master nebo slave. Vodiče SDA a SCL jsou k zařízením master a slave připojeny pomocí obvodů s otevřeným kolektorem. Každé zařízení připojené ke sběrnici je identifikováno jedinečnou 7
Teoretická část
15
bitovou nebo 10 bitovou adresou. Master je zařízení, které zahajuje a ukončuje přenos dat a generuje hodinový signál. Všechny adresované zařízení jsou vyhodnoceny jako slave zařízení. Sběrnice I2C podporuje připojení více master zařízení (Hrbáček, 1999). 2.5.1
Protokol sběrnice I2C
Pro zahájení komunikace vyšle zařízení master adresu zařízení, se kterým chce komunikovat. Všechna zařízení připojená ke sběrnici poslouchají. Zařízení, které rozpozná svou adresu, pošle pomocný signál (ACK). Součástí bytu s adresou je také příznak (R/-W), který určí, jestli se budou data posílat ze zařízení slave do zařízení master nebo naopak. Na obrázku č. 4 je naznačen protokol pro komunikaci čtení dat ze zařízení slave a zápisu dat do zařízení slave. Světlými plochami je označena komunikace od zařízení master šedými komunikace od zařízení slave. Komunikace je zahájena start sekvencí (S), po které následuje byte s adresou zařízení a příznakem zápisu či čtení (R/W). Po každém vyslaném bytu je vyslán 1 bitový příznak úspěšného přijetí (A). Pokud zařízení master nepřijme potvrzení příjmu dat (A), pak je transakce ukončena stop sekvencí (P). Pokud jedno ze zařízení potřebuje čas na zpracování dat, může nastavit komunikace do stavu čekání (wait), tento stav je určen nastavením hodinového signálu na úroveň L (Hrbáček, 1999).
Obr. 4
Ukázka protokolu I2C (Hrbáček, 1999)
2.5.2
Sekvence start, stop a časování sběrnice
Sekvencemi start a stop se zahajuje a ukončuje komunikace mezi dvěma zařízeními. Sekvence vždy generuje zařízení master. Průběh a stav při těchto sekvencích na hodinovém a datovém signálu jsou vyznačeny na obrázku č. 5, který znázorňuje přenos dat. Komunikace začíná prvním nejvýznamnějším bitem v zaslaném bytu. K bezchybnému čtení datového signálu, musí být hodinový signál nastaven v úrovni H. Změna úrovně datového signálu, je povolena pouze, pokud je hodinový signál nastaven na úrovni L. Za každým poslaným bytem musí být poslán bit příznaku přijmutí. Příznak příjmu bytu je vyhodnocen jako pozitivní pokud je datový signál nastaven do úrovně L při devátém hodinovém pulzu s nastavenou úrovní H. Při nastavené úrovni H při tomto hodinovém impulzu je
Teoretická část
16
vyhodnocen příznak negativně a je poslána stop sekvence (NXP Semiconductors, 2012).
Obr. 5
Přenos dat (Hrbáček, 1999)
2.6 Stavebnice LEGO Mindstorms NXT Aktuálně je stavebnice ve verzi 2.0. Základní stavební součástí je výpočetní jednotka, ke které se připojují senzory a motory. Konstrukce robotů a další zařízení je možné stavět ze stavebnic LEGO technic a LEGO systém, které jsou s prvky stavebnice LEGO Mindstorms kompatibilní. Stavebnice je velice vhodný výukový prostředek pro základy robotiky (Lego, 2012). 2.6.1
Řídicí jednotka NXT
Řídicí jednotka robota systému LEGO Mindstorms je základní prvek stavebnice (obrázek č. 6). Jednotka obsahuje hlavní mikropočítač Atmel, založeném na 32 bitovém procesoru ARM, pracujícím na frekvenci 48 MHz. V jednotce se vyskytuje také koprocesor Atmel, založený na 8 bitovém AVR procesoru o frekvenci 8 MHz. Jednotka se může připojit k PC bezdrátově pomocí technologie Bluetooth nebo přes USB port. Bezdrátová komunikace funguje také mezi řídicími jednotkami. Na vrchní straně kostky se nachází monochromatický LCD displej s velikostí 100 x 64 bodů a 4 gumové tlačítka pro ovládání. Jednotka je napájena šesti AA bateriemi nebo akumulátorem ze stavebnice. Po stranách se vyskytují tři výstupní porty označené A, B, C a čtyři vstupní senzorové porty označené 1–4. Výstupní porty napájí a řídí např. servomotory. Vstupní porty slouží pro připojení snímačů, porty 1–3 komunikují prostřednictvím I2C komunikaci. Pro připojení senzoru, motorů a dalších zařízení do portů se používají upravené modulární konektory RJ12 s uchycovacím kolíčkem na pravé straně (Lego, 2012).
Teoretická část
Obr. 6
Řídicí jednotka systému LEGO Mindstorms (AIMFORTHESTARS, 2011)
2.6.2
Servomotory stavebnice NXT
17
Servomotory NXT slouží jako základní pohonné jednotky ve stavebnici (obrázek č. 7). K řídicí jednotce se připojují na portech A, B a C. Servomotor má zabudovaný senzor pro měření rychlosti a ujeté vzdálenosti. Tyto data posílá nazpět do řídicí jednotky. Motor se dá jednoduše řídit, můžeme u něj nastavit rychlost rotace, směr otáčení. Motor je možno nechat rotovat o určitý úhel (Lego, 2012).
Obr. 7
Servomotor stavebnice LEGO Mindstorms (Lego, 2012)
Teoretická část
2.6.3
18
Možné způsoby programování řídicí jednotky NXT
Řídicí jednotku je možné programovat v softwaru, který je dodáván ke stavebnici NXT–G. Tento software má prostředí založené na softwaru LabView. Program se tvoří vkládání a přetahováním funkčních bloků. Tento způsob programování není vhodný pro náročné úlohy. Další možností je využití software LeJOS NXJ. V tomto software se programuje v jazyce Java. V referencích je obsáhlá a detailní dokumentace všech tříd. Pro programování v tomto softwaru je nutné nahrát nový firmware do řídicí jednotky, ve které se vytvoří Java virtual machine (Lego, 2012).
2.7 Navigace Každý mobilní robotický systém, který se má samostatně přesunovat, potřebuje znát svou polohu. Proto musí robot obsahovat navigační systém. Aby tuto činnost zvládal efektivně a zároveň nedošlo ke kolizím s překážkami v terénu, dělí se systém na globální a lokální souřadné systémy. Globální souřadný systém se stará o dopravení robotu z počátečního do cílového bodu. Globální systém obsahuje celý prostor, ve kterém se bude robot pohybovat. Metody, které slouží ke zjištění polohy v globálním navigačním systému, se dělí na relativní a absolutní navigaci. Lokální souřadný systém zajišťuje operace pro zabránění kolizí s objekty v pracovním prostoru. Lokální systém je nadřazen globálnímu. Ke své činnosti využívá senzory, které dodávají dostatek informací o nejbližším okolí robota (Novák, 2004). 2.7.1
Relativní navigace
Při určování polohy robotu při relativní navigaci nedochází k interakci s okolím robota. Poloha se vyhodnocuje z parametrů, které se měří na robotu. Výchozí pozice robotu, představuje obvykle počáteční bod globálního souřadného systému. Problémy, které se u této navigace vyskytují, souvisí s narůstající chybou při každém odečtu přírůstku polohy v souřadném systému. Z těchto důvodů se v praxi obvykle kombinuje s absolutním systémem navigace (Novák, 2004). 2.7.2
Absolutní navigace
Absolutní navigace zjišťuje polohu robotu využitím referenčních bodů se známou polohou. Tyto body mají přesně danou polohu v globálním souřadném systému. K vyhodnocení polohy robota v závislosti na referenčních bodech se nejčastěji využívá metod trilaterace a triangulace (Novák, 2004).
Teoretická část
19
2.8 Optický snímač v myši Dnešní optické myši využívají kompaktní optoelektronické senzory, které snímají povrch. Jako zdroj světla je používána světlo emitující dioda. Pro snímání povrchu bývají použity prvky technologií CMOS nebo CCD. Tyto prvky se dnes používají ve většině zařízení, které snímají a vyhodnocují obraz. Využití prvků technologie CMOS je v optických myších častější z důvodů nižších pořizovacích nákladů, než jsou u technologie CCD. V obvodu použitých v optických myších se většinou nachází CMOS optický senzor, digitální signálový procesor, obvod pro řízení LED, oscilátor, sériový port a obvod pro řízení napájení. Signálový procesor v integrovaném obvodu zpracovává obraz snímaný CMOS senzorem. Ze snímaného obrazu matematicky vyhodnotí směr a změnu vzdálenosti (Ohta, 2008). Na obrázku č. 8 je integrovaný optický senzor pro myš ADNS-2610 od firmy Avago s rozlišením 400 cpi (Avago technologies, 2008).
Obr. 8
Optický senzor pro myš ADNS-2610 (Avago technologies, 2008)
2.8.1
CMOS technologie
Jedná se o jednu z technologií pro snímání obrazu. Senzor pracuje na principu přeměny světelné veličiny na elektrickou. Senzor obsahuje matici obrazových bodů, na které dopadá světlo (obrázek č. 9). Každý z těchto bodů obsahuje fotodetektor a tranzistory. Obrazové body se dělí na aktivní a pasivní. V dnešní době se používají aktivní prvky se čtyřmi tranzistory. K této ploše je připojeny horizontální, vertikální přístupové obvody a obvod pro odečet hodnot. Tyto obvody zpracovávají signál z bodů v matici. Nejčastěji bývají použity ve fotodetektorech fotodiody s P-N přechodem. Využívá se také fototranzistorů a dalších prvků. Při dopadu světla na polovodič se část světla odrazí a část je polovodičem pohlcena. V polovodiči jsou pohlceným světlem vytvořeny páry elektron-díra. Množství vytvořených párů záleží na použitém materiálu polovodiče. Tyto nosi-
Teoretická část
20
če jsou zpracovány v tranzistorech. Každý obrazový bod je adresován a čten pomocí přístupových a čtecích obvodů (Ohta, 2008).
Obr. 9
Matice obrazových bodů s obvody (Ohta, 2008)
Metodika
21
3 Metodika Konstrukce robotu byla realizována z optického senzoru použitého v počítačové myši. Pro čtení dat ze senzoru, zpracování dat a komunikaci s řídicí jednotkou stavebnice Lego Mindstorms bylo využito mikropočítačové desky Arduino Uno. Program pro modul je realizována v jazyce Arduino ve vývojovém prostředí Arduino. Ke komunikaci pomocí sběrnici I2C se využívá standarní knihovny Wire.h. Řízení a čtení dat ze senzoru obstarává knihovna OptiMouse.h. Tato knihovna musela být rozšířena pro použití senzoru. Rozšíření knihovny je napsané v jazyce C++ v prostředí codeblocks. Program pro řídicí jednotku robota NXT byl napsán v jazyce Java s využitím nástroje LeJOS, ve vývojovém prostředí Eclipse. Pro komunikaci a řízení robotu byly využity standardně implementované třídy v nástroji LeJOS. Pro zjištění pro jakou vzdálenost odpovídají data získaná ze senzoru, bylo provedeno měření vzdálenosti pomocí modulu. Modul byl následně použit pro řízení robota konstrukce tribot.
Vlastní práce
22
4 Vlastní práce 4.1 Konstrukce modulu Modul je sestaven z optického senzoru určeného pro aplikaci v počítačové myši, a mikroprocesorové desky Arduino Uno. Optický senzor slouží pro určení směru a rozsah pohybu v osách x a y. Modul je napájena 9 V baterií, která je připojena k souosému konektoru s vnitřním průměrem 2,1 mm (obrázek č. 10) (Oxer, 2009).
Obr. 10
Baterie s konektorem
V modulu byly použity součásti z optické myši. Jedná se o spodní kryt myši, soustavu čoček, sloužící k osvětlení snímaného povrchu a správného snímání obrazu povrchu a část obvodu s optickým senzorem. Senzor PAN3101 pracuje na frekvencí 18,432 MHz. Umožňuje snímání obrazu až do rychlosti 54 ∙ 10-3 m ∙ s-1. Operační napětí je 4,25–5,5 V. Čip snímá 3000 snímků za sekundu. Senzor pracuje s rozlišením 400 nebo 800 cpi. Na obrázku č. 11 je osmi vývodové pouzdro čipu PAN3101 jedná se o standardní pouzdro DIP8. Vývody 1 (OSCIN) a 2 (OSCOUT) slouží k připojení rezonátoru. Pomocí vývodu 3 (SDIO) a 4 (SCLK) čip komunikuje po sériové komunikaci. Vývodem 5 (LED) je řízena intenzita svitu LED. Pomocí vývod 6 (VSS) a 7 (VDD) je čip napájen. Na vývodu 8 (VREF) je přivedeno referenční napětí (Pixart, 2005).
Vlastní práce
Obr. 11
23
Schéma pouzdra senzoru PAN3101 (Pixart, 2005)
Na obrázku č. 12 je schéma propojených součástí. Senzor PAN3101 je napájen na vývodech 6 a 7 z desky Arduino Uno, kde se k tomuto účelu využívá vývodu 5V a GND. Sériová komunikace mezi deskou a senzorem se uskutečňuje vývody 3 a 4 u senzoru a digitálními vývody 2 a 3 na desce Arduino.
Obr. 12
Schéma modulu
Pro připojení desky Arduino k řídicí jednotce robota NXT se u modulu využívá upraveného kabelu ze stavebnice LEGO Mindstorms. Obsahuje šest vodičů, a připojuje se pomocí specifického (kolíček pro zachycení se nalézá na pravé straně) modulárního konektoru RJ12. Na obrázku č. 13 lze vidět schéma senzorového portu. Komunikace se uskutečňuje na kontaktech konektoru 5 (DIGIAI0), který nese hodinový signál a 6 (DIGIAI1), který slouží pro přenos dat. Také je využit kontakt 2 (GND). Vodiče ve standardním kabelu jsou od sebe rozli-
Vlastní práce
24
šeny různou barvou. Vodič na kontaktu 5 (DIGIAI0) má žlutou barvu, vodič na kontaktu 6 (DIGIAI1) má modrou barvu a vodič 2 (GND) má barvu černou. Ke komunikaci s deskou Arduino je využito vývodu A4 a A5 (Gasperi, Hurbain, 2009).
Obr. 13
Schéma a popis senzorového portu (Lego, 2012)
Propojení obvodu se senzorem PAN3101 a desky Arduino Uno na obrázku č. 14.
Obr. 14
Senzor propojený s deskou Arduino
Vlastní práce
25
4.2 4.3 Úlohy modulu Modul slouží pro připojení k řídicí jednotce ze stavebnice Lego Mindstorms. Modul je určen pro použití měření ujeté vzdálenosti robotu. Měření zrychlení robotu. Také může být použit pro získání zpětné vazby, jestli se robot pohybuje přímým směrem.
4.4 Čtení dat a řízení senzoru S čipem senzoru se pracuje pomocí zapisování a čtení jeho registrů. Veškerá komunikace se senzorem je řízena mikrokontrolerem. Jedná se o sériovou komunikaci, v jeden moment jsou data posílána jen jedním směrem a je realizována pomocí dvou vodičů. Protokol obsahuje dva operační módy operaci čtení a zapisování. Tyto dvě operace a operaci pro resynchronizování komunikace se senzorem implementuje externí knihovna OptiMouse.h pro prostředí Arduino. Obě tyto operace obsahují dva byty. První byte obsahuje 7 bitovou adresu, nejvýznamnější bit idndikuje, jestli se jedná o operaci čtení nebo zápisu. Druhý byte obsahuje data určená k zápisu do registru nebo data přečtená z registru. Pomocí operace čtení z registru si mikrokontroler (Arduino) čte data z registrů, jejich adresy jsou značeny v hexadecimálních jednotkách. Registry Delta_Y s adresou 0x02, Delta_X s adresou 0x03 a Motion_Status s adresou 0x16 jsou registry, ze kterých se čtou data. První dva zmíněné registry obsahují hodnotu o velikosti jeden byte. Hodnota se pohybuje v rozmezí -127 až 128. Udává o kolik bodů, se senzor posunul od posledního sejmutého a vyhodnoceného obrazu. Po přečtení registru se registr vynuluje. Registr Motion_Status obsahuje bitové pole, které indikuje určité stavy senzoru. Bit s nejvyšší vahou značí, jestli došlo k pohybu a data v registrech s hodnotami poloh x a y jsou připraveny pro čtení (Pixart, 2005). Pro nastavení funkce senzoru se používá několik registrů, které jsou schopny zápisu. Aplikace používá pro konfiguraci senzoru registr Operation_Mode1 s adresou 0x00. Po nastavení šestého nejvyššího bitu na hodnotu logické jedničky dojde k přepnutí senzoru do módu s nízkou spotřebou (Power down mode). Další nastavení senzoru program neprovádí. Využívá se standardního nastavení senzoru. Toto nastavení přepne senzor do módu Sleep pokud není v uplynulé sekundě indikován pohyb senzoru. V tomto módu se sníží intenzita svitu světlo emitující diody. K zajištění správné konfigurace senzoru a čtení z registrů bylo nutné vytvořit rozšíření pro externí knihovnu OptiMouse.h, která se v programu připojuje. Toto rozšíření je specifické pro použitý optický senzor PAN3101. Následuje ukázka implementace metody pro nastavení Power down módu (Pixart, 2005).
Vlastní práce
26
//definice adresy registru a bitových masek #define Operation_mode1 0x00 #define PowerDown_mask 0x40 //implementace metody s využitím metody writeRegister, //readRegister a použití bitové masky s logickou //operací součtu void OptiSensor::powerDown(void) { uint8_t opMode = 0; _operationMode = readRegister(Operation_mode1); opMode = _operationMode || PowerDown_mask; writeRegister(Operation_mode1,opMode); delay(1); } 4.4.1
Operace zápisu
Na obrázku č. 15 lze vidět komunikaci při zápisu do registru. Datovou komunikaci zahajuje mikrokontroler. První bit na úrovni logické jedničky indikuje, že se jedná o operaci zápisu do registru. Dále následuje sedm bitů s hodnotou adresy, do kterého se má zapisovat. Druhý byte obsahuje data, která se mají do registru zapsat. Komunikace je synchronizována hodinovým signálem. Mikrokontroler mění úroveň na padající hraně hodinového signálu. Senzor čte tyto úrovně na vzestupné hraně signálu (Pixart, 2005).
Obr. 15
Operace zápisu (Pixart, 2005)
4.4.2
Operace čtení
Na obrázku č. 16 lze vidět komunikaci při čtení z registru. Datovou komunikaci zahajuje mikrokontroler. První bit má hodnotu logické nuly a značí, že se jedná o operaci čtení z registru. Poté se pošle sedm bitů s adresou registru. Po odeslání posledního bitu adresy mikrokontroler uvolní datovou komunikaci a nastaví datový signál do stavu vysoké impedance, ve kterém setrvá minimálně 3 × 10-6 sekund. Poté se datové komunikace ujme čip PAN3101 a pošle do mikrokontroleru jeden byte s obsahem registru. Po poslání posledního datového bitu uvolní datovou komunikaci a nastaví datový signál do stavu vysoké impedance. Komunikace je synchronizována a řízena hodinovým signálem, stejně jako u operace zápisu (Pixart, 2005).
Vlastní práce
Obr. 16
Operace čtení (Pixart, 2005)
4.4.3
Power down mód senzoru
27
Senzor se do tohoto módu nastaví po přepsání 6 bitu v registru s adresou 0x00 na hodnotu logické jedničky. Po nastavení senzoru, se musí vyčkat alespoň 333 × 10-6 sekund. Po opuštění tohoto módu se musí vyčkat s komunikací se senzorem minimálně 3 × 10-3 sekund (Pixart, 2005).
4.5 Program v Arduino Uno Každý program v prostředí Arduino musí obsahovat struktury setup() a loop(). V programu je připojena knihovna OptiSensor.h, která zajišťuje operace pro komunikaci a nastavení senzoru PAN3101. Dále je připojena standardní knihovna Wire.h, která zajišťuje komunikaci přes I2C sběrnici. Ve struktuře loop() se inicializuje připojení a nastaví se 7 bitová adresa desky Arduino pomocí konstruktoru Wire.begin(). Konstruktor s parametrem adresy způsobí nastavení desky Arduino jako zařízení slave. Také se zde inicializují funkce Wire.onRequest(requestEvent) a Wire.onReceive(receiveEvent). Tyto funkce se provedou v momentě požadavku dat nebo poslání dat ze zařízení master. Tyto funkce se definují mimo struktury setup() a loop(). Ve struktuře loop() se nastaví senzor do módu snížené spotřeby. Tento stav trvá, dokud řídicí jednotka nepošle požadavek na spuštění snímání. Tento požadavek se zpracuje v handleru receiveEvent(). Pro přečtení zaslaných dat ze zařízení master slouží metoda Wire.read(). Po opuštění módu se sníženou spotřebou začne Arduino číst data ze senzoru. Změny polohy senzoru se snímají a přírůstkově sčítají do doby, kdy si řídicí jednotka pošle požadavek na poslání dat ze zařízení. Poslání dat jednotce implementuje handler requestEvent(). Zde se koordináty převedou na pole bytů o velikosti čtyř prvků. Funkce Wire.write() pošle data do jednotky, parametry funkce obsahují bytové pole, které se má poslat a jeho velikost. Po poslání dat se koordináty polohy vynulují a snímání změny polohy začíná od aktuálního bodu. Vývojový diagram programu je na obrázku č. 17 (Arduino, 2012).
Vlastní práce
Obr. 17
28
Vývojový diagram programu v desce Arduino
4.6 Měření vzdálenosti modulem Modul byl testován na vzdálenost 50 cm. Modulem se pohybovalo ve směru osy y. Data byly čteny přímo z desky Arduino Uno a posílána byla do PC. Pro zobrazení dat v prostředí Arduino v monitoru sériového komunikace, bylo využito knihovny Serial.h, která zobrazuje data přenášená po sériové komunikaci. V následující tabulce č. 1 jsou hodnoty naměřených dat. Obrázek č. 18 zobrazuje naměřené hodnoty v grafu, proložené přímkami lineární interpolace. Tato funkce slouží pro určení souřadnic bodu, který leží na přímce mezi dvěma známými body (Arduino, 2012).
Vlastní práce Tab. 1
29
Naměřená hodnoty senzoru
Vzdálenost v cm 5 10 15 20 25 30 35 40 45 50
Obr. 18
Naměřené hodnoty 2143 3959 6379 8326 10385 12436 14529 16486 18567 20142
Graf naměřených hodnot
Z grafu (obrázek č. 18) lze vidět, že naměřené hodnoty ze snímače stoupají s rostoucí vzdáleností. Průběh funkce je takřka lineárně. Pro přepočet naměřených hodnot ze snímače na jednotky centimetrů využiji následující vztah, kde h je poměr naměřené hodnoty ze snímače vůči vzdálenosti.
Vlastní práce
30
Z vypočtených hodnot se zjistí průměr. Po zaokrouhlení výsledku vychází, že posunutí senzoru o jeden centimetr se rovná hodnotě 414 bodů, která je získána ze senzoru.
4.7 Program pro komunikaci v řídicí jednotce LEGO NXT Komunikace řídicí jednotky robota NXT a desky Arduino pracuje pomocí rozhraní I2C. Řídicí jednotka pracuje při komunikaci vždy jako zařízení master. Arduino komunikuje jako zařízení slave. Pro zahájení a řízení komunikace se modulem slouží v prostředí LeJOS třída I2CSensor. V konstruktoru třídy se nastaví použitý senzorový port I2CSensor(), parametrem funkce je použitý senzorový port. Funkce setAddress() nastaví adresu zařízení, s kterým bude řídicí jednotka komunikovat. Řídicí jednotka používá 8 bitovou adresaci připojených senzorů (Arduino používá 7 bitovou adresaci). Z tohoto důvodu musí být adresa, která je použita v parametru funkce, posunuta o jeden bit pomocí bitové operace posunutí doleva. Pro zaslání dat do zařízení slouží funkce sendData(), parametry funkce jsou adresa registru, pole bytů, které se pošle a velikost pole. Funkce getData() slouží pro získání dat ze zařízení. Jejími parametry jsou adresa registru, pole bytů, do kterého se data uloží a velikost pole (Lejos, 2007).
4.8 Využití modulu v konstrukci mobilního robotu Modul byl v konstrukci robota použit pro měření ujeté vzdálenosti. Jedná se o konstrukci typu tribot (obrázek č. 19). Podvozek je vybaven dvěma koly připojenými k servomotorům stavebnice a kolem třetím pro vyrovnání podvozku. Průměr kol je 43,2 mm a vzdálenost středů kol od sebe je 15,3 cm. Umístění senzoru je zásadní. Spodní kryt myši s obvodem senzoru je umístěn mezi servomotory. Čočka snímače je umístěna v ose otáčení podvozku. Robot je použit v aplikaci přesunu z počátečního bodu do zadaného cílového bodu. Bod je určen zadanými souřadnicemi. Modul je v této aplikaci použit pro měření ujeté vzdálenosti.
Vlastní práce
Obr. 19
Robot využívající modul
4.8.1
Pracovní plocha
31
Robot se pohybuje na pracovní ploše rozdělené do čtyř kvadrantů (obrázek č. 20). Pro správné řízení robota je důležité určit, ve kterém kvadrantu se cílový bod vyskytuje.
Obr. 20
Nákres pracovní plochy
Vlastní práce
4.8.2
32
Program robotu
Základní funkce programu spočívá v zjištění úhlu a vzdálenosti, kterou má robot urazit, aby se dostal do cílového bodu a měření ujeté vzdálenosti. Vývojový diagram je na obrázku č. 21.
Obr. 21
Vývojový diagram programu robotu
K řízení podvozku program používá třídu DifferentialPilot. Do parametrů konstruktoru třídy se musí zadat průměr kol, šířka podvozku. Tyto parametry musí být uvedeny v jednotkách palců. K dalším parametrům patří porty, do kterých jsou připojeny levý a pravý servomotor podvozku. Rychlost otáčení kol je nastavena pomocí metody setRotateSpeed(). Parametr metody udává, o kolik stupňů za sekundu se má motor otočit. Přímý pohyb zajišťuje metoda travel(). V parametru se udává vzdálenost, kterou má robot urazit. V momentě spuštění programu se podle zadaných souřadnic cílového bodu zjistí, ve kterém kvadrantu se cílový bod nachází vzhledem k počáteční pozici robota. K tomu účelu slouží funkce getQuadrant(). Parametry funkce jsou pozice cílového bodu. Pokud jsou obě souřadnice kladné, pak je bod v prvním kvadrantu. Je-li souřadnice x záporná a y kladná pak se bod nachází ve druhém kvadrantu. Pokud jsou obě souřadnice záporné, pak se jedná o třetí kvadrant. Při kladné hodnotě x a záporné y leží bod ve čtvrtém kvadrantu. Funkce getAngle() slouží k výpočtu úhlu, na který se má robot natočit. Parametry funkce jsou souřadnice cílového bodu. K výpočtu úhlu je potřeba znát délku přepony u pravoúhlého trojúhelníku. To zařizuje metoda getHyp() s pa-
Vlastní práce
33
rametry souřadnic cílového bodu. Používá jednoduchý výpočet podle pravidel o pravoúhlém trojúhelníku, je znázorněn v následujícím vztahu (Lejos, 2007).
Pomocí této funkce zjistíme vzdálenost, kterou má robot urazit a délku přepony pro výpočet úhlu ve funkci getAngle(). Výpočet úhlu je naznačen v následujícím vztahu.
Ve funkci se přičte úhel 90, 180, 270 stupňů podle toho, ve kterém kvadrantu se cílový bod nachází. Pro funkce getAngle() a getHyp() bylo použito matematických funkcí z knihovny java.Math. Program vypočte hodnoty úhlu, o který se má robot otočit a vzdálenosti, kterou má ujet. Poté se robot otočí pomocí metody rotate(), parametr metody je velikost úhlu v jednotkách stupňů a spustí pohyb přímým směrem, dokud nedosáhne požadované vzdálenosti. Ujetá vzdálenost je snímána modulem a zasílána do řídicí jednotky. V řídicí jednotce je tato vzdálenost přepočtena na centimetry.
Diskuze
34
5 Diskuze Při konstrukci modulu bylo výhodně využito spodního krytu myši z důvodu správného umístění čočky a správného umístění snímače od snímaného povrchu. Ke zpracování dat ze snímače a následného odeslání dat bylo využito desky Arduino Uno. Výhodou desky je její jednoduché programování v jazyce a vývojové prostředí pro tento hardware určeném. Program je psán v jazyce postaveném na syntaxi jazyků C/C++. Tedy není nutné mít znalosti o programování mikrokontroleru. Modul slouží pro využití v problematice relativní navigace mobilního robotu. Z měření bylo zjištěno, že data ze senzoru jsou, přímo úměrná posunuté vzdálenosti. Při měření bylo zjištěno, že snímaná změna polohy je závislá na rychlosti pohybu senzoru. Pro správné čtení a vyhodnocení obrazu je důležitá vzdálenost senzoru od snímaného povrchu. Modul byl použit v konstrukci robotu typu tribot. Robot řeší problém přesunu z počátečního bodu do koncového a modul využívá pro snímání ujeté vzdálenosti. Program robotu byl vytvořen v jazyce Java v prostředí Eclipse. Možnosti vylepšení modulu jsou především v oblasti konstrukce. Bylo by vhodné využití 3D tiskárny pro vytvoření kompaktního krytu pro celý modul. Dále využití jiného hardwaru systému Arduino např. desky Arduino Mini nebo Arduino Nano z důvodů malých rozměrů těchto desek. Modul by se s využitím tohoto hadrwaru měl menší rozměry a mohl by být napájen z řídicí jednotky stavebnice Lego Mindstorms jako standardní senzory ze stavebnice. K přesnějšímu měření změny polohy by se mohl použít optický senzor s vyšším rozlišením a s vyšší frekvencí snímkování.
Závěr
35
6 Závěr Cílem práce byl návrh a konstrukce identifikačního modulu polohy a vytvoření aplikace pro vyhodnocení a přenos dat do řídicí jednotky robota NXT. Modul byl zkonstruován ze součástí optické myši. Byl využit obvod optického senzoru, krytu a systému čoček. Ke zpracování dat, řízení senzoru a komunikaci s řídicí jednotkou bylo využito mikroprocesorového systému Arduino přesněji model desky Arduino Uno. Program byl vytvořen v jazyce Arduino v prostředí určeném pro systém Arduino, za použití rozšířených externích knihoven, které obsahují operace pro čtení a zápis z registrů optického senzoru. Program získává a zpracovává data ze senzoru. Dále zajišťuje komunikaci s řídicí jednotkou robota stavebnice Lego NXT. Modul měří změnu polohy v osách x a y. Modul slouží k měření ujeté vzdálenosti, rychlosti mobilního robota. Také může být využit pro zpětnou vazbu, jestli se robot pohybuje přímo a z toho plynoucí úpravy otáček motoru. Modul je tedy vhodný pro použití při problematice relativní navigace robotu. Při měření vzdálenosti pomocí modulu bylo zjištěno, že naměřené hodnoty jsou ovlivněny rychlostí pohybu modulu. Také je důležité, aby bylo optické zařízení senzoru umístěné v určitém rozsahu vzdálenosti od snímaného povrchu, jinak by docházelo k chybám při snímání. Modul je použitelný pouze na rovných plochách. Pro využití na jiných plochách by bylo nutné použití jiného systému čoček. Navržený modul byl použit v aplikaci řízení mobilního robota, který se pohyboval po herní ploše, která se využívá pro potřeby soutěží robotů. Robot konstrukce tribot se pohyboval z počáteční pozice do zadaného koncového bodu. Modul byl v robotu použit pro měření ujeté vzdálenosti.
Literatura
36
7 Literatura AIMFORTHESTARS. NXT Brick [online]. University of NebraskaOmaha, 2011 [cit. 2012-05-20]. Dostupné z: http://aimforthestars.unomaha.edu/pages/rcxnxt.php ARDUINO. ArduinoBoardUno [online]. 2012 [cit. 2012-05-20]. Dostupné z: http://arduino.cc/en/Main/ArduinoBoardUno ARDUINO. Arduino - BuildProcess [online]. 2012 [cit. 2012-05-20]. Dostupné z: http://arduino.cc/en/Hacking/BuildProcess ARDUINO. Arduino - Libraries [online]. 2012 [cit. 2012-05-20]. Dostupné z: http://arduino.cc/en/Reference/Libraries ARDUINO. Arduino - Loop [online]. 2012 [cit. 2012-05-20]. Dostupné z: http://arduino.cc/en/Reference/Loop ARDUINO. Arduino - Environment [online]. 2012 [cit. 2012-05-20]. Dostupné z: http://arduino.cc/en/Guide/Environment ARDUINO. Arduino - Reference [online]. 2012 [cit. 2012-05-20]. Dostupné z: http://arduino.cc/en/Reference/HomePage ARDUINO. Arduino - Serial [online]. 2012 [cit. 2012-05-20]. Dostupné z: http://arduino.cc/en/Reference/Serial ARDUINO. Arduino - Setup [online]. 2012 [cit. 2012-05-20]. Dostupné z: http://arduino.cc/en/Reference/Setup ATMEL. ATmega328 [online]. 2012 [cit. 2012-05-20]. Dostupné z: http://www.atmel.com/devices/atmega328.aspx?tab=overvi ew AVAGO TECHNOLOGIES. ADNS-2610: Optical Mouse Sensor [online]. 4. 9. 2008 [cit. 2012-05-20]. Dostupné z: http://www.avagotech.com/docs/AV02-1184EN GASPERI, MICHAEL A PHILIPPE HURBAIN. Extreme NXT: extending the LEGO MINDSTORMS NXT to the next level. 2nd ed. Berkeley, Calif: Apress, 2009. ISBN 978-143-0224-532 HRBÁČEK, JIŘÍ. Komunikace mikrokontroléru s okolím. 1. vyd. Praha: BEN - technická literatura, 1999, 159 s. ISBN 80-86056-42-21 LEJOS. Java for Lego Mindstorms: leJOS NXJ PC-API documentation [online]. 2007 [cit. 2012-05-20]. Dostupné z: http://lejos.sourceforge.net/nxt/pc/api/index.html LEGO, Mindstorms. [online]. 2012 [cit. 2012-05-20]. Dostupné z: http://mindstorms.lego.com/engb/whatisnxt/default.aspx
Literatura
37
LEGO. LEGO MINDSTORMS NXT: Hardware Developer Kit [online]. 2006 [cit. 2012-05-20]. Dostupné z: http://mindstorms.lego.com/enus/support/files/default.aspx NOVÁK, PETR. Mobilní roboty: pohony, senzory, řízení. Vyd. 1. Praha: BEN - technická literatura, 2004, 247 s. ISBN 80-730-0141-1 NXP SEMICONDUCTORS. UM10204: I2C-bus specification and user manual [online]. 13. 2. 2012 [cit. 2012-05-20]. Dostupné z: http://www.nxp.com/documents/user_manual/UM10204.pdf OHTA, JUN. Smart CMOS image sensors and applications. Boca Raton: CRC Press, c2008, xvii, 248 s. Optical science and engineering (Boca Raton, Fla.), 129. ISBN 08-493-3681-3 OXER, JONATHAN. Practical Arduino: cool projects for open source hardware. Vyd. 1. Berkeley, CA: Apress, c2009, 423 s. ISBN 978-1-43022477-8 PIXART. PAN3101 [online]. 2005 [cit. 2012-05-20]. Dostupné z: http://www.pixart.com.tw/upload/PAN3101_V10_2005112117 0653.pdf
Přílohy
38
Přílohy
Seznam obrázků
39
A Seznam obrázků Obr. 1 Arduino Mini
10
Obr. 2
Arduino Uno
11
Obr. 3
Okno vývojového prostředí
13
Obr. 4
Ukázka protokolu I2C
15
Obr. 5
Přenos dat
16
Obr. 6
Řídicí jednotka systému LEGO Mindstorms
17
Obr. 7
Servomotor stavebnice LEGO Mindstorms
17
Obr. 8
Optický senzor pro myš ADNS-2610
19
Obr. 9
Matice obrazových bodů s obvody
20
Obr. 10
Baterie s konektorem
22
Obr. 11
Schéma pouzdra senzoru PAN3101
23
Obr. 12
Schéma modulu
23
Obr. 13
Schéma a popis senzorového portu
24
Obr. 14
Senzor propojený s deskou Arduino
24
Obr. 15
Operace zápisu
26
Obr. 16
Operace čtení
27
Obr. 17
Vývojový diagram programu v desce Arduino
28
Obr. 18
Graf naměřených hodnot
29
Obr. 19
Robot využívající modul
31
Obr. 20
Nákres pracovní plochy
31
Obr. 21
Vývojový diagram programu robotu
32
Obr. 22
Schéma desky Arduino Uno Rev 2
41
Seznam tabulek
40
B Seznam tabulek Tab. 1 Naměřená hodnoty senzoru
29
Schéma desky Arduino Uno Rev 2
C Schéma desky Arduino Uno Rev 2
Obr. 22
Schéma desky Arduino Uno Rev 2
41
Program v desce Arduino
42
D Program v desce Arduino //připojení použitých knihoven #include
#include <Wire.h> #include <Math.h> //definování vývodu pro připojení senzoru #define SCLK 2 #define SDIO 3 //vytvoření instance třídy, //která implementuje metody pro práci se senzorem OptiSensor OpticalM = OptiSensor(SCLK, SDIO); //adresa desky ArduinoUno při komunikaci int address = 0x43; //vytvoření proměnných byte startRead; boolean dataSend = false; int howMany = 1; short mask = 0xFF; signed short x = 0; signed short y = 0; byte myData[4]; //metoda pro inicializaci pole, které bude posíláno řídicí jednotce void myDataIni(){ for (int i = 0; i < 4; i++){ myData[i] = 0; } } //inicializace použitých knihoven a metod knihoven void setup(){ OpticalM.begin(); Wire.begin(address); Wire.onReceive(receiveEvent); Wire.onRequest(requestEvent); myDataIni(); }
Program v desce Arduino
43
void loop(){ if (dataSend){ x = 0; y = 0; dataSend = false; } if (startRead == 0){ OpticalM.powerDown(); } if (startRead == 1){ OpticalM.powerUp(); startRead = 2; } if (startRead == 2){ x += OpticalM.dx(); y += OpticalM.dy(); } } //implementace metody pro příjem dat z řídicí jednotky void receiveEvent(int howMany){ if (Wire.available() >0 ) { startRead = Wire.read(); } } //implementace metody pro void requestEvent(){ myData[0] = (byte) x >> myData[1] = (byte) x && myData[2] = (byte) y >> myData[3] = (byte) y && Wire.write(myData,4); dataSend = true; }
zaslání dat do rídící jednotky 8; mask; 8; mask;