České vysoké učení technické v Praze Fakulta elektrotechnická
Bakalářská práce
Ovládání hračky Furby přes BlueTooth Tomáš Kunc
Vedoucí práce: Ing. Miroslav Skrbek Ph.D. Studijní program: Elektronika a informatika strukturovaný bakalářský Obor: Výpočetní technika srpen 2007
ii
Poděkování Tímto bych rád poděkoval vedoucímu mé bakalářské práce Ing. Miroslavu Skrbkovi Ph.D. za pomoc během její tvorby. Dále děkuji společnosti IBM Česká republika, spol. s r.o. za poskytnutí finančních prostředků a materiálu pro implementaci této bakalářské práce.
iii
iv
Prohlášení: Prohlašuji, že jsem svou bakalářskou práci vypracoval samostatně a použil jsem pouze podklady uvedené v přiloženém seznamu. Nemám závažný důvod proti užití tohoto školního díla ve smyslu §60 Zákona č. 121/2000 SB., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů (autorský zákon).
V Praze dne 24. 8. 2007
...........................................................................................................
v
vi
Abstract The aim of this thesis is to modify the Furby Toy to allow for its wireless control. The goal of the project is to design new electronics (hardware and firmware) for Furby such a way, that any mechanical part doesn’t have to be modified. Wireless transmission is based on BlueTooth technology using F2M03AC2 module by Free2Move. Modified toy should be able to execute movements and monitor/reflect state of its sensors. Additional requirement is to support carrying of audio signal between the toy and controlling PC. This would potentially enable voice control of Furby (voice control doesn’t belong to goals of this thesis).
Abstrakt Tato bakalářská práce se zabývá modifikací hračky Furby umožňující její bezdrátové ovládání. Cílem projektu je návrh nového elektronického vybavení hračky a jeho implementace bez nutnosti mechanických úprav zařízení. Bezdrátový přenos je založen na technologii BlueTooth za využití modulu F2M03AC2 od firmy Free2Move. Upravená hračka má být schopna vykonávat pohyby a sledovat stav svých snímačů. Má být zajištěn i přenos audio signálu mezi hračkou a ovládacím počítačem, což umožní hlasové ovládání (není součástí této bakalářské práce).
vii
viii
Obsah
Seznam obrázků ....................................................................................................................... xi Seznam tabulek ...................................................................................................................... xiii 1
Úvod ................................................................................................................................ 1
2
Popis a specifikace hračky Furby.................................................................................... 3 2.1
Mechanická konstrukce............................................................................................... 4
2.2
Elektronické prvky ...................................................................................................... 5
2.2.1
Inkrementální enkodér ........................................................................................ 5
2.2.2
Furbyho dotykové senzory .................................................................................. 7
2.2.3
Audio rozhraní .................................................................................................... 7
2.2.4
Seznam Furbyho elektrických komponent .......................................................... 7
3
Analýza a návrh řešení hardwarové části ........................................................................ 8 3.1
Výběr elektronických obvodů ................................................................................... 10
3.1.1
BlueTooth modul Free2Move F2M03AC2 ...................................................... 10
3.1.2
Mikrokontrolér .................................................................................................. 11
3.1.3
H-můstek ........................................................................................................... 15
3.1.4
Napěťový regulátor ........................................................................................... 16
3.2 4
PWM regulace motorů .............................................................................................. 17 Implementace hardwaru ................................................................................................ 19
4.1
Popis zapojení ........................................................................................................... 19
4.1.1
Napájení ............................................................................................................ 19
4.1.2
Zapojení provozních pinů MCU ....................................................................... 21
4.1.3
Zapojení H-můstku ........................................................................................... 22
4.1.4
Připojení mikrofonu .......................................................................................... 23
4.1.5
Připojení A/D převodníku ................................................................................. 23
4.1.6
Programovací konektor ..................................................................................... 25
4.1.7
Propojení BlueTooth modulu a MCU ............................................................... 26
4.1.8
Připojení enkodéru ............................................................................................ 27
4.1.9
Připojení čidel ................................................................................................... 27
4.2
Deska tištěných spojů................................................................................................ 28
4.3
Zkompletování Furbyho ............................................................................................ 30
5
Řídící software Furbyho................................................................................................ 31 5.1
Architektura firmwaru............................................................................................... 32
ix
5.2
Komunikace mezi Furbym a počítačem .................................................................... 34
5.3
Formát a struktura příkazů ........................................................................................ 34
5.4
Formát a struktura odpovědí a zpráv ......................................................................... 35
5.5
Seznam příkazů a odpovědí ....................................................................................... 36
5.5.1
Příkazy a odpovědi motoru č. 1 ......................................................................... 36
5.5.2
Příkazy a odpovědi motoru č. 2 ......................................................................... 38
5.5.3
Ostatní příkazy .................................................................................................. 40
5.5.4
Automatické zprávy .......................................................................................... 41
6
Implementace firmwaru ................................................................................................ 42 6.1
Popis funkcí a metod firmwaru ................................................................................. 42
6.1.1
Funkce main ...................................................................................................... 44
6.1.2
Výběr příkazů ze vstupní fronty ........................................................................ 47
6.1.3
Dekódování příkazů .......................................................................................... 47
6.1.4
Příjem příkazů ................................................................................................... 47
6.1.5
Interpretace signálu enkodéru............................................................................ 48
6.1.6
Ošetření zákmitů mechanických čidel ............................................................... 49
6.1.7
Nastavení směru a rychlosti motorů .................................................................. 50
7
Testování ....................................................................................................................... 51
8
Možná vylepšení Furbyho ............................................................................................. 53
9
Závěr.............................................................................................................................. 54
10
Seznam literatury........................................................................................................... 55
A. Příloha – Použité zkratky ................................................................................................... 57 B. Příloha – Nastavení sériové linky a připojení Furbyho .................................................. 58 C. Příloha – Obrazová dokumentace .................................................................................... 59 D. Příloha –Přiřazení vývodů MCU k Furbyho komponentám ........................................... 61 E. Příloha – obsah CD nosiče ................................................................................................. 62
x
Seznam obrázků Obr. 1 – schéma celkového systému Furby ↔ PC ................................................................... 1 Obr. 2 – základní deska BlueTooth modulu ............................................................................. 2 Obr. 3 – boční pohled ............................................................................................................... 3 Obr. 4 – zadní pohled................................................................................................................ 4 Obr. 5 – inkrementální enkodér ................................................................................................ 5 Obr. 6 – průběh signálu z enkodéru .......................................................................................... 6 Obr. 7 – princip inkrementálního enkodéru .............................................................................. 6 Obr. 8 – tvar výstupních signálů enkodéru ............................................................................... 7 Obr. 9 – nová hardwarová architektura .................................................................................... 8 Obr. 10 – blokové schéma návrhu hardwarové části Furbyho.................................................. 9 Obr. 11 – pokusná deska ........................................................................................................... 9 Obr. 12 – BlueTooth modul Free2Move F2M02AC2 ............................................................ 10 Obr. 13 – obecné schéma H-můstku ....................................................................................... 15 Obr. 14 – logické schéma obvodu L293D .............................................................................. 16 Obr. 15 – princip digitálního generování PWM signálu ......................................................... 17 Obr. 16 – příklady výstupních PWM průběhů........................................................................ 18 Obr. 17 – zapojení napájecí části 3.3 V .................................................................................. 21 Obr. 18 – zapojení provozních pinů mikrokontroléru ............................................................ 22 Obr. 19 – zapojení H-můstku.................................................................................................. 22 Obr. 20 – napájecí obvod mikrofonu ...................................................................................... 23 Obr. 21 – napěťový dělič pro A/D převodník ......................................................................... 24 Obr. 22 – programovací konektor ........................................................................................... 26 Obr. 23 – konektor enkodéru .................................................................................................. 27 Obr. 24 – zapojení čidel .......................................................................................................... 27 Obr. 25 – návrh desky plošných spojů.................................................................................... 28 Obr. 26 – PCB (vrchní pohled)¨ ............................................................................................. 29 Obr. 27 – PCB (spodní pohled) .............................................................................................. 29 Obr. 28 – zabudování desky do Furbyho ................................................................................ 30 Obr. 29 – BlueTooth Furby .................................................................................................... 30 Obr. 30 – blokové schéma - architektura firmwaru ................................................................ 32 Obr. 31 – struktura příkazu ..................................................................................................... 35 Obr. 32 – struktura hlavičky příkazu ...................................................................................... 35
xi
Obr. 33 – struktura odpovědi .................................................................................................. 36 Obr. 34 – vývojový diagram funkce main .............................................................................. 44 Obr. 35 – vývojový diagram výběru příkazu ze vstupní fronty .............................................. 47 Obr. 36 – vývojový diagram příjmu příkazů ........................................................................... 48 Obr. 37 – vývojový diagram interpretace signálu enkodéru ................................................... 49 Obr. 38 – celkové schéma zapojení......................................................................................... 59 Obr. 39 – layout základní desky.............................................................................................. 60 Obr. 40 – popis konektorů na základní desce ......................................................................... 60
xii
Seznam tabulek Tab. 1 – použité komponenty ................................................................................................. 10 Tab. 2 – technické parametry modulu .................................................................................... 11 Tab. 3 – využití vývodů mikrokontroléru ............................................................................... 12 Tab. 4 – porovnání parametrů mikrokontrolérů...................................................................... 13 Tab. 5 – elektrické parametry mikrokontroléru ATmega8-L (pro Vcc=3,3V) ....................... 14 Tab. 6 – seznam režimu pinů .................................................................................................. 14 Tab. 7 – elektrické parametry obvodu L293D ........................................................................ 16 Tab. 8 – porovnání napěťových stabilizátorů ......................................................................... 17 Tab. 9 – propojeni H-můstku a MCU ..................................................................................... 23 Tab. 10 – barevná reprezentace signálů prog. kabelu ............................................................. 25 Tab. 11 – propojení MCU a BlueTooth modulu.................................................................... 26 Tab. 12 – propojení MCU a enkodéru .................................................................................... 27 Tab. 13 – seznam stavových proměnných .............................................................................. 42 Tab. 14 – seznam metod firmwaru ......................................................................................... 43 Tab. 15 – ovládání směru a rychlosti motoru ......................................................................... 50 Tab. 16 – použité zkratky ....................................................................................................... 57
xiii
1 Úvod Bakalářská práce se zabývá implementací bezdrátového ovládání hračky Furby přes BlueTooth rozhraní. Hračka Furby je produktem firmy Tiger Electronics. V minulosti se jednalo mezi dětmi o velmi populární výrobek. V originální (nemodifikované) verzi je toto zařízení schopné samostatné činnosti. Reaguje na různé jednoduché podněty z okolí. Dokáže například reagovat na hlasové příkazy, vnímá dotyky. K těmto účelům Furby disponuje několika čidly. Jedná se o dotykové senzory na břiše, na zádech, v zobáku a čidlo polohy. Dále obsahuje audio rozhraní tvořené mikrofonem a reproduktorem. Furby je po estetické stránce poměrně zdařilá a příjemná hračka a bylo by ji možné využít pro prezentaci komunikace člověka s počítačem např. za pomocí hlasového rozpoznávače. Toto si uvědomila firma IBM a zadala projekt, jehož cílem je modifikace Furbyho, aby bylo možno jeho bezdrátové řízení přes rozhraní BlueTooth, což je typ bezdrátového datového přenosu ve frekvenčním pásmu 2.4GHz. Furby by měl být řízen počítačem vybaveným běžným BlueTooth rozhraním. Kromě možnosti ovládání pohybů je nutné také vyřešit audio přenos, umožňující hlasovou komunikaci. Furby BlueTooth rozhraní
počítač se zvukovou kartou a BlueTooth rozhraním
audio (SCO) kanál
datový kanál (wireless uart)
Obr. 1 – schéma celkového systému Furby ↔ PC
Modifikace by mohla umožnit využití Furbyho pro interaktivní demonstraci hlasového ovládání pomocí rozpoznávače na straně řídícího počítače. Člověk by tedy mluvil na Furbyho a ten by reagoval na jeho příkazy. Současně by byly umožněny nové způsoby využití hračky Furby a bylo by usnadněno navrhování nových funkcí, protože logika by díky dálkovému ovládání byla přenesena na stranu počítače. Samotným hlasovým ovládáním a softwarem na PC straně se zabývají a budou zabývat další navazující projekty a práce. Možné zjednodušené schéma celkového sytému je uvedeno na Obr. 1. Projekt jsem si jako bakalářskou práci vybral především pro možnost seznámení se s návrhem hardwaru od zapojení až po konečnou implementaci na desce plošných spojů a oživení napsáním řídícího softwaru zařízení (firmwaru). Má část práce se zabývá konkrétně úpravou Furbyho. Zadavatel stanovil, že modifikace bude provedena odebráním stávající elektroniky z hračky a nahrazení nově navrženou elektronikou. Původní elektronická část se skládá především ze základní desky a senzorů. Právě deska je
1
předmětem návrhu a nahrazení. Nová deska musí proto splňovat především kritéria týkající se kompatibility, jak po elektrické (připojení stávajících senzorů) tak i mechanické stránce (zaměnitelnost s původní deskou bez mechanických úprav hračky). Pro tuto práci jsem mohl využít informací získaných předcházejícími projekty, a to především projektem, který se zabýval ovládáním Furbyho přes paralelní rozhraní centronics (paralelní port). V dokumentaci tohoto projektu jsem načerpal cenné informace týkající se mechanického provedení a funkce čidel. Např. zde byl zmíněn způsob ovládání jednotlivých částí těla a zapojení senzorů. Některé z těchto poznatků jsou zmíněny v kapitole 2. Značnou část ostatních výsledků projektu jsem bohužel nemohl uplatnit, protože se týkaly specificky ovládání pomocí paralelního rozhraní. Hlídání pozice jednotlivých částí těla bylo soustředěno výhradně do aplikace běžící na ovládacím počítači. V mém projektu bylo naopak vhodné umístit část logiky přímo do Furbyho, jedná se tedy o návrh embedded zařízení. Dále bylo stanoveno, že pro bezdrátovou komunikaci se má využít BlueTooth modul firmy Free2Move. Proto jsem ještě před samotným zahájením této práce pracoval na semestrálním projektu týkající se implementace modulu. Jednalo se o návrh základní desky s tímto modulem. Zařízení ověřilo možnost bezdrátové datové komunikace pomocí modulu (bezdrátový sériový port) a přenosu audio signálu pomocí integrovaného audio kodeku. Při přenosu audio signálu se vyskytl problém s rušením a zašuměním zvuku. Toto se mi naštěstí podařilo z velké části eliminovat změnami v zapojení. Výsledky jsem uplatnil při implementaci modulu v rámci této bakalářské práce. Návrhem a schématem zapojení této desky se v dokumentaci zabývat nebudu, lze ho však najít na přiloženém cd. Deska je vyobrazena na Obr. 2.
Obr. 2 – základní deska BlueTooth modulu
2
2 Popis a specifikace hračky Furby Hračka Furby je robotické zřízení, které lze obecně rozdělit na část mechanickou a elektrickou. Na následujících řádcích se budu zabývat především popisem elektronické části, protože právě ta úzce souvisí s náplní mého projektu. Okrajově se zmíním i o nejnutnějších detailech mechanické konstrukce. Zobrazení Furbyho s odebranou deskou řídící elektroniky a popis komponent je na Obr. 3 a Obr. 4.
čidlo v zobáku
index spínač motoru č. 1
čidlo na břiše reproduktor mikrofon
Obr. 3 – boční pohled
3
enkodér
index spínač motoru č. 2 motor č. 2
čidlo na zádech motor č. 1 pouzdro na 4 tužkové baterie
Obr. 4 – zadní pohled
2.1 Mechanická konstrukce Mechanická část je ovládána akčními členy. V tomto případě se jedná o dva stejnosměrné motory napájené napětím okolo 6V. Každý z motorů ovládá určitou sadu partií Furbyho těla. První motor je umístěn ve spodní části a slouží k pohonu nohou a současně i zobáku. Nohy vykonávají kmitavý pohyb, čímž se tvoří iluze kolébavého pohybu. Současně tento motor ovládá i otevírání zobáku. Rozlišení mezi nohami a zobákem je zajištěno pomocí změny směru rotace motoru (z toho mimo jiné vyplývá skutečnost, že nohy mohou kmitat jen jedním „směrem“, což vzhledem k periodickému charakteru pohybu nepředstavuje problém). Změnou výkonu motoru je možné ovládat rychlost nohou nebo intenzitu rozevření zobáku. Při otvírání zobáku se však motor nijak výrazně netočí. Je zde využit jen k natažení pružiny, která vrací zobák. Toto bohužel způsobuje značné zatížení a tím i poměrně velký proud protékající vinutím motoru a řídícími obvody. Druhý motor slouží k ovládání horní skupiny částí těla (oči, uši a břicho). Všechny tyto prvky jsou ovládány jedním motorem. Pohyb jednotlivých elementů je řízen pomocí vačkové hřídele. Z těchto poznatků je patrné, že pohyb je sekvenční a cyklický. Během jednoho cyklu se vystřídají různé kombinace poloh a tím se vytváří mimika obličeje a těla. Toto mimo jiné znamená, že jednotlivé mimiky jsou vzájemně závislé. Změnou výkonu motoru je možné ovládat rychlost pohybu. Ke sledování polohy v rámci cyklu slouží optický inkrementální enkodér a index spínač, který sepnutím vymezuje počátek cyklu (polohu 0).
4
2.2 Elektronické prvky V následujících kapitolách přiblížím jednotlivé elektronické prvky Furbyho.
2.2.1
Inkrementální enkodér
Inkrementální enkodér ve Furbym (viz Obr. 5) slouží k hlídání polohy motoru, který ovládá sekvence pohybů horní části těla. Jedná se o elektromechanický převodník, který je spjat se sledovanou mechanikou, a který převádí rotační pohyb na sekvence tvarovaných elektrických impulsů. Frekvence, se kterou jsou generovány impulsy je přímo úměrná rychlosti otáčení hřídele procházející senzorem. Inkrementální enkodér generuje dva obdélníkové průběhy, vzájemně fázově posunuté, které se nazývají kanál A a kanál B (viz Obr. 6). Zpracováním samotného kanálu A lze získat informaci o rychlosti otáčení, s pomocí druhého kanálu je možné podle vzájemného fázového posunutí kanálů rozeznat i směr otáčení. Pokud se kolečka otáčejí ve směru znázorněném na obrázku červenými šipkami, předbíhá kanál B před kanálem A (viz situace vpravo na Obr. 6). Pokud se otáčejí opačně, předbíhá naopak kanál A před kanálem B (viz situace vlevo na Obr. 6).
Obr. 5 – inkrementální enkodér
5
kanál A
kanál B
Obr. 6 – průběh signálu z enkodéru
Existují mechanické i optické provedení enkodérů, v současnosti se využívají především optické, vzhledem k jejich vyšší přesnosti a spolehlivosti. Nejinak je tomu i ve hračce Furby, i zde je využito optické varianty. Optický enkodér ve Furbym je založen na průchodu světla skrz děrované kolečko, které je spojené s hřídelí. Jako zdroj světla je zde použita infračervená led dioda. Emitované záření dopadá na kolečko s přesně vyfrézovanými otvory. Na opačné straně kolečka se nachází fototranzistor, který je citlivý na infračervené záření. Při dopadu záření se otevře a prochází jím proud z připojeného zdroje. Impulsy jsou generovány rotací kolečka, které střídavě přerušuje světelný paprsek mezi led diodou a fototranzistorem jak ukazuje Obr. 7. Kolečko ve Furbym má nepravidelné rozložení děr, tudíž pulsy jsou vždy kratší než mezery mezi nimi (viz průběh na Obr. 8). Vzniklé impulsy navíc nemají správný tvar požadovaný pro následné korektní digitální zpracováni (průběh s pomalým náběhem může způsobovat špatnou interpretaci na vstupu mikrokontroléru), proto je napětí z výstupu senzoru ještě zpracováno schmittovými klopnými obvody (integrovaný obvod 74HC14), které současně zavádí hysterezi (zabraňuje kmitání v oblasti přechodu mezi logickými úrovněmi). Výsledkem jsou obdélníkové pulsy se strmými hranami. Převod tvaru signálu je znázorněn také na Obr. 8. Zatím jsem se zmínil pouze o kanálu A, signál pro kanál B je podle mých zjištění generován pomocí druhého fototranzistoru, který je umístěn ihned vedle prvního. Oba fototranzistory jsou integrovány v jednom pouzdře.
Obr. 7 – princip inkrementálního enkodéru
6
výstup z fototranzistoru
výstup z enkodéru po úpravě obvodem 74HC14
Obr. 8 – tvar výstupních signálů enkodéru
Na základě informací ze samotného enkodéru je možné zjistit pouze směr a uraženou dráhu (čítáním impulsů). Pro určení absolutní pozice v rámci jednoho cyklu vačkového hřídele je nutné určit začátek cyklu. Toto zajišťuje index spínač, který sepne vždy na začátku cyklu. Na jeden cyklus připadá cca 213 impulsů (213 poloh) enkodéru. 2.2.2
Furbyho dotykové senzory
Furby má celkem 4 čidla, která slouží k interakci s okolím. Jsou to senzory na břiše, na zádech, v zobáku a snímač polohy. Všechny snímače kromě polohového čidla se sestávají z jednoduchých mechanických spínacích kontaktů. Kontakty jsou v sepnutém stavu, pokud je na čidlo vyvíjen mechanický tlak (například při stlačení rukou). Čidlo polohy má tři vývody a snímá, zda je hračka postavena normálně nebo vzhůru nohama. Na základě polohy se sepne prostřední vývod na jeden ze dvou krajních. Čidlo je nerozebíratelné, tudíž jeho princip činnosti nelze přesně zjistit, avšak pravděpodobně je uvnitř pohyblivý prvek z vodivého materiálu, který se překlápí na základě působení tíhové síly a dotýká se přitom vnitřních kontaktů. Za zmínku stojí skutečnost, že toto čidlo je velmi nekvalitní a udává nepřesné a často falešné údaje. Na výstupu všech mechanických spínačů dochází k zákmitům. 2.2.3
Audio rozhraní
Audio rozhraní slouží pro hlasovou komunikaci s člověkem. Je tvořeno elektretovým mikrofonem a malým reproduktorem. 2.2.4
Seznam Furbyho elektrických komponent
Na závěr popisu Furbyho uvádím seznam komponent, které je nutné propojit s řídící elektronikou: • • •
• • • •
motor č. 1 (spodní motor) motor č. 2 (horní motor) čidla o břicho o záda o zobák o čidlo pozice index spínače motoru č. 1 a č. 2 inkrementální enkodéru mikrofon reproduktor
7
3 Analýza a návrh řešení hardwarové části Původní řídící elektronika je soustředěna na jedné desce plošných spojů, na které se nachází jak výkonové obvody, tak i řídící procesor. Na desce jsou využity procesory neznámého typu, u nichž nebylo možné identifikovat výrobce ani typ. Jedná se o integrované obvody, jejichž pouzdro je přímo napařeno na desce. Úprava desky spočívá v její kompletní výměně. Bylo nutné navrhnout nové schéma zapojení a layout desky (=rozmístění součástek a vodivých spojů). Návrh layoutu desky je obtížnější vzhledem k nutnosti dodržet přesně stejný tvar i rozměry jaký má původní deska. Silně omezující skutečností byl především malý rozměr desky a nutnost zachování stejného rozmístění konektorů, což vedlo k nutnosti minimalizace počtu součástek na nezbytné minimum. Blokové schéma nové hardwarové architektury systému je na Obr. 9. Je zde zobrazeno hierarchické budoucí uspořádání Furbyho. Detailní blokové schéma návrhu základní desky je na Obr. 10.
Obr. 9 – nová hardwarová architektura
8
mikrofon
reproduktor
napájení elektretového mikrofonu
stabilizátor napětí (napájení BT modulu)
napěťový dělič (pro kontrolu napětí baterií)
bezdrátové BlueTooth rozhraní buletooth modul F2M03AC2 sériová linka
řídící signály senzory
mikrokontrolér index spínače
Atmel ATMega8 stabilizátor napětí (napájení mikrokontroléru)
napájení motorů přímo z baterie
inkrementální enkodér
H-můstek L293D, výkonové řízení motorů
motor 1
motor 2
Obr. 10 – blokové schéma návrhu hardwarové části Furbyho
Během návrhové části vzniklo testovací zapojení (viz Obr. 11), na němž jsem zkoušel možnosti ovládání Furbyho.
Obr. 11 – pokusná deska
9
3.1 Výběr elektronických obvodů K jednotlivým blokům návrhu hardwarové části Furbyho, jak je uveden na Obr. 10, jsem provedl výběr konkrétních elektronických obvodů. Zadání práce stanovilo povinnost využít pro zajištění bezdrátového přenosu BlueTooth modul firmy Free2Move. Jeho napájecí napětí činí 3.3V, což vedlo k výběru ostatních součástek se stejným napájecím napětím, aby se zajistilo bezproblémové vzájemné propojení bez nutnosti převodu logických úrovní. V zapojení jsem se rozhodl využít klíčové komponenty uvedené v Tab. 1
Typ
Popis
Funkce ve Furbym řízení pohybu, snímání senzorů a komunikace po sériové lince bezdrátová komunikace sérová linka + audio kanál
Atmel ATMega8L-8AU
mikrokontrolér
Free2Move F2M03AC2
BlueTooth modul
L293D
H-můstek
výkonové řízení motorů
LP2950CZ-3.3
napěťový stabilizátor
stabilizace napájecího napětí 3,3V pro logiku
Tab. 1 – použité komponenty
3.1.1
BlueTooth modul Free2Move F2M03AC2
Obr. 12 – BlueTooth modul Free2Move F2M02AC2
Využití BlueTooth modulu F2M03AC2 (viz Obr. 12) bylo stanoveno již při zadávání práce, vhledem k jeho dostupnosti na fakultě, a protože se jeho využitím zabývá již více projektů na katedře počítačů. Jeho použitím se zabýval i můj podpůrný projekt pro tuto bakalářskou práci, zmíněný již v úvodu této dokumentace, ve kterém jsem si ověřil a otestoval jeho schopnosti a docílil i relativně slušné kvality audio přenosu integrovaným kodekem. Díky tomu není v této práci nutné použít externí audio kodek. F2M03AC2 je integrovaný modul který splňuje tyto pro můj projekt podstatné požadavky: • • • •
Implementuje BlueTooth stack, podporuje BlueTooth verze 1.1, třídy 2. Obsahuje integrovanou anténu. Obsahuje integrovaný audio kodek (15 bitové rozlišení). Obsahuje analogové audio rozhraní (analogový vstup a výstup pro mikrofon a reproduktor včetně zesilovače a předzesilovače).
10
• • •
Možnost připojení externího kodeku (nakonec nebylo třeba využít v mém návrhu). Podporuje profil bezdrátového sériového portu (wireless uart), což umožňuje transparentní přenos informací stejně jako po metalické sériové lince. Umožňuje konfiguraci parametrů sériové linky i parametry audio rozhraní.
Modul obsahuje vlastní řídící procesor s kompletním firmwarem, takže není nutné jeho dodatečné programování ani řízení. Sám zajišťuje párovací sekvenci při navazování spojení s partnerským BlueTooth zařízením. Jediná situace, při které je nutné zasáhnout do jeho automatického provozu, je při konfiguraci parametrů, jakými je například změna nastavení přenosové rychlosti bezdrátové sériové linky nebo zisků audio rozhraní (zesílení zvuku). Konfigurace se provádí připojením k USART vývodům modulu a zasíláním příkazů. Toto lze automatizovaně zajistit pomocí konfiguračního software dodávaného firmou Free2Move. Při konfiguraci musí být modul odpojen od BlueTooth zařízení. Modul se ukázal jako vhodný nejen díky integrovanému audio kodeku, ale i protože integruje mnoho funkcí, je malých rozměrů a umožňuje eliminaci značného množství pomocných externích součástek, což je vzhledem k malé finální velikosti osazené desky podstatné. Obsahuje analogové audio rozhraní se symetrickými vstupy a výstupy a umožňuje tedy přímé připojení reproduktoru. Elektretový mikrofon lze připojit, ale je nutné vytvořit mikrofonní napájecí obvod, protože elektretový mikrofon obsahuje vždy i interní zesilovač využívající JFET tranzistoru. Modul poskytuje asynchronní obousměrný datový kanál a synchronní obousměrný audio kanál. Oba typy přenosů je možné využívat současně. Nevýhodou tohoto modulu je způsob jeho letování k desce plošných spojů, vývody jsou totiž umístěny zespodu a přiletování může být značně náročné. Jeho napájecí napětí činí 3.3V, což vedlo k výběru ostatních součástek se stejným napájecím napětím, aby se zajistilo bezproblémové vzájemné propojení bez nutnosti převodu logických úrovní. Základní elektrické parametry modulu jsou uvedeny v Tab. 2
Parametr napájecí napětí špičkový proudový odběr max. vyzářený výkon zisk audio výstupu zisk mikrofonního audio vstupu podporované rychlosti sériové linky
Hodnota 2.5 až 3.5 V DC 85 mA 4dBm 21dB, rozlišení 3dB 42dB, rozlišení 4dB 2.4, 4.8, 9.6, 19.2, 38.4, 57.6, 115.2 kbaud
Tab. 2 – technické parametry modulu
3.1.2
Mikrokontrolér
Mikrokontrolér je základním řídícím prvkem systému. Kontroluje pozici jednotlivých prvků Furbyho těla, řídí pohyb motorů, kontroluje stav senzorů. Mikrokontrolér (MCU) je obecně jednočipový počítač, který v jednom pouzdru sdružuje aritmeticko-logickou jednotku, řadič instrukcí, registry, paměti různých druhů (FLASH, SRAM, EEPROM), vstupně-výstupní (dále I/O - input/output) porty a může obsahovat hardwarové
11
jednotky jako čítače, analogově-číslicové převodníky (A/D převodníky), řadiče různých sériových rozhraní apod. Konkrétní vlastnosti se liší podle zvoleného typu mikrokontroléru. Při výběru vhodného typu jsem přihlížel k následujícím kritériím: • • • • • • • •
napájecí napětí počet i/o pinů (vývodů) druhy integrovaných hardwarových jednotek (modulů) velikost programové paměti flash a paměti dat SRAM rychlost dostupnost překladače pro jazyk C velikost pouzdra dostupnost
Velikost napájecího napětí souvisí s nutnosti využít BlueTooth modul F2M03AC2 s napájecím napětím 3.3 V. Od tohoto napájecího napětí se totiž odvíjí napěťové logické úrovně I/O pinů modulu, které budou propojeny s MCU. Nejjednodušším řešením tedy je zvolit identické napěťové úrovně u MCU. Toto zúžilo výběr na 3.3V modely. Počet I/O pinů souvisí s nutností obsloužit všechny senzory Furbyho, řízení motorů a kontrolní linky BlueTooth modulu. Některé vývody MCU jsou sdílené s jeho integrovanými hardwarovými jednotkami jako například USART a některé jsou použity současně pro spouštění přerušení (externí přerušení). To snižuje množství vývodů použitelných jako vstupně-výstupní, pokud je nutné jednotky využívat. Existují i řešení, které snižují počet nutných vývodů za využití multiplexerů, avšak toto řešení se jeví v případě mojí práce jako ne příliš vhodné, vzhledem k omezenému prostoru k osazení těchto integrovaných obvodů. Nakonec se ukázalo, že i většina jednoduchých mikrokontrolérů je z tohoto pohledu vyhovující. V Tab. 3 je uvedeno využití pinů pro jednotlivé funkce.
Využití
Počet pinů
Poznámka
řízení motorů
6
inkrementální enkodér
2
alespoň 2 musí podporovat PWM alespoň 1 z nich musí podporovat externí přerušení
index spínače dotyková čidla čidlo polohy kontrolní linky k BT modulu (reset, enable) kontrola napětí baterie sériová linka
2 3 2 2 1 2
vstup A/D převodníku RX a TX vývod jednotky USART
Tab. 3 – využití vývodů mikrokontroléru
Paměťové ani rychlostní nároky v mé aplikaci nejsou nikterak vysoké a proto rychlost MCU a velikost paměti nebyly rozhodujícím parametrem. Po zvážení předchozích kritérií a dostupnosti v obchodech jsem se rozhodoval mezi mikrokontroléry firmy Microchip a Atmel.
12
Pro výrobky firmy Atmel existuje poměrně kvalitní freewarový překladač jazyka C s názvem GCC, který je součástí balíčku WinAVR. Tento balík lze snadno zakomponovat do vývojového prostředí AVRStudio fy Atmel. Firma Microchip naproti tomu využívá svůj komerční překladač C18 a C30. Tento je sice dostupný i ve volně dostupné verzi, avšak s jistými omezeními především v možnostech optimalizace překládaného kódu. Některé mikrokontroléry Microchip dostupné na katedře počítačů umožňovaly připojení externího audio kodeku, ale vzhledem k dosažení slušné kvality s interním kodekem BlueTooth modulu toto nakonec nehrálo podstatnou roli. Navíc tyto mikrokontroléry disponují pro aplikace ve Furbym zbytečně vysokým výpočetním výkonem a bylo by neekonomické využívat je zde. Vzhledem k těmto skutečnostem a s přihlédnutím k tomu, že jsem se již dříve seznámil s mikrokontroléry Atmel, jsem se rozhodl vypustit ze zřetele modely fy Microchip. Jako vhodné se zdály 8-bitové MCU Atmel z rodiny ATmega zmíněné v Tab. 4, které nedisponují nadbytečně vysokým výpočetním výkonem.
typ MCU velikost programové paměti FLASH velikost paměti SRAM velikost paměti EEPROM počet I/O pinů počet PWM jednotek externí přerušení počet A/D kanálů počet časovačů napájecí napětí
ATmega8-L
ATmega16-L
8 kB
16 kB
1 kB 0.5 kB 23 3 2 8 3 2.7 - 5.5 V
1 kB 0.5 kB 32 4 3 8 3 2.7 - 5.5 V
Tab. 4 – porovnání parametrů mikrokontrolérů
Oba modely plně vyhovují požadavkům na počet hardwarových jednotek a pinů. Větší počet pinů u modelu ATmega16 znamená pouzdro s větším množstvím vývodů a většími rozměry, což je zbytečný luxus za cenu horšího osazování a větší zabrané plochy na desce. Další výrazný rozdíl z mého pohledu představovala velikost flash paměti, která představuje u těchto mikrokontrolérů úložiště pro instrukce programu. Proto jsem ještě před výběrem provedl pokus o napsání části firmwaru (především část pro řízení motorů a komunikaci po sériové lince) a ozkoušení na provizorním testovacím zapojení (viz Obr. 11), abych odhadl paměťové nároky. Z následné analýzy vyplynulo, že i velikost paměti 8kB bude s nejvyšší pravděpodobností dostatečná. Zvolil jsem proto model ATmega8-L. Na následujících řádcích přiblížím vlastnosti tohoto mikrokontroléru. Tab. 5 přibližuje parametry z elektronického pohledu. Kompletní informace o mikrokontroléru ATmega8L lze najít v katalogovém listu [1].
Parametr
Hodnota
napájecí napětí proudový odběr maximální proud pinu log1.
3.3 V 7mA + ∑(IOH)pinů 40 mA (součet IOH všech pinů musí být <=300mA)
(IOH)
13
Parametr vstup. napětí na pinu pro log. 1 vstup. napětí na pinu pro log. 0 výstupní napětí v log. 0 min. výstupní napětí v log. 1
Hodnota (VIH) (VIL) (VOL) (VOH)
0.6.Vcc až Vcc+0.5V 0 až 0.2Vcc 0 až 0.5V 2.2V
Tab. 5 – elektrické parametry mikrokontroléru ATmega8-L (pro Vcc=3,3V)
I/O porty Jedná se o sdružení více vývodů (pinů), umožňujících komunikaci mikrokontroléru s okolím. Mikrokontrolér Atmel ATmega8 disponuje celkem 3 porty, pojmenovanými port B, C, D. Některé piny jsou samostatné, některé však sdílené s hardwarovými jednotkami včetně pinů pro připojení krystalu. Každý port obsahuje sadu kontrolních a datový registrů. Jednotlivé bity reprezentují piny daného portu. Jednotlivé piny lze ovládat individuálně nastavením patřičných bitů. Piny umožňují po elektrické stránce nastavení různých režimů. Přepínání se provádí pomocí kombinace nastavení kontrolních a datových registrů. Tab. 6 poskytuje stručný přehled základních konfigurací pinů. Maximální zatížení výstupních pinů dosahuje hodnoty cca 40mA. Režim pull-up znamená zjednodušeně interní připojení pinu k napájení (log. 1) přes rezistor s vysokou impedancí. To znamená, že pokud není pin připojen z vnějšku k potenciálu nižšímu než úroveň log. 1, je na pinu definovaná hodnota log. 1.
Směr vstupní výstupní
Režim stav vysoké impedance připojen interní pull-up rezistor logická 1 logická 0 Tab. 6 – seznam režimu pinů
USART modul Zkratka USART vychází z anglického názvu „Universal Synchronous and Asynchronous serial Receiver and Transmitter“, což znamená univerzální synchronní a asynchronní přijímač a vysílač. Tento modul se využívá pro komunikaci po sériových linkách. Převádí paralelně zadaná data obsažená ve výstupním registru na posloupnost odesílaných bitů nebo naopak skládá přijatou posloupnost do paralelně uspořádaných bitů přijímacího registru. Bližší informace o USART jednotce uvádějí katalogové listy [1].
Časovače Časovače jsou samostatné hardwarové moduly. Skládají se z čítače a řídící logiky. Jako „hodinová“ frekvence pro čítač je použita frekvence systémových hodin (krystalu mikrokontroléru) nebo frekvence externího zdroje. Frekvence je buď přivedena přímo na vstup čítače, nebo je ještě poslána přes předděličku , která redukuje kmitočet na požadovanou hodnotu. K dispozici je několik dělících poměrů, vždy je ale jeho hodnota mocninou dvou. Celkem obsahuje MCU 3 čítače, z toho
14
2 osmibitové a jeden šestnáctibitový. Časovače v MCU ATmega8 jsou schopny generovat různé druhy přerušení: • •
Přerušení při přetečení čítače Přerušení při shodě hodnoty čítače s požadovanou hodnotou
Tyto přerušení lze využít pro přesné časování, protože časovač běží víceméně nezávisle na běhu programu (je to samostatný hw modul) a není tedy přímo ovlivněn během programu a přerušeními. Jednotky časovačů poskytují kromě vyjmenovaných schopností ještě velmi široké spektrum schopností (liší se podle typu čítačů, každý poskytuje mírně rozdílnou sadu funkcí), jejichž vyčerpávající popis je možno získat v katalogových listech [1]. Pro mou aplikaci je nejpodstatnější schopnost generovat PWM průběhy. Popisem PWM se zabývá kapitola 3.2. 3.1.3
H-můstek
H-můstek je výkonový obvod pro řízení motorů. Přímé řízení motorů pomocí mikrokontroléru není možné, jelikož neposkytuje výkonové výstupy a nedokáže proto ovládat motor. Zjednodušené obecné schéma H-můstků (nikoliv přímo L293D) pro řízení motorů je uvedeno na Obr. 13
Obr. 13 – obecné schéma H-můstku
Toto zapojení je schopno regulovat směr otáčení a s použitím další logiky i rychlost otáčení za pomocí PWM řízení (viz kap. 3.2). Na následujících řádcích objasním jeho funkci. Jedná se o čtveřici výkonových spínacích tranzistorů. Tranzistory se spínají po dvojicích (vždy jen jedna dvojice sepnuta). Tím se mění směr proudu protékajícího motorem a tím směr otáčení. Pokud jsou otevřeny tranzistory T1 a T2 a uzavřeny T3 a T4 prochází proud cestou T1→M→T2 a motor se otáčí jedním směrem. Pokud jsou naopak sepnuty tranzistory T3 a T4, prochází proud cestou T3→M→T4 a motor se točí opačným směrem. Pokud se daná dvojice střídavě otevírá a zavírá, např. pomocí přivedení PWM signálu na báze tranzistorů, reguluje se výkon a otáčky motoru. Ochranné diody v zapojení jsou nutné z důvodu spínaní indukční zátěže (dochází k přechodovému ději) a také umožňují průtok proudu při běhu motoru na prázdno (chová se jako generátor). H-můstky se běžně dodávají jako kompletní řešení v integrovaném obvodu. Při výběru takového obvodu jsem volil mezi obvody L293 a L293D. Oba obvody obsahují 2 úplné H-můstky, a tudíž umožňují plnohodnotné řízení dvou motorů. Současně obsahují i ochranu proti tepelnému přetížení. Obvody mohou mít oddělené napájení vstupní a výstupní (výkonové části) a jejich vstupy jsou TTL kompatibilní. 15
Obvod L293D obsahuje navíc ochranné diody. Oproti L293 má však nižší maximální proud, který je schopen spínat a to 1.2A oproti 2A u L293. Nakonec jsem po zátěžových testech zvolil obvod L293D. Proud jednoho z motorů sice dosahuje při otevírání zobáku téměř 1.2A, což je na hranici možností, ale při rozumném způsobu řízení, kdy se omezí výkon motoru, lze zabránit tepelnému poškození obvodu. Logické schéma obvodu L293D a log. funkční tabulku uvádím na Obr. 14 a elektrické parametry uvádí Tab. 7.
A … vstupy Y … výstupy EN … vstup povolení (enable) Funkční tabulka vstupy EN
výstupy Y
H
H
H
L
H
L
X
L
Z
A
H … log 1 L … log 0
X … don´t care Z … stav vysoké impedance
Obr. 14 – logické schéma obvodu L293D Parametr napájecí napětí vstupních obvodů
Hodnota Vcc1
4,5 – 7 V
napájecí napětí výstupních obvodů Vcc2
Vcc1 – 36 V
maximální špičkové proudové zatížení
1,2 A
vstup log 0 VIH
2,3 – Vcc1
vstup log 1 VOH
0 – 1,5 V Tab. 7 – elektrické parametry obvodu L293D
3.1.4
Napěťový regulátor
Pro snížení napětí a zajištění jeho stability a neměnnosti slouží stabilizátory. Ve Furbym je potřeba zajistit napájení pro BlueTooth modul a MCU 3,3V. Pro toto napětí existuje více druhů lineárních stabilizátorů s pevným napětím (využití stabilizátoru s proměnným napětím by bylo pro moji potřebu naprosto zbytečné). Stabilizátory s pevným napětím se liší především hodnotou výstupního napětí, vstupního napětí, maximálním výstupním proudem, úbytkem napětí na stabilizátoru. Vybíral jsem mezi modely s pouzdrem TO-92, což je vzhledem k velikosti výhodnější než využít stabilizátory s vyšším výkonem s pouzdrem TO-220. Současně mají nízkovýkonové stabilizátory většinou nižší úbytky napětí. V úvahu padly dva modely uvedené v Tab. 8. Tyto typy se vyznačují nízkým napěťovým úbytkem a jsou vhodné pro aplikaci napájenou z baterií, kterou Furby je. Oba splňují mé požadavky. Konkrétní typ závisí na dostupnosti v době nákupu.
16
Typ výstupní napětí max. vstupní napětí max. výstupní proud napěťový úbytek (Udrop)
LE33CZ
LP2950CZ-3.3
3,3 V 18 V 150 mA
3,3 V 30 V 100 mA
0,5 V
0,4 V
Tab. 8 – porovnání napěťových stabilizátorů
3.2 PWM regulace motorů Řízení výkonu motorů bude zajištěno pomocí PWM regulace. PWM znamená „Pulse-Width Modulation“, v překladu pulzně-šířková modulace. Jedná se o metodu, kterou je možné mimo jiné využít pro řízení výkonu a rychlosti motorů. PWM průběhy lze generovat pomocí časovačů v mikrokontroléru viz katalogové listy [1]. Při digitálním způsobu generování PWM signálu čítá čítač ke své maximální hodnotě a pak změní směr a odečítá k minimální. Současně při dosažení určité zadané hodnoty se přehodí logická úroveň na výstupním pinu, viz Obr. 15. TOP porovnávaná hodnota hodnota čítače BOTTOM
výstupní signál
Obr. 15 – princip digitálního generování PWM signálu
Frekvence PWM se vypočítá podle vzorce (1)
(1)
kde TOP je maximální hodnota čítače, systémových hodin mikrokontroléru.
N je hodnota předděličky a fclk je frekvence
Příklad průběhu napětí na výstupu PWM jednotky je uveden na Obr. 16. Jsou zde zobrazeny tři průběhy s různou šířky pulsů v rámci periody, která je u všech tří průběhů stejná. Oranžovou čarou je znázorněna střední hodnota Us (stejnosměrná složka). Tuto střední hodnotu můžeme spočítat ze vztahu (2).
(2)
V případě uvedeného pravoúhlého signálu lze využít intuitivního vztahu (3) vyjadřujícího to samé za pomocí poměru Tp/T, který vyjadřuje podíl času kdy je signál nahozený v log. 1.
17
(3)
Vliv na výkon motoru má především stejnosměrná složka. Pokud je tedy napětí takovéhoto průběhu přivedeno na elektrický stejnosměrný motor chová se podobně, jako bychom prováděli spojitou analogovou regulaci jeho výkonu. Motor tím mění své otáčky. Doporučenou podmínkou je, aby frekvence pokud možno byla současně za hranicí slyšitelnosti, jinak by bylo slyšet pískání při běhu motoru. Pro lidské ucho je horní hranice slyšitelnosti přibližně 20 kHz.
Obr. 16 – příklady výstupních PWM průběhů
18
4 Implementace hardwaru V následujících kapitolách uvedu konkrétní implementaci jednotlivých částí hardwaru pomocí schémat, případně doplním slovním doprovodem. Ke konci se zmíním také o návrhu fyzické podoby desky tištěných spojů (tzv. layoutu desky) a zkompletování Furbyho. Veškerá schémata i návrh desky tištěných spojů (PCB) jsem realizoval v programu Eagle 4.15, který jsem zvolil především pro jednoduchost ovládání. Celkové schéma a návrh desky ve velkém formátu je možné nalézt v příloze C nebo na přiloženém CD médiu (obsah viz příloha B). ¨
4.1 Popis zapojení Tato kapitola se zabývá popisem zapojení klíčových součástí Furbyho základní desky. U jednotlivých částí jsou uvedeny i příslušné výřezy schématu. 4.1.1
Napájení
Napájení je zajištěno čtyřmi tužkovými bateriemi. Hodnota napětí je tedy 4 1.5 V 6 V za předpokladu použití běžných baterií. Napájení lze rozdělit do dvou větví: • •
napájení motorů napájení logiky (mikrokontrolér, BlueTooth modul) Motory jsou napájeny skrze H-můstek, který je napájen přímo z baterií.
Napájení logiky vyžaduje stabilizaci napájecího napětí na hodnotě 3.3V. Pro tento úkol využívám lineární stabilizátor LP2950CZ-3.3, výkonnější model LM33CZ bohužel nebyl v době nákupu dostupný. Maximální proudové zatížení stabilizátoru činí 100 mA. Pro stanovení celkového odběru logiky jsem provedl měření, ze kterého vyplynulo, že maximální odběr BlueTooth modulu při spuštěném audio i datovém přenosu je cca 96mA (přestože výrobce uvádí 85 mA). Odběr mikrokontroléru se pohybuje průměrně okolo 35mA, ale značně závisí na aktuální činnosti, režimu I/O pinů a samozřejmě i na parametrech připojených obvodů (především proud IIH vstupních pinů). Připojenými obvody mám na mysli H-můstek a BlueTooth modul. Z uvedených hodnot spotřeby plyne, že není rozumné využít pouze jednoho stabilizátoru. Proto jsem nakonec využil dva stabilizátory, jeden pro napájení BlueTooth modulu a jeden pro mikrokontrolér. Ještě bych rád zmínil, že i v případě využití stabilizátoru LM33CZ s proudovým zatížením 150mA by bylo pravděpodobně vhodnější využít dvou stabilizátorů vzhledem k velké variabilitě odběru mikrokontroléru. Každý integrovaný obvod má blízko napájecích pinů na napájecí větvi umístěn blokovací kondenzátor. Schéma zapojení napájení je uvedeno na Obr. 17. Problémem, který je nutné řešit, je omezení poklesů napětí při spínání motorů. Motory jsou připojeny přímo k baterii přes výkonový H-můstek, tudíž při jejich rozjezdech dochází k pulzním poklesům napětí na hlavní baterii, což by bez náležitého ošetření mohlo způsobit resetování
19
mikrokontroléru nebo BlueTooth modulu. Napájecí část logiky jsem proto oddělil od hlavního napájení diodou D1. K omezení poklesů slouží dioda D1 v kombinaci s elektrolytickým kondenzátorem C1. Jako dioda je použita schottkyho dioda, která má nižší úbytek napětí v propustném směru, cca 0.3 V oproti 0.7 V u klasické usměrňovací diody s PN přechodem a současně vykazuje rychlou odezvu (rychlou schopnost uzavření). Nízký úbytek je zde kritickým parametrem, neboť Furby je napájen z baterií, a pokud zvolíme akumulátory s napětím 1.2V (NiCD, Ni-MH) tak napětí bude 4 1.2 V 4.8 V. Přitom vstupní napětí stabilizátorů musí být minimálně 3.8V, aby byly schopné udržet hodnotu výstupního napětí na stabilních 3.3 V. Pokud by byl úbytek vysoký např. 0.7 V, zbývalo by pouze 4.1 V pro stabilizátory (a i pro kondenzátor C1) a to ještě při plně nabitých akumulátorech. Při využití schottkyho diody zbývá 4.5V. Přes diodu se nabíjí kondenzátor C1, který slouží jako stabilizace napájecího napětí a zásobárna elektrického náboje. Pokud hlavní napájecí napětí klesne pod úroveň napětí na tomto kondenzátoru, dojde k závěrné polarizaci diody, která tím zamezí odčerpání náboje kondenzátoru motory. Kondenzátor slouží po dobu napěťového poklesu jako zdroj napětí pro logiku. Zvolil jsem kondenzátor s co největší kapacitou, omezením byla jeho fyzická velikost. Zvolil jsem kapacitu 470µF. Pro kondenzátor platí vztah (4)
% &
(4)
dále platí
'
()
(5)
(
po dosazení do (4)
'&
(* (
&
+* +
(6)
po úpravě
,
-+* .
(7)
Přípustný pokles napětí činí , 4.5 / 3.8V 0.7 V , kapacita je 470 µF, spotřeba I=200mA. Dosazením do (7) lze zjistit, že při spotřebě 200mA (naddimenzována) dokáže kondenzátor krýt spotřebu (pokles napětí ze 4.5 na 3.8V) po dobu přibližně 1.645 ms. Toto by měla být dostatečná doba pro pokrytí kratších poklesů. Kondenzátor C19 je přidán kvůli delší vzdálenosti příslušného stabilizátoru od kondenzátoru C1, ostatní kondenzátory respektují doporučená zapojení stabilizátorů (byly upraveny hodnoty kapacity).
20
kladný pól baterií
výstup 3.3V pro mikrokontrolér a programovací konektor
výstup 3.3V pro BlueTooth modul a napájení elektretového mikrofonu
C4 blokovací kondenzátor
Obr. 17 – zapojení napájecí části 3.3 V
4.1.2
Zapojení provozních pinů MCU
Jako provozní piny označuji vývody pro napájení MCU, krystal, a různé analogové referenční vstupy a napájení. Jejich zapojení zobrazuje Obr. 18. Dvojice součástek L1 - C7, L4 - C4 tvoří mimo jiné dolnopropustní filtry. Dodatečný pull-up rezistor R9 je zde z důvodu zlepšení ochrany před nechtěným resetem obvodu (MCU obsahuje i slabý interní pull-up). C4 slouží jako blokovací kondenzátor pro referenční pin A/D převodníku. Tento pin není přímo funkčně využit, protože je využita interní reference. I přesto je ale tento vývod interně spojen s převodníkem a jeho interní referencí. C4 proto zvyšuje odolnost proti indukovanému vnějšímu vysokofrekvenčnímu rušení. Pro vyšší frekvence kondenzátor představuje nízkou impedanci, tudíž „svod“ na zem.
21
Vcc 3.3V od stabilizátoru
Obr. 18 – zapojení provozních pinů mikrokontroléru
4.1.3
Zapojení H-můstku
H-můstek slouží k výkonovému řízení motorů. Je reprezentován obvodem L293D. Obě napájení (Vcc1, Vcc2) jsou připojeny přímo na baterie, protože i napětí vstupní části (Vcc1) vyžaduje minimálně 4,5V. Ostatní piny jsou spojeny s mikrokontrolérem a motory a jejich význam je uveden ve schématu, jímž se zabývá Obr. 19. Tab. 9 ukazuje, jak je propojen mikrokontrolér a Hmůstek.
Obr. 19 – zapojení H-můstku
22
H-můstek
MCU
4A
MOT1_CH1
PC2
3A
MOT1_CH2
PC1
3-4EN
PWM1
PB2(OC1B)
2A
MOT2_CH1
PC0
1A
MOT2_CH2
PC3
1-2EN
PWM2
PB1(OC1A)
Tab. 9 – propojeni H-můstku a MCU
4.1.4
Připojení mikrofonu
Ve Furbym je využit pro příjem zvuku elektretový mikrofon. Já ho také využívám připojený k audio vstupu BlueTooth modulu. Elektretový mikrofon potřebuje pro svou činnost přivést na kladnou svorku napájecí napětí. Toto napětí napájí interní předzesilovač, který je součástí mikrofonu a je skrytý uvnitř pouzdra. Většinou je tvořen JFET tranzistorem. K zajištění napájení mikrofonu jsem využil doporučené schéma zapojení uvedené v katalogových listech BlueTooth modulu [2] uvedené na Obr. 20. Přidal jsem filtr tvořený L2, C13, C14 důležitý k odstranění potenciálního rušení pronikajícího z napájecí větve. Změnil jsem hodnotu kondenzátoru C16, jehož hodnotu jsem zvýšil z původních 47nF na 100nF. Tato úprava vedla ke znatelnému odstranění rušení a tím zlepšení kvality zvuku.
napájecí napětí 3.3V
svorky mikrofonu
vstup BT modulu MIC +
vstup BT modulu MIC -
Obr. 20 – napájecí obvod mikrofonu
4.1.5
Připojení A/D převodníku
Napěťový dělič, jehož zapojení ilustruje Obr. 21, slouží k tvorbě snímaného napětí pro A/D převodník. Převodník sleduje stav baterií a jeho reference je nastavena interní 2.56V. To znamená, že převodník je schopen měřit napětí v rozmezí 0 – 2.56V. Maximální napětí baterií se ale pohybuje něco nad 6V (maximálně asi 6.5V, ale silně záleží na použitých bateriích), tudíž je nutno z něj vytvořit nižší napětí např. pomocí děliče (zachovává linearitu). Je nutno, aby při maximálním požadovaném měřitelném napětí baterií bylo výstupní napětí 2.56V, aby A/D převodník byl schopen měřit celý rozsah. Pro dělič jsem volil hodnoty rezistorů z řady E12. 23
Pro dělič platí vztah (8).
3ý 5
56
6 57
89
(8)
zvolil jsem R1=2.7kΩ a R2=3.9kΩ, po dosazení do (8) tedy <==
2.56 : ; <==>?== 6.258 :
(9)
Pro vstupní větší než cca 6.258 V nebude převodník vykazovat změny hodnoty a bude ukazovat maximální hodnotu, tzn. po softwarovém přepočtu (na straně řídícího PC) přibližně 6.258V. Převodník je 10-bitový, což znamená, že má 1024 kroků. Vztah mezi měřeným napětím a výsledkem konverze je uveden na následujícím řádku (10) *Cěř =F J *GHI
@A& B
(10)
po úpravě *
GHI
Kěř @A& =F
(11)
,kde Uref je referenčním napětím převodníku, ADC výsledkem převodu (celočíselná hodnota), U měř je měřenou hodnotou. Pokud je Uref = 2.56V, pak krok číní linearitu, takže výsledný krok činí
M.LO =F
0,0025V. Je zde dělič, který zachovává
; 0,00611V. Pokud se pro jednoduchost softwarově čte
nižší rozlišení (vyšších 8-bitů), tak krok činí Děličem protéká při 6.5V proud
.LM =F
M.LO LM
; 0,02445V.
*STU M.F <==>?== 0.97@, při minimálním 5Vě * F. P(ěQ,F.R 5STU <==>?== ; 0.62@. Tyto hodnoty Vě
P(ěQ,M.LR
bezpečném Furbyho provozním napětí 4.1V
bohatě zajišťují „tvrdost“ děliče, jsou dokonce o několik řádů větší, než proud odebíraný vstupem A/D převodníku. Kondenzátory slouží k odfiltrování rušivých vyšších frekvencí, C12 je umístěn prostorově co nejblíže mikrokontroléru. Přesné potlačení určitých frekvencí a dodržení Nyquistova kriteria není nutné, jelikož není třeba rekonstruovat časový průběh, postačuje amplituda v jednom okamžiku.
napětí z baterií
k A/D převodníku
Obr. 21 – napěťový dělič pro A/D převodník
24
4.1.6
Programovací konektor
Programovací konektor je 6-pinový. Pro programování mikrokontroléru lze využít metodu ISP (In System Programming). Je možné pomocí něj zařízení přeprogramovat bez nutnosti vyletování mikrokontroléru z desky. Na Obr. 22 je uvedeno schéma zapojení konektoru a fyzická podoba na desce. Metoda využívá rozraní SPI konkrétně následující piny mikrokontroléru: • • •
MISO - Master In Slave Out MOSI - Master Out Slave In SCK - clock
A také RESET pin mikrokontroléru, který je nutný pro přepnutí do programovacího režimu a reset MCU. Mikrokontrolér se při programování chová jako slave zřízení a programátor jako master. Na programovací konektor jsem vyvedl také zem (GND) a napájecí napětí 3.3V (VCC_1). Na stejné napájecí větvi je i mikrokontrolér, tudíž maximální zatížení Vcc pinu by nemělo přesáhnout určitou hodnotu (odhadem okolo 50mA-nelze přesně určit vzhledem k variabilní spotřebě mikrokontroléru). Dále jsem vytvořil kabel s redukcí, jehož jeden konec se připojí ke konektoru a druhý konec vyčnívá ven z Furbyho. Tab. 10 udává význam barev vodičů kabelu. Konektor na konci kabelu (v podobě jumper vidlice) je pinově kompatibilní s paralelním JTAG kabelem firmy Digilent, který je dostupný na katedře (využívaný pro programování vývojových desek s FPGA obvody Xilinx). Proto lze pro programování využít i tento kabel a v programu AVRDude zvolit jako programátor „xil“ (parametr programu -c xil).
pin MCU MISO MOSI SCK RESET Vcc GND
Funkce oranžová žlutá zelená modrá šedá červená
Tab. 10 – barevná reprezentace signálů prog. kabelu
Tento kabel obsahuje budiče. Pokud však chceme použít i přímé programování přes rozhraní centronics (paralelní port), je vhodné upravit zapojení a přidat na datové linky sériově ochranné rezistory (R5 až R8), hodnota postačí 1kΩ. Na desce Furbyho jsou pro tyto rezistory volné plošky pro přiletování. Standardně jsou zkratovány (propojeny). Případně je možno provést modifikaci na redukčním kabelu, který vyčnívá z Furbyho, bez nutnosti zásahu do desky nebo přímo na programátoru.
25
SCK
MISO
Vcc
GND RESET
MOSI
Obr. 22 – programovací konektor
4.1.7
Propojení BlueTooth modulu a MCU
Mikrokontrolér je pro účely sériové linky propojen s modulem pomocí signálů RXD, TXD, které zprostředkovávají komunikaci po sériové lince. Tyto signály jsou rozděleny propojkami (jumpery), aby bylo možné vedení přerušit a bylo možné externí napojení na modul např. pro potřebu konfigurace. Mikrokontrolér je současně schopen ovládat signály BlueTooth modulu, které slouží k resetu (pin RESET) a zakázání BlueTooth komunikace (PIO[2]). K tomuto propojení jsem přistoupil vzhledem k možnosti rozšíření firmwaru o funkce umožňující měnit konfiguraci modulu, např. přenosovou rychlost, kód pro párování BlueTooth apod. To by eliminovalo nutnost externí konfigurace a otevření Furbyho kvůli napojení na jumper sériové linky. K tomu je nutné zapojit oba výše zmíněné řídící signály. Piny jsou propojeny způsobem uvedeným v Tab. 11.
Mikrokontrolér RXD TXD PB4 (MISO) PB3 (MOSI)
BT modul TXD RXD RESET PIO[2]
Tab. 11 – propojení MCU a BlueTooth modulu
Jak je z tabulky vidět, jsou piny pro řídící signály sdíleny s rozhraním SPI. Probíhá přes ně tedy i komunikace při programování mikrokontroléru. Využít tyto piny současně i pro tento účel je v tomto případě možné, protože oba signály BlueTooth modulu jsou vstupní, což neovlivní komunikaci při programování MCU. Vedlejším efektem je pouze narušení činnosti modulu připojením programovacího kabelu (ovlivňuje RESET signál a způsobuje zákaz činnosti přes PIO[2] signál). Toto narušení neohrozí normální činnost Furbyho, protože během programování se BlueTooth modul nepoužívá pro komunikaci. Problém by šlo řešit i složitější cestou. Programování je podmíněno signálem RESET mikrokontroléru. Tudíž by bylo možné využít kombinační logiku pro odpojení BT modulu od MCU při programování. To by bylo možné realizovat např. hradly AND, což představuje třeba obvod 74HC08. V tomto případě je to ale zbytečné (signály modulu nejsou výstupní a jeho korektní činnost během programovací sekvence není potřebná).
26
4.1.8
Připojení enkodéru Schéma zapojení ukazuje Obr. 23. Propojení signálů MCU a enkodéru uvedeno v Tab. 12.
Enkodér
MCU
encoder channel A
PD3 (INT1)
encoder channel B
PD4
Tab. 12 – propojení MCU a enkodéru
GND
CH_A
CH_B
Vcc
Obr. 23 – konektor enkodéru
4.1.9
Připojení čidel
Čidla Furbyho se skládají z mechanických spínacích prvků. Tyto spínače jsem připojil vždy jedním pólem k zemi a druhým k pinu mikrokontroléru. Na těchto pinech je softwarově inicializován interní pull-up (lze si ho zjednodušeně představit jako rezistor k napájecímu napětí). Při rozepnutém spínači je logická úroveň 1 a při sepnutí je 0. Zapojení přibližuje Obr. 24. MCU
čidlo - spínač
Obr. 24 – zapojení čidel
27
4.2
Deska tištěných spojů Desku tištěných spojů (PCB) jsem navrhoval v programu Eagle. Návrh znázorňuje Obr. 25.
Obr. 25 – návrh desky plošných spojů
Při návrhu desky bylo nezbytné dodržet stejné rozměry, jako měla původní deska. Proto jsem nejdříve vytvořil okótovaný nákres původní desky. Podle něj jsem pak vytvořil v programu Eagle obrys. Deska má nepravidelné rozměry a narušují jí díry pro šrouby. Navíc do ní zasahují různé výstupky a podpěry ze strany Furbyho. Musel jsem tedy zajistit, aby s nimi rozměrnější součástky (např. elektrolytické kondenzátory) nekolidovaly. To vše samozřejmě spolu s malými celkovými rozměry komplikovalo rozmístění součástek. Proto jsem se již od samého začátku návrhu zapojení snažil o minimalizaci počtu komponent a složitosti zapojení. Mezi základní kritéria patří umístění blokovacích kondenzátorů co nejblíže vývodům integrovaných obvodů, zajištění dostatečné zemnící plochy na spodní vrstvě desky, dostatečné dimenzování vodivých drah pro předpokládaný proud. U vodičů vedoucích od MCU ke krystalu je vhodné minimalizovat délku, což eliminuje vyzařování vysokofrekvenčních složek energie do okolí a současně i citlivost k vnějšímu rušení. Mezi těmito vodiči jsem také natáhl zemnící plochy. V okolí antény BlueTooth modulu nesmí být kovové součásti tudíž i zemnící plochy, které jsem zde vynechal. Nejtěžší částí návrhu bylo rozmístění prokovů v oblasti mikrokontroléru, protože je zde poměrně málo místa a současně není vhodné narušovat spodní zemnící vrstvu příliš mnoha dráhami. Snažil jsem se tedy geometricky dráhy na spodní vrstvě rozmístit tak, aby zůstala co největší zemnící plocha konzistentní. Součástí návrhu desky bylo i doplnění knihoven programu Eagle o potřebné součástky. Knihovna představuje sadu schematických symbolů součástek a tvarů pouzdra s rozmístěním vývodů (fyzická reprezentaci). Navrhnul jsem tedy například součástku BlueTooth modulu F2M03AC2, pro který dosud neexistovala. 28
Návrh desky byl předán k zhotovení firmě, která se zabývá výrobou tištěných spojů. Po obdržení finálního produktu jsem osadil desku jednotlivými součástkami. Nejtěžší zde bylo (jak jsem předpokládal) osazení modulu, jehož vývody jsou ze spodu a není k nim přístup. Musel jsem tedy opakovaně nanášet cín, aby došlo k „podlití“ a vodivému spojení. Hotovou vyrobenou a osazenou desku zobrazuje obrázek Obr. 26 a Obr. 27.
konektory motorů
konektor enkodéru
mikro-kontrolér prog. konektor
jumpery sériové linky
Obr. 26 – PCB (vrchní pohled)¨
připojení napájení z baterií
H-můstek
připojení čidel
připojení mikrofonu připojení čidel a index spínačů
připojení repro. BlueTooth modul
Obr. 27 – PCB (spodní pohled)
29
4.3
Zkompletování Furbyho
Po osazení desky jsem přistoupil k její montáži do Furbyho. Provedl jsem některé nezbytné úpravy délky vodičů a přiletoval všechny kabely vedoucí z Furbyho snímačů a audio rozhraní. Výsledek ukazuje Obr. 28 a Obr. 29. Poté jsem nahrál firmware a přistoupil k ladění a posléze k závěrečnému testování.
Obr. 28 – zabudování desky do Furbyho
Obr. 29 – BlueTooth Furby
30
5 Řídící software Furbyho K oživení zařízení je nutné navrhnout ovládací software Furbyho. Jedná se konkrétně o řídící program pro mikrokontrolér. Tento program se běžně v praxi nazývá firmware. I já tento název budu využívat. Firmware musí zajišťovat •
přenos informací mezi počítačem a mikrokontrolérem.
•
řízení pohybů,
•
hlídání senzorů
•
sledování stavu příkazů.
•
sledování stavu baterií
Při řízení pohybu motoru je nutné hlídat pozici motorů, což znamená interpretovat signál z inkrementálního enkodéru a sledovat index spínače. Hlídání senzorů zase obnáší řešení zákmitů, které vznikají běžně u většiny spínačů založených na mechanickém principu (s výjimkou různých bezkontaktních principů). Pro možnosti sledování stavu baterií firmware využívá A/D převodníku mikrokontroléru. Naopak úkolem firmwaru není •
řídit audio přenos, protože ten je zajištěn automaticky BlueTooth modulem.
•
nutně zajišťovat řízení modulu nebo provádět jeho konfiguraci.
Hardwarové zapojení však umožňuje pozdější zabudování funkcí pro konfiguraci BlueTooth modulu do firmwaru díky propojení mikrokontroléru s řídícími signály modulu.
31
5.1 Architektura firmwaru Zjednodušené blokové schéma firmwaru z pohledu zpracování příkazů a základních využitých datových struktur uvádí Obr. 30.
příchozí bajty příkazu
skládání příkazu
příkaz stavové údaje stav příkazů
vstupní fronta stav čidel frontové příkazy fronta motoru č. 1
zpracování příkazů pro motor č. 1
nefrontové příkazy
fronta motoru č. 2
zpracování příkazů pro motor č. 2
odeslání informace o dokončení / odeslání odpovědi
napájecí napětí
zpracování nefrontových příkazů
odeslání odpovědi
Obr. 30 – blokové schéma - architektura firmwaru
Návrh firmwaru vyplývá z požadavků, které musí splňovat. K přenosu dat mezi Furbym a počítačem je použito rozhraní BlueTooth, což v některých případech může přinášet problémy s odezvou při přenosu dat. Především při velké vzdálenosti mezi zařízeními může docházet k opoždění dat (opakování poškozených paketů). Při návrhu jsem proto bral na zřetel tuto skutečnost. Proto jsem navrhl frontovou architekturu pro zpracování příkazů. Tato architektura eliminuje nutnost přesné synchronizace mezi počítačem a Furbym. Řízení časově kritických operací, jako například hlídání přesné pozice motoru v reálném čase, bude zajišťovat sám Furby. Přenos informací přes BlueTooth se omezí pouze na přijímání příkazů a odesílání odpovědí. Firmware proto obsahuje datové struktury, které slouží pro uchovávání příkazů, stavových dat a procedury které zajišťují manipulaci s příkazy a zpracování příkazů.
32
Mezi stavová data patří: •
•
•
Stav příkazu – Udává v jaké fázi vykonávání se příkaz nachází. Realizováno bude polem, index pole představuje identifikaci příkazu a hodnota položky pole reprezentuje stav příkazu Stav senzorů – Uchovává informaci o tom, zda je dané čidlo stisknuto nebo ne. Realizováno bude polem, index pole představuje identifikaci čidla a hodnota položky pole reprezentuje stav čidla. Hodnota napájecího napětí Furbyho baterií
Struktury pro uchování příkazů implementovány pomocí fifo front. Architektura firmwaru je schopna zpracovávat frontové a nefrontové příkazy. •
Frontové příkazy jsou příkazy týkající se motorů, u kterých je podmínkou vykonávání ve správném pořadí. Například pokud přijdou dva příkazy pro pohyb motorem č. 2 do dvou různých poloh, potom se tyto příkazy provedou přesně v pořadí, v jakém byly odeslány.
•
Nefrontové příkazy jsou příkazy, u kterých se předpokládá prioritní zpracování co nejdříve, bez nutnosti čekání na dokončení předchozích frontových příkazů. Jedná se většinou o zjištění stavu, případně o příkazy požadující okamžité přerušení činnosti motorů.
Algoritmus zpracování příchozích příkazů: •
Každý příkaz, který dorazí po sériové lince do přijímacího registru USART modulu je zařazen do fronty příkazů. Fronta je pravidelně prohledávána na přítomnost nových příkazů.
•
Následně se podle typu příkazu zjistí, zda se jedná o frontový či nefrontový příkaz.
•
Pokud se jedná o frontový, stanoví se, pro který motor je určen (frontové se vždy týkají motorů) a následně se zařadí do správné fronty. Obě fronty týkající se motorů jsou pravidelně prohledávány a příkazy jsou předávány výkonným funkcím k provedení.
•
Pokud se jedná o nefrontový příkaz, je řízení předáno funkci, která rozpozná typ příkazu a předá ho k okamžitému vykonání.
•
V případě dokončení frontového příkazu je okamžitě zaslána zpráva o dokončení obsahující identifikaci dokončeného příkazu.
•
Pokud je dokončen nefrontový příkaz (dotaz) je odeslána odpověď obsahující data odpovědi.
Většina příkazů obsahuje identifikační číslo v rozsahu 0-255, aby bylo možné pokládat dotazy na stav konkrétního příkazu a aby se dalo na straně počítače jednoznačně určit, ke kterému příkazu se váže odeslaná odpověď. Pro uchovávání informací o příkazu bude sloužit stavové pole o kapacitě 256 bajtů, index do pole představuje id příkazu a hodnota položky pole reprezentuje stav příkazu. Konkrétní rozdělení příkazů na frontové / nefrontové, možné stavy příkazů, tvary a typy příkazů uvedu v kapitolách 5.3, 5.4 a 5.5.
33
5.2 Komunikace mezi Furbym a počítačem K přenosu dat mezi Furbym a počítačem je použito rozhraní BlueTooth. Přenos dat bude zajištěn na základě služby bezdrátového sériového portu, který podporuje modul využívaný v mém návrhu. Tato služby je podporována i běžnými ovladači (například velmi rozšířený ovladač firmy Widcomm) BlueTooth modulů pro osobní počítače PC. Přenos mezi počítačem a mikrokontrolérem je obousměrný. Ve svém projektu budu využívat asynchronní režim přenosu pro přenos řídících údajů mezi Furbym a počítačem. Přesněji se jedná o izochronní typ přenosu, jednotlivé rámce dat jsou přenášeny asynchronně, avšak data uvnitř rámce jsou přenášena synchronně. Formát splňuje standart rs232, s výjimkou napěťových úrovní. Pro zajištění tohoto přenosu budu využívat modul USART, který je součástí mikrokontroléru. Komunikace bude tedy probíhat přes sériovou linku. Parametry sériové linky: • • • • •
datový rámec 8 datových bitů (1 bajt) 1 start bit 1stop bit bez parity rychlost 38400 baud
Při vícebitových příkazech není rozumné čekat na další bajty aktivním čekáním, tudíž bude pro příjem dat využito přerušení. Dalším problémem může být rychlý příchod sekvence bajtů, kdy by mohla nastat situace, že mikrokontrolér nestihne včas zpracovat předchozí bajt a během jeho zpracovávání ztratí další bajty, protože vyrovnávací paměť USART modulu není velká (pouze 2 bajty). Je tedy vhodné zaznamenávat příchozí data co nejrychleji a zabývat se jejich dekódováním až později. Proto jsem navrhl vstupní fifo frontu o kapacitě 40 příkazů. Data jsou do této fronty ukládána ihned, jakmile jsou k dispozici ve vstupním registru USART modulu. Zároveň tato strategie umožňuje ve spojení s frontovou architekturou eliminovat problémy spojené s nestabilitou odezvy BlueTooth spojení. Komunikace Furbyho s PC probíhá pomocí příkazů odesílaných z PC a odpovědí / zpráv odesílaných z Furbyho. Při tvorbě sady příkazů jsem se snažil dodržet požadavky zadavatele práce na typy příkazů a akce, které by měly zajišťovat. Některé příkazy jsem modifikoval, aby lépe vystihovaly potřeby na straně řídícího počítače a odpovídaly reálnému chování Furbyho. Navrhl jsem přenosový protokol, tedy formát přenosu informací po sériové lince.
5.3 Formát a struktura příkazů Příkazy odesílané z PC mají proměnnou délku, čímž šetřím přenosovou kapacitu. Je to vhodné, protože datové rámce sériové linky jsou následně baleny do rámců BlueTooth přenosu, který při slabší kvalitě signálu (např. větší vzdálenosti zařízení) vykazuje horší odezvu. Příkazy se skládají z povinné hlavičky a za ní následují až 3 volitelné parametry. Hlavička a jednotlivé parametry mají délku 1 bajt (8 bitů). Počet parametrů závisí na typu příkazu. V hlavičce jsou uvedeny důležité informaci o typu příkazu, délce příkazu a některé další informace. Struktura příkazů je uvedena na Obr. 31.
34
Příkaz: hlavička
parametr 1
parametr 2
parametr 3
Obr. 31 – struktura příkazu
Hlavička obsahuje nezbytné informace a tvoří povinnou část každého příkazu. Z pohledu programátora ji lze rozdělit na bity, každý její bit má přesně daný význam. Význam bitů je sice pevně stanoven, ale záleží na typu příkazu, které bity bude využívat a které budou nepodstatné, tzv. „don’t care“. Schéma hlavičky je uvedeno na Obr. 32.
Hlavička příkazu: M
D
L
L
T
T
T
T
Obr. 32 – struktura hlavičky příkazu
Význam symbolů:
•
•
•
•
M = motor o 0 = motor č. 1 (spodní motor) o 1 = motor č. 2 (horní motor) D = směr (direction) o 0 o 1 LL = počet parametrů za hlavičkou (length) o 00 = 0 o 01 = 1 o 10 = 2 o 11 = 3 TTTT = typ příkazu o 0001 až 1111 binárně, 1 až 15 dekadicky, udává typ příkazu viz seznam příkazů v kapitole 5.5.
5.4 Formát a struktura odpovědí a zpráv Za zprávy jsou považována taková odchozí data, která se generují automaticky bez předchozího vyžádání. Odpovědi jsou naopak ta data, která přišla jako reakce na dotaz (příkaz). Odpovědi a zprávy mají pevnou délku 3 bajty, viz Obr. 33. První bajt specifikuje typ odpovědi / zprávy, využití zbylých dvou bajtů záleží na typu. Pokud některý bajt není využit, je nulový. U odpovědí udává parametr označený ID identifikační číslo příkazu, kterého se odpověď týká. Typy odpovědí: •
odpověď na dotazovací příkaz – 0x03
35
Typy zpráv: přijetí příkazu (v současné verzi firmwaru je implementováno, ale není povoleno) dokončení příkazu – 0x02 informace o změně stavu čidel – 0x04 hlášení o chybě (např. přeplnění fronty) – 0x05
• • • •
Odpověď / zpráva: typ
parametr1
parametr 2
Obr. 33 – struktura odpovědi
5.5 Seznam příkazů a odpovědí V této kapitole uvedu seznam a tvary příkazů sloužících ke komunikaci mezi Furbym a PC. Příkazy jsou uvedeny v binárním formátu. Znak X znamená nepodstatný bit (don’t care). Frontové příkazy jsou označeny písmenem F před názvem příkazu. Vstupní fronta příkazů má kapacitu 40 příkazů a fronty pro motor č. 1 a 2 mají každá kapacitu 20 příkazů. Odpovědi jsou uvedeny v hexadecimálním formátu (není potřeba znázorňovat nepodstatné bity, jelikož se zde neobjevují). Parametry jsou označeny symboly: •
•
• • 5.5.1
ID = identifikační číslo příkazu v rozmezí 0-255. Jednou použitá čísla je možné znovu uvolnit pomocí příkazu, který zjišťuje stav příkazu s daným id.(viz kap. 5.5.3 - Zjištění stavu příkazu). SP = výkon motoru v rozmezí 0-255, udává rychlost otáčení, popř. intenzitu otevření zobáku. Pozor, existuje dolní hranice, která se odvíjí od napájecího napětí. Pokud se zadá nízká hodnota, může dojít k uváznutí motoru a nedokončení příkazu. Pak je nutno „násilně“ příkaz ukončit. Problém lze řešit na straně řídícího počítače na základě údaje o napájecím napětí, kterou Furby poskytuje. POS = pozice motoru 2 v rozmezí 0-212 TI = čas (trvání příkazu) v násobcích 0,25s
Příkazy a odpovědi motoru č. 1 Jako motor č. 1 označuji spodní motor ovládající nohy a zobák.
F - Přemístění do výchozí polohy Přemístí motory do výchozí polohy. Odpověď přichází v momentě dokončení pohybu. Příkaz: 0X01 0010
ID
Odpověď: 0x02
ID
0x00
36
F - Pohyb nohama Hýbe nohama po daný čas danou rychlostí. Odpověď přichází v momentě dokončení pohybu. Příkaz: 0011 0001
SP
TI
ID
Odpověď: 0x02
ID
0x00
F - Otevření zobáku Otevře zobák po daný čas danou intenzitou. Intenzita otevření je dána parametrem rychlost v rozmezí 0-255. Pozor na přetížení, není rozumné otevírat zobák na dlouhou dobu na plnou intenzitu. Rozumný maximální čas pro otevření zobáku je cca 5s. Příkaz s delším časem než 5s bude zkrácen na 5s bez upozornění. Odpověď přichází v momentě dokončení pohybu. Příkaz: 0111 0001
SP
TI
ID
Odpověď: 0x02
ID
0x00
F - Čekání v nečinnosti. Vloží pauzu do fronty motoru. Během vykonávání daný motor stojí. Například takto lze vytvořit přesnou pauzu mezi dvěma příkazy ve frontě. Pauza se vkládá do fronty stejně jako ostatní frontové příkazy. Odpověď přichází v momentě dokončení příkazu. Příkaz: 0X10 0011
TI
ID
ID
0x00
Odpověď: 0x02
Zastavení (break) Zastaví právě vykonávané činnosti Příkaz: 0X00 0101
37
Zastavení s vyčištěním fronty (stop) Zastaví právě vykonávanou činnost a vymaže všechny následující příkazy, které jsou právě ve frontě motoru č. 1. Příkaz: 0X00 0110
Stav motoru Zjistí aktuální stav motoru. V odpovědi v datové části přijde jedna z následujících hodnot: 0 = nečinnost, 1 = dupání nohama, 2 = otevření zobáku. Příkaz: 0X01 0111
ID
Odpověď: 0x03
5.5.2
ID
DATA
Příkazy a odpovědi motoru č. 2
Jako motor č. 2 označuji spodní motor ovládající uši, oči, břicho, v podstatě všechny partie těla kromě nohou a zobáku. Tento motor řídí mimiku Furbyho, a proto disponuje mechanismem hlídání polohy. Poloha se udává pomocí zadání cílové pozice v rozsahu <0,212>.
F - Přemístění do výchozí polohy Přemístí motor č. 2 do výchozí polohy. Odpověď přichází v momentě dokončení pohybu. Příkaz: 1X01 0010
ID
Odpověď: 0x02
ID
0x00
F - Pohyb na zadanou pozici: Poloha se udává pomocí parametru POS v rozmezí 0-212. 0 představuje výchozí pozici cyklu. Není zaručené zastavení motoru na přesné pozici vzhledem k nekvalitní mechanice, tudíž je zavedena tolerance +/- 7 poloh od cíle. Z toho vyplývá současně i následující vlastnost – pokud je motor na pozici x a odešle se příkaz pro pohyb na pozici v intervalu <x-7, x+7> (v modulo 213), neboli na pozici vzdálenou méně nebo rovno pěti od současné polohy, neprovede se žádná činnost a příkaz se označí jako vykonaný. Parametr D specifikuje požadovaný směr pohybu (0=ve směru dekrementace pozic, 1 ve směru inkrementace pozic). Odpověď přichází v momentě dokončení pohybu.
38
Příkaz: 1D11 0001
SP
POS
ID
0x00
ID
Odpověď: 0x02
F - Čekání v nečinnosti Vloží pauzu do fronty motoru. Například lze vytvořit přesnou pauzu mezi dvěma příkazy ve frontě. Pauza se vkládá do fronty stejně jako ostatní frontové příkazy. Odpověď přichází v momentě dokončení příkazu. Příkaz: 0X10 0011
TI
ID
ID
DATA
Odpověď: 0x03
Zjištění pozice Zjistí pozici motoru. V datové části odpovědi je uvedena pozice v rozsahu <0,212>. Příkaz: 1X01 1000
ID
Odpověď: 0x03
ID
DATA
Zastavení (break) Zastaví právě vykonávané činnosti Příkaz: 1X00 0101
Zastavení s vyčištěním fronty (stop) Zastaví právě vykonávanou činnost a vymaže všechny následující příkazy, které jsou právě ve frontě motoru č. 1. Příkaz: 1X00 0110
39
Stav motoru Zjistí aktuální stav motoru. V odpovědi v datové části přijde jedna z následujících hodnot: 0 = nečinnost, 1 = pohyb ve směru dekrementace pozic, 2 = ve směru inkrementace pozic. Příkaz 1X01 0111
ID
Odpověď: 0x03
5.5.3
ID
DATA
Ostatní příkazy
Zjištění stavu příkazu Dotaz na stav frontového příkazu s daným id. CMD_ID = id příkazu na který se ptám. Odpověď vrací v datové části stav dotazovaného příkazu: 0 = dané id je volné, 1 = příkaz je ve frontě jednoho motorů, 2 = příkaz se vykonává, 3 = příkaz je dokončen, 5 = příkaz přerušen příkazem break, 6 = příkaz přerušen příkazem stop (příkaz, který i vyprazdňuje frontu). Pokud je navrácen stav 3,5 nebo 6 je identifikační číslo uvolněno pro použití dalším příkazem, tzn. stav tohoto id je 0. Příkaz: XX10 1001
CMD_ID
ID
ID
DATA
Odpověď: 0x03
Zjištění stavu senzorů Odpověď v datové části obsahuje bajt, jehož spodních 5 bitů reprezentuje stav dotykových čidel. Logická 1 reprezentuje stisknuté čidlo. POS_A a POS_B pochází z čidla polohy a udává, zda je furby vzhůru nohama nebo normálně. Příkaz: XX01 1010
ID
Odpověď: 0x03
ID
DATA
Datová část odpovědi: X
X
X
POS_A
POS_B
ZOBÁK
ZADA
BŘICHO
Zjištění napájecího napětí Hodnota napájecího napětí je předána v datové části odpovědi. Je udávána v násobcích 0.02445V. Výsledné napětí se tedy vypočítá podle vzorce 89XYZX A@[@ 0.02445 :. 40
Příkaz: XX01 1011
ID
Odpověď: 0x03
5.5.4
ID
DATA
Automatické zprávy
Jedná se o odchozí data, které generuje sám Furby bez předchozího dotazu. Generují se při dokončení příkazu, změně stavu senzorů a při chybě.
Zpráva o dokončení příkazu V momentě dokončení příkazu je generována zpráva. ID představuje identifikaci dokončeného příkazu. Zpráva: 0x02
ID
0x00
Zpráva o změně senzorů Pokud dojde ke změně stavu čidel, je generována zpráva. Položka DATA představuje stavy čidel (viz Zjištění stavu senzorů). Zpráva: 0x04
0x00
DATA
Zpráva o chybě Pokud dojde k chybě, je generována zpráva. V současné verzi firmware je implementována zpráva o chybě přeplnění vstupní fronty nebo front motorů. U chyby fronty motoru položka ID znamená identifikační číslo příkazu, který způsobil chybu a který tudíž nebude vykonán. U chyby vstupní fronty ID není, protože je zaručeno, že pokud nastane, přijde ihned po odeslání příkazu do Furbyho (nemůže mezi ně vniknout jiná zpráva nebo odpověď).
Chyba vstupní fronty: 0x05
0x00
0x02
ID
0x03
Chyba front motorů: 0x05
41
6 Implementace firmwaru Firmware jsem se rozhodl psát v jazyce C. Oproti assembleru poskytuje programování mikrokontrolérů v tomto jazyce výhody i nevýhody. Nevýhodou je větší velikost kódu a o něco pomalejší chod programu. V assembleru má programátor větší přehled o tom co se přesně odehrává v procesoru (zapisuje přímo instrukce) a je schopen lepší optimalizace kódu, jelikož má oproti překladači z vyššího jazyka znalost problému a cíle. S narůstající pamětí a rychlostí mikrokontrolérů jsou mnohá negativa programování v jazyce C částečně eliminována a v mnoha běžných případech je výhodnější psát program v jazyce C. Vývoj softwaru v tomto jazyce je o poznání rychlejší a příjemnější, programátor se například nemusí starat o přesné využití registrů a psát procedury pro základní aritmetické operace. C navíc nabízí mnoho hotových knihovních funkcí. Jako vývojové prostředí jsem využil AVRStudio a jako překladač volně dostupný AVR GCC, který je součástí balíku WinAVR a lze ho integrovat do AVRStudia. Konečným výstupem překladu a linkování je *.hex soubor obsahující instrukce programu pro mikrokontrolér, který lze nahrát do flash paměti mikrokontroléru. Nahrávání probíhá metodou ISP (In-System Programming), kterou podporuje mikrokontrolér ATmega8. Pro nahrávání využívám paralelní rozhraní centronix (např. běžný paralelní port PC) a program AVRDude, který je součástí balíku WinAVR.
6.1 Popis funkcí a metod firmwaru Na následujících řádcích se pokusím stručně popsat funkční strukturu programu, tzn., uvedu základní metody a funkce firmwaru. U některých významnějších, zajímavějších nebo složitějších částí kódu se zmíním i o principu, případně uvedu vývojový diagram. Tab. 13 uvádí seznam proměnných, které slouží pro řízení chodu firmwaru. Tab. 14 obsahuje soupis metod a funkcí a jejich stručný popis.
Stavová proměnná mot1_going_home/ mot2_going_home mot1_cmd_id / mot2_cmd_id target_pos_reached mot1_status / mot2_status status_field[255] send_mot2_complete check_mot1_time / check_mot2_time
Popis udává. zda běží příkaz pohyb do výchozí polohy id běžícího příkazu udává, zda je dosaženo cílové pozice motoru č. 2 aktuální stav motorů stavové pole příkazů podle jejich id udává, zda poslat příkaz o dokončení příkazu mot2Move (pohyb na zadanou pozici) udává, zda kontrolovat časovače, nastaveno pokud běží časovaný příkaz
Tab. 13 – seznam stavových proměnných
42
Název metody
Účel metody
main
Hlavní funkce, tou program startuje. Je v ní nekonečná smyčka, ze které se volají ostatní metody, a kontroluje fronty.
AVRInit
Inicializace mikrokontroléru. Nastavuje režim pinů a konfiguruje hw jednotky MCU.
sortReceivedCommands
Prohledává vstupní frontu příkazů a rozřazuje příkazy do jednotlivých front, pokud jsou frontové a přímo posílá výkonné funkci, pokud jsou nefrontové
getCommandId removeCommands
Vrací identifikační číslo předaného příkazu. Odebírá příkazy ze zadané fronty (motoru č. 1 nebo 2).
decodeMot1Cmd / decodeMot2Cmd
Dekóduje příkaz pro motor č. 1 / 2 a volá výkonné funkce, které spustí akci danou příkazem, nebo akci sama vykoná. To záleží na typu příkazu.
decodeNoFifoCmd
Dekóduje nefrontový příkaz netýkající se motorů a vykonává ho. Je většinou volána funkcí sortReceivedCommands.
mot1Reset / mot2Reset
Provede tzv. „homing“, neboli zaparkování obou motorů do výchozí polohy, kterou udávají index spínače svým sepnutím.
mot1Home / mot2Home
Výkonné metody, které implementují příkaz pro pohyb motoru na výchozí pozici. Výkonné metody zajišťující pohyb motorů. V případě motoru č. 1 jde o pohyb určitou rychlostí, směrem a po určitý čas. V případě motoru č. 2 jde o pohyb určitou rychlostí, směrem a na zadanou pozici (s tolerancí +/- 7 pozic).
motor1Move / motor2Move
motorWait
Výkonná metoda, zajišťuje příkaz pro čekání zadaného motoru v klidu. Provádí to nastavením stavu motoru na 1, což znemožní spouštění dalších příkazů až do doby než se tato stavová proměnná opět shodí na 0.
usartSendByte
Odesílá jeden bajt po sériové lince směrem k počítači.
sendCmdComplete, sendResponse, sendSwitchChanged, sendError
Funkce odesílající různé druhy zpráv po sériové lince směrem k počítači. Využívají funkci usartSendByte.
getDebouncedSwitches ISR(USART_RXC_vect)
ISR(INT1_vect)
ISR(TIMER2_OVF_vect)
ISR(TIMER0_OVF_vect)
Zajišťuje odstranění zákmitů spínačů (čidel). Vrací stav čidel. Obsluha přerušení při přijmu bajtu usart modulem. Zajišťuje složení bajtů do příkazu a vložení do vstupní fronty. Obsluha přerušení při náběžné hraně kanálu enkodéru. Vyhodnocuje změnu pozice, tzn. inkrementaci/dekrementaci čítače polohy. Současně hlídá, zda nebyla dosažená cílová poloha, pokud byl předtím spuštěn příkaz pro pohyb motoru č. 2 na pozici. Obsluha přerušení při přetečení časovače 2. Slouží k inkrementaci proměnných určených k časování časovaných příkazů. Obsluha přerušení při přetečení časovače 0. V pravidelných intervalech načítá stav čidel do pole, sbírá data pro funkci getDebouncedSwitches,zajišťující odstranění zákmitů spínačů. Tab. 14 – seznam metod firmwaru
43
6.1.1
Funkce main
Program mikrokontroléru startuje main funkcí. Main obsahuje hlavní smyčku programu, ve které se procesor nachází. Běh je narušován přerušeními. Vývojový diagram je uveden na Obr. 34. Elementy zvýrazněné modrým okrajem reprezentují přímo další funkce.
START Je nastaven příznak send_mot2_complete ? Inicializace mcu - AVRInit
ANO
NE
Pošli zprávu o dokončení příkazu motor2Move (po dosažení pozice).
sortReceivedCommands
Obsahuje fronta motru č. 1 příkaz ?
NE
Je nastaven příznak check_mot1_time/ check_mot2_time ?
ANO dekóduj příkaz z fronty decodeMot1Cmd
NE ANO
Vypršel už čas příkazu?
Obsahuje fronta motru č. 2 příkaz ?
NE
NE ANO
ANO
dekóduj příkaz z fronty – decodeMot2Cmd
Zastav motor 1 / 2. Pošli zprávu o dokončení Nastav příznaky(check_mot1_time/ check_mot2_time = 0; mot_1_status/ mot_2_status=0; Zaznamenej stav příkazu do stavového pole
Je nastaven příznak mot1_going_home / mot2_going_home ?
Zjisti stav čidel ANO Změnil se stav od posledního načtení stavu ?
Je motor 1 / 2 na výchozí pozici (index spínač) ?
NE ANO
ANO Zastav motor 1 / 2 Odešli potvrzení o dokončení příkazu Nastav příznaky (mot1_going_home/ mot2_going_home =0; mot_1_status/ mot_2_status=0; ) Zaznamenej stav příkazu do stavového pole
Odešli zprávu o změně stavu.
Obr. 34 – vývojový diagram funkce main
První volanou funkcí uvnitř main je AVRInit. Tato metoda inicializuje porty mikrokontroléru. Tzn. nastavuje, zda budou vstupní nebo výstupní a jaké logické úrovně na nich zpočátku budou. Současně inicializuje USART modul, A/D převodník a tři časovače včetně PWM režimu časovače č. 1. Většina těchto operací se provádí nastavováním kontrolních registrů. V jazyce C se toho dosahuje přiřazením hodnoty (vývojové prostředí AVRStudio dokonce umožňuje používat v přiřazení symbolické názvy registrů). Informace o kontrolních registrech a popis hw jednotek lze najít v katalogových listech k mikrokontroléru [1].
44
USART jednotka je nakonfigurována na formát rámce 8 datových bitů, 1 start bit, 1 stop bit bez parity. Rychlost přenosu činí 38400baud. Tato hodnota je snadno modifikovatelná v definiční části zdrojového kódu, kam jsem vložil makro s výpočtem. Časovače jsou rozlišeny čísly. Já využívám časovač 0,1 a 2. Časovače 0 a 2 jsou 8-bitové. Časovač 1 je 16-bitový. Pro generování PWM průběhu využívám časovač č. 1. Předdělička je nastavena na 8, maximální hodnota čítání je 0xFF, režim generování je fázově přesné PWM. Výsledná PWM frekvence je tedy 1.8kHz (při frekvenci krystalu 7.3728MHz). Bohužel je tato frekvence slyšitelná lidským uchem. Snažil jsem se o její zvýšení, ale motor při vyšší frekvenci značně ztrácel na výkonu, dokonce se ani pořádně neroztočil a nepodařilo se mi tedy docílit neslyšitelnosti. Dokonce je lepší nastavit ještě vyšší předděličku, např. na hodnotu 64 a výslednou frekvenci 225 Hz. Motor se pak lépe točí v nižších otáčkách. Toto je možno snadno zajistit ve zdrojovém kódu, kde jsou uvedeny obě varianty, jedna je zakomentována. Omezení zvýšení frekvence je dané samotným Hmůstkem (obvod L293D), který má doporučenou max. spínací frekvenci okolo 5kHz. Ve frekvenčním pásmu pod 5kHz se na poklesu výkonu pravděpodobně projevují charakteristiky motoru. Motor je v podstatě LR obvod a proud vinutím narůstá exponenciálně. Úbytek výkonu je tedy pravděpodobně způsoben časovou konstantou L/R. Čím vyšší je frekvence tím nižší úrovně dosáhne proud při jeho nárůstu během logické 1 v rámci periody PWM. Tímto je pravděpodobně způsoben úbytek výkonu při vyšších frekvencích. Indukčnost Furbyho motorů je poměrně vysoká a proto i jeho časová konstanta je vysoká. Na frekvenční charakteristiku budou mít vliv i kondenzátory paralelně spojené se svorkami motorů, ty jsou ale součástí Furbyho, tudíž jsem se nepokoušel o jejich demontáž, která by navíc mohla vést ke vzrůstu rušení produkovaného motory. Časovač č. 0 využívám pro načítání stavu čidel pro účely ošetření zákmitů. Využívám při tom přerušení při přetečení časovače. Frekvence přetečení je zde 450Hz. Časovač č. 2 využívám pro generování času pro časování některých příkazů pro motory. Frekvence přetečení tohoto čítače činí 28.125Hz. Na 0,25s (což je nejmenší jednotka časování pro příkazy) připadá tedy cca 7 tiků přerušení. A/D převodník je nakonfigurován s interní napěťovou referencí 2.56V a měří napětí baterií podělené napěťovým děličem tak, aby napětí bylo při maximální hodnotě právě cca 2.56V. Jedná se o 10bitový převodník. Já však využívám pouze horních 8 bitů. Převodník je nastaven do režimu neustálé konverze, což znamená, že automaticky opakovaně provádí konverzi. Výsledek se čte pomocí přiřazení z registru převodníku. Výsledek je 10-bitový a je ve dvou registrech, já čtu vyšších 8 bitů, což znamená redukci přesnosti, která však zcela vyhovuje. Výsledek je vracen jako binární hodnota v násobcích 0.0244V. Po inicializační metodě následuje nekonečná smyčka, uvnitř které se provádí většina operací firmwaru a spouští se odsud ostatní funkce (kromě přerušení). Ve smyčče se několikrát volá metoda sortReceivedCommands. Tato metoda provede prohledání vstupní USART fronty ve které jsou umístěny všechny příkazy přijaté ze sériové linky. Vstupní fronta stejně jako ostatní fronty v mém návrhu je typu fifo. Pokud je prvek přečten je současně i odebrán z fronty, prvky jsou pevně 4-bajtové (což je maximální možná délka příkazu). Jestliže metoda sortReceivedCommands zjistí neprázdnost fronty, vybere příkaz z fronty a podle hlavičky dekóduje jeho typ. Pokud se jedná o frontový příkaz, přeřadí jej do správné cílové fronty (motoru č. 1, 2). Pokud se jedná o nefrontový příkaz pro motory, zavolá rovnou metodu na dekódování příkazů decodeMot1Cmd / decodeMot2Cmd, která daný příkaz dále analyzuje a
45
vykoná. Pokud se jedná o nefrontový příkaz, který se netýká motorů, zavolá se metoda decodeNoFifoCmd. Metody decodeMot1Cmd / decodeMot2Cmd jsou volány metodou sortReceivedCommands nebo se volají z hlavní smyčky metody main v případě, že fronta příslušného motoru obsahuje příkazy a daný motor je současně neaktivní Metody decodeMot1Cmd / decodeMot2Cmd a decodeNoFifoCmd dekódují příkazy. Základní princip spočívá v načtení typu z hlavičky příkazu. Následuje rozhodovací struktura (většinou switch) která na základě čísla typu určí, co se provede. Může zavolat externí výkonnou funkci nebo přímo vykonat akci. Mezi přímo vykonané akce patří například zastavení motorů, dotaz na jejich stav nebo pozici, případně u metody decodeNoFifoCmd může např. vyčíst stav senzorů a poslat přes sériovou linku. Mezi volané výkonné metody patří například motor1Move, motor2Move, motor1Home, motor2Home, motor1Wait, motor2Wait. Jedná se o metody, které iniciují určitý druh pohybu motoru nebo vkládají pauzu. Pohyb konfigurují pomocí nastavování log. úrovní na pinech ovládajících H-můstek a nastavením PWM. V momentě kdy je zahájen pohyb se současně nastaví příznaky v poli stavu příkazů (na hodnotu 2 – příkaz vykonáván) a stav motoru na 1 což indikuje probíhající příkaz. V době kdy je stav motoru nastaven nemůže být spuštěn žádný další frontový příkaz pro daný motor. Kontrola dokončení příkazu se provádí ve funkci main nebo v obsluze přerušení enkodéru. V metodě main je sada podmínkových příkazů, které na základě příznaků nastavených výše uvedenými výkonnými metodami kontrolují průběh příkazu. V případě detekování podmínkz pro ukončení příkazu se provede nastavení stavu příkazu (na hodnotu 3 – příkaz dokončen), nastavení stavu motoru na 0. Současně je pomocí USART modulu odeslána zpráva o dokončení příkazu obsahující i identifikaci příkazu. Běh programu narušují celkem čtyři přerušení. Dvě jsou generovány přetečením časovače, jedno kanálem inkrementálního enkodéru a jedno USART modulem při přijetí bajtu ze sériové linky. Přerušení z časovačů jsou používána pro přesné časování. Přerušení čítače 0 slouží k načítání stavu čidel do pole pro účely ošetření zákmitů. Přerušení čítače 2 pro časování příkazů, například u příkazů typu čekání motoru v nečinnosti. Spouští se s frekvencí 28.125 Hz. Čas pro tyto příkazy se udává v násobcích 0.25s, na jednu tuto jednotku připadá cca 7 volání této obsluhy přerušení, která inkrementuje čítací proměnnou. Proměnná je při každém volání časovaného příkazu nulována a následně se kontroluje její hodnota. Když dosáhne požadované hodnoty, nastavené při inicializaci časovaného příkazu, příkaz se ukončí. Dalším přerušením je přerušení z USART jednotky, které je vyvoláno při přijetí bajtu, což se využívá k příjmu a skládání příkazů.
46
6.1.2
Výběr příkazů ze vstupní fronty
Zajištěno voláním metody sortReceivedCommands. Vývojový diagram je uveden na Obr. 35.
Obr. 35 – vývojový diagram výběru příkazu ze vstupní fronty
6.1.3
Dekódování příkazů Metody decodeMot1Cmd, decodeMot2Cmd, decodeNoFifoCmd.
Jsou volány metodou sortReceivedCommands případně z funkce main. Pokud dekóduje frontový příkaz je metoda volána z hlavní smyčky metody main, jinak z metody sortReceivedCommands. Metody decodeMot1Cmd a decodeMot2Cmd dekódují příkazy, které se určitým způsobem vážou k některému z motorů. V jejich těle se nachází rozhodovací příkaz (většinou switch), který na základě typu určí, o jaký příkaz se jedná a pak buď volá výkonnou funkci, nebo příkaz přímo vykoná. Metoda decodeNoFifoCmd dekóduje a přímo zpracovává nefrontové příkazy. Dokončení některých příkazů se hlídá v hlavním cyklu funkce main (např. příkazy pro čekání v nečinnosti nebo příkazy pro zaparkování motoru do výchozí pozice). 6.1.4
Příjem příkazů Obsluha přerušení - ISR(USART_RXC_vect)
Přijímání příkazů zajišťuje obsluha přerušení USART modulu. Jedná se o přerušení při příchodu datového bajtu po sériové lince. Vyvolává se v momentě, kdy je bajt přijat ve vstupním registru. Každý příkaz určený pro Furbyho obsahuje v hlavičce (prvním bajtu) počet dalších parametrů příkazu (dalších bajtů).
47
Při příchodu bajtu vyvolá Furbyho mikrokontrolér přerušení. Obsluha tohoto přerušení se stará o skládání příkazů. Při příchodu prvního bajtu příkazu se z něj dekóduje počet dalších bajtů a tím, i celková délka příkazu. Pokud je nulový, znamená to, že příkaz se skládá jen z právě přijaté hlavičky a ta je zařazena do vstupní fronty příkazů. Pokud není nulový, nastaví se čítač počtu dalších bajtů. Při každém dalším vyvolání přerušení (příchodem bajtu) se čítač dekrementuje a bajt se přiřadí za předešlý a skládá se tak postupně celkový příkaz. Až čítač dosáhne nuly, jsou načtené bajty uloženy jako kompletní příkaz do vstupní fronty. Vstupní fronta má pevnou velikost položek 4 bajty, což je maximální možná délka příkazu. Na Obr. 36 je vyobrazen vývojový diagram metody.
Obr. 36 – vývojový diagram příjmu příkazů
6.1.5
Interpretace signálu enkodéru Obsluha přerušení - ISR(INT1_vect)
Jeden z kanálů (například kanál A) je připojen na pin mikrokontroléru, který podporuje funkci externího přerušení. Kanál B je připojen na standardní I/O pin. Pokud nastane na kanálu A náběžná hrana (přechod z logické 0 do log. 1) je spuštěna obsluha přerušení. Tato metoda provede inkrementaci nebo dekrementaci čítače poloh na základě log. stavu kanálu B. Po změně čítače se kontroluje rozsah hodnoty, tak aby byla vždy v rozmezí <0,212>, tzn. modulo 213. Součástí obsluhy přerušení je i kontrola zda nebylo dosaženo cílové polohy, pokud je zrovna v průběhu příkaz pro pohyb motorem č. 2 na zadanou polohu. Na Obr. 37 je vyobrazen vývojový diagram.
48
Obr. 37 – vývojový diagram interpretace signálu enkodéru
6.1.6
Ošetření zákmitů mechanických čidel
Dotyková čidla jsou mechanického provedení a navíc značně nekvalitní. Vykazují proto zákmity, které je nutné ošetřit. Zvolil jsem cestu softwarového ošetření. Jeden z možných principů uvádí publikace [3]. Stav senzorů je pravidelně obsluhou přerušení ISR(TIMER0_OVF_vect) načítán do pole. Celkem má pole 10 položek (počet lze nastavit proměnnou v definiční části zdrojového kódu). Každá položka pole představuje jeden bajt a každý z dolních 5 bitů bajtu reprezentuje stav čidla (logická 1 znamená stisknuté čidlo). Celkem má pole 10 takovýchto položek (počet lze nastavit proměnnou v definiční části zdrojového kódu). Současně s plněním pole se volá periodicky ve smyčče main funkce getDebouncedSwitches, která provede logický součin prvků pole (jednotlivých bajtů), tzn. stavů spínačů v jednotlivých po sobě jdoucích okamžicích. Výsledkem je tedy bajt, ve kterém jsou jedničky na místech, kde byly ve všech okamžicích, tzn., kde byly sepnuté spínače po delší dobu. Tímto principem je možné poměrně snadno ošetřit zákmity všech spínačů najednou. Nastavením časovače je možné měnit interval nabírání vzorků a tím přizpůsobit rutinu parametrům spínačů. V main funkci se současně vyhodnotí, zda nedošlo ke změně stavu spínačů oproti předchozímu načtení. Pokud ano, je poslána zpráva přes sériovou linku.
49
6.1.7
Nastavení směru a rychlosti motorů
Nastavení směru a rychlosti motorů využívají metody motor1Reset, motor2Reset, motor1Home, motor2Home, motor1Move, motor2Move. Nastavení směru se zajišťuje pomocí nastavení log. úrovní na vstupu H-můstku. H-můstek je propojen s mikrokontrolérem přes piny. To znamená, že změna se provádí přiřazením logických úrovní přiřazením do portů. Rychlost otáčení motoru se udává nastavením PWM (hodnoty 0-255, 0 znamená stojící motor), což zajišťuje v mém firmwaru funkce setPWM. Následující tabulka a ukázka kódu ukazuje, jak lze např. nastavit směr a rychlost rotace motoru. Pro rychlé zabrzdění využívám nastavení obou pinů na stejnou hodnotu a nastavení PWM 255, tzn. kontinuální připojení obou konců vinutí motoru na stejný potenciál. Tab. 15 a ukázka kódu pod tabulkou naznačuje, jak lze např. nastavit směr a rychlost rotace motoru č. 1.
směr / rychlost Směr A (rychlost daná hodnotou PWM) Směr B (rychlost daná hodnotou PWM) stojí stojí
kanál 1 (pin X)
kanál 2 (pin Y)
1 0 0 1
0 1 0 1
Tab. 15 – ovládání směru a rychlosti motoru
// nastavení pinu označeného konstantou MOT1_DIR_CHAN1 na hodnotu log. 1 PORTC |= (1 << MOT1_DIR_CHAN1); // nastavení pinu označeného konstantou MOT1_DIR_CHAN2 na hodnotu log. 0 PORTC &= ~(1 << MOT1_DIR_CHAN2); setPWM(180, 1);
//nastavení PWM motoru č. 1 na hodnotu výkonu 180
50
7 Testování Tetování Furbyho se skládalo ze dvou částí: • •
testování firmware testování audio rozhraní (je nezávislé na firmwaru, je řízeno BlueTooth modulem)
Pro účely testování firmware jsem využíval terminálový program, kterým jsem posílal Furbymu příkazy. Pro BlueTooth komunikaci jsem použil klasický BlueTooth USB dongle a pomocí správce BlueTooth zařízení (součást programového vybavení donglu) jsem vytvořil virtuální sériový bezdrátový port. Nastavení sériového portu využité při testování: • • • • •
8 datových bitů 1 start bit 1 stop bit bez parity rychlost 38400 baud
Bylo nutno otestovat tyto aspekty: schopnost správně rozeznat příkazy schopnost zpracovat více příkazů za sebou, tzn. naskládat je do front odesílání správných odpovědí Postupně jsem tedy odesílal různé typy příkazů a následně i sekvenci několika příkazů. Podle Furbyho reakcí mohu konstatovat, že splňuje výše zmíněné požadavky. Při tomto testování se ukázalo, že rychlost motorů je závislá na napětí baterií a tudíž především při využití akumulátorů jsou Furbyho pohyby pomalejší. Při příliš nízkém napětí může dojít k uváznutí motoru. Tyto problémy se ale dají ošetřit na straně PC na základě informace, kterou Furby podává o napájecím napětí. Dále bylo nutné otestovat audio rozhraní tvořené mikrofonem, reproduktorem a BlueTooth modulem. Pro navázání SCO audio kanálu je nutný druhý BlueTooth modul F2M03AC2 nebo speciální ovládací software pro klasický dongle (toto je součástí ostatních projektů). Tento software nemám k dispozici, tudíž jsem využil desku s BlueTooth modulem, kterou jsem navrhnul ještě před zahájením této bakalářské práce (zmíněno v Úvodu dokumentace). BlueTooth moduly jsou schopny navázat automaticky audio spojení bez spolupráce s Furbyho firmwarem. Poslechem jsem zjistil, že se ve zvuku vyskytuje jen nepatrné rušení. Rozhodl jsem se pro jistotu provést další integrační testy vzhledem k projektu hlasového rozpoznávání. Společně s kolegou, který pracuje na projektu hlasového rozpoznávače na PC straně jsem testoval, zda je kvalita zvuku vyhovující. Z uskutečněných testů vyplývá, že by kvalita měla být dostačující. Při všech testech se však ukázalo, že BlueTooth přenos mezi donglem na PC straně a modulem ve Furbym je značně ovlivněn vzdáleností a překážkami fyzického rázu. Pokud mezi
51
zařízeními existují překážky, klesne někdy dosah jen na 2m. Tato hodnota ale velmi silně závisí na prostoru, ve kterém se zřízení nachází a nedá se přesně stanovit. Poruchy se projevují např. přerušováním zvuku („cukáním“ zvuku) a zpomalením datového přenosu. Změny zvuku tohoto rázu bohužel mohou způsobit chybnou interpretaci hlasovým rozpoznávačem, případně znemožní rozpoznání úplně.
52
8 Možná vylepšení Furbyho Hardware byl navržen s ohledem na možnost budoucí konfigurace modulu. Modifikací firmwaru lze dosáhnout možnosti konfigurovat BlueTooth modul bez nutnosti rozebrání Furbyho. Je možno vytvořit příkazy, na které by Furby zareagoval odpojením modulu od řídícího počítače a následnou automatickou rekonfigurací. Další potenciální vylepšení představuje implementace diskrétního regulátoru polohy motoru do firmwaru, což by odstranilo nutnost zavedení tolerance pro pozici horního motoru. Pokoušel jsem se o implementaci PID regulátoru (proporcionálně integro-derivační regulátor), avšak ukázalo se, že mechanika Furbyho je velice nekvalitní a působí zde značné setrvačné síly a tření, které navíc nejsou identické po dobu jedné otočky, tudíž má proměnnou charakteristiku. Jako převod mezi motorem a mechanikou je použita obyčejná pružná gumička, což má na regulaci katastrofální vliv. Ani samotný motor není příliš vhodný a je velmi obtížné navrhnout správné koeficienty regulačního algoritmu. Přesto jsem nakonec dosáhl schopnosti stabilizace polohy horního motoru na správné pozici. Ke stabilizaci docházelo ale bohužel v neadekvátně dlouhé době (cca 5 sekund, docházelo ke kmitání okolo cílové polohy), a proto jsem regulátor nakonec vyřadil z činnosti a nezahrnul do výsledné implementace. Dovolím si však tvrdit, že s patřičným měřícím vybavením, možná i využitím sofistikovanějšího druhu algoritmu a dostatkem času by bylo možné činnost regulátoru mírně zoptimalizovat. Nedovedu však odhadnout, zda se podaří docílit dostatečně malého překmitu a dostatečně krátké doby stabilizace.
53
9 Závěr Účelem mé bakalářské práce bylo vytvoření funkční verze Furbyho, kterou by bylo možno ovládat dálkově přes rozhraní BlueTooth. Navrhl jsem novou základní desku elektroniky, která jde bez problémů zabudovat do stejného typu hračky Furby. Zpracování příkazů zajišťuje zabudovaný mikrokontrolér. Pro přenos dat přes BlueTooth rozhraní jsem využil služeb BlueTooth modulu Free2Move F2M03AC2, a to především službu bezdrátového sériového portu a integrovaný audio kodek s analogovým audio rozhraním. Dále jsem navrhl a implementoval ovládací software mikrokontroléru včetně návrhu komunikačního protokolu a příkazů pro komunikaci mezi Furbym a počítačem. Celá architektura ovládání je založena na možnosti frontového zpracování příkazů, takže Furby akceptuje větší množství příkazů naráz a eliminují se kritické časové synchronizace. Vstupní fronta má kapacitu 40 příkazů a fronty motorů mají každá kapacitu 20 příkazů. Spolu s hlasovým ovládáním a audio rozhraním bude možné ovládat Furbyho interaktivně. V této oblasti se naskytuje mnoho různých uplatnění od prosté demonstrace hlasového rozpoznávače zábavnou formou až po různé interaktivní hry pro malé děti. Provedené implementační testy a jejich výsledky prověřily funkčnost celého mnou navrženého a implementovaného řešení.
54
10 Seznam literatury [1] ATmega8 datasheet, Technická literatura firmy Atmel [online] URL:
[2] Free2Move F2M03AC2 datasheet, Technická literatura firmy Free2Move [internet] URL: < http://www.datasoft.se/documents/DatasheetF2M03AC2DSS.pdf> [3] Jack G. Ganssle, The Ganssle Group: A Guide to Debouncing [online] URL: < http://www.ganssle.com/debouncing.pdf> [4] Internetové fórum AVRFreaks, týkající se mikrokontrolérů firmy Atmel [online] URL: < http://www.avrfreaks.net/ >
[5] Dokument týkající se regulace elektrických motorů [online] URL: < http://www.fm.vslib.cz/~krtsub/fm/par/pohony.pdf>
[6] Jan Vobecký, Vít Záhlava: Elektronika Součástky a obvody, principy a příklady, 3. rozšířené vydání, Grada Publishing, Praha 2005, ISBN 80-247-1241-5 [7] Milan Mikulec, Václav Havlíček: Základy teorie elektrických obvodů 1, Vydavatelství ČVUT, Praha 2004, ISBN 80-01-02519-5
55
56
A. Příloha – Použité zkratky Zkratka
Význam
A/D převodník BT
analogově-digitální převodník BlueTooth Electrically Erasable Programmable Read-Only Memory elektricky přepisovatelná paměť hardware elektricky přepisovatelná paměť (podobná eeprom) Input / Output – vstupně/výstupní micro controller unit – mikrokontrolér Personal Computer - osobní počítač vývod součástky StaticRrandom Access Memory Universal Synchronous and Asynchronous serial Receiver and Transmitter – univerzální synchronní a asynchronní sériový přijímač a vysílač Universal Serial Bus
EEPROM HW FLASH I/O MCU PC PIN SRAM USART USB
Tab. 16 – použité zkratky
57
B. Příloha – Nastavení sériové linky a připojení Furbyho Pro zprovoznění komunikace mezi počítačem a Furbym je nutné správně nakonfigurovat BlueTooth rozhraní a rychlost sériové linky. Furby se chová jako SLAVE zařízení BlueTooth komunikace. Počítač jako MASTER. Furby se hlásí s názvem zařízení „Furby“ a poskytuje službu „sériový port“. Párovací pin kód pro autorizaci zařízení je: 1234. Parametry sériového portu: • • • • •
datový rámec 8 datových bitů (1 bajt) 1 start bit 1stop bit bez parity rychlost 38400 baud
58
C. Příloha – Obrazová dokumentace
Obr. 38 – celkové schéma zapojení
59
Obr. 39 – layout základní desky
kanál B
kanál A
GND CH_A kanál A kanál B CH_B Vcc
motor č. 2 motor č. 1
enkodér
Obr. 40 – popis konektorů na základní desce
60
D. Příloha –Přiřazení vývodů MCU k Furbyho komponentám
komponenta Furbyho
vývod (pin) mikrokontroléru
kanál A
PC2
kanál B
PC1
PWM1
PB2(OC1B)
kanál A
PC0
kanál B
PC3
PWM2
PB1(OC1A)
kanál A
PD3 (INT1)
kanál B
PD4
RXD
PD1 (TXD)
TXD
PD0 (RXD)
RESET
PB4
enable – PIO[2]
PB3
motor č. 1
motor č. 2
enkodér
BT modul
index spínač motoru č. 1
PD5
index spínač motoru č. 2
PD6
čidlo na břiše
PD2
čidlo na zádech
PC5
čidlo v zobáku
PC4
vstup A/D převodníku pro měření baterií
ADC7
Tab. 16 – přiřazení vývodů MCU k Furbyho komponentám
61
E. Příloha – obsah CD nosiče přípravný projekt - BlueTooth deska
\bluetooth_baseboard\
hardware
\hardware\ \eagle_project\
projekt pro program Eagle 4.15; obsahuje schémata a layout desky
\img_schematics_layout\
obrázky schémat a layoutu různé obrázky
\images\
tato bakalářská práce - BT Furby
\furby\ \doc\
dokumentace, text bak. práce
\firmware\
software pro mikrokontrolér
\project_avr_studio\
projekt pro AVRStudio
\sources\
zdrojové kódy v jazyce C hardware
\hardware\ \eagle_project\
projekt pro program Eagle 4.15; obsahuje schémata a layout desky
\img_schematics_layout\
obrázky schémat a layoutu desky různé obrázky
\images\
obsah CD
\readme.txt
62