Robotika základy - technika.junior.cz
Transkript
ROBOTIKA – ZÁKLADY verze 0.4 ze dne 5.9.2012 Rudolf Hlaváček a kolektiv Obsah 1 Úvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1 Týmy pro stavbu robotů . . . . . . . . . . . . . . . . . 1.2 Co budeme stavět – přehled kapitol . . . . . . . . . . . 1.3 Orientace v textu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 4 4 4 2 Soutěže . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1 Eurobot starter a Bear Rescue Beginner . . . . . . . . 2.2 Pravidla kategorie Stopár v soutěži Istrobot . . . . . . 2.3 Robotchallenge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 5 3 Doporučení k mechanické konstrukci robota . . . . . 3.1 Ovládání robotů . . . . . . . . . . . . . . . . . . . . . . 3.2 Velikost robotů . . . . . . . . . . . . . . . . . . . . . . 3.3 Konstrukce velkých robotů . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 6 6 6 4 Nezbytné součástky . . . . . . . 4.1 Datasheet . . . . . . . . . . . 4.2 Mikroprocesor, mikrokontrolér 4.3 Rezistor . . . . . . . . . . . . 4.4 Kondenzátor . . . . . . . . . . 4.5 Dioda . . . . . . . . . . . . . 4.6 LED . . . . . . . . . . . . . . 4.7 Tranzistor . . . . . . . . . . . 4.8 Cívka . . . . . . . . . . . . . 4.9 Driver . . . . . . . . . . . . . 4.10 Stabilizátor . . . . . . . . . . 4.11 Krystal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 6 7 7 7 7 8 8 8 8 8 8 5 Postup při programování čipu . . . . . . . . . . . . . . 5.1 Úvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.1 Postup programování robota . . . . . . . . . . . 5.1.2 Potřebné programy . . . . . . . . . . . . . . . . 5.2 Nastavení a práce v AVR Studiu . . . . . . . . . . . . . 5.3 WinAVR . . . . . . . . . . . . . . . . . . . . . . . . . . 5.4 Nastavení programu Up . . . . . . . . . . . . . . . . . 5.5 Práce s programátorem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 9 9 9 9 10 10 10 6 Základy syntaxe v jazyce C . . . . . . . . . . . . . . . 6.1 Základní pojmy . . . . . . . . . . . . . . . . . . . . . . 6.2 Výrazy a operátory . . . . . . . . . . . . . . . . . . . . 6.2.1 Aritmetické operátory . . . . . . . . . . . . . . 6.2.2 Operátory inkrementace a dekrementace . . . . 6.2.3 Logické výrazy a operátory . . . . . . . . . . . . 6.3 Příkazy . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3.1 Přiřazovací příkaz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 11 12 12 13 13 14 14 . . . . . . . . . . . . 1 . . . . . . . . . . . . . . . . ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 14 16 17 18 19 20 20 20 7 Bity a bajty . . . . . . . . . . . . . . . . . . . . . . . . 7.1 Desítková soustava a dvojková soustava . . . . . . . . 7.1.1 Desítková soustava . . . . . . . . . . . . . . . . 7.1.2 Dvojková soustava . . . . . . . . . . . . . . . . 7.1.3 Převod z desítkové soustavy do dvojkové . . . . 7.1.4 Bity a bajty . . . . . . . . . . . . . . . . . . . . 7.1.5 Převod z dvojkové soustavy do desítkové . . . . 7.2 Bitové výrazy a práce s nimi . . . . . . . . . . . . . . . 7.2.1 Bitové operátory . . . . . . . . . . . . . . . . . 7.2.2 Bitový součet . . . . . . . . . . . . . . . . . . . 7.2.3 Bitový součin . . . . . . . . . . . . . . . . . . . 7.2.4 Bitová negace . . . . . . . . . . . . . . . . . . . 7.2.5 Bitový exklusivní součet . . . . . . . . . . . . . 7.2.6 Bitový posun doleva . . . . . . . . . . . . . . . 7.2.7 Bitový posun doprava . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 20 20 20 20 22 22 22 22 23 23 23 24 24 25 8 Periferie . . . . . . . . . . . . . . 8.1 Co jsou to periferie . . . . . . 8.2 Jaké periferie Atmega16 má? . 8.3 Obecné použití periferií . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 25 25 26 9 Práce s ATMega16 v C . . . . . . . . . . . . . . . . . . 9.1 Piny . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.2 Přehled pinů . . . . . . . . . . . . . . . . . . . . . . . . 9.2.1 Připojení na programátor . . . . . . . . . . . . 9.3 Práce s registry . . . . . . . . . . . . . . . . . . . . . . 9.4 Registry pro řízení pinů . . . . . . . . . . . . . . . . . 9.5 Základní vstup a výstup . . . . . . . . . . . . . . . . . 9.6 Nastavování bitu – zapsání jedničky . . . . . . . . . . . 9.7 Sesazení bitu – zapsání nuly . . . . . . . . . . . . . . . 9.8 Příklad pro vstup a výstup . . . . . . . . . . . . . . . . 9.9 Registry časovačů/čítačů . . . . . . . . . . . . . . . . . 9.10 PWM – řízení motorů . . . . . . . . . . . . . . . . . . 9.11 Řízení serva . . . . . . . . . . . . . . . . . . . . . . . . 9.12 Přerušení . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 26 26 27 27 27 27 28 29 29 29 30 30 31 10 Základy elektroniky . . . . . . . . . . . . . . . . . . . . . . . . . . 31 6.4 6.5 6.3.2 Blok příkazů . . . . . . . . . . . . . . . . . . . 6.3.3 Podmiňovací příkaz (if) . . . . . . . . . . . . 6.3.4 Příkaz několikanásobného větvení (switch) . . 6.3.5 Cyklus for (cyklus řízený proměnou ) . . . . 6.3.6 Cyklus while (cyklus s podmínkou na začátku Funkce a procedury . . . . . . . . . . . . . . . . . . . Knihovny . . . . . . . . . . . . . . . . . . . . . . . . 6.5.1 Vlastní knihovny . . . . . . . . . . . . . . . . 6.5.2 Použité knihovny . . . . . . . . . . . . . . . . . . . . . . . . 10.1 10.2 10.3 10.4 10.5 10.6 10.7 10.8 10.9 Proud . . . . . . . . . . . . . . . . . . Napětí . . . . . . . . . . . . . . . . . . Odpor . . . . . . . . . . . . . . . . . . Výkon . . . . . . . . . . . . . . . . . . Výpočet tepelného výkonu (ztrátového) Dioda . . . . . . . . . . . . . . . . . . Výpočet rezistoru pro LED-diodu . . . Tranzistory . . . . . . . . . . . . . . . Stabilizátor . . . . . . . . . . . . . . . . . . . . . . . . 32 32 32 32 32 33 34 35 36 Literatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 Rejstřík . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 Úvod Tento text chce čtenáři – naprostému začátečníkovi – pomoct stavět a programovat amatérské roboty, pro zábavu a nebo pro účast v různých robotických soutěžích. 1.1 Týmy pro stavbu robotů Stavba robotů zahrnuje tři propojené, ale relativně nezávislé okruhy: návrh a výrobu mechanické konstrukce, návrh a zapojení elektroniky a programování. Proto je dobré roboty stavět v týmech, kde se jednotliví členové zaměřují na tyto oblasti a navzájem se doplňují. Navíc každý tým potřebuje řadu pomocných činností (nákup součástek, vyhledávání údajů na internetu a pod.). Je dobré mít proto v každém týmu ještě pomocníka, který podporuje ostatní a umožňuje jim soustředit se na jejich hlavní úkoly. Úplně ideální potom je, když každou funkci v týmu zastávají dva lidé, takže se mohou vzájemně zastupovat. Tým by potom měl celkem osm členů – dva mechaniky, dva elektroniky, dva programátory a dva pomocníky. To se ale v praxi téměř nikdy nepodaří. Často nastane právě opačný případ, kdy tým má pouze dva nebo tři členy, kteří se o všechny činnosti musí nějak podělit. V každém případě ale platí, že je výhoda, pokud lidé v týmu znají i věci mimo jejich „hlavní oborÿ, tj. když například programátor zná základy elekroniky. 1.2 Co budeme stavět – přehled kapitol Většina studentů si na začátku vybere robotickou soutěž (viz kapitola 2 ) a pro ni staví robota. Základní zásady mechanické stavby robotů jsou popsány v kapitole 3. Nezbytné elektronické součástky pro výrobu robotů, které by měli znát všichni, jsou v kapitole 4. Další informace k elektronice jsou v kapitole 10. Ostatní kapitoly postupně popisují programování robotů. 1.3 Orientace v textu Čísla ve hranatých závorkách odkazují na seznam literatury na straně 37. Pro stavbu robotů, především elektroniku a programování, je potřebná řada pojmů. Měli jsme snahu uvádět nové informace postupně, ale vždycky to nebylo možné. Pokud narazíte na neznámý pojem, použijte rejstřík (strana 38). Pokud něco v rejsříku nenajdete, přijďte to reklamovat :-). Pokud už budete některé pasáže znát, můžete je přeskočit. Toto je první verze textu, proto mohou být některé pasáže nesrozumitelné. Pokud Vám nebude něco jasné, přijďte se zeptat nebo použijte Google. 4 2 2.1 Soutěže Eurobot starter a Bear Rescue Beginner Toto je soutěž, na kterou se přednostě zaměřujeme. Koná se každoročně v Praze. Cílem je sestrojit robota, který plní soutěžní úkoly. Hřiště a úkoly se každoročně mění. Nicméně je jedna věc, kterou musí umět každopádně: jezdit. Takže se stavbou funkčního podvozku se dá začít ještě než výjdou oficiální pravidla. Většinou musí umět něco tlačit před sebou, zvedat, stavět na sebe, to záleží na zadání. Roboti jsou ovládání před kabel řidičem, takže odpadá složité programování. Nicméně naprogramování řízení například přes joystick usnadňuje řidiči manipulaci s robotem, což je základ úspěchu. Dále je nezbytný trénink. I pár dní ježdění způsobí umístění v první osmičce robotů, které postupují do vyřazování. V roce 2012 byla soutěž Eurobot starter nahrazena soutěží Bear Rescue Beginner. Základní charakter soutěže zůstal zachován. 2.2 Pravidla kategorie Stopár v soutěži Istrobot Stopár je kategorie soutěže Istrobot, která se koná v Bratislavě. Cílem je sestrojit zcela samostatného robota, který bude sledovat černou čáru na bílém podkladu a projede soutěžní trať co nejrychleji. Na trati se přitom mohou vyskytovat tyto překážky: tunel, přerušení čáry, cihla, reflektor (změna osvětlení trati), most, rozdvojení čáry, dveře [13]. Konstrukce a materiály nejsou omezeny, je povoleno i používat zakoupené stavebnice robotů, podmínkou je pouze, aby autor napsal aspoň program. To je také důvod, proč se na soutěži vyskytují v hojné míře roboti, kteří jsou postaveni ze stavebnice Lego. Roboti musí být autonomní a nesmí být ovládáni dálkově. Omezeno je nejvyšší napětí, se kterým mohou roboti pracovat, a to na 24 V. Proudový odběr je povolen maximálně do 20 A. Počet nebo druh senzorů není omezen. Na soutěži byl robot s jedním senzorem (kamera), ale objevil se i robot s dvaceti čtyřmi senzory. Šířka a výška robota nesmí přesáhnout 20 cm. Délka není omezená. 2.3 Robotchallenge Ve Vídni pořádají soutěž s názvem Robot Challenge [12], jen asi větší. Je zde více kategorií, nás bude nejvíce zajímat kategorie Line Follower a Line Follower Enhanced. Ta poslední zmíněná je podobná té na soutěži Istrobot. Zatímco kategorie Line Follower je jednodušší v tom, že neobsahuje překážky jako přerušení čáry, cihlu, tunel. Šířka robota nesmí přesáhnout 30 cm. Co se týče vlastních poznatků musím zmínit, že v soutěži Robotchallenge je důležité mít senzory na detekci čáry zakrytovaané. Samozřejmě je vhodné je mít zaktytovány i v soutěži Istrobot, tam to ale není tak nutné, protože světelné podmínky mi připadaly během soutěže neměnné. Nicméně na Robotchallenge se světelné podmínky dost měnily. Zde je velice nutné myslet na zakrytování všech IR senzorů. 5 3 Doporučení k mechanické konstrukci robota Roboty rozlišujeme podle způsobu ovládání a podle velikosti. 3.1 Ovládání robotů Každý robot může být buď řízený nebo autonomní. Autonomní znamená, že je naprogramovaný a během soutěže nebo prezentace se pohybuje samostatně. Roboty můžeme řídit po kabelu nebo bezdrátově, například přes bluetooth. 3.2 Velikost robotů Na škole a v DDM Junior stavíme a programujeme hlavně roboty dvojího typu : „středníÿ a „velkéÿ. Jako střední používáme roboty yunimin a 3pi - jsou v zásadě hotové a „pouzeÿ se programují, jsou určené pro soutěže typu sledování čáry (Robotchallege, Istrobot, nově i Robotický den v Praze), minisumo a další. Pro střední roboty neexistuje soutěž, kde by se ovládali po kabelu, musí proto být autonomní. Velké roboty (typicky pro soutěž Eurobot a Robotický den) si stavíme sami. Mohou být dálkově řízené i autonomní. Začátečníkům se silně doporučuje začít s dálkově řízeným robotem a nebo se přidat k týmu zkušenějších konstruktérů. 3.3 Konstrukce velkých robotů Při stavbě velkých robotů se držíme osvědčeného schématu: Podvozek tvoří základní deska z překližky nebo rám z hliníkových profilů typu „Lÿ tvaru obdélníku, osmiúhelníku nebo kruhu. Na podvozku jsou připevněné dva motory z akušroubováků nebo z akuvrtaček včetně převodovek, které se koupí hotové. Jiné typy motorů jsou buď pomalé nebo slabé. V žádném případě se nepokoušejte koupit pouze motor (např. protože je levnější) a vyrábět si převody sami. Dále jsou zde dvě kola, každé připojené ke svému motoru a jedna nebo více podpěr podvozku, obvykle z kartáčku na zuby. Motory s koly lze umístit doprostřed nebo dozadu, podle toho, co má robot na hřišti dělat. Na podvozek se umisťuje konstrukce z hliníkových tyčí, profilů nebo z merkuru, s pomocí které robot plní svoje úkoly. Méně tuhé materiály se neosvědčily. 4 4.1 Nezbytné součástky Datasheet Datasheet je dokument, ve kterém jsou detailně popsány vlastnosti a možnosti dané elektronické součástky. Každá součástka má svůj datasheet. Datasheet je možné najít na internetu, například na stránce www.datasheetcatalog.com 6 nebo na stránkách výrobce nebo prodejce součástky. Bohužel jsou všechny datasheety anglicky. 4.2 Mikroprocesor, mikrokontrolér Mikroprocesor, mikrokontrolér, čip znamenají totéž – integrovaný obvod, který se snažíme naprogramovat, aby řídil robota nebo jeho část. Pin je vývod (nožička) čipu (podrobněji viz 9.1). Jednoduché čipy (např. ATtiny) mají osm pinů, složitější čipy mají 32, 40, nebo také 100 pinů. 4.3 Rezistor Rezistor nebo také odpor1 je součástka, která klade elektrickému proudu určitý odpor neboli ho omezuje. A to podle vzorce: U = R · I, kde U je napětí, R je odpor a I elektrický proud (viz str. 32). Tento vztah je znám pod názvem Ohmův zákon a můžeme z něj vyjádřit proud I: I = U/R. Ze vzorce je vidět, že pokud použijeme rezistor s větším odporem při stejném napětí, tak se protékající proud zmenší (použití viz 10.7). Odpor rezistoru měříme v ohmech, značka Ω. 4.4 Kondenzátor Kondenzátor je součástka, která uchovává elektrický náboj. Jeho hlavní vlastností je kapacita. Jednotkou kapacity je Farad, značka F. V praxi se používají násobky jako mikrofarad (µF), nanofarad (nF) a pikofarad2 (pF). Kondenzátory se nabíjí a vybíjí různě rychle a mají různou kapacitu. Keramické kondenzátory mají nejmenší kapacitu(pF, nF) a jsou nejrychlejší, tantalové mívají kapacitu okolo pár µF a jsou pomalejší a nejpomalejší jsou elektrolytické s kapacitou stovek až tisíců µF. U tantalových a elektrolytických kondenzátorů musíme dát pozor na polaritu, tj. kam připojujeme + a kam -. Další důležitý údaj je maximální hodnota napětí, kterou kondenzátor snese. 4.5 Dioda Dioda je součástka, která usměrňuje elektrický proud. To znamená, že pokud ji zapojíme do elektrického obvodu, tak zajistí, že proud bude téct pouze jedním směrem. Proto budeme diodu používat jako ochranu proti tzv. přepólování – chybnému zapojení baterie nebo součástky do obvodu, které obvykle vede ke zničení součástky (podrobněji viz 10.6). 1 Správně se součástce říká rezistor, odpor je její vlastnost. Ale mnoho lidí používá pro označení součástky slovo odpor. 2 Mikrofarad je miliontina faradu, nanofarad je tisíckrát menší a pikofarad milionkrát menší než mikrofarad. 7 4.6 LED LED3 je součástka, která není primárně určená k usměrnění proudu, ale k signalizaci, zda obvodem protéká proud. K LED se vždy musí připojit rezistor (viz 10.7). 4.7 Tranzistor Tranzistor je součástka, která umožňuje pomocí malých proudů z čipu řídit větší proudy, například do reproduktoru nebo motorku (viz 10.8). 4.8 Cívka Cívka neboli tlumivka je součástka, jejíž hlavní vlastností je indukčnost, jednotka henry, značka H. V praxi se používají milihenry (mH) a mikroHenry (µH). 4.9 Driver Čip nemůže řídit například motor přímo, protože jedním pinem může protékat obvykle maximálně 40 mA většina motorů potřebuje mnohem větší proud. Proto se používají součástky zvané drivery, které podle pokynů z čipu řídí proud z baterií do motorů a servomotorů. 4.10 Stabilizátor Většinu čipů je potřeba napájet přesně 5 V. Jak toho docílit z baterií, na kterých je například 9 V nebo 12 V, zkrátka více než 5 V. Navíc napětí na bateriích kolísá podle toho, jak moc proudu zrovna odebírají motory. Pro napájení čipů je proto nutné použít stabilizátor. Stabilizátor je součástka, která z kolísavého vyššího napětí vyrobí přesné napětí nižší. Nejčastěji se používají stabilizátory řady 78XX, kde XX značí, na kolik voltů součástka stabilizuje, například 7805 stabilizuje na 5 V. Stabilizátor má tři piny (vstup, zem, výstup). Zapojí se takto: Kladný pól baterie (+) se napojí na vstup, záporný pól na zem (-). Mikrokontrolér se zapojí pinem VCC na výstup stabilizátoru a GND (pin 11 - digitální zem) se zapojí na zem stabilizátoru. Tímto máme připojený mikrokontrolér na napájení. 4.11 Krystal Pokud budeme potřebovat vyšší frekvenci procesoru, použijeme krystal . Původní frekvence mikrokontroléru ATMega16 je nastavena na 1 MHz. S pomocí krystalu ji můžeme zvýšit až na 16 MHz. Krystal zapojíme takto: Jeden pin krystalu (je jedno, který) připojíme na pin XTAL1 a druhý na XTAL2. Dále na pin XTAL1 připojíme jednu nožičku kondenzátoru a druhou na digitální zem (11GND). To samé u pinu XTAL2. Hodnotu kondenzátoru můžeme volit od 12pF do 22pF. 3 Light emitting diode – světlo vysílající dioda 8 5 Postup při programování čipu 5.1 Úvod Roboty programujeme v jazyce C++, a to z několika důvodů. Zaprvé je to mnohem jednodušší než programovat v Assembleru. Zadruhé je to jazyk běžně používaný pro programování čipů. Většina informací o programování je pro řadu čipů společná, pro konkrétní ukázky je použitý čip ATMega16 [1]. 5.1.1 Postup programování robota 1. Napsání a přeložení programu v AVR Studiu 2. Nahrání přeloženého souboru *.hex do mikrokontroléru 5.1.2 Potřebné programy 1. AVR Studio 4 – v něm budeme psát zdrojový kód 2. WinAVR – použijeme pro překlad 3. Up – tímto programem nahrajeme *.hex soubor do mikrokontroléru 5.2 Nastavení a práce v AVR Studiu 1. Spustíme AVR Studio 2. Klikneme na New project 3. V kolonce Project type zvolíme AVR GCC 4. Do kolonky Project name napíšeme jméno projektu bez diakritiky 5. Zaškrtneme Create initial file a Create folder 6. Do kolonky Location napíšeme adresu, kam se má projekt uložit 7. Vlevo vybereme AVR Simulator a vpravo námi použitý mikrokontrolér (např. ATmega16) 8. Klikneme na Finish 9. Klikneme na záložku Project a dáme položku Configuration Options 10. Zvolíme Custom Options a nyní přepíšeme text -std=gnu99 v levém okně na -x c++ a dáme Add a potom OK 11. Nyní můžeme psát program, poté ho přeložíme klávesou F7 nebo tlačítkem Build Active Configuration 12. Zkontrolujeme, zda se v programu vyskytují chyby či nikoli 9 13. Pokud tu chyby jsou, musíme najít první v pořadí, dvakrát na ní klikneme a objeví se nám modrá šipka ukazující na místo, kde se chyba vyskytuje 5.3 WinAVR Abychom mohli zdrojový kód přeložit, zavolá AVR Studio překladač, který kód přeloží do souboru typu *.hex, který potom můžeme nahrát do mikrokontroléru. Na to ale musíme mít nainstalovaný překladač WinAVR [8]. Po vytvoření souboru *.hex ze zdrojového kódu můžeme tento soubor nahrát do mikrokontroléru. 5.4 Nastavení programu Up Do mikrokontroléru nahrajeme *.hex soubor programem Up pomocí programátoru4 PRESTO. Nejprve upravíme nastavení programu Up (stačí jednou). 1. klikneme na záložku Nastavení, dále vybereme Klávesové zkratky..., potom vyberu pro tlačítko GO Programování paměti programu.5 2. klikneme na záložku Nastavení a zvolíme Nastavení programu 3. zaškrtneme Načíst hex soubor vždy znovu před programováním 4. dále necháme zaškrtlé pouze Zobrazovat varovné hlášky k pojistkám, Pro čtení: Automaticky zavřít stavové okno, Delší čas pro zapojení napětí při ICSP 5. nastavíme čas na 10000 µs, a odklikneme OK 5.5 Práce s programátorem 1. Spustíme programu Up 2. Klikneme na Otevřít a najdeme si cestu k projektu, který jsme si vytvořili v AVR Studiu 3. Až to najdeme, tak klikneme na adresář default a najdeme hex soubor a dáme otevřít 4. Teď zbývá nahrát ho do mikrokontroléru 5. Nastavíme a nebo zkontrolujeme Konfiguraci 6. Propojku BODLEVEL nastavíme na co nejvyšší hodnotu menší, než hodnotu napájení mikroprocesoru a propojku BODEN na Enable 4 Zařízení pro naprogramování součástek. Tím zajistíme, že se při zmáčknutí tlačítka GO na programátoru přeprogramuje pouze paměť pro program a ne například paměť EEPROM. Dále tím dosáhnu toho, že se nepřenastaví propojky pro mikrokontrolér. 5 10 7. Propojku SUT, CKSEL nastavíme na námi požadovanou frekvenci danou vnějším oscilátorem. V našem případě máme krystal 16MHz, a proto nastavíme SUT, CKSEL na XT 3.0-8.0MHz, 16Kck+65ms – tím říkáme, že krystal je od 3 do 8 MHz, 16Kck+65ms říká, že než začne procesor pracovat, uplyne 16 tisíc tiků kryslalu naprázdno plus ještě 65 ms počká, je to kvůli stabilitě hodin v čipu, zkrátka, aby procesor pracoval správně. 8. Propojku CKOPT nastavíme na XT up to 16MHz, rail to rail – tím řekneme, že krystal připojený k čipu je 16 MHz a ne 8 MHz, které jsme si zvolili v propojkách SUT, CKSEL 9. Při prvním programovaní musíme upravit frekvenci programátoru, protože mikrokontrolér je z výroby nastaven na 1 M Hz. V kolonce Frekvence krystalu zvolíme menší než 1 M Hz například >100 kHz 10. Důležité jsou i kolonky Napájení v klidu a Napájení během programování. Pokud máme na procesoru napětí 5 V, tak dáme Žádné/externí a Externí 2,7 V až 5,5 V. Pokud chceme procesor napájet z programátoru, tak nastavíme políčko Napájení během programování na interní 5 V. Políčkem Napájení v klidu pak zapínáme a vypínáme procesor. 11. Klikneme na Konfigurační tabulku pravým tlačítkem a dáme Zapamatovat pojistky, pak znovu pravé tlačítko a dáme Naprogramovat konfigurační paměť. 12. Nyní můžeme stisknout tlačítko GO na programátoru. 6 6.1 Základy syntaxe v jazyce C Základní pojmy příkaz – povel pro procesor, říká procesoru, co má dělat. Příkazy probíhají postupně, nejprve se udělá jeden a pak další, který je na řadě Za příkazy dáváme středník (;). syntaxe – „pravopisÿ programovacího jazyka, říká, jak psát příkazy programovacího jazyka tak, aby nám počítač rozuměl preprocesor – před samotným překladem programu do *.hex souboru proběhnou tzv. direktivy preprocesoru (něco jako příkazy, podrobně viz [3], str. 18). Příklady: #include <> – pro vkládání hlavičkových souborů #include "" – pro vkládání vlastních hlavičkových souborů #define KONSTANTA HODNOTA_KONSTANTY – pro definici konstanty, všude kde se v kódu vyskytne text KONSTANTA bude tento text nahrazen HODNOTA_KONSTANTY proměnná – je místo v paměti, kde jsou uložena nějaké data 11 datový typ – říká nám, v jaké podobě jsou data v proměnné uložena. V proměnné jsou pouze jedničky a nuly, Pomocí datového typu mikrokontrolér pozná, jestli ta data jsou čísla, nebo znak, v jakém rozsahu jsou čísla, atd. . . používané datové typy: uint8_t – celá čísla od 0 do 255 int8_t – celá čísla od -127 do 127 uint16_t – celá čísla od 0 do 65535 int16_t – celá čísla od -32767 do 32767 uint32_t – celá čísla od 0 do 4294967296 int32_t – celá čísla od -2147483647 do 2147483647 operandy – jsou čísla nebo výrazy, které „vstupují do operaceÿ operátory – nám říká, jaké operace provedeme s operandy (co s nimi uděláme) Příklad: 5 + 2, přitom 5 a 2 jsou operandy a znaménko plus je operátor, který nám říká, že čísla chceme sečíst (provést operaci sečítání) poznámka – cokoliv se objeví v kódu mezi znaky /* a */, tak je poznámka a bude před překladem odstraněno z kódu. Pokud chceme zapoznámkovat pouze jeden řádek, použijeme // Příklady: /* Vše co napsáno zde je poznámka a nebude překládáno */ // Toto je poznámka, která může popsat funkci nějakého úseku kódu 6.2 Výrazy a operátory Výraz je něco co nabývá nějaké hodnoty, např.: 5 + 3 je výraz, který nabývá hodnoty 8. 5 > 3 je výraz nabývající hodnoty true neboli pravda, x <= 10 je výraz který je pravdivý, pokud proměnná x(kterou musíme mít deklarovanou) menší nebo rovna číslu 10. 6.2.1 + * / Aritmetické operátory sčítání odčítaní násobení dělení 12 6.2.2 Operátory inkrementace a dekrementace pokud chceme zvýšit hodnotu proměnné o jedničku, napíšeme ++název_proměnné; pokud chceme snížit hodnotu proměnné o jedničku, napíšeme --název_proměnné; Příklad: uint8_t i = 5; // Vytvoření proměnné i a dosazení hodnoty 5 do ní. uint8_t j = 42; // Vytvoření proměnné j a dosazení hodnoty 42 do ní. ++i; --j; 6.2.3 // Hodnota i se zvýší o jedničku na číslo 6. // Hodnota j se sníží o jedničku na číslo 41. Logické výrazy a operátory Přehled logických operátorů: == porovnání - rovnost != porovnání - nerovnost && logický součin || logický součet ! negace < menší než <= menší nebo rovno > větší než >= větší nebo rovno Logický výraz může nabývat pouze dvou hodnot – pravda (true) a nepravda (false). Obvykle je nepravda reprezentovaná nulou a pravda každým nenulovým číslem. Logické výrazy se používají v podmínkách (viz např. 6.3.3) . Logické operace se používají při vyhodnocování logických výrazů. Příklady: a == b výraz je pravdivý, pokud se a rovná b a != b výraz je pravdivý, pokud se a nerovná b lze to napsat i konkrétněji, např.: a != 5, výraz je pravda pokud se a nerovná 5, pokud se rovná výsledkem výrazu je nepravda(false) b > c výraz je pravdivý, pokud je b větší než c b >= d výraz je pravdivý, pokud je b větší nebo rovný d !(a > b) výraz v závorce je pravdivý, pokud je a větší než b, ale pak je negováno(z pravdy se stává nepravda a naopak ), tj. celý výraz je nepravdivý, pokud je a větší než b, pokud je a menší nebo rovno, tak je výraz pravdivý. !(a == b) výraz (a == b) je negován znaménkem !, to znamená, že výraz je pravdivý, pokud se výraz a nerovná výrazu b, v podstatě se to dá napsat i takto: a != b Pozor: negace výrazu (a > b), tj. !(a > b) není to samé jako výraz (a < b), 13 ale správně je to (a <= b) 6 Logický součin && se používá, pokud budeme potřebovat spojit dva nebo více výrazů dohromady, např.: (a > b)&&(c == d), výsledkem tohoto výrazu bude logický součin výrazů v závorkách, pro logický součin platí, že je pravda pokud oba výrazy jsou pravdivé, jinak je výsledek nepravda, tj. zde bude pravda pouze pokud bude a větší než b a zároveň bude platit, že c se rovná d. Logický součin použijeme, pokud musí všechny výryzy být pravda. Logický součet || je pravdivý, pokud alespoň jeden výraz je pravdivý. Např.: (e <= f)||(g != 3) výraz bude pravda, pokud bude platit, že e je menší nebo roven f, nebo bude platit, že g se nerovná 3, anebo klidně budou platit oba výrazy. 6.3 6.3.1 Příkazy Přiřazovací příkaz Použijeme, pokud chceme, aby se do proměnné uložila nějaká data. Syntaxe: datový_typ název_proměnné; syntaxe vkládání: název_proměnné = hodnota_která_se_má_uložit; Data do proměnné můžeme vložit rovnou při vytváření proměnných: datový_typ název_proměnné = hodnota; Příklad: uint8_t b = 5; Vytvoří se proměnná pojmenovaná b (která je v rozsahu od 0 do 255) a uloží se do ní číslo 5. int16_t B; Vytvoří se proměnná B. B není to samé jako b, protože jazyk C rozlišuje VELKÁ a malá písmena. B = 1024; Do proměnné B se uloží hodnota 1024; 6.3.2 Blok příkazů Pokud chceme někam dát více příkazů, ale můžeme tam dát pouze jeden příkaz, tak je dáme do složených závorek Příklad: { PŘÍKAZ1; PŘÍKAZ2; PŘÍKAZ3; } 6.3.3 Podmiňovací příkaz (if) Použijeme, pokud chceme, aby se program mohl rozhodnout na základě nějaké podmínky. 6 Platí zde určité zákonitosti viz De Morganovy zákony 14 syntaxe: if(PODMÍNKA) PŘÍKAZ1; else PŘÍKAZ2; Pokud platí PODMÍNKA v kulaté závorce, vykoná se PŘÍKAZ1, pokud neplatí, vykoná se PŘÍKAZ2. Za if nebo else může být pouze jeden příkaz, pokud jich tam chceme dát více, použijeme blok. Větev else je nepovinná. Příklad: if(a > 5) // Pokud platí, že //proměnná a je větší něž 5, tak se { b = a; // do proměnné b uloží hodnota, která je v proměnné a c = 2; // do proměnné c se uloží číslo 2. } // Pokud podmínka neplatí, tak se nevykoná nic. podmínka může být výraz např.: a > 5 // podmínka bude platit, // pokud proměnná a je větší než 5 podmíněné příkazy lze vnořovat - v bloku příkazů může být další if Příklad: if(PODMÍNKA1) { PŘÍKAZ1; if(PODMÍNKA2) { PŘÍKAZ2; } PŘÍKAZ3; } else { PŘÍKAZ4; } Pokud platí PODMÍNKA1 tak se vykoná PŘÍKAZ1, pak se zkontroluje PODMÍNKA2, pokud platí, tak se vykoná PŘÍKAZ2, pokud ne, program pokračuje dál a vykoná PŘÍKAZ3. V případě, že neplatí ani PODMÍNKA1, tak se blok příkazů přeskočí a vykoná se blok příkazů za else, tj. PŘÍKAZ4. Je tu možnost také do větve else napsat daší if else, vypadá to takto: if(PODMÍNKA1) { PRÍKAZ1; 15 } else { if(PODMÍNKA2) { PRÍKAZ2; } else { PRÍKAZ3; } } Pokud platí PODMÍNKA1, tak se vykoná PŘÍKAZ1, pokud ne, tak se zkontroluje PODMÍNKA2, pokud platí tak se vykoná PŘÍKAZ2, pokud neplatí, tak se vykoná PŘÍKAZ3. Výše zapsaný kód sice bude fungovat, ale není přehledný, a proto z důvodu lepší orientace v kódu zvolíme tento zápis: if(PODMÍNKA1) { PRÍKAZ1; } else if(PODMÍNKA2) { PRÍKAZ2; } else { PRÍKAZ3; } 6.3.4 Příkaz několikanásobného větvení (switch) Pokud by takto zapsaných podmínek bylo moc a vztahovali by se k jedné řídící proměnné lze použít příkaz několikanásobného větvění neboli switch. Tak například místo zápisu: if(a == 1) { PŘÍKAZ1; } else if(a == 2) { PŘÍKAZ2; } else if(a == 3) { PŘÍKAZ3; 16 } else if(a == 4) { PŘÍKAZ4; } else { PŘÍKAZ5; } Lze napsat: switch(a) { case 1: PŘÍKAZ1; break; case 2: PŘÍKAZ2; break; case 3: PŘÍKAZ3; break; case 4: PŘÍKAZ4; break; default: PŘÍKAZ5; break; } Čím se to celé zjednodušuje. 6.3.5 Cyklus for (cyklus řízený proměnou ) Tento cyklu použijeme, pokud předem známe kolikrát se má opakovat určitá operace Syntaxe: for(řidící_proměnná; podmínka; zvýšení_nebo_snížení_hodnoty_proměnné ) { PŘÍKAZ1; PŘÍKAZ2; } Příklad: for(uint8_t i=0; i<4; i++) { rozsvit_ledku(); 17 pockej_sekundu(); zhasni ledku(); } Co tento kód udělá? Dejme tomu, že máme už předem vytvořené funkce rozsvit_ledku(), atd. . . Potom cyklus udělá následující: vytvoří proměnnou i datového typu uint8_t (celá čísla od 0 do 255), uloží do ní číslo 0. Potom zkontroluje podmínku, zda je proměnná i menší než 4, pak se provedou příkazy či funkce v těle cyklu, tj. rozsvítí se LED-dioda, bude svítit jednu sekundu, a pak zhasne. Pak se provede příkaz i++, ten zvýší hodnotu proměnné o jednu, tj. na číslo 1. Potom se kontroluje znovu podmínka, zdali je proměnná i (která má teď hodnotu 1) menší než 4, atd. . . Celkem se tělo cyklu vykoná čtyřikrát. Cyklus for lze použít i bez proměnné, podmínky a zvýšení hodnoty, potom bude probíhat donekonečna. Příklad: for(;;) { rozsvit_ledku(); pockej_sekundu(); zhasni ledku(); } Tento cyklus bude dělat to samé, co předchozí, s tím rozdílem, že to bude dělat donekonečna a nebude se ptát na podmínku. Použití v programu pro robota: Nekonečný cyklus, ve kterém se kontrolují podmínky, zda je na čáře, zda je před ním soupeř, zda má udělat to či ono. 6.3.6 Cyklus while (cyklus s podmínkou na začátku ) Použijeme, pokud nebudeme vědět kolikrát mají proběhnout příkazy a funkce v těle cyklu. Syntaxe: while(podmínka) { PŘÍKAZ1; ... } Příklad: while(!je_tlacitko_stiskle()) { ujed_1_cm(); } Tento cyklus bude stát, dokud nezmáčkneme tlačítko. Vyžaduje mít předem naprogramovanou funkci ujed_1_cm() a je_tlacitko_stiskle(). 18 6.4 Funkce a procedury Pokud se nám v zdrojovém kódu opakují dokola stejné příkazy, můžeme vytvořit funkce nebo procedury, které potom voláme a které nám usnadní kód. syntaxe: datový_typ_který_funkce_vrací název_funkce(datový_typ_parametru1 parametr1, datový_typ_parametru2 parametr2) // Parametry jsou nepovinné { PŘÍKAZ1; // Nepovinné příkazy PŘÍKAZ2; return HODNOTA_KTEROU_FUNKCE_VRACI; // Za return se napíše výraz, který funkce vrací. } Příklad: // Funkce na sčítání dvou čísel, každé od 0 do 255. uint16_t umocni(uint8_t zakl, uint8_t exp) { uint16_t vys = 1; if(exp > 0) { for(uint8_t i = 0; i < exp; i++) { vys = vys * zakl; } } return vys; } pokud někde v programu použiji funkci secti(10, 2), tak výsledkem bude, jako bych napsal 10*10, tj. 100. Příklad: c = umocni(a, b); // Do proměnné c se uloží b-tá mocnina čísla a. procedura – je vlastně funkce, jen s tím rozdílem, že procedura má datový typ void a nemá return (tj. nevrací žádnou hodnotu). Příklad: void rozsvitLedku() { DDRB |= (1<<PB0); /* Co dělá tento příkaz nemusíte zatím řešit, pak se k tomu dostaneme. */ } Pokud někde v programu napíšu rozsvitLedku(), tak se rozsvítí LEDka na robotovi. tělo funkce main – všechny příkazy, které jsou mezi složenými závorkami, se po zahajení programu postupně vykonají 19 6.5 6.5.1 Knihovny Vlastní knihovny Z funkcí a procedur se mohou vytvářet soubory pro usnadnění práce. těmto souborům se říká knihovny . Soubory mají koncovku .h Příklad: avr/io.h moje_knihovna.h Vlastní knihovnu poté mohu vložit direktivou #include Příklad: #include "moje_knihovna.h" 6.5.2 Použité knihovny Pro práci s mikrokontroléry budeme potřebovat některé už vytvořené knihovny Příklad: avr/io.h – pro základní vstup a výstup avr/interrupt.h – pro práci s přerušením stdint.h – zde je definovány datové typy (viz 6.1) 7 7.1 Bity a bajty Desítková soustava a dvojková soustava V počítači jsou všechna data uložena pouze v podobě jedniček a nul. A proto se nám bude hodit, když se budeme aspoň trochu orientovat v převodech mezi dvojkovou a desítkovou soustavou. 7.1.1 Desítková soustava V desítkové soustavě je základem číslo deset. Příklad: číslo 156 si můžeme rozložit jako 1*10^2 + 5*10^1 + 6*10^0, přitom 10^0=1, 10^1=10, 10^2=10*10=100, 10^3=10*10*10=1000 atd . . ., takže naše číslo potom vypadá takto: 1*100 + 5*10 + 6*1 = 156. 7.1.2 Dvojková soustava Ve dvojkové soustavě je základem číslo dva. Příklad: číslo 11001010 rozložíme na 1*2^7 + 1*2^6 + 0*2^5 + 0*2^4 + 1*2^3 + 0*2^2 + 1*2^1 + 0*2^0, přitom 2^0=1, 2^1=2, 2^2=2*2=4, 2^3=2*2*2=8, 2^4=2*2*2*2=16, 2^5=32, atd. . ., proto naše číslo má hodnotu: 1*128 + 1*64 + 0*32 + 0*16 + 1*8 + 0*4 + 1*2 + 0*1 = 202. 7.1.3 Převod z desítkové soustavy do dvojkové Jak na to, když chceme převádět číslo z desítkové soustavy do dvojkové? Například převedeme číslo 97. Nejprve je potřeba, abychom znali násobky čísla dva: 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, atd. . . 20 Napíšeme jedničku. 1 Najdeme nejbližší nižší násobek dvou k našemu číslu, v našem případě je nejblíže 64. Odečteme si od 97 číslo 64, 97-64=33. Odečítali jsme číslo 64, další v pořadí je číslo 32, je 32 obsaženo v 33? Ano, proto napíšeme další jedničku. 11 Dále 33-32=1, další číslo je 16, je 16 obsaženo v 1? Ne, proto napíšeme nulu. 110 Další číslo je 8, také není obsaženo v 1, takže napíšeme nulu. 1100 Čísla 4 a 2 také nejsou obsažena v čísle 1, proto napíšeme nuly. 110000 A nakonec, je číslo jedna obsaženo v čísle jedna? Ano, napíšeme jedničku. Náš binární zápis čísla 97 vypadá takto:1100001. Čísla v binární soustavě by měla mít počet cifer rovno 8, 16, 32, podle toho s kolika bitovými čísly počítáme. V našem případě musíme doplnit jednu nulu. Pokud bychom počítali s 16 bitovými čísly doplníme o 8 nul více. Nuly doplňujeme zleva. Zapamatujeme si to snadno v desítkové soustavě se číslo 128 také nezmění pokud před něj dáme nuly, 000128. Nuly navíc nebudeme psát v desítkové soustavě, ale v dvojkové nám to pomůže se lépe orientovat. Takže to bude vypadat: 01100001 No a to ještě není všechno. Aby mělo číslo správný tvar musí mít před číslem uvedeno 0b(nula a malé B), tím říkáme v jazyce C, že číslo je v (binární) dvojkové soustavě. Pozor: Čísla 101 a 0b101 nejsou to samé!Je to jednoduché, pokud 0b neuvedeme bude překladač číslo brát jakože je v desítkové soustavě. Tj. 101 => číslo sto jedna, 0b101 => číslo pět. Další příklad: Převedeme číslo 237. Nejbližší nižší číslo je 128. 1 237-128=109 je číslo 64 obsaženo v čísle 109? ANO, další jednička. 11 109-64=45 je číslo 32 obsaženo v 45? ANO, jednička. 111 45-32=13 je 16 obsaženo v čísle 13? NE, nula. 1110 je číslo 8 obsaženo v 13? ANO, jednička. 11101 13-8=5 je 4 obsaženo v 5? ANO, jednička. 111011 5-4=1 je obsažena v 1? NE, nula. 1110110 je 1 obsažena v 1? ANO, jednička. 11101101 Binární zápis čísla 237 vypadá takto:11101101. 21 7.1.4 Bity a bajty Každá číslice ve dvojkové soustavě reprezentuje jeden bit (nabývá hodnot 0 nebo 1). Osm bitů dohromady tvoří bajt. Nejnižší bit v bajtu leží vpravo (tzv nultý bit), další je nalevo od něj (první bit), až do sedmého bitu, který je nejvíce vlevo. 7.1.5 Převod z dvojkové soustavy do desítkové Vezmeme si například binární číslo 1011. Očíslujeme si pozice zprava doleva od nuly, tj.: 1 0 1 1 3 2 1 0 Pohybujeme se v dvojkové soustavě, tj. základ bude 2. Vezmeme nultou číslici a vynásobíme s ní číslo 2^0. Dostáváme 1*2^0 = 1. Dále první číslici vynásobíme číslem 2^1, tj. 1*2^1 = 2. Dále druhou číslici vynásobíme číslem 2^2, tj. 0*2^2 = 0. A to samé provedeme s číslicí na třetí pozici: 1*2^3 = 8. A nyní čísla sečteme 8 + 0 + 2 + 1 = 11, takže binární číslo 1011 převedené do desítkové soustavy je 11. Příklad 2: Převeďte binární číslo 11101001 do desítkové soustavy. 1*2^0 + 0*2^1 + 0*2^2 + 1*2^3 + 0*2^4 + 1*2^5 + 1*2^6 + 1*2^7 To je: 1 + 0 + 0 + 8 + 0 + 32 + 64 + 128 = 233 Binární číslo 11101001 převedeno do desítkové soustavy je 233. Příklad 3: Převeďte binární číslo 00010101. 1*2^0 + 0*2^1 + 1*2^2 + 0*2^3 + 1*2^4 + 0*2^5 + 0*2^6 + 0*2^7, samozřejmě členy 2^x, které násobíme nulou budou nulové a tudíž je můžeme beztrestně vynechat, tj. 1*2^0 + 1*2^2 + 1*2^4 = 1 + 4 + 16 = 21 Binární číslo 00010101 má v desítkové soustavě hodnotu 21. 7.2 Bitové výrazy a práce s nimi Bitové operace se od logických operací (viz 6.2.3) liší tím, že se neaplikují na číslo jako celek, ale bit po bitu, viz níže. My budeme potřebovat následující bitové operace: bitový součet, bitový součin, bitovou negaci, bitový posun doleva. 7.2.1 Bitové operátory | bitový součet & bitový součin ~ bitová negace ^ bitový exluzivní součet << bitový posuv doleva >> bitový posuv doprava 22 7.2.2 Bitový součet Platí, že 0|0=0, 0|1=1, 1|0=1, 1|1=1, sčítají se vždy pouze bity, které leží pod sebou. Zkrátka pokud je aspoň jeden bit jedna, výsledek je také jedna. Příklad: máme dvě binární čísla 00000100 a 01100001 a chceme je bitově sečíst. Když sečteme nulté bity zadaných čísel, dostamene 0—1=1. Pak provedeme bitový součet i pro první, druhé a další bity. Zapíšeme: (0b00000100 | 0b01100001); Nebo pokud budeme mít čísla v proměnných: uint8_t a = 0b00000100; uint8_t b = 0b01100001; uint8_t c; c = (a|b); Do proměnné c se zapíše výsledná hodnota. 00000100 - první číslo 01100001 - druhé číslo -------01100101 - výsledek po bitovém logickém součtu Výsledek: 01100101. 7.2.3 Bitový součin Platí, že 0&0=0, 0&1=0, 1&0=0, 1&1=1, tady platí, že výsledek je jedna, pokud oba bity jsou jedna. Příklad: bitový součin čísel 00110011 a 01000001 Zapíšeme: (0b00110011 & 0b01000001); Nebo pokud budeme mít čísla v proměnných: uint8_t c = 0b00110011; uint8_t d = 0b01000001; uint8_t e; e = (c&d); Výsledná hodnota se zapíše do proměnné e. 00110011 - první číslo 01000001 - druhé číslo -------00000001 - výsledek bitového logického součinu 7.2.4 Bitová negace Tam, kde byla jednička, bude nula, a kde byla nula, bude jednička. Příklad: znegujte číslo 00110101 Zapíšeme: ~(0b00110101); Nebo pokud budeme mít číslo v proměnné: uint8_t a = 0b00110101; uint8_t b; b = ~a; 23 Do proměnné b se zapíše výsledná hodnota. 00110101 - číslo, které bude logicky znegováno -------11001010 - výsledek 7.2.5 Bitový exklusivní součet Výsledkem exklusivního součinu je pravda, pokud se hodnoty liší, tj. nejsou stejné. Takže platí 0^0=0, 0^1=1, 1^0=1, 1^1=0 Zapíšeme: (0b00110011 ^ 0b01000001); Nebo pokud budeme mít čísla v proměnných: uint8_t c = 0b00110011; uint8_t d = 0b01000001; uint8_t e; e = (c^d); Výsledná hodnota se zapíše do proměnné e. 00110011 - první číslo 01000001 - druhé číslo -------01110010 - výsledek bitového exklusivního součtu 7.2.6 Bitový posun doleva Vezmeme celé osmibitové číslo a posuneme ho o určitý počet míst doleva. Přitom čísla vlevo zmizí a na na uprázdněné místo vpravo přijdou vždy nuly. Zapíšeme: (0b01000101 << 3); Nebo pokud budeme mít číslo v proměnné: uint8_t c = 0b01000101; uint8_t d; d = (c << 3); Do proměnné d se přiřadí výsledek operace. Pokud například už nebudeme potřebovat původní hodnotu proměnné c, lze to napsat i takto: uint8_t c = 0b01000101; c = (c << 3); Hodnota v proměnné c se nejprve posune o tři pozice a pak se výsledná pozice zapíše na stejnou pozici v paměti mikrokontroléru. Příklad: proveďte bitový posun doleva o tři s číslem 00000101 01000101 -------10001010 - posun o jedno doleva 00010100 - znovu o jedno doleva (celkem o dvě místa) 00101000 - celkový posun o tři bity doleva 24 7.2.7 Bitový posun doprava Bitový posun doprava je podobný jako operace bitový posun doleva, liší se jen ve směru posunu, tj. posouvá se na opačnou stranu. Příklad 1: Proveďte bitový posun doprava o tři pozice s binárním číslem 00000101. Zapíšeme: (0b00000101 >> 3); Výsledkem bude toto: 00000101 -------00000010 - posun o jednu pozici doprava 00000001 - posun o druhou pozici 00000000 - posun o třetí pozici Příklad 2: Proveďte bitový posun o dvě pozice doprava a potom o tři doleva s binárním číslem 11110111. Zapíšeme: ((0b11110111 >> 2) << 3); Výsledkem bude toto: 11110111 -------00111101 - posun o dvě pozice doprava 11101000 - posun o tři pozice doleva, toto je výsledek. Příklad 3: Ale co když zadám číslo do proměnné v desítkové soustavě, například 189 a provedu bitový posun o dvě pozice doprava? Co dostanu? Dostanu snad 1? Ne, i když jsme číslo zadali v desítkové soustavě, v mikrokontroléru je stejně uloženo jako jedničky a nuly, takže číslo musíme nejprve převést do dvojkové soustavy. 189 = 0b10111101 A teď posun o dvě pozice doprava: 00101111 a to je číslo 47. Takže 47 je výsledek bitového posunu čísla 189 o dvě pozice doprava. Zapíšeme takto: uint8_t a = 189; uint8_t b; b = (a >> 2); No a výsledek(tj. číslo 47 ) se uloží do proměnné b. 8 8.1 Periferie Co jsou to periferie Periferie je nějaké rozšíření funkce jednotlivých pinů procesoru. Periferie rozšiřují použití mikrokontrolérů téměř na jakékoliv použití od blikání LED, přes různé časovače, digitální hodiny, teploměry až k menší autonomním robotům. 8.2 Jaké periferie Atmega16 má? Atmega16 má dva 8-bitové časovače/čítače, jeden 16-bitový časovač/čítač, osm kanálů 10-bitového A/D (analogově/digitálního) převodníku, analogový komparátor, tři druhy komunikací (TWI, SPI, USART), které lze použít ke komunikaci mikrokontroléru s okolím. 25 8.3 Obecné použití periferií Vstupně/výstupní pin lze použít k rozsvěcení LED (v sérii s LED musí být rezistor, viz ). Lze zjišťovat, zda je nebo není tlačítko zmáčknuté. Časovače/čítače mohou být zdrojem času pro určité aplikace, ale nejužitečnější je použití č/č jako generátor obdélníkového signálu, která bude sloužit jako pwm k řízení motoru. Kdykoliv potřebujeme získat nějaký rozumný údaj z analogových senzorů, to jest ne pouze 5 V nebo 0 V, ale cokoliv co se nachází mezi např.: 2,14 V. Použití například údaj z potenciometru nebo senzoru(fototranzistor, elektronický kompas či akcelerometr). Komunikaci mikrokontroléru s jiným mikrokontrolérem budeme řešit přes USART, TWI nebo SPI. 9 9.1 Práce s ATMega16 v C Piny Pin je nožička procesoru. Může být nastavený jako vstupní nebo jako výstupní. Pokud je pin nastavený jako vstupní, umí určit, zda na něm je napětí odpovídající logické jedničce (5 V) nebo logické nule (0 V). Pokud je pin nastavený jako výstupní, umí se nastavit na logickou jedničku nebo logickou nulu. Další funkce pinů jsou popsány níže. 9.2 Přehled pinů Na druhé straně nahoře v [1] najdete podobu mikrokontroléru a popis jeho pinů. Pro nás jsou nejdůležitější tyto piny (čísla v závorce jsou čísla pinů podle obrázku): VCC(10) – napájení digitální části mikrokontroléru 5 V GND(11) – zem digitální části AVCC(30) – napájení analogové části(A/D převodník na portu A) GND(31) – zem pro analogovou část AREF(32) – referenční napětí pro A/D převodník RESET(9) – přivedením logické nuly (0 V) po krátkou dobu se procesor resetuje a program začne běžet od začátku XTAL1(13) a XTAL2(12) – piny pro připojení krystalu Pak jsou tu piny jako PB0 až PB7, je to označení základní vstupně výstupního pinu – druhé písmeno nám říká z jakého je portu a číslo pořadí pinu (pozor:začíná od nuly). Každý takto označený pin lze nastavit na logickou jedničku (5V) nebo logickou nulu (0V), nebo lze například číst, zda je na pinu logická jednička či nula (testování stisklého tlačítka). V závorkách je uvedena alternativní funkce pinu. Nás zajímají tyto: ADC0(40) až ADC7(33) – A/D(Analogově/digitální) převodník, pro získání hodnot z nějakého analogového senzoru (např.: teplotní čidlo, IR senzor, čtení napětí na bateriích přes odporový dělič). 26 OC0(4), OC1A(19), OC1B(18), OC2(21) – výstupy č/č(časovače/čítače), které lze použít ke generování PWM signálu pro řízení motorů, ale ne přímo z mikrokontroléru, ale pouze pomocí driveru. MOSI(6), MISO(7), SCK(8), RESET(9), GND(11) – piny používané pro programování mikrokontroléru. INT0(16), INT1(17), INT2(3) – vnější přerušení, například pro detekci stisknutí tlačítka. 9.2.1 Připojení na programátor Programátor má některé piny pojmenovány odlišně: VPP(13V), VDD, GND, DATA/MOSI, CLOCK, MISO VPP programátoru připojíme na RESET mikrokontroléru, VDD připojíme na VCC, GND na GND, DATA/MOSI na MOSI, CLOCK na SCK, MISO na MISO. 9.3 Práce s registry Při práci s mikrokontrolérem budeme pracovat s menšími úseky paměti, tzv. osmibitovými registry. Registr se chová jako proměnná – můžeme z něj číst údaj nebo ho tam vkládat. Tím řídíme chod mikrokontroléru. Registry jsou pojmenovány velkými písmeny, například: DDRD, PORTD, PIND, OCR1, atd. . . 9.4 Registry pro řízení pinů Piny jsou označeny PA0 až PA7, PB0 až PB7, atd. . . Písmeno za P říká, z jakého portu je pin, číslo udává pořadí pinu (čísluje se od nuly). Např.: PD5 – pátý pin portu D, PA4 – čtvrtý pin portu A, PC0 - nultý pin portu C. 9.5 Základní vstup a výstup Díky registrům DDRA, DDRB, DDRC a DDRD mikrokontroléru řekneme, který pin má být vstupní či výstupní. Na začátku jsou všechny bity těchto registrů nastaveny na nulu, tj. všechny nožičky mikrokontroléru jsou vstupní. Piny jsou rozděleny do portů A, B, C a D, každý port má maximálně osm pinů. Každému pinu je přiřazen jeden bit v registru. Každý pin je značen PXn, kde X je port, kterému pin náleží(A,B,C,D), a n je číslo pinu(od 0 do 7). Například PB5 je pátý pin portu B, kterému odpovídá pátý bit v registru DDRB, tj. bit označený jako X v čísle 00X00000. Totéž trochu jinak: Vstupně/výstupní piny ( [1] str.48) Pro práci s vstupně/výstupními piny jsou k dispozici tři registry DDRX, PORTX, PINX, kde X je označení portu (A,B,C,D). DDRX – tímto registrem říkáme, zda je pin v portu X vstupní (0) či výstupní(1). PORTX – pokud je pin vstupní, tak logickou nulou vypínáme pull-up (zdvihávací) rezistor a logickou jedničkou zapínáme pull-up7 . PORTX – pokud je pin výstupní, 7 Pull-up rezistor je rezistor, který zajistí, že na pinu bude logická jednička(5 V ), je to rezistor, kde jedna nožička je na VCC a druhá na pinu. 27 tak logickou nulou nastavíme na pinu logickou nulu a logickou jedničkou jedničku. PINX – tento registr slouží pouze a jen pro čtení, a udává aktuální hodnotu na portu X 9.6 Nastavování bitu – zapsání jedničky Například: DDRB = DDRB | (1<<PB5); // Tento příkaz nastaví pátý bit v~registru DDRB. Co jednotlivé znaky v příkaze znamenají? Výraz v závorce (1<<PB5) udělá bitový posuv čísla 1 o PB5 míst doleva. PB5 je symbolická konstanta, která má hodnotu 5, místo PB5 lze použít jen číslo 5. Takže (1<<5) je vlastně posunutí čísla 00000001 o pět míst doleva, výsledek 00100000. Znak svislé čáry je operátor pro bitový součet. DDRB je registr pro určení vstupu a výstupu pro port B. Takže příkaz DDRB = DDRB | (1<<5); udělá to, že do registru DDRB uloží hodnotu vzniklou bitovým součtem z původní hodnoty registru DDRB a čísla 00100000. Takto postupujeme, protože neznáme hodnoty v registru DDRB a chceme nastavit jen pátý bit a ostatní chceme nechat nezměněny. Pokud bychom chtěli nastavit jen pátý bit nehledě na ostatní, použijeme příkaz: DDRB = 0b00100000; // 0b - říká překladači, že se jedná o binární číslo Co by se stalo, kdyby v registru už nějaké hodnoty byly nastaveny a my bychom napsali pouze DDRB = 0b00100000;? 01001111 // předchozí hodnota, kterou neznáme, ale chceme ji tam mít 00100000 // výsledná hodnota, která se tam dosadí // výsledek - krom jednoho bitu se všechny další sesadily Při použití příkazu DDRB = DDRB | (1<<5); to bude vypadat takto: 01001111 00100000 -------01101111 // // // // předchozí hodnota hodnota, která se má nastavit bitový součet nastavili jsme pátý bit a ostatní jsme ponechali Příkaz DDRB = DDRB | (1<<5); lze zkrátit na DDRB |= (1<<5);. 28 9.7 Sesazení bitu – zapsání nuly Ze stejného důvodu jako při nastavování bitu použijeme sice složitější zápis, ale bezchybný. Příklad: chceme sesadit pátý bit a ostatní chceme nechat takové, jaké jsou. DDRB = DDRB & ~(1<<5); Vlnka (~) před výrazem v závorce je bitová negace, ampérsand (&) je znak bitového součinu. Nejprve se vyhodnotí výraz v závorce: 00100000 // výraz v~závorce 11011111 // negace výrazu v závorce // s~výsledkem negace se provede logický součin //s~původní hodnotou v~registru 01101111 11011111 -------01001111 // // // // // příklad původní hodnoty výsledek negace logický součin výsledek se oproti původní hodnotě liší jen tím, že je sesazen pátý bit Příkaz na sesazení bitu lze také zkrátit na DDRB &= ~(1<<5); . 9.8 Příklad pro vstup a výstup Příklad: Napište program, kde nastavíte piny PB0, PB1, PB3, sesadíte piny PC5, PC6, vytvoříte proměnou d a uložíte do ní stav portu D. Řešení: #include <avr/io.h> int main() { DDRB |= (1<<PB0)|(1<<PB1)|(1<<PB3); DDRC &= ~((1<<PC5)|(1<<PC6)); uint8_t d = PIND; } 9.9 Registry časovačů/čítačů Pro řízení motorů nám postačí osmibitový časovač/čítače (č/č0, č/č2). Signál pro servo získáme z kanálů šestnáctibitového č/č1. V registrech jsou bity pojmenovány např.: pátý bit v registru – COM01. Můžeme napsat (1<<5), ale raději kvůli přehlednosti budeme psát (1<<COM01). č/č0(datasheet str.68): TCCR0 – pro nastavení časovače na PWM TCNT0 – aktuální hodnota č/č OCR0 – hodnota v porovnávacím registru 29 TIMSK – zde můžeme nastavit přerušení po dosažení shody registru OCR0 s registrem TCNT0 nastavením bitu OCIE0, nebo nastavit přerušení při přetečení č/č nastavením bitu TOIE0. TIFR – pokud nastala shoda registru OCR0 s registrem TCNT0 nastaví se bit OCF0, pokud přeteče č/č nastaví se bit TOV0, bity se nulují samy po vstupu do obslužné rutiny přerušení, nebo pokud nastavíme na jedničku bit TOV. 9.10 PWM – řízení motorů Pro nastavení PWM se podíváme do tabulky na straně 80: Zvolíme mód FastPWM – pro tento mód musíme nastavit bity WGM01 a WGM00 v registru TCCR0, nyní se podíváme na tabulku 40 na straně 81 a budeme chtít použít mód, kdy se při shodě registrů ORC0 a TCNT0 nastaví na pinu OC0 logická nula a při přetečení se nastaví logická jednička – musíme nastavit bit COM01 v registru TCCR0. Teď se podíváme na tabulku 42. V tabulce vidíme různé předděličky CO TO JE, které můžeme použít pro generování PWM. Po dosazení do vzorce na straně 75, kde N je předdělička. Nastavení předděličky bychom měli volit tak, aby frekvence podle vzorce vyšla taková, kterou lidské ucho neslyší (nad 16kHz), ale zase nesmí být větší, něž dokáže zvládnout náš driver CO TO JE(najdeme v datasheetu). Já volil předěličku 64 - výsledná frekvence je kolem 1kHz NEODPOVÍDÁ PŘEDCHOZÍ PODMÍNCE: TCCR0 = (1<<WGM01)|(1<<WGM00)|(COM01)|(1<<CS01)|(1<<CS00); č/č2(datasheet str.115): K ovládání č/č2 slouží registry TCCR2, TCNT2, OCR2, TIMSK, TIFR a navíc registr ASSR, ten by nás zajímal, pokud bychom č/č2 asynchronní(tj. nepoužíval by frekvenci krystalu na pinech XTAL1 a XTAL2, ale krystal na pinech TOSC1 a TOSC2). Pro stejné nastavení č/č2 se podíváme na odpovídající tabulky:50(str 126), 52(str 127), 54(str 128) Příkaz bude vypadat takto: TCCR2 = (1<<WGM21)|(1<<WGM20)|(1<<COM21)|(1<<CS22); 9.11 Řízení serva č/č1(datasheet str.86): S č/č1 to bude trochu složitější. Č/č1 má více možných použití, také se dá použít na pwm pro motory, ale my ho použijeme pro řízení servomotoru (serva). Jak se řídí pohyb serva? Servo se řídí logickým signálem (jedničkou) po dobu od 1 ms do 2 ms (často i od 0,5 ms do 2,5 ms), a celková perioda je 20 ms. Podle toho, jak dlouho signál trvá, tak se servo natočí. Tj. pokud budeme chtít servo maximálně natočit na jednu stranu, nastavíme pin, který slouží jako řídící signál pro servo, na logickou jedničku po dobu 1 ms a pak 19 ms logickou nulu a pak zase logickou jedničku, logickou nulu, atd. . . Pokud budeme chtít servo posunout do druhé krajní polohy, necháme logickou jedničku po dobu 2 ms a logickou nulu po dobu 18 ms. Pokud budeme chtít střední polohu, tak jedničku nastavíme na 1,5 ms a nulu na 18,5 ms. Jestliže budeme potřebovat jiný úhel natočení, nastavíme logickou jedničku na odpovídající dobu. Nastavení č/č1 pro řízení až dvou serv: Registrů, které ovládájí č/č1 je více než u předchozích č/č: 30 TCCR1A, TCCR1B, TCNT1H, TCNT1L, OCR1AH, OCR1AL, OCR1BH, OCR1BL, ICR1H, ICR1L, TIMSK, TIFR Registry označené posledním písmenem H jsou vyšší bajty registru a L nižší bajty registru. Jsou to vlastně šestnáctibitové registry, ke kterým můžeme přistupovat buď jako k dvěma osmibitovým registrům (ICR1L = ..., ICR1H = ...) nebo jednomu šestnáctibitovému (ICR1 = ...). PŘEFORMULOVAT ************* Z tabulky 47 na straně 110 si vybereme mód, který nám vyhovuje: mód 14 rychlé PWM, z tabulky 45 na straně 109 si vybereme to samé, co u předešlých nastaveních č/č. Z tabulky 48 nastavíme předěličku na 8, protože při dosazení do vzorce: ,kde TOP je hodnota v registru ICR, tu nastavíme na 40000, při tomto nastavení nám vyjde, že jeden tik č/č trvá 0,5 ms a toho využijeme při ovládání serv. Nastavíme počáteční hodnotu do registrů OCR1A a OCR1B, jde o to, jak budou serva natočena při zahájení programu, je také důležité nastavit piny pro PWM na výstup: TCCR1A = (1<<WGM11)|(1<<COM1A1)|(1<<COM1B1); TCCR1B = (1<<WGM13)|(1<<WGM12)|(1<<CS11); ICR1 = 40000; OCR1A = 3000; OCR1B = 3000; DDRD |= (1<<PD5)|(1<<PD4); 9.12 Přerušení Co je přerušení? Procesor může zvládnout pouze jednu operaci na jeden tik krystalu, postupuje od jednoho příkazu k druhému a nemůže jen tak všeho nechat a věnovat se něčemu jinému, občas je to ale potřeba. Při přerušení procesor všeho nechá a bude se věnovat přerušení, potom co skončí se bude věnovat dál programu tam, kde přestal. Nastavíme přerušení při přetečení časovače: TIMSK |= (1<<TOIE1); Obslužná rutina přerušení se píše mimo tělo hlavní funkce a vypadá takto ISR(ZDROJ_PŘERUŠENÍ) { PŘÍKAZY; } Zdroj přerušení najdeme v datsheetu na straně 43, v našem případě to bude: ISR(TIMER1_OVF_vect) { } 10 Základy elektroniky Abychom se mohli úspěšně věnovat robotice, musíme znát základní poznatky z elektroniky. Musíme se seznámit se základními pojmy, součástkami a vzorci, které se v elektronice používají. A nemusíme se obávat, těch základních je jenom pár. 31 10.1 Proud Pokud použijeme vodní model, tak (elektrický) proud je množství vody, které proteče za jednu sekundu8 . • Značka: I • Jednotka: 1A = 1 ampér 10.2 Napětí Elektrické napětí měříme vždy mezi dvěma body. Můžeme si ho představit jako rozdíl výšek dvou vodních hladin. Z výše položeného jezera (kladné napětí, +) teče voda (el. proud) do níže položeného (zem, nulový potenciál, -). • Značka: U • Jednotka: 1V = 1 volt 10.3 Odpor DODĚLAT 10.4 Výkon Výkon je definován jako součin napětí a proudu: P =U ·I . • Značka: P • Jednotka: 1W = 1 watt 10.5 Výpočet tepelného výkonu (ztrátového) Na součástkách, na kterých je úbytek napětí a kterými protéká proud, vznikají tepelné ztráty. Příklad 1: Na rezistoru je úbytek napětí 3, 6V a protéká jím 240mA. Jaký je tepelný ztrátový výkon? P = U · I = 3, 6V · 0, 24A = 0, 864W = 864mW Ztráty na rezistoru činí 864W, a proto musíme volit rezistor, který zvládne větší výkon, tj. minimálně na 1W . 8 Ve skutečnosti je to protečení množství elektronů nebo jiných nosičů el. nábojů s celkovým nábojem 1 Coulomb za sekundu. 32 Příklad 2: Diodou 1N4148 bude procházet 100mA, při tomto proudu bude úbytek napětí na diodě 1V . Nezničíme diodu 1N4148? P = U · I = 1V · 0, 1A = 0, 1W = 100mW Diodu nezničíme, protože je vyráběná na celkový výkon 500mW. Příklad 3: Na stabilizátor L7805 přivádím 12V , stabilizátor mi vytváří 5V stabilizovaného napětí a odebírám z něho 250mA. Jaký tepelný výkon bude potřeba uchladit? P = U · I = (12V − 5V ) · 0, 25A = 1, 75W Tepelné ztráty na stabilizátoru budou 1, 75W 9 . 10.6 Dioda Dioda je velmi užitečná součástka, která usměrňuje elektrický proud. To znamená, že pokud ji zapojíme do elektrického obvodu, tak zajistí, že proud bude téct pouze jedním směrem. Proto budeme diodu používat jako ochranu před přepólování tak, že ji připojíme na kladné napětí (znaménko +) nožičkou bez proužku a nožičku, ke které je blíže proužek tu napojíme na část obvodu, kterou budeme chtít napájet. Zem nebo také 0 V (znaménko -) připojíme normálně k obvodu, který budeme chtít napájet. Na diodě vzniká úbytek napětí, se kterým musíme počítat při návrhu obvodu. Tak například pokud připojím na diodu s úbytkem napětí 0,6 V připojím 12 V, tak za diodou bude napětí 11,4 V. Při výběru diody se musíme podívat do datasheetu10 a zjistit parametry diody: 1. Maximální napětí, na které diodu mohu připojit11 2. Maximální proud12 3. Maximální výkon13 4. Úbytek napětí14 Ze začátku nám bude stačit, pokud budeme používat diody: 1N4148 s parametry: • Maximální napětí - 100 V • Maximální proud - 200 mA • Maximální výkon - 500 mW 9 Ve vzorci bylo použito 12V-5V, je to protože na stabilizátoru ubyde 7V, abychom se dostali na požadovaných 5V. 10 Datasheet je dokumentace k dané součástce. Můžeme je sehnat například na stránce www.datasheetcatalog.com 11 Ang.:Peak Repetitive Reverse Voltage 12 Ang.:Continuous Forward Current 13 Ang.:Total Power Dissipation 14 Ang.:Forward Voltage 33 • Úbytek napětí - 1,8 V 1N4007 s parametry: • Maximální napětí - 1000 V • Maximální proud - 1 A • Maximální výkon - 3 W • Úbytek napětí - 1,1 V 10.7 Výpočet rezistoru pro LED-diodu LED-dioda je součástka, která není primárně určená k usměrnění proudu, ale k signalizaci. Může svítit světlem bílým, modrým, zeleným, červeným, ultrafialovým či infračerveným15 . Pokud připojím diodu správně na napětí, tj. tak aby mohl procházet proud a ono nic, tak jsem diodu spálil, protože jí tekl moc velký proud. A proto musíme vždy k diodě připojit do série rezistor, který omezí proud protékající přes LED. A to podle vzorce: N apeti zdroje − U bytek napeti U = I P ozadovany proud Příklad 1: Vypočítejte odpor rezistoru, který zapojíme do série k LED. Připojujeme k ní napětí 5V a provozní proud je 20mA a maximální proud při, kterém dojde ke zničení diody je 40mA. Úbytek na diodě je 1, 2V . R= R= U 5V − 1, 2V = = 190Ω I 0, 02A Použijeme rezistor s odporem 190Ω nebo nejbližší vyšší odpor. Příklad 2: Máme sériově spojeny tři LED-diody, s úbytky napětí 0, 6V , 0, 8V a 1, 2V . Připojíme je k zdroji o napětí 12V . Rezistor o jak velkém odporu musíme použít, jestliže má diodami protékat 20mA. U 12V − 0, 6V − 0, 8V − 1, 2V = = 470Ω I 0, 02A Musíme použít rezistor o odporu 470Ω. Měli bychom ještě spočítat výkon rezistoru. Můžeme použít úbytek napětí na rezistoru vynásobený procházejícím proudem: R= P = U ·I = (12V −0, 6V −0, 8V −1, 2V )·0, 02A = 9, 4V ·0, 02A = 0, 188W = 188mW Stačí 250mW rezistor. Nebo si můžu vypočítat úbytek napětí z U = R · I, to protože znám odpor a protékající proud. P = U · I = R · I · I = R · I 2 = 470Ω · 0, 02A2 = 0, 188W = 188mW Vyšel nám stejný výsledek, použijeme tedy 250mW rezistor o odporu 470Ω. 15 Té využijeme jako senzoru pro robota. 34 10.8 Tranzistory Tranzistor je součástka, která má tři nožičky: báze, kolektor a emitor. Tranzistorů existuje obrovské množství, pro jednoduchost se budeme zabývat pouze některými typy. Jsou to bipolární tranzistory. Ty existují dva: PNP a NPN16 . Tranzistory mají prakticky dvě použití: mohou pracovat jako spínač(vypínač) nebo jako zesilovač. Budeme se zabývat jednodušším použitím, tj. jako spínače. Budeme používat tranzistory NPN. Pokud bude přes bázi do emitoru téct omezený(malý) proud, tranzistor se otevře a přes kolektor do emitoru bude téct velký proud. Tak nám stačil malý proud k řízení velkého. A toho budeme využívat. Základní parametry, které musíme vyhledat v datasheetu: • Maximální napětí mezi kolektorem a emitorem VCEO 17 • Maximální napětí mezi bází a emitorem VCBO 18 • Maximální proud tekoucí kolektorem IC 19 • Maximální výkon PC 20 • Zesílení hf e 21 Ze začátku nám bude stačit používat tranzistory BC337, BC547: BC337 s parametry: • Max. napětí mezi kol. a emit. VCEO - 50V • Max. napětí mezi bází a emit. VCBO - 5V • Max. proud tekoucí kolektorem IC - 800mA • Maximální výkon PC - 625mW • Zesílení hf e - 100 až 600 BC547 s parametry: • Max. napětí mezi kol. a emit.VCEO - 45V • Max. napětí mezi bází a emit. VCBO - 6V • Max. proud tekoucí kolektorem IC - 100mA • Maximální výkon PC - 500mW • Zesílení hf e - 110 až 800 16 Pro lepší zapamatování značky: eN-Pé-eN - šipka VEN Ang.: Collector-Emitter Voltage 18 Ang.: Emitter-Base Voltage 19 Ang.: Collector Current 20 Ang.: Collector Power Dissipation 21 Ang.: DC Current Gain 17 35 BD911 s parametry: • Max. napětí mezi kol. a emit.VCEO - 100V • Max. napětí mezi bází a emit. VCBO - 5V • Max. proud tekoucí kolektorem IC - 15A • Maximální výkon PC - 90W • Zesílení hf e - 5 až 250 Důležité je si všimnout, že minimální zesílení je 522 . To znamená, že pokud budeme chtít tranzistorem spínat proud 10A, tak budeme muset nechat bází téct řídící proud 2A, to znamená, že ho nemůžeme naplno využít, pokud ho budeme řídit mikrokontrolérem, tj. musíme ho spínat jiným tranzistorem. Anebo za čas přijdeme na myšlenku, že pokud budeme chtít řídit velké proudy, budeme potřebovat MOS-FET, např.: IRF520, IRL3803. 10.9 Stabilizátor Výše v textu je zmíněn stabilizátor. Je to součástka, která stabilizuje napětí. My budeme používat stabilizátor L7805, znaky „L78ÿ nám říkají, že se jedná o stabilizátor, který stabilizuje kladné napětí. Číslice „05ÿ nám říká, že stabilizuje na 5V . Například stabilizátor L7812, stabilizuje na 12V . A stabilizátor L7905, stabilizuje na −5V . My použijeme pouze L7805 a možná L7812. Na co stabilizátor? Mikrokontrolér vyžaduje napětí 5V , abychom zajistili, že na vstupu bude vždy 5V musíme ho napájet přes stabilizátor. Aby tyto stabilizátory mohli pracovat správně je potřeba, aby napětí, které přivedeme na jeho vstup bylo aspoň o 2V vyšší než které potřebujeme, tj. pokud budu mít stabilizátor L7805, musím ho napájet aspoň 7V . Úbytek by však neměl být větší než 5V , protože pak nebudeme moct odebírat max. proud, tj. 1, 5A. Stabilizátor máme před sebou tak, abychom přečetli její označení, tj. L7805, první pin zleva je vstup, druhý je zem a třetí, tj. úplně vpravo je výstup. Na vstup připojíme 7V až 12V , prostřední pin uzemníme, a poslední pin vyvedeme na VCC mikrokontroléru. Dále je potřeba věnovat pozornost zapojení kondenzátorů. Mezi vstup a zem připojím podle datasheetu kondenzátor s kapacitou 330nF . Mezi výstup a zem kondenzátor 100nF . 22 Platí pokud bude kolektorem protékat 10A. 36 Literatura [1] Datasheet ATMEGA16A [2] Matoušek David: Práce s mikrokontroléry ATMEL AVR ATmega16, BEN Praha 2006 [3] Kadlec: Programování v jazyce C [4] Kadlec: Programování v jazyce C++ [5] Elektronika tajemství zbavená 1. a 2. díl [6] Dioda, tranzistor a tyristor názorně [7] Váňa Vladimír: Mikrokontroléry ATMEL AVR – Programovaní v jazyce C, BEN Praha, 2003 [8] http://www.atmel.com/dyn/products/tools_card_v2.asp? tool_id=2725&source=redirect [9] http://eurobot.cz/ (kategorie Starter ) [10] http://www.robotchallenge.org/cz/reglement/puck-collect/ [11] http://www.robotika.sk/mains.php (Soutěž Istrobot, kategorie Myš v bludisku) [12] http://www.robotchallenge.org/cz/reglement/parallelslalom/ [13] http://www.robotika.sk/mains.php (Soutěž Istrobot, kategorie Stopár ) 37 Rejstřík autonomní robot, 6 AVR Studio, 9 datasheet, 6 datový typ, 12 desítková soustava, 20 dioda, 7, 33 LED, 8, 34 direktiva preprocesoru, 11 driver, 8 dvojková soustava, 20 periferie, 25 pin, 7, 26 preprocesor, 11 program AVR Studio, 9 Up, 10 WinAVR, 10 programátor, 10 PRESTO, 10 práce s programátorem, 10 proměnná, 11 proud elektrický, 32 přepolóvání ochrana, 7 příkaz, 11 elektrické napětí, 32 elektrický proud, 32 registr, 27 rezistor, 7 knihovna, 20 kondenzátor, 7 elektrolytický, 7 keramický, 7 tantalový, 7 krystal, 8 soustava desítková, 20 dvojková, 20 stabilizátor, 8 7805, 8 syntaxe, 11 LED, 8, 34 logická jednička, 26 logická nula, 26 logická operace, 13 logický výraz, 13 tlumivka, 8 tranzistor, 8, 35 bajt, 22 bit, 22 nultý, 22 cívka, 8 Up, 10 mikrokontrolér, 7 mikroprocesor, 7 výkon, 32 tepelný, 32 výraz logický, 13 napětí elektrické, 32 nultý bit, 22 WinAVR, 10 odpor, 32 Ohmův zákon, 7 operace logická, 13 čip, 7 zákon Ohmův, 7 38
Podobné dokumenty
CINEMA 4D TUTORIÁLY
Poslední možností jak pojmenovat materiál je poklepat na ikonu materiálu (oproti tomu jak jsme klikali na jméno materiálu) - tím se otevře dialogové okno, které je zdrojem informací, jež jsou k dis...
VíceDiplomová práce - Jiří Hobza 200 - Katedra optiky
programování MCU a k vývoji jiných aplikací. Velmi dobře dostupné a zároveň výkonné jsou například mikrokontroléry od firmy ATMEL. Protože základní myšlenkou řídícího programu pro MCU je opakující ...
VíceRízení sériové komunikace - Mikroprocesorová technika a embedded
Spojenı́ Master (programuje) a Slave (je programováno) obsahuje dvojici posuvných registrů + generátor hodin od nadřazeného obvodu Master. Postup programovánı́ (komunikace Master→Slave): (1)...
Více2011-01-28 - Martin Mareš
Příklad toku. Čísla představují toky po hranách, v závorkách jsou kapacity. Poznámka: V angličtině se obvykle zdroj značí s a stok t jako source a target. Pozorování: Nějaký tok vždy existuje. V li...
VíceMikroprocesorová technika, prednáška c. 6
Úroveň na resetovacı́m pinu mikrokontroléru je nižšı́ než práh VP OT (Power-on reset threshold), Externı́ reset: přı́tomnost nı́zké úrovně na vstupu Reset Přetečenı́ ochranného časov...
VíceText práce ve formátu PDF
voltu a tím dolaďuji rychlost pomalejšího motoru, zrychluji ho. Kondenzátory u stabilizátoru mají stejný význam jako u prvního. Napětí z tohoto stabilizátoru napájí pouze operační zesilovače jednoh...
Více