Programování jbotbrainu II v Javě a práce s moduly. 2010, Adam Heinrich (www.adamh.cz)

Rozměr: px
Začít zobrazení ze stránky:

Download "Programování jbotbrainu II v Javě a práce s moduly. 2010, Adam Heinrich (www.adamh.cz)"

Transkript

1 Programování jbotbrainu II v Javě a práce s moduly 2010, Adam Heinrich (www.adamh.cz)

2 Obsah 1 Programovací jazyk Java Proč právě Java? První program Komentáře Třídy a objekty Metody Popis jazyka Java Datové typy a proměnné Definice proměnných Přiřazení hodnoty Aritmetické výrazy Pole Podmínky Cykly Cyklus while Cyklus do-while Cyklus for Příkazy break a continue Nekonečný cyklus Metody Třídy Veřejné a soukromé Konstruktor Statické a dynamické metody a třídy Dědičnost Rozhraní Balíky Výjimky Popis vývojového prostředí Eclipse Vytvoření projektu krok za krokem Kompilace a nahrávání programu Vytvoření nové třídy

3 2.3 Automatické doplňování Přejmenování třídy Zobrazení čísel řádků Hledání a opravy chyb Automatické formátování zdrojového kódu Programování jbotbrainu II Rozbor prvního programu Práce s periferiemi jbotbrainu II LED a čekací smyčky Tlačítka Výstup do konzole Bzučák Digitální výstupy Digitální vstupy Čítač Analogové vstupy Motory Servomotory Bluetooth UART I2C Vlákna Časovače Práce s moduly SD 05 Dotykový spínač SA 02 Senzor atmosférického tlaku SA 04 Teploměr SI 01 Akcelerometr SI 02 Světelný senzor SI 03 Ultrazvukový dálkoměr MI 04 Řadič krokových motorů Programování pro mobilní telefony Úvod do J2ME aplikací Co budeme potřebovat?

4 4.1.2 Ahoj světe! Vypisujeme na displej Vytvoření J2ME aplikace pro dálkové ovládání Část první Část druhá Část třetí Propojení všech částí dohromady Závěr

5 1 Programovací jazyk Java 1.1 Proč právě Java? Java je v poslední době mezi programátory velice oblíbená. Jedná se o interpretovaný jazyk to znamená, že kompilací programu nevzniká binární kód specifický pro danou platformu, ale jakýsi mezikód, kterému říkáme bytecode. O spuštění a běh bytecode se pak stará tzv. Java Virtual Machine (JVM). Díky tomuto mezikódu můžeme program vytvořit pouze jednou a spustit na kterékoliv z platforem, pro kterou je JVM vyvinut (ve světě osobních počítačů je to například Windows, Mac OS či Linux). Kvůli své přenositelnosti se Java stala populární při programování různých zařízení, například set- -top boxů nebo aplikací pro mobilní telefony. Existuje totiž velká řada mobilních telefonů s odlišným hardwarem a vytvořit aplikaci, která by fungovala na více telefonech, by pro programátora znamenalo napsat ji pro každý telefon jinak. Proto výrobci do mobilních telefonů začali implementovat Java Virtual Machine, která hardware zařízení abstrahuje a zabaluje do přehledné soustavy tříd a rozhraní, díky čemuž se vývoj aplikací pro mobilní telefony stal velice jednoduchým a efektivním a umožnil tak masové rozšíření různých Java aplikací či her. Takovouto Java Virtual Machine s celou řadou funkcí pro práci s hardwarem má v sobě i jbotbrain II, a je tedy vhodný jak pro pokročilé programátory, tak i pro začátečníky v robotice a mikroprocesorové technice vůbec. Nemusíme se starat o to, na jakém portu je připojeno servo, jak máme nastavit registry pro generování servopulzů nebo jak komunikovat s I 2 C senzorem, protože tyto základní metody už za nás někdo nativně implementoval v rámci JVM jbotbrainu II. Můžeme se tak věnovat zajímavějším věcem, třeba programování algoritmu sledování čáry nebo hledání cesty v bludišti. Pro spouštění programů v Javě na PC potřebujete tzv. Java Runtime Environment (JRE) a pro jejich kompilaci do bajtkódu Java Development Envirnment (JDK). Pro operační systém Windows je můžete získat na Instalační soubory JDK jsou součástí vývojového prostředí jbotbrainu II, takže si s jejich instalací nemusíme lámat hlavu. Pro vytváření prvních programů a seznámení s Javou doporučuji zdrojové soubory vytvářet v jednoduchých textových editorech (Poznámkový blok ve Windows nebo PSPad) namísto složitějších vývojových prostředí (například Eclipse IDE), protože vývojové prostředí by ze začátku zbytečně odvádělo vaši pozornost

6 1.2 První program Javu si ukážeme prakticky prvním jednoduchým programem, který vypíše na obrazovku text Ahoj světe! a následně si jej krok po kroku rozebereme. S větou Hello World! se setkal asi každý, kdo se někdy nějaký programovací jazyk učil: /* Náš první program v Javě */ public class PrvniProgram { public static void main(string args[]) { System.out.println("Ahoj svete!"); Celý program uložíme do souboru PrvniProgram.java, který vytvoříme v libovolném textovém editoru, třeba poznámkovém bloku, který je součástí Windows. Při přepisování je potřeba dbát na velikost písmen, Java je totiž tzv. case-sensitive, to znamená, že je citlivá na zápis velkých a malých písmen. PrvniProgram a prvnirprogram jsou tedy dva úplně odlišné identifikátory. Poté spustíme příkazový řádek v příslušné složce a napíšeme příkaz: javac PrvniProgram.java Tip: Jak na příkazový řádek? Práce s příkazovým řádkem patří mezi základní programátorské znalosti. Klíčový je pracovní adresář, většinou je výchozím pracovním adresářem domovská složka uživatele. Abychom náš program mohli zkompilovat a spustit, musíme se dostat do adresáře, kde máme zdrojové kódy ulžoeny k tomu slouží příkaz cd. Pokud máme náš příklad uložen v adresáři zdrojaky, použijeme příkaz takto: cd zdrojaky Pro přesunutí do nadřezaného adrresáře slouží příkaz cd.. V případě, že je název adresáře příliš dlouhý, můžeme využít doplňování textu napíšeme prvních pár písmen a stiskneme tabulátor, název se sám doplní. Pro výpis souborů v adresáři slouží příkaz ls, případně dir. Příkaz javac přeloží program ze zdrojového kódu do počítači srozumitelné podoby, tzv. bajtkódu. Program nějakou dobu poběží a po ukončení vytvoří soubor PrvniProgram.class, který obsahuje zmíněný bajtkód. Program je hotový a můžeme ho spustit příkazem: java PrvniProgram Parametrem je pouze název hlavní třídy (programu), příponu.class vynecháme. Program na obrazovku vypíše text Ahoj svete! a ukončí se. Může se stát, že u vytváření prvního programu nastanou problémy. Není třeba věšet hlavu, jejich řešení je jednoduché

7 1. Pokud systém vypíše, že program javac neexistuje, máme dvě možnosti: 1. Ve vašem počítači není nainstalováno prostředí JDK, o kterém se zmiňuje úvodní kapitola. 2. Cesta k adresáři s programem javac.exe není uložena v systémové proměnné PATH (na mém počítači je to C:\Program Files\Java\jdk1.6.0_12\bin). 2. Pokud se v chybovém hlášení objeví javac: invalid argument: PrvniProgram, znamená to, že jste zapomněli uvést příponu souboru.java. 3. Objeví-li se při překladu programu chybové hlášení podobné tomuto: javac PrvniProgram.java PrvniProgram.java:5: reached end of file while parsing ^ 1 error Znamená to, že jste při přepisu programu udělali takzvanou syntaktickou chybu.v našem případě to znamená, že jsme zapomněli na posledním řádku programu napsat druhou složenou závorku uzavírající blok hlavní třídy. Chybové hlášení javac PrvniProgram.java PrvniProgram.java:4: ';' expected System.out.println("Ahoj svete!") ^ 1 error znamená, že jsme za příkazem System.out.println zapomněli napsat středník v tomto případě nám program javac přesně ukázal, kde se chyba objevila a jak ji odstranit. Středník je důležitý, ukončuje každý příkaz v Javě. Nyní si náš první program projdeme krok za krokem a ukážeme si některé prvky jazyka Java Komentáře První řádek programu /* Náš první program v Javě */ je takzvaný komentář. Komentáře slouží v Javě ke psaní poznámek programátora. Jsou velice důležité, protože bez nich by složitější program mohl být po roce nesrozumitelný a programátor by musel u svého vlastního programu provádět tzv. Reverse engineering, což je velice neefektivní. Výrazně také usnadní orientaci v programu druhým lidem. Další možností využití je zakomentování kódu, který momentálně nepotřebujeme, ale někdy bychom se k němu chtěli vrátit. V Javě rozlišujeme tři typy komentářů: // Řádkový komentář začíná dvěma lomítky a slouží k zápisu komentáře // pouze na jednom řádku. /* Blokový komentář (ten, který jsme použili v našem prvním programu), - 7 -

8 slouží k zápisu komentářů delších, které se nám na jeden řádek nevejdou. Začíná lomítkem a hvězdičkou a končí hvězdičkou a lomítkem. */ /** * Dokumentační komentář * Slouží k zápisu dokumentace programu, kterou lze vygenerovat * ve formátu HTML programem javadoc. Má velké množství parametrů, * například tento pro uvedení autora: Josef Novák */ Třídy a objekty Druhý řádek programu public class PrvniProgram { obsahuje deklaraci třídy PrvniProgram. Klíčové slovo public znamená, že jde o třídu veřejnou (k tomu se dostaneme později), klíčové slovo class pak značí, že se jedná o třídu. Třídy zapisujeme způsobem CamelCase (odvozeno od velblouda, který má hrby) první písmeno a počáteční písmena každého slova v případě víceslovného identifikátoru jsou velká. Každou třídu ukládáme do samostatného souboru, jehož název je tvořen jménem třídy a příponu.java v našem případě PrvniProgram.java. Složené (množinové) závorky { a se v Javě používají pro ohraničení bloku příkazů, v tomto případě otevírá závorka blok, který se týká třídy PrvniProgram. Angličtina Jazykem programátorů je angličtina, všechny identifikátory a komentáře v programu by tedy měly být psány výhradně anglicky. Důvodů je hned několik usnadní to orientaci v programu cizincům a pro národy užívající komplikované nebo překomplikované jazyky (jakým čeština bezesporu je) usnadní některé gramatické jevy, například tvorbu množných čísel (v angličtině pouze přidáním koncovky -s). V tomto výukovém materiálu ale konvence nedodržím a budu používat identifikátory a komentáře psané pro větší názornost česky. Třída představuje skupinu objektů, které mají společné vlastnosti a metody. Vlastnosti jsou proměnné, které obsahují nějakou hodnotu, metody jsou bloky operací, které může třída provádět. Použití si ukážeme na příkladu počítačové hry, ve které se vyskytují dvě auta, trabant a barovák. Nejprve si definujeme třídu Auto, která obsahuje společné vlastnosti cena a maxrychlost: class Auto { int cena; int maxrychlost; - 8 -

9 Ve hře pak vytvořime dvě instance třidy Auto, trabant a bavorak budeme jim řikat objekty. Každemu objektu nastavime odlišne vlastnosti: Auto trabant = new Auto(); Auto bavorak = new Auto(); trabant.maxrychlost = 60; tranabt.cena = 1000; bavorak.maxrychlost = 240; bavorak.cena = ; Příkaz Auto trabant = new Auto(); slouží k vytvoření proměnné datového typu Auto, která se bude jmenovat trabant. Příkaz new Auto() vytvoří novou instanci třídy Auto (objekt), který do proměnné uložíme. O datových typech si povíme později. Metody použité v naší hře by to mohly být například zastav(), zatrub() nebo zatocdoleva(). Výhodou je, že při programování řízení automobilu nás nezajímá, zda hráč ovládá trabant nebo bavorák obě auta mají stejné metody dané třídou Auto. K čemu je to dobré? jbotbrain II má definováno několik tříd pro práci s různým hardwarem například ovládání LED diod na desce, práci s I 2 C senzory nebo rozhraním Bluetooth. Pokud chceme použít několik I 2 C ultrazvukových dálkoměrů (sonarů) s různými adresami, jednoduše si pro každý senzor vytvoříme jinou instanci třídy jbotbrain2.sensors.srf02sensor s různými adresami Metody Třetí řádek public static void main(string args[]) { definuje jedinou metodu třídy PrvniProgram, a sice metodu main. Metody obsahují bloky operací, které můžeme se třídou provádět. Metoda main je velice důležitá, neboť jde o hlavní třídu programu, tedy místo, kde celý program začíná. Její definice musí být zapsána přesně jako v našem příkladu, jinak ji interpret java nepozná a program se nespustí. Obsah metody je opět ohraničen složenými závorkami. String args[] v závorce definuje argumenty metody, tedy proměnné, které metodě předáváme ke zpracování. Metodu main spouští přímo interpret a jako argument předá parametry, pokud jsme nějaké v příkazovém řádku uvedli. K významu klíčových slov static a void se dostaneme později. Čtvrtý řádek System.out.println("Ahoj svete!"); je voláním metody println sloužící k výpisu textu na standardní výstup, v našem případě do obrazovky příkazového řádku

10 1.3 Popis jazyka Java Datové typy a proměnné Počítač každou hodnotu do paměti ukládá jako jedničky a nuly. Paměť se skládá z bajtů, což jsou skupiny 8 bitů. Jeden bit může nebývat hodnot 1 nebo 0. Bajt v paměti obsahující hodnotu tedy může být číslo 65 v desítkové soustavě, znak 'A' (podle standardu ASCII) nebo součást většího celku obsahující větší počet bajtů. Aby počítač mohl rozlišit o jaký typ dat se jedná, zavádíme datové typy. Datových typů v Javě je několik: Název Význam Rozsah byte Celé číslo short Celé číslo int Celé číslo long Celé číslo float Reálné číslo 1, , double Reálné číslo 4, , boolean Logická hodnota true/false (pravda/nepravda) char Znak 'A', 'B',.. 'a', 'b', '.', ',',..'0', '9' String Řetězec (pole znaků) Ahoj, světe! Definice proměnných Proměnnou musíme před použitím definovat. Uděláme to tak, že napíšeme datový typ a název proměnné. Název proměnné tvoříme stylem camelcase jako u třídy s tím rozdílem, že první písmeno je malé: boolean mamhlad; int hmotnost; float desetinnecislo; String jmeno; char znak;

11 Přiřazení hodnoty Do definované proměnné můžeme přiřadit hodnotu. K tomu slouží operátor přiřazení (znak = ) hmotnost = 75; mamhlad = true; desetinnecislo = 0.75; Přiřazení celého čísla Přiřazení logické hodnoty true nebo false (pravda a nepravda) Přiřazení desetinného čísla (používáme desetinnou tečku, ne čárku) hmosnost = 0x45; Přiřazení celého čísla v šestnáctkové (hexadecimální) soustavě hmotnost = 0113; Přiřazení celého čísla v šestnáctkové soustavě číslo je uvozeno nulou znak = 'A'; jmeno = Pepa ; Přiřazení znaku (používáme jednoduché uvozovky) Přiřazení řetězce (používáme dvojité uvozovky) Proměnnou můžeme definovat a zároveň jí přiřadit nějakou hodnotu na jednom řádku, například: int promenna = 42; String s = Hello! ; Aritmetické výrazy Aritmetické výrazy slouží k výpočtu číselné hodnoty. Skládají se z operandů (konstant a proměnných) a operátorů (tedy operací, které na nich chceme provádět). Součet dvou proměnných by v Javě vypadal takto: int a = 10; int b = 15; int vysledek = a+b; // vysledek = 25 Operandů i operátorů může být ve výrazu samozřejmě více, přičemž je můžeme kombinovat pomocí kulatých závorek. Přehled aritmetických operátorů se nachází v následující tabulce: Operátor Význam + Sčítání - Odčítání * Násobení / Dělení

12 % Modulo (zbytek po dělení) >> a << Bitové posuny výraz (a << b) posune číslo a o b bitů doleva, výraz (a >> b) posune číslo a o b bitů doprava: Výraz Výsledek Před Po 8 << << >> Inkrementace o 1 (Operace a++; přičte k proměnné a hodnotu 1) -- Dekrementace o 1 +=, -=, *=, /=, Složené přiřazení; a += b; znamená totéž co a = a+b;! Negace Pole boolean a, b; a = true; boolean b =!a; // b má hodnotu false Pole je množina proměnných stejného datového typu, ke které přistupujeme jako k jednomu celku. Indexy jsou číslovány od nuly, takže v poli o N prvcích má poslední prvek index N-1, stejně jako ve většině jiných programovacích jazyků. První řádek příkladu ukazuje definici celočíselného pole s názvem pole, druhý řádek slouží k vytvoření pole o třech prvcích. K vytvoření pole používáme, stejně jako při vytváření objektů, klíčové slovo new : int[] pole; pole = new int[3]; Pro přístup k prvkům pole používáme indexy zapsané v hranatých závorkách: pole[0] = 10; pole[1] = 20; pole[3] = 30; System.out.println("Druhy prvek pole: "+pole[1]); Kromě použití klíčového slova new můžeme pole inicializovat výčtem prvků v poli, pokud již předem známe jejich hodnoty. Následující příklad vytvoří pole řetězců s názvy dnů v týdnu a vypíše

13 název třetího dne, tedy středy: String[] dny = {"pondeli", "utery", "streda", "ctvrtek", "patek", "sobota", "nedele"; System.out.println("Treti den v tydnu: "+dny[2]); Java důsledně hlídá přístupy k neinicializovanému poli a k neexistujícím prvkům pole. V prvním případě vyhodí JVM výjimku NullPointerException, v druhém případě pak ArrayIndexOutOfBoundsException. O výjimkách si povíme později. Pokud se chceme chybám vyhnout, může nám pomoci složka vlastost length, kterou má každé pole a která nám udává počet prvků v poli. Musíme ale myslet za to, že poslední prvek v poli má vždy index length-1. Chceme li tedy vypsat poslední den v týdnu, neděli, můžeme použít tento zápis: System.out.println("Posledni den v tydnu: "+dny[dny.length-1]); Pokud má pole indexů více, říkáme jim pole vícerozměrné. Dvojrozměrné pole můžeme využít třeba v případě, kdy chceme ukládat souřadnice x a y, například pole 5 5 pro jednoduchou hru piškvorky: char[][] piskvokry; piskvoky = new char[5][5]; Přístup k prvkům pole pak probíhá pomocí dvou indexů, například zápis piskvorky[2][3] = 'x'; piskvorky[2][4] = 'x'; piskvorky[0][0] = 'o'; piskvorky[1][4] = 'o'; naplní pole piskvorky těmito hodnotami: yx o x 4 o x

14 1.3.2 Podmínky Podmíněné výrazy umožňují větvení programu na základě dané podmínky. Struktura podmínky je následující: if (výraz) { // akce, která se provede pokud je výraz pravdivý else { // akce, která se provede pokud je výraz nepravdivý Příkaz if musíme použít pokaždé, příkaz else je nepovinný. Příkaz v bloku if se provede, pokud je relační výraz v závorkách pravdivý. Relační výraz je takový, který vrací logickou hodnotu typu boolean, tedy true nebo false. Nejčastěji se příkaz if používá pro porovnávání proměnných pomocí porovnávacích operátorů: Operátor Význam.== Test rovnosti (rovná se)!= Test nerovnosti (nerovná se) < > Test nerovnosti (menší než, větší než) <= >= Test nerovnosti (menší nebo rovno, větší nebo rovno) Následující příklad ukazuje výpis pozdravu podle věkové kategorie uživatele dané proměnnou věk: int vek = 15; if (vek < 18) { System.out.prtintln("Nazdar!"); else if (vek < 60) { System.out.prtintln("Dobry den."); else { System.out.prtintln("Uctiva poklona.");

15 Relační výrazy můžeme v podmínce spojovat použitím logických operátorů a sdružovat je pomocí kulatých závorek. Místo true je pro přehlednost použita hodnota 1, místo false hodnota 0: Operátor Význam && Logický součin (AND, a) konjunkce: A B A && B Logický součet (OR, a/nebo) disjunkce: A B A B ^^ Exkluzivní logický součet (XOR, nebo) exkluzivní ( ostrá ) disjunkce: A B A ^^ B

16 Pokud tedy chceme naši podmínku z prvního příkladu opravit tak, aby pozdravem Ahoj zdravila i rodinné příslušníky, zavedeme si další proměnnou rodinnyprislusnik datového typu boolean: int vek = 60; boolean rodinnyprislusnik = true; if (vek < 18 rodinnyprislusnik == true) { System.out.prtintln("Nazdar!"); else if (vek < 60) { System.out.prtintln("Dobry den."); else { System.out.prtintln("Uctiva poklona."); Cykly Cyklus je blok příkazů, který se opakuje dokud platí daná podmínka. Cykly jsou výhodné v okamžiku, kdy chceme provést několik stejných či podobných operací za sebou. Jazyk Java rozlišuje tři typy cyklů: Cyklus while Struktura cyklu while je následující: while (podmínka) { // blok příkazů Pokud platí podmínka, provede se blok příkazů ohraničený složenými závorkami. Po provedení bloku příkazů se znovu otestuje, zda podmínka (opakovací podmínka) platí a pokud ano, provede se blok příkazů znova a tak dále. Cyklus while si ukážeme na jednoduchém příkladu, který vypíše dny v týdnu uložené v poli: String[] dny = {"pondeli", "utery", "streda", "ctvrtek", "patek", "sobota", "nedele"; int i = 0; while (i < dny.length) { System.out.println((i+1)+". den v tydnu je "+dny[i]); i++; Index pole jsou číslovány od nuly, proto je výchozí hodnota proměnné i nula. Při každé iteraci cyklu (průchodu cyklem) je hodntoa proměnné i zvýšena o Cyklus do-while Struktura cyklu do-while je velilice podobná cyklu while: do { // blok příkazů while (podmínka); Rozdíl je ten, že oproti cyklu while se nejprve provede blok příkazů a až pak je kontrolováno, zda podmínka platí. Blok příkazů se tedy provede aspoň jednou

17 Vypsání prvků pole s použitím cyklu do-while by vypadalo takto: int i = 0; do { System.out.println((i+1)+". den v tydnu je "+dny[i]); i++; while (i < dny.length); Cyklus for Cyklus for je pro vypisování obsahu pole asi nejvýhodnější, má totiž inicializaci výchozí hodnoty proměnné, podmínku i inkrementaci hodnoty zadanou přímo v deklaraci cyklu: for (inicializace; podmínka; inkrementace) { // blok příkazů Ač se může zdát na první pohled komplikovaným, je pro vypisování prvků pole nejvýhodnější. Navíc je i přehlednější, protože podmínka a inkrementace proměnné je na jednom místě a programátorovi se nemůže stát, že by inkrementaci proměnné zapomněl a dostal tak nekonečný cyklus (o tom si povíme později). Vše si opět ukážeme na příkladu výpisů dnu v týdnu: for (int i = 0; i < dny.length; i++) { System.out.println((i+1)+". den v tydnu je "+dny[i]); Jak vidíte, čítací proměnnou i můžeme definovat i přímo v inicializaci cyklu for. Pokud bychom dny chtěli vypsat s opačným pořadím, tedy od neděle do pondělí, upravíme cyklus takto: for (int i = (dny.length-1); i >= 0; i--) { System.out.println((i+1)+". den v tydnu je "+dny[i]); Hodnotu proměnné i musíme nastavit na dny.length-1, protože poslední index pole o N prvcích má hodnotu N-1, v našem případě 7-1 =

18 Příkazy break a continue Pokud bychom chtěli cyklus předčasně ukončit, můžeme použít příkaz break: String s = Ahoj svete ; char z = 'h'; int i; for (i = 0; i < s.length; i++) { if (s.charat(i) == z) { break; if (i == s.length) { i = -1; Příklad vyhledá pozici znaku v řetězci a uloží ji do proměnné i. Pokud znak není nalezen, je hodnota proměnné i rovna -1. Pro přerušení cyklu po nálezu znaku je použit příkaz break, aby cyklus zbytečně nezatěžoval počítač, když už znak našel. Kromě příkazu break můžeme pro ovládání cyklů použít příkaz continue, který ukončí vykonávání bloku příkazů a přeskočí na další iteraci cyklu (na rozdíl od příkazu break, který cyklus ukončí úplně) Nekonečný cyklus S nekonečným cyklem se budeme při programování jbotbrainu II setkávat často, bude totiž tvořit hlavní smyčku programu, kde chceme, aby se blok příkazů opakoval neustále, dokud není zařízení vypnuto. Pro realizaci nekonečného cyklu nejčastěji používáme cyklus while, který se provádí, dokud platí podmínka (dokud má výraz logickou hodnotu true): while (true) { // Tento blok příkazů se bude provádět donekonečna Kromě toho je nekonečný cyklus jednou z nejčastějších programátorských chyb, která vznikne nesprávnou volbou podmínky a vede k zamrznutí programu

19 1.3.4 Metody Metody jsou bloky příkazů, operace, které můžeme se třídou provádět. Metodu si můžeme představit jako funkci může mít několik vstupních argumentů a vracet výstupní hodnotu. Definice metody vypadá takto: (modifikátory) datovýtyp názevmetody(seznam argumentů) { // blok příkazů Pokud bychom si chtěli vytvořit metodu soucet, která sečte dvě čísla a a b a vrátí jejich výsledek, použijeme tento zápis: int soucet(int a, int b) { a = a+b; return a; int před názvem metody je návratový datový typ, tedy hodnota, kterou metoda vrací. int a, int b v závorkách za názvem metody je sezman argumetů, tedy definování proměnných,tkeré musíme metodě předat. Klíčové slovo return slouží k ukončení metody a vrácení návratové hodnoty. Volání metody soucet, která sečte čísla 10 a 5 pak vypadá následovně: int vysledek = soucet(10, 5); System.out.prtintln("10+5 = "+vysledek); Metoda nemusí pokaždé vracet hodnotu, můžeme je využít pouze pro provedení nějaké akce. Ukázková metoda pozdrav vypíše jméno uživatele a věk, které předáme argumentem. Pro definici metody bez návratové hodnoty použijeme klíčové slovo void (prázdný datový typ): void pozdrav(string jmeno, int vek) { System.out.prtintln("Uzivatel se jmenuje "+jmeno+" a ma "+vek+" let."); V rámci jedné třídy můžeme mít definováno několik metod se stejným názvem, klíčový je pčoet, datové typy a pořadí argumentů. Tomu říkáme přetěžování metod: void pozdrav(string jmeno) { System.out.prtintln("Uzivatel se jmenuje "+jmeno); void pozdrav(string jmeno, int vek) { System.out.prtintln("Uzivatel se jmenuje "+jmeno+" a ma "+vek+" let.");

20 1.3.5 Třídy O třídách jsme si pověděli v úvodní kapitole. Zde se zaměříme na pokročilou práci s nimi. Vše si vysvětlíme na ukázkové třídě Auto: public class Auto { private int maxrychlost; private String znacka; private boolean nastartovano; public Auto(String znacka, int maxrychlost) { this.znacka = znacka; this.maxrychlost = maxrychlost; public void nastartuj() { nastartovano = true; public String getznacka() { return znacka; public void setmaxrychlost(int maxrychlost) { this.maxrychlost = maxrychlost; Veřejné a soukromé Před definicí vlastností (proměnných) vidíme modifkátor private, před definicí metod modifikátory public. Co to znamená? Private značí, že jde o soukromou vlastnost, která je přístupná pouze metodám třídy, ne zvenku. Pokud bychom se k vlastnosti znacka snažili přistoupit z jiné třídy, například zápisem (předpokládejme, že v proměnná auto je instancí třídy Auto): System.out.println("Znacka: "+auto.znacka); dostali bychom chybové hlášení. V Javě a OOP obecně je totiž zvykem nepřistupovat k vlastnostem přímo, ale pomocí metod, například takzvaných getterů a setterů (v našem případě metoda getznacka() pro získání značky a metoda setmaxrychlost(int maxrychlost) pro nastavení maximální rychlosti), které mají modifikátor public a jsou veřejné. Tomuto přístupu říkáme zapouzdření a slouží k oproštění programátora od implementace třídy, která ho v daném případě nezajímá. Pokud bychom značku automobilu nastavovali přímým přístupem k vlastnosti znacka, měli bychom velice omezené možnosti. Co kdyby bylo v průběhu vývoje programu rozhodnuto, že se značka musí při nastavení porovnat s databází známých značek aut? V případě použitá přímého přístupu bychom museli všechny výskyty nastavení značky v programu složitě vyhledávat a přepisovat, kdežto v případě použití standardního getteru nemusíme vyhledávat nic a stačí nám pouze upravit jednu metodu. Podobným případem může být použití soukromých (privátních) metod, pokud nechceme, aby měl programátor možnost spouštět metody pro vnitřní použití třídy, jejímž neuváženým použitím by mohl něco poškodit

21 Konstruktor Řekli jsme si, že metodu definujeme udáním návratového datového typu před názvem, který začíná vždy malým písmenem. Proč tedy hned první metodě návratový typ chybí a název začíná velkým písmenem? public Auto(String znacka, int maxrychlost) { Jedná se o konstruktor metodu, která je zavolána při vytvoření nové instance třídy. Můžeme ho využít například pro nastavení výchozích hodnot, v našem případě značky a maximální rychlosti. Vytvoření nové instance (objektu) třídy Auto pak může vypadat takto: Auto fazol; fazol = new Auto("Favorit", 80); Pokud bychom parametry neuvedli a použili inicializaci fazol = new Auto(); vyhodila by JVM chybové hlášení, protože konstruktor bez parametrů není definován Statické a dynamické metody a třídy Dynamická třída je třída, která nám umožní vytvoření své instance, objektu například třída Auto (můžeme dle libosti vytvářet objekty trabant, velorex, zigulik a další). Statická třída vytvoření objektu neumožňuje. Statická metoda je pak metoda, kterou můžeme volat i bez vytvoření instance třídy, příkladem jsou metody v třídě Math, které implementují důležité matematické operace (Math.sin(double a) pro sinus, Math.sqrt(double a) pro druhou odmocninu atd). Dalším příkladem statické metody je metoda main z našeho prvního programu. Statickou metodu, třídu nebo vlastnost definujeme modifikátorem static umístěným před datovým typem a názvem. Pokud bychom se snažili dynamickou metodu zavolat statickým přístupem, například Auto.setZnacka("Velorex"); dostali bychom chybové hlášení. Pomocí modifikátoru static můžeme definovat konstanty, například konstanta PI v třídě Math (veřejná statická vlastnost, jejíž hodnotu již nemůžeme změnit): public static final PI = ; Dědičnost Velikou výhodou tříd je, že můžeme vytvářet třídy, které vycházejí z jiných rozšiřují jejich metody nebo vlastnosti. Říkáme, že tyto vlastnosti dědí. Nově vytvořená třída je potomek, třída, ze které dědíme se nazývá rodič. K definování rodiče slouží klíčové slovo extends umístěné za název potomka. Dědění si ukážeme na příkladu třídy Nakladak, které vychází z dříve definované třídy Auto a zavádí nové metody a vlastnosti typické pro nákladní auta. Výhodou je, že můžeme použít již jednou vytvořený kód a nevytvářet vše znova, protože osobní a nákladní auta mají některé vlastnosti společné

22 public class Nakladak extends Auto { private String naklad; public Nakladak(String znacka, int maxrychlost, String naklad) { super(znacka, maxrychlost); this.naklad = naklad; public void vyloznaklad() { System.out.println("Vykladam "+naklad); Všimněte si konstruktoru, kde se nachází volání metody super, což je volání konstruktoru rodičovské třídy v našem případě třídy Auto. Třída Nakladak zavádí novou privátní vlastnost naklad, upravuje konstruktor a přidává veřejnou metodu vyloznaklad(), která vypíše obsah nákladního prostoru. Kromě toho můžeme samozřejmě použít i veřejné metody definované rodičovskou třídou Auto: Nakladak auto = new Nakladak("Tatra", 150, "pivo"); System.out.println("Nase auto je "+auto.getznacka()); auto.vyloznaklad(); // Vypíšeme náklad Rozhraní Rozhraní je předpis, který určuje, jaké metody musí třída implementovat. Můžeme je využít například pokud chceme několik tříd sjednotit, typicky pokud chceme, aby všechny třídy pracující s dálkoměry vracely hodnotu v centimetrech a aby se metoda jmenovala stejně, třeba getdistance(). Výhodou oproti dědění je, že třída může implementovat více rozhraní, dědit ale můžeme pouze z jedné třídy. K definování rozhraní slouží klíčové slovo interface (všimněte si, že v definici rozhraní Rangefinder chybí blok příkazů, zajímají nás pouze definice metod), k implementování do třídy pak klíčové slovo implements: interface Rangefinder { public int getdistance(); class InfraredRangefinder implements Rangefinder { public int getdistance() { // Náš vlastní kód class UltrasonicRangefinder implements Rangefinder { public int getdistance() { // Náš vlastní kód class LaserRangefinder implements Rangefinder { public int getdistance() { // Náš vlastní kód Pokud bychom neimplementovali všechny metody dané rozhraním, dostali bychom chybové hlášení

23 Balíky V rozsáhlejších projektech je občas potřeba použít více tříd ze stejným názvem nebo třídy roztřídit podle toho, co dělají. K tomu slouží balíky (packages). Můžeme si je představit jako adresáře. K určení balíku, do kterého třída patří, slouží příkaz package. Použití balíku si ukážeme na jednoduchém příkladu. Vytvoříme si adresář kalendar, do kterého uložíme třídu s názvem Datum (soubor Datum.java): package kalendar; class Datum { private String[] dny = {"pondeli", "utery", "streda", "ctvrtek", "patek", "sobota", "nedele"; public static String denvtydnu(int den) { return dny[den]; Statická metoda denvtydnu vrací název dne v týdnu podle zadaného indexu. Třídu Datum umístěnou v balíku kalendar použijeme takto: String den = kalendar.datum.denvtdynu(6); System.out.prtintln("Den v tydnu: "+den); Druhou možností je použití příkazu import, který se umisťuje před deklaraci třídy a slouží k importování určité třídy: import kalendar.datum; Potom již můžeme třídu Datum použít bez uvedení názvu balíku. Příkaz import umožňuje i importování všech tříd v balíku, pokud místo názvu třídy použijeme hvězdičku: import kalendar.*; Každý balík může obsahovat další balíky, což umožňuje vytváření složitějších adresářových struktur. Názvy balíků a podbalíků se oddělují tečkami. Podle konvencí Javy se názvy balíků tvoří malými písmeny Výjimky Výjimka (Exception) je chyba, která vznikla za běhu programu. Může jít o soubor, který nebyl nalezen, dělení nulou nebo přístup k neexistujícímu prvku pole. V případě, že se výjimka objeví, běh programu se pozastaví a JVM začne hledat handler, což je místo v programu, které se o ošetření výjimky stará. Pokud není žádný handler definován, použije se handler výchozí. V našem případě, kdy programujeme konzolové aplikace pro operační systém Windows nebo Linux a používáme JRE firmy Sun, je to zpravidla vypsání chybové hlášky a ukončení běhu programu

24 Jak taková výjimka vypadá, si ukážeme na následujícím příkladu: public class ZkouskaPole { public static void main(string args[]) { String[] dny = {"pondeli", "utery", "streda", "ctvrtek", "patek", "sobota", "nedele"; System.out.println("1. den v tydnu: "+dny[0]); System.out.println("8. den v tydnu: "+dny[7]); System.out.println("3. den v tydnu: "+dny[2]); Pokud program spustíme, dostaneme v příkazovém řádku tento výpis: 1. den v tydnu: pondeli Exception in thread "main" java.lang.arrayindexoutofboundsexception: 7 at ZkouskaPole.main(ZkouskaPole.java:6) Chybové hlášení nám říká, že se na 6. řádku programu (ZkouskaPole.java:6) objevila výjimka ArrayIndexOutOfBoundsException, která znamená, že jsme přistoupili k neexistujícímu prvku pole s indexem 7 poslední prvek našeho pole sedmi dnů v týdnu má index 6. Pokud je použit výchozí handler, program se po výskytu výjimky ukončí. V našem případě to znamená, že se nevypíše poslední řádek s 3. dnem v týdnu. Zabránit tomu můžeme definováním vlastního handleru, k tomu slouží příkaz try-catch (všimněte si toho, že ona výjimka není nic jiného než objekt třídy ArrayIndexOutOfBoundsException odvozené od třídy Exception): try { System.out.println("8. den v tydnu: "+dny[8]); catch (ArrayIndexOutOfBoundsException e) { System.out.println("Zachycena vyjimka!"); e.printstacktrace(); Pokud program spustíme teď, dostaneme tento výpis: 1. den v tydnu: pondeli Zachycena vyjimka! java.lang.arrayindexoutofboundsexception: 8 at ZkouskaPole.main(ZkouskaPole.java:8) 3. den v tydnu: streda Jak vidíte, výjimka byla zachycena naším vlastním handlerem a běh programu se po zachycení nezastavil, pouze jsme vypsali chybové hlášení. Další možností, jak se výjimky zbavit, je zahodit ji pomocí klíčového slova throws zapsaného za definicí metody. Tím předáme výjimku o úroveň dál a budeme ji muset ošetřit na jiném místě programu. V našem případě bychom se jí mohli zbavit zápisem: public static void main(string args[]) throws ArrayIndexOutOfBoundsException { Se zahazováním výjimek se při programování jbotbrainu II setkáme například když budeme chtít využít čekací smyčku Thread.sleep()

25 2 Popis vývojového prostředí Eclipse Pokud vývojové prostředí Eclipse IDE spustíte a zavřete uvítací obrazovku, uvidíte okno, které vypadá přibližně takto: V seznamu projektů se budou postupně objevovat vámi vytvořené projekty a zdrojové soubory. Pracovní plocha je prostor, který slouží k editaci zdrojových kódů. Ve výpisu chybových hlášení se během psaní zdrojových kódů objevují chyby a varovná hlášení, které musíme opravit. Struktura třídy nabídne přehledný seznam metod a vlastností právě upravované třídy. Jednotlivá okna můžeme po hlavním pracovním okně různě přetahovat a přepínat podle našeho uvážení

26 2.1 Vytvoření projektu krok za krokem Nejprve klikneme na File New Project: Po otevření okna vybereme z nabídky C-bot device projects možnost jbotbrain2 application a klikneme na tlačítko Next:

27 V dalším kroku zadáme název projektu (v našem případě HelloWorld). Název hlavní třídy HelloWorldMain se doplní automaticky, pokud necháme volbu Create main class zaškrtnutou: Po stisknutí tlačítka Finish se nově vytvořený projekt objeví v seznamu Package Explorer a v pracovním okně se otevře hlavní třída třída projektu HelloWorldMain se základní strukturou (metoda main). Všimněte si, že metoda main se objevila i ve výpisu struktury třídy v pravém okně Outline:

28 Do editačního okna vepíšeme zdrojový kód naší první aplikace pro jbotbrain II, která rozbliká zelenou LED diodu s periodou 500 ms: Podrobný rozbor celého programu je uveden v kapitole, která se věnuje programování jbotbrainu II. Upravený soubor uložíme ikonkou v horním panelu nebo klávesovou zkratkou Ctrl+S Kompilace a nahrávání programu Ke kompilaci a nahrání programu do jbotbrainu Ii slouží tlačítko Upload project ve vrchní liště prostředí Eclipse: Po stisku tlačítka se objeví okno zobrazující stav nahrávání, které se po dokončení samo zavře:

29 2.2 Vytvoření nové třídy Novou třídu vytvoříme pravím kliknutím na název balíku (v našem případě jbotbrain2.helloworld) a výběrem New Class. Stejným způsobem můžeme vytvářet nové balíky, rozhraní (Interface) a soubory: Po vyplnění názvu třídy (v našem případě Pozdrav) a stisknutí tlačítka Finish se nově otevřená třída sama otevře v editoru:

30 2.3 Automatické doplňování Velkou výhodou vývojového prostředí Eclipse je automatické doplňování, které během psaní zdrojového kódu nabízí metody, které jsou k dispozici. Pokud tedy napíšeme System.out., vyskočí nabídka všech metod, které jsou v této třídě obsaženy a které můžeme použít. Vybereme-li metodu println, zobrazí se i malá kontextová nápověda s výpisem dokumentace metody: Kromě toho automatické doplňování napovídá také pořadí a popis parametrů, což se velice hodí v případě, že jich má daná metoda více. Zde vidíme, že jediným parametrem metody println je řetězec, který chceme vypsat:

31 2.4 Přejmenování třídy Pokud se rozhodneme třídu Pozdrav přejmenovat na Zdraveni, vybereme v kontextové nabídce třídy možnost Refractor Rename: V okně, které se otevře, jen změníme název na Zdraveni. Pokud necháme všem možnostem jejich výchozí nastavení a stiskneme tlačítko Finish, vývojové prostředí automaticky přejmenuje třídu, změní její zdrojový kód tak, aby se jmenovala Zdraveni a vyhledá i všechny výskyty starého názvu Pozdrav, což nám práci výrazně ulehčí:

32 2.5 Zobrazení čísel řádků Čísla řádků zpřehledňují orientaci ve zdrojovém kódu. Zapnout je můžeme kliknutím na šedou postranní lištu editačního okna a výběrem možnosti Show Line Numbers:

33 2.6 Hledání a opravy chyb Kromě automatického doplňování nabízí prostředí Eclipse upozorňování na chyby přímo v průběhu psaní zdrojového kódu a u některých nabídne i jejich opravu. V našem případě se jedná o zapomenutý středník, který ukončuje příkaz: Druhý typ chyby může nastat, pokud zapomeneme implementovat všechny metody rozhraní nebo pokud neošetříme výjimku, pokud to nějaká metoda vyžaduje. Příkladem může být metoda Thread.sleep(), která slouží k pozastavení běhu programu na dobu danou v milisekundách: Pokud myší najedeme na ikonku žárovky, objeví se zpráva, že metoda může vyhodit výjimku InterruptedException, kterou jsme neošetřili

34 Po kliknutí na ikonku nám Eclipse nabídne dvě možnosti zahození výjimky prostřednictvím příkazu throws nebo ošetření blokem try-catch: Pokud jednu z možností vybereme, vývojové prostředí automaticky doplní potřebný kód a chyba je odstraněna:

35 2.7 Automatické formátování zdrojového kódu Někdy se stane, že nedáváme pozor na správné odsazování zdrojového kódu a ten se tak stane velice nepřehledným. Zkrášlit jej můžeme použitím příkazu Source Format po kliknutí do prostoru editovaného zdrojového kódu pravým tlačítkem myši:

36 3 Programování jbotbrainu II 3.1 Rozbor prvního programu První program, který jsme do jbotbrainu II nahráli, měl jen několik řádků a vypadal takto: package jbotbrain2.helloworld; import jbotbrain2.hw.*; public class HelloWorldMain { public static void main(string[] args) { Led.GREEN1.set(Led.MODE_BLINK, 500); while (true) { Příkaz package definuje název balíku, se kterým pracujeme. Eclipse automaticky vytvoří balík jbotbrain2.<název_projektu>. Příkaz import slouží k improtu tříd, které budeme potřebovat. V našem případě importujeme všechny třídy (*) z balíku jbotbrain2.hw, který obsahuje důležité třídy pracující s periferiemi jbotbrainu II a kde je také umístěna třída Led, kterou v příkladu používáme. Kromě balíku hw nabízí jbotbrain II ještě několik alších: jbotbrain2.comm pro komunikaci pomocí Bluetooth modulu a UARTu. jbotbrain2.devices obsahuje třídy pro práci s různými zařízeními na sběrnici I 2 C. jbotbrain2.sensors ukrývá třídy pracující se senzory jako jsou ultrazvukový dálkoměr nebo elektromagnetický kompas. jbotbrain2.util implementuje důležité systémové nástroje, jako je časovač (Timer). Třída HelloWorldMain je hlavní a jednou třídou programu. Protože jde o hlavní třídu, obsahuje ještě statickou metodu main, která je zavolána po spuštění jbotbrainu II. Příkaz Led.GREEN1.set(Led.MODE_BLINK, 500); slouží k rozblikání první zelené LED diody s periodou 500 ms. Třída Led je popsána v kapitole LED a čekací smyčky. Příkaz while(true) { je nekonečný cyklus a tvoří hlavní smyčku programu (main loop). Ta zaručuje, že program po spuštění jbotbrainu II poběží pořád a svévolně se neukončí

37 3.2 Práce s periferiemi jbotbrainu II LED a čekací smyčky Jak rozblikat LED diodu jsme si ukázali v prvním příkladu. Kromě blikání nabízí třída Led v balíku jbotbrain2.hw i metody pro rozsvícení a zhasnutí jedné nebo všech LED diod: Třída jbotbrain2.hw.led static Led GREEN1, GREEN2, ORANGE, RED Přístup ke dvěma zeleným, oranžové a červené LED diodě. void on() void off() void set(int mode, int time) Rozsvícení LED diody. Zhasnutí LED diody. Nastavení stavu LED diody podle parametru mode: Led.MODE_ON Rozsvícení, hodnota parametru time není podstatná. Led.MODE_OFF Zhasnutí, hodnota parametru time není podstatná. LED.MODE_BLINK Blikání, parametr time nastavuje periodu blikání v milisekundách. static void ledsetall(boolean on) Rozsvícení nebo zhasnutí všech LED diod pokud má parametr on hodnotu true, všechny LED svítí, v opačném případě LED zhasnnou. Čekací smyčka se nám hodí, pokud potřebujeme program na několik okamžiků zastavit nebo pozdržet. Slouží k tomu statická metoda Thread.sleep(int ms), kde parametr ms je čas v milisekundách (jedna vteřina má 1000 milisekund), po který program čeká. Metoda v případě neúspěchu vyvolá výjimku InterruptedException. Tu musíme buď ošetřit pomocí bloku try/catch nebo zahodit připsáním výrazu throws InterruptedException za deklaraci metody, ve které čekací smyčku používáme v našem případě metoda main()

38 Následující příklad pojmenovaný LedExample na začátku na půl vteřiny rozsvítí všechny diody, poté je zhasne a rozbliká oranžovou LED. V nekonečné smyčce pak bliká červenou LED diodou pomocí metod on(), off() a čekací smyčky Thread.sleep(): package jbotbrain2.ledexample; import jbotbrain2.hw.*; public class LedExampleMain { public static void main(string[] args) throws InterruptedException { Led.ledSetAll(true); Thread.sleep(500); Led.ledSetAll(false); Led.GREEN1.set(Led.MODE_ON, 300); boolean on = false; while (true) { if (on) { Led.ORANGE.off(); on = false; else { Led.ORANGE.on(); on = true; Thread.sleep(300);

39 3.2.2 Tlačítka Čtyři tlačítka S1-S4 na jbotbrainu II můžeme použít k ovládání naší aplikace. Třída Button v balíku jbotbrain2.hw umožňuje číst stav všech tlačítek najednou nebo každého tlačítka zvlášť a čekat na jejich stisknutí: Třída jbotbrain2.hw.button static Button S1, S2, S3 a S4 static int readbuttons() Přístup ke čtyřem tlačítkům S1-S4. Přečte stav tlačítek jako číslo. Každému tlačítku odpovídá jiná číselná hodnota: Button.S1_BUTTON Button.S1_BUTTON Button.S1_BUTTON Button.S1_BUTTON 0x08 0x04 0x02 0x01 Pokud není stisknuto ani jedno tlačítko, vrátí metoda hodnotu 0. static int waitforpress() boolean ispressed() Vyčká na stisknutí tlačítka a vrátí jeho hodnotu stejně jako metoda readbuttons(). V případě, že je tlačítko stisknuto, vátí metoda hodnotu true, v opačném případě vrací false

40 Práci s tlačítky si ukážeme na příkladu ButtonsExample. Program přepíná blikající LED diodu podle aktuálně stisknutého tlačítka: package jbotbrain2.buttonsexample; import jbotbrain2.hw.*; public class ButtonsExampleMain { public static void main(string[] args) { Led.GREEN1.set(Led.MODE_BLINK, 200); while (true) { if (Button.S1.isPressed()) { Led.ledSetAll(false); Led.GREEN1.set(Led.MODE_BLINK, 200); while (Button.S1.isPressed()); if (Button.S2.isPressed()) { Led.ledSetAll(false); Led.GREEN2.set(Led.MODE_BLINK, 200); while (Button.S2.isPressed()); if (Button.S3.isPressed()) { Led.ledSetAll(false); Led.ORANGE.set(Led.MODE_BLINK, 200); while (Button.S3.isPressed()); if (Button.S4.isPressed()) { Led.ledSetAll(false); Led.RED.set(Led.MODE_BLINK, 200); while (Button.S4.isPressed());

41 3.2.3 Výstup do konzole Během vytváření projektů pro jbotbrain II budeme často potřebovat programy ladit vypisováním hodnot proměnných nebo toho, co právě program dělá. K tomu slouží jconsole, která je součástí vývojového prostředí. Do ní můžeme vypisovat zprávy metodami System.out.print(String s) a System.out.println(String s). Rozdíl v nich je jednoduchý metoda println za vypsaným řetězcem ještě odřádkuje. Příklad ConsoleExample čeká na stisknuté tlačítko a po každém stisku vypíše do konzole na nový řádek jeho číselnou hodnotu: package jbotbrain2.consoleexample; import jbotbrain2.hw.*; public class ConsoleExampleMain { public static void main(string[] args) { Led.GREEN1.set(Led.MODE_BLINK, 300); int status; while (true) { status = Button.waitForPress(); System.out.println("Stisknute tlacitko: "+status); V některých případech potřebujeme hodnoty vypisovat v krátkých intervalech a pokud bychom pro každý výpis přidali nový řádek, stalo by se okno konzole rychle nepřehledným. Proto můžeme využít metodu print, která na rozdíl od println nový řádek nepřidá. Pokud bude řetězec končit znakem '\r' (CR = Carriage Return, návrat vozíku ASCII kód 13), znamená to, že se kurzor vrátí na začátek řádku. Za takto vypsaný řetězec je dobré napsat několik mezer, aby na řádku nezůstávaly znaky z předchozího výpisu: while (true) { status = Button.waitForPress(); System.out.print("Stisknute tlacitko : "+status+" \r");

42 3.2.4 Bzučák Bzučák, který se nachází přímo na desce jbotbrainu II, můžeme využít k oživení našich aplikací například k ozvučení stisknutých tlačítek nebo k varovným signálům. Práci s bzučákem zajišťuje třída Sound v balíku jbotbrain2.hw: Třída jbotbrain2.hw.sound static void beep(int tone, int delay) Zahraje tón tone po dobu delay milisekund. Hodnota parametru tone může být jedna z následujících: Sound.C4 Sound.C5 Sound.C6 Sound.D4 Sound.E4 Sound.F4 Sound.G4 Sound.A4 Sound.H4 Sound.B4 Sound.D5 Sound.E5 Sound.F5 Sound.G5 Sound.A5 Sound.H5 Sound.B5 Metoda není blokující to znamená, že zvuk hraje na pozadí a další příkazy se zpracovávají ihned, ne až po doznění tónu

43 Jednoduchý příklad SoundExample po spuštění zahraje na půl sekundy tón A4 (440 Hz). Tlačítka jbotbrainu II S1 S4 mají přiřazené tóny a jbotbrain II tak může sloužit jako improvizovaný hudební nástroj: package jbotbrain2.soundexample; import jbotbrain2.hw.*; public class SoundExampleMain { public static void main(string[] args) { Led.GREEN1.set(Led.MODE_BLINK, 300); Sound.beep(Sound.A4, 500); while (true) { if (Button.S1.isPressed()) { Sound.beep(Sound.A4, 300); while(button.s1.ispressed()); if (Button.S2.isPressed()) { Sound.beep(Sound.H4, 300); while(button.s2.ispressed()); if (Button.S3.isPressed()) { Sound.beep(Sound.C5, 300); while(button.s3.ispressed()); if (Button.S4.isPressed()) { Sound.beep(Sound.D5, 300); while(button.s4.ispressed());

44 3.2.5 Digitální výstupy Při práci s jbotbrainem II máme k dispozici celkem osm digitálních výstupů, na kterých můžeme nastavit vysokou nebo nízkou úroveň (5 V a 0) a které můžeme využít i k připojení modelářského servomotoru. Přístup k digitálním výstupům zajišťuje třída DigitalOutput v balíčku jbotbrain2.hw a umožňuje jak nastavení celého portu (všech osmi výstupů zároveň), tak i přístup k jednotlivým pinům prostřednictvím pole PINS (mějme na paměti že jsou číslovány od nuly, osmému pinu tedy odpovídá číslo 7) nebo označení písmeny A-H. Třída jbotbrain2.hw.digitaloutput static DigitalOutput A, B, C, D, E, F, G, H Digitální výstupy A-H odpovídající pinům 1-8. static DigitalOutput[] PINS Pole obsahující digitální výstupy 0-7. void setvalue(boolean value) Nastavení logické úrovně výstupního pinu (true nebo false): true 1 H (high = vysoká uroveň) 5 V false 0 L (low = nízká úroveň) 0 V void portwrite(int value) Nastavení hodnoty celého portu, tedy všech osmi pinů zároveň podle prvních osmi bitů parametru value. Následující dva příklady budou postupně rozsvěcet LED diody připojené na digitálních výstupech a vytvoří efekt světelného hada, lišit se budou v použití tříd DigitalOutput

45 V prvním příkladu, pojmenovaném DigitalOutExample, použijeme metodu setvalue() a budeme přistupovat jednotlivým pinům. Na to si zavedeme dvě proměnné, pin a prevpin (previous znamená anglicky předchozí), které budeme při každé iteraci nekonečného cyklu (při každém průchodu cyklem) zvyšovat o hodnotu 1: package jbotbrain2.digitaloutexample; import jbotbrain2.hw.*; public class DigitalOutExampleMain { public static void main(string[] args) throws InterruptedException { Led.GREEN1.set(Led.MODE_BLINK, 300); // Nastav všechny piny na nulu DigitalOutput.portWrite(0); int prevpin = 0; int pin = 0; while (true) { // shození předchozího pinu DigitalOutput.PINS[prevPin].setValue(false); // nastavení aktuálního pinu DigitalOutput.PINS[pin].setValue(true); // Přejdi na další pin pin++; prevpin = pin; // Znovu od začátku if (pin == 8) { pin = 0; Thread.sleep(200); Druhý příklad bude vycházet z prvního, proto je ve výpisu zdrojového kódu zobrazena jen část s definicí proměnných a nekonečným cyklem. K nastavení digitálních výstupů je použita metoda portwrite(int value), která najednou nastaví logické úrovně celého portu, tedy všech osmi pinů podle parametru value. K nastavování jednotlivých bitů slouží bitové operace. int pin = 0; while (true) { DigitalOutput.portWrite(1 << pin); // shození předchozího pinu pin++; // Přejdi na další pin // Znovu od začátku if (pin == 8) { pin = 0; Thread.sleep(200);

46 3.2.6 Digitální vstupy Kromě digitálních výstupů máme na jbotbrainu II k dispozici také šest digitálních vstupů. Ty můžeme využít ke čtení logické úrovně (1 nebo 0) a k počítání pulsů. K jejich obsluze slouží třída DigitalInput, která se nachází v balíku jbotbrain2.hw a nabízí obdobný přístup jako třída Digitaloutput k pinům můžeme přistupovat jak pomocí pole PINS, tak i za použití písmen A-F. Třída jbotbrain2.hw.digitalinput static DigitalInput A, B, C, D, E, F Digitální vstupy A-F odpovídající pinům 1-6. static DigitalInput[] PINS Pole obsahující digitální výstupy 0-5. boolean getvalue() Přečtení logické úrovně vstupního pinu (true nebo false): true 1 H (high = vysoká uroveň) 5 V false 0 L (low = nízká úroveň) 0 V int portread() Čtení celého vstupního portu, stav je uložen do horních šesti bitů. Příklad pojmenovaný DigitalInExample ukazuje vypisování stavu tlačítka připojeného na prvním digitálním vstupu proti napájení 5V do konzole. Kromě toho se při stisku tlačítka rozsvítí oranžová LED: package jbotbrain2.digitalinexample; import jbotbrain2.hw.*; public class DigitalInExampleMain { public static void main(string[] args) { Led.GREEN1.set(Led.MODE_BLINK, 300); while (true) { if (DigitalInput.PINS[0].getValue()) { System.out.print("Tlacitko stisknuto. \r"); Led.ORANGE.on(); else { System.out.print("Tlacitko rozpojeno. \r"); Led.ORANGE.off();

47 3.2.7 Čítač K počítání pulsů na vstupním pinu slouží třída Counter. Umožňuje jak počítání náběžných hran, tak i přepočet na frekvenci v Hertzech. Stejně jako třída DigitalInput se nachází v balíku jbotbrain2.hw a nabízí celkem čtyři metody: Třída jbotbrain2.hw.counter Counter(DigitalInput pin) int getedgecount() int getfrequency() void setedgecount(int count) void resetedgecount() Konstruktor třídy, parametrem se nastavuje, s jakým pinem bude čítač pracovat. Vrací počet načítaných náběžných hran. Vrací frekvenci pulsů v Hz. Nastavení stavu čítače na hodnotu count. Vynulování čítače. Ve druhém příkladu připojíme k digitálnímu vstupu IN1 optozávoru (modul SD 01 Optocoupler) a budeme do konzole vypisovat počet impulsů a frekvenci: package jbotbrain2.digitalinexample; import jbotbrain2.hw.*; public class DigitalInExampleMain { public static void main(string[] args) throws InterruptedException { Led.GREEN1.set(Led.MODE_BLINK, 300); Counter cnt = new Counter(DigitalInput.A); while (true) { System.out.print("Pocet impulsu: "+cnt.getedgecount()+", frekvence: "+cnt.getfrequency()+" Hz \r"); Thread.sleep(300);

48 3.2.8 Analogové vstupy Analogové vstupy můžeme využít k připojení senzorů s analogovým výstupem (infračervené dálkoměry, čidla teploty, tlaku, ), potenciometru nebo k prostému měření napětí v rozsahu 0-5 V s desetibitovým rozlišením. To znamená, že měřené napětí reprezentuje číslo v rozsahu (1024 = 2 10 ) a rozlišení je tedy 5000/1024 = necelých 5 mv. Analogových vstupů najdeme na desce celkem šest a přistupujeme k nim obdobnou logikou jako k digitálním vstupům nebo výstupům, pomocí třídy AnalogInput, která se nachází v balíčku jbotbrain2.hw. Ke čtení pinů slouží konstanty A-F nebo pole INPUTS[0-5]: Třída jbotbrain2.hw.analoginput static AnalogInput A, B, C, D, E, F Analogové vstupy A-F odpovídající vstupům 0-5. static AnalogInput[] INPUTS Pole obsahující analogové vstupy (0-5). int readvalue_mv() float readvalue_v() Měření napětí v milivoltech jako celé číslo v rozsahu , kde 5000 mv odpovídá 5 V. Měření napětí ve voltech jako číslo s desetinným místem. Následující příklad, AnalogExample, bude číst stav potenciometru připojeného na analogový vstup 0 a do konzole vypisovat jak hodnotu napětí v milivoltech, tak i polohu osy potenciometru v procentech. Zároveň umožní potenciometrem regulovat periodu blikání oranžové LED diody

49 Pokusně bylo zjištěno, že pro krajní polohy potenciometru naměří jbotbrain II hotnody 5 a 4950 mv. Proto je u přepočtu napětí na procenta použit tento vztah: percent = ((voltage-5)*100/4950); Proměnná delta v sobě uchovává změnu polohy a slouží k tomu, abychom blikání LED diody nastavili jen v případě, kdy jsme s osou potenciometru skutečně pohli (delta je různá od nuly): package jbotbrain2.analogexample; import jbotbrain2.hw.*; public class AnalogExampleMain { public static void main(string[] args) throws InterruptedException { AnalogInput analog = AnalogInput.Inputs[0]; Led.GREEN1.set(Led.MODE_BLINK, 300); int voltage; int percent = 0; int delta = 0; while (true) { voltage = analog.readvalue_mv(); delta = percent; percent = ((voltage-5)*100/4950); delta -= percent; if (delta!= 0) { Led.ORANGE.set(Led.MODE_BLINK, percent*3); \r"); System.out.print("Poloha: "+percent+"% (U = "+voltage+" mv) Thread.sleep(10);

50 3.2.9 Motory jbotbrain II umožňuje připojení celkem dvou stejnosměrných motorů, které jsou označeny A a B. Alternativně můžeme použít výstupy pro ovládání čtyř stejnosměrných motorů připojením jedné svorky motoru na výstup jbotbrainu II a druhé svorky na zem nebo napájecí napětí z akumulátoru musíme ale počítat se sníženým proudovým limitem a s tím, že přijdeme o možnost změnit směr otáčení motoru. Přístup k motorům zajišťuje třída Motor v balíku jbotbrain2.hw: Třída jbotbrain2.hw.motor static Motor A, B Přístup k motorům A a B. void setspeed(int speed) Nastavení rychlosti motoru v rozsahu (0 = motor stojí, 255 je maximální rychlost). void setdirection(int direction) Nastavení směru otáčení motoru. Hodnoty proměnné direction jsou popsány v tabulce níže. Možné hodnoty parametru metody setdirection(int direction) jsou následující: Motor.MOTOR_CLOCKWISE Motor.MOTOR_ANTICLOCKWISE Motor.MOTOR_STANDBY Otáčení po směru chodu hodinových ručiček. Otáčení v opačném směru. Odpojení motoru žádný proud neprochází, hřídel se volně protáčí. Motor.MOTOR_STOP Brzda, motor je zkratován (stále jím prochází proud) hřídelí motoru nelze volně otáčet

51 Ovládání motorů ukazuje následující příklad. Tlačítky S2 a S3 se mění směr otáčení motorů, tlačítka S4 a S1 slouží k přidávání/ubírání rychlosti (je nutné ohlídat, aby rychlost nebyla menší než 0 a větší než 255): package jbotbrain2.motorsexample; import jbotbrain2.hw.*; public class MotorsExampleMain { public static void main(string[] args) { int speed = 0; Led.GREEN1.set(Led.MODE_BLINK, 300); Motor.A.setDirection(Motor.MOTOR_STANDBY); Motor.A.setDirection(Motor.MOTOR_STANDBY); while (true) { if (Button.S3.isPressed()) { while (Button.S3.isPressed()); Motor.A.setDirection(Motor.MOTOR_ANTICLOCKWISE); Motor.B.setDirection(Motor.MOTOR_ANTICLOCKWISE); else if (Button.S2.isPressed()) { while (Button.S2.isPressed()); Motor.A.setDirection(Motor.MOTOR_CLOCKWISE); Motor.B.setDirection(Motor.MOTOR_CLOCKWISE); if (Button.S4.isPressed()) { while (Button.S4.isPressed()); speed -= 20; if (speed < 0) { speed = 0; Motor.A.setSpeed(speed); Motor.B.setSpeed(speed); else if (Button.S1.isPressed()) { while (Button.S1.isPressed()); speed += 20; if (speed > 255) { speed = 255; Motor.A.setSpeed(speed); Motor.B.setSpeed(speed);

52 Servomotory K připojení standardních modelářských servomotorů můžeme využít jeden z osmi digitálních výstupů. O řízení serva se stará třída ServoMotor, ukrytá v balíčku jbotbrain2.hw a má kromě konstruktoru jedinou metodu sloužící k nastavení polohy výstupní osy. Třída jbotbrain2.hw.servomotor ServoMotor(DigitalOutput output) void setvalue(int value) Konstruktor sloužící k nastavení digitálního pinu (output), ke kterému je servomotor připojen. Nastavení polohy serva v rozsahu Hodnota 127 je krajní poloha odpovídající pulsu o šířce 1,5 ms. Následující příklad, pojmenovaný ServoExample, pracuje se servem připojeným na digitální výstup 1, které se po stisku tlačítka natáčí do poloh postupně 0, 90 a 180 : package jbotbrain2.servotest; import jbotbrain2.hw.*; public class ServoExampleMain { public static void main(string[] args) { ServoMotor servo = new ServoMotor(DigitalOutput.PINS[0]); Led.GREEN1.set(Led.MODE_BLINK, 300); int pos = 1; while (true) { servo.setvalue(pos); Button.waitForPress(); pos += 126; if (pos > 255) { pos = 1;

53 Bluetooth Abychom mohli s Bluetooth rozhraním jbotbrainu II pracovat, musíme mít Bluetooth modul zapnutý a spárovaný s naším počítačem. Práci s Bluetoothem v režimu SPP (Serial Port Profile to znamená, že se v počítači hlásí jako běžný sériový COM port) zajišťuje třída BTCommport v balíku jbotbrain2.comm. Kromě ní se v balíku nachází ještě třída UARTCommPort, která slouží k práci se sériovým portem (UART) a která je popsána v následující kapitole. Obě třídy implementují rozhraní CommPort, takže práce s nimi je podobná. Ve výpisu metod jsou zahrnuty pouze metody, které využijeme a které nejsou implementovány jen kvůli kompatibilitě s rozhraním CommPort (například metoda open(), jejíž použití nemá žádný vliv): Třída jbotbrain2.comm.btcommport int getstatus() Zjištění stavu Bluetooth modulu: CommPort.DEVICE_OFF Modul je vypnut. CommPort.DEVICE_ON CommPort.DEVICE_WAIT_ CONN CommPort.DEVICE_CONN ECTED Modul je zapnut. Čekání na spojení. Spojení s dalším Bluetooth zařízením bylo navázáno. int write(bytes[] buffer, int offset, int length) Pošle length bajtů z pole buffer od indexu offset. Pro odeslání řetězce znaků ahoj použijeme metodu následovně: BTCommPort comm = new BTCommPort(); byte[] buffer = {'a', 'h', 'o', 'j'; comm.write(buffer, 0, buffer.length); Metoda vrací počet odeslaných bajtů. int read(bytes[] buffer, int offset, int length) int writestring(string s) Načte length přijatých bajtů do pole buffer od indexu offset a vrací počet přečtených bajtů bajtů. Odešle řetězec a vrátí počet odeslaných bajtů

54 Příjem a odesílání dat si ukážeme na jednoduchém příkladu vozítka s diferenciálním řízením (jako tank) a dvěma motory připojenými přímo k jbotbrainu II, které budeme ovládat dálkově rozhraním Bluetooth. Celý příklad se vejde do jediné třídy RemoteControlMain: package jbotbrain2.remotecontrol; import jbotbrain2.hw.*; import jbotbrain2.comm.btcommport; public class RemoteControlMain { public static void main(string[] args) { Led.GREEN1.set(Led.MODE_BLINK, 300); // Přijímací buffer byte[] buffer = new byte[1]; // Příkaz maximálně 5 znaků char[] command = new char[5]; // Počet přijatých bajtů int bytescount = 0; // Počet bajtů příkazu int count = 0; // Vytvoření instance BT komunikačního portu BTCommPort comm = new BTCommPort(); while (true) { // Načtení bajtů z Bluetoothu bytescount = comm.read(buffer, 0, 1); // Uložení bajtů do pole command if (bytescount > 0) { command[count] = (char) buffer[0]; count++; command.length) { // Zpracuj příkaz, pokud je ukončen novým řádkem // nebo pokud počet bajtů přetekl if (command[count 1] == '\n' count == count = 0; commandreceived(command); comm.writestring("ok\n"); /** * Zpracování příkazu */ public static void commandreceived(char[] command) { System.out.println("Command received: " + command[0] + " " + command[1]);

55 // Levý motor switch (command[0]) { case 'F': Motor.A.setSpeed(255); Motor.A.setDirection(Motor.MOTOR_CLOCKWISE); break; case 'B': Motor.A.setSpeed(255); Motor.A.setDirection(Motor.MOTOR_ANTICLOCKWISE); break; default: Motor.A.setSpeed(0); break; // Pravý motor switch (command[1]) { case 'F': Motor.B.setSpeed(255); Motor.B.setDirection(Motor.MOTOR_CLOCKWISE); break; case 'B': Motor.B.setSpeed(255); Motor.B.setDirection(Motor.MOTOR_ANTICLOCKWISE); break; default: Motor.B.setSpeed(0); break; Program v nekonečné smyčce načítá data z Bluetooth modulu (k tomu slouží třída jbotbrain2.comm.btcommport) do pole command. Pokud narazí na znak nového řádku nebo pokud hrozí přetečení pole command, je zavolána metoda commandreceived, která zajišťuje zpracování příkazu přepínačem (switch). Využity jsou první dva bajty příkazu, první pro levý motor a druhý pro motor pravý. Směr otáčení motoru může být buď F (forward otáčení vpřed), B (backward otáčení vzad) nebo S (stop zastavení). Příkaz FF tedy slouží k jízdě vpřed, příkaz FB pak k otáčení na místě doprava. Po přijetí příkazu jbotbrain II odešle zprávu OK a odřádkuje, abychom se přesvědčili, že byl příkaz přijat. Kromě toho vypisuje přijaté příkazy do konzole

56 Bluetooth modul je nastavený na komunikaci rychlostí baudů. Dálkové ovládání bude fungovat třeba v Hyperterminálu, stačí se připojit ke správnému portu a posílat příkazy popsané výše a oddělené novým řádkem. Protože ovládání z terminálu nepatří mezi nejpohodlnější, napsal jsem jednoduchou aplikaci v Delphi, která se připojí k danému sériovému portu a odesílá příkazy. Vozítko je možné ovládat buď šipkami nebo klikáním na tlačítka. Ovládací aplikaci najdete v příloze

57 UART Jak jsem zmínil v minulé kapitole, práci se sériovým portem (UART) jbotbrainu II zajišťuje třída UARTCommPort v balíku jbotbrain2.comm, která má stejně jako třída BTCommPort implementováno rozhraní CommPort a její použití je obdobné. Ve výpisu metod tedy zmíním jen metody, které nejsou ve třídě pro práci s Bluetooth modulem zahrnuty nebo které se mírně liší: Třída jbotbrain2.comm.uartcommport int getstatus() Zjištění stavu UART portu: CommPort.DEVICE_OFF CommPort.DEVICE_CONN ECTED Port je uzavřen (odpojen). Port je otevřen. int writestring(string s) Otevře spojení s UART portem a nastaví komunikační rychlost (baudrate) a paritu dat (parity) a vrací true v případě úspěchu. Komunikační rychlosti můžeme vybrat následující: CommPort.BR_1200 CommPort.BR_2400 CommPort.BR_4800 CommPort.BR_9600 CommPort.BR_19200 CommPort.BR_38400 CommPort.BR_57600 CommPort.BR_ ,2 kbd (1200 baudů) 2,4 kbd 4,8 kbd 9,6 kbd 19,2 kbd 38,4 kbd 57,6 kbd 115,2 kbd Parmetr parity mastavuje chování paritního bitu a může

58 nabývat těchto hodnot: CommPort.PARITY_ODD Počet jedniček v odeslaném bajtu je lichý. CommPort.PARITY_EVEN Počet jedniček v odeslaném bajtu je sudý- CommPort.PARITY_MARK CommPort.PARITY_SPACE CommPort.PARITY_NONE Paritní bit má vždy hodnotu 1. Paritní bit má vždy hodnotu 0. Paritní bit není posílán. Parity MARK a SPACE jsou výhodné v případě, že chceme pracovat se zařízením, které vyžaduje devítibitovou komunikaci namísto osmibitové. void close() Ukončí práci s UART portem a uzavře jej. Protože třídy BTCommPort a UARTCommPort můžeme jednoduše zaměnit, ukážeme si použití třídy UARTCommPort na úpravě příkladu dálkového ovládání s Bluetoothem z předchozí kapitoly. Stačí pouze změnit třídu importovanou z balíku jbotbrain2.comm a řádek s vytvoření instance třídy BTCommPort BTCommPort comm = new BTCommPort(); změnit na UARTCommPort comm = new UARTCommPort(); comm.open(commport.br_115200, CommPort.PARITY_NONE); Nyní můžeme vozítko ovládat z počítače prostřednictvím USB TTL UART převodníku nebo převodníku z RS232 na UART v TTL úrovních. Stačí jen změnit číslo COM portu v terminálu nebo ovládacím programu. Úrovně RS232C Proč je pro připojení ke COM portu počítače potřeba převodník? Sériový COM port na počítači pracuje s úrovněmi až ± 10 V, které by jbotbrain II pracující s TTL úrovněmi 0 a 5 V spolehlivě zničily. Kromě toho je potřeba logické úrovně invertovat k tomu slouží převodníky například s integrovaným obvodem MAX

59 I 2 C Hardware jbotbrainu II umožňuje práci s I 2 C zařízeními, přičemž jbotbrain II je brán jako master. Přímo na desce jsou vyvedeny čtyři konektory pro připojení zařízení. Co je to I 2 C? Sběrnice I 2 C (IIC, Inter-Integrated Circuit, čteme [I-squared-C]) je multimasterová sběrnice vyvinuta firmou Philips, umožňující připojení až 127 zařízení pomocí dvou obousměrných linek. Linka SCL tvoří hodinový signál, po lince SDA se přenášejí data. U jiných výrobců se kvůli licenční politice můžeme setkat s označením TWI (Two-Wire Interface). Je používána ke komunikaci s různými zařízeními jak v počítačích, tak i v mobilních telefonech a dalších zařízeních například paměti, obvody reálného času, A/D převodníky. Díky implementaci v mikrokontrolérech se stala populární pro připojování různých modulů, jako jsou různé senzory a další zařízení. Pro přístup k I 2 C portu slouží třída I2CPort ukrytá v balíku jbotbrain2.hw. Kromě metod uvedených v tabulce obsahuje ještě nízkoúrovňové metody pro zapnutí a vypnutí I 2 C portu, ty pro nás ale nejsou zajímavé. Třída jbotbrain2.hw.i2cport static int i2cbusy() static int i2cstart( int address, int internaladdress, int numinternalbytes, byte[] buffer, int numbytes, int transfertype ) Zjištění vytíženosti I 2 C portu pokud je hodnota větší než 0, port právě odesílá neb o přijímá data. Statická metoda pro zahájení zápisu nebo čtení dat. address je adresa I 2 C zařízení. internaladdress je číslo registru, kam chceme zapisovat, nebo ze kterého chceme číst. numinternalbytes je počet bajtů, které chceme ze zařízení přečíst nebo zapsat. buffer je pole bajtů, do kterého chceme data načíst nebo které chceme do zařízení zapsat. numbytes je počet bajtů (délka) bufferu. transfertype určuje typ operace I2CPort.I2C_READ pro čtení nebo I2CPort.I2C_WRITE pro zápis

60 Ač může vypadat použití metody i2cstart složitě, není tomu tak. Práci s I 2 C portem si ukážeme na příkladu, kdy vytvoříme třídu pracující s elektromagnetickým kompasem CMPS03. Ta bude jen ukázková, protože jbotbrain II obsahuje třídy pro práci s mnoha senzory, kompas CMPS03 nevyjímaje (konkrétně jde o třídu jbotbrain2.sensors.cmps03sensor). Pár slov o CMPS03 Modul kompasu CMPS03 vyrábí firma Devantech a slouží k určení směru, kterým je robot otočen. Využívá k tomu dvou navzájem kolmých senzorů magnetického pole KMZ51. S okolím komunikuje pomocí sběrnice I2C, kterou jsme se začali zabývat v minulém dílu. Pro správné měření by měl být kompas správně zkalibrován a na robotovi umístěn co možná nejdále od zdrojů rušení, hlavně motorů a feromagnetických látek. Kromě toho musí být umístěn vodorovně, náklon senzoru či poskakování robota po dlažebních kostkách má na výsledek měření špatný vliv. Sběrnice I 2 C se dá využít pro komunikaci master zařízení (zde je to jbotbrain II) se slave zařízeními (SRF02, CMPS03, EEPROM 24C04 atd.). Každé z těchto zařízení má svou adresu a několik vnitřních registrů, ze kterých můžeme číst nebo do kterých můžeme zapisovat. Podrobný popis komunikace se zařízením bývá uveden v jeho dokumentaci, modul CMPS03 ji má dostupnou v angličtině na webu Z ní vyplývá, že kompas má celkem 16 registrů: Registr Význam 0 Verze software 1 Natočení jako bajt, ,3 Natočení jako word (2 bajty), reprezentuje 0-359,9 4,5 Interní test (slouží k testování ve výrobě) 6,7 Interní test (slouží k testování ve výrobě) 8,9 Nezpracovaná data prvního senzoru 10,11 Nezpracovaná data druhého senzoru 12, 13 a 14 Odemykací kód (unlock code) 15 Příkazový registr Registry 4-11 jsou pro nás nezajímavé, slouží ke zkouškám ve výrobě. Natočení kompasu budeme získávat z registrů 2 a 3, které obsahují natočení s rozlišením na desetiny stupně a stačí je pouze přečíst, o nic víc se starat nemusíme (na rozdíl od sonaru SRF02, kde je před přečtením hodnoty nutné zahájit měření a vyčkat 80 milisekund). Registr 15 slouží ke kalibraci kompasu (o té si povíme později) a ke změně adresy tu využijeme, pokud již na sběrnici nějaké jiné zařízení s adresou 0xC0 (výchozí adresa CMPS03) používáme. Předtím ale musíme do registru 15 zapsat kód, kterým kompas odemkneme a změnu adresy povolíme

61 Hlavní třída programu, ComppasMain, slouží jen k vytvoření instance třídy Compass a vypisování hodnot do konzole: package jbotbrain2.compass; import jbotbrain2.hw.led; public class CompassMain { public static void main(string[] args) throws InterruptedException { Led.ORANGE.set(Led.MODE_BLINK, 200); Compass compass = new Compass(); while (true) { System.out.print("Uhel: "+compass.getangle()+" Thread.sleep(200); \r"); Klíčovou je až třída Compass, kterou postupně rozebereme: package jbotbrain2.compass; import jbotbrain2.hw.i2cport; public class Compass { private int address; public Compass(int address) { this.address = address; public Compass() { address = 0xC0; // Ostatní metody jsou popsány níže Pro práci s I 2 C zařízením budeme potřebovat třídu jbotbrain2.hw.i2cport, kterou musíme importovat. Naše třída Compass má jednu privátní vlastnost address pro uložení adresy zařízení. Adresa je nastavena konstruktorem. Pokud adresu nezadáme, je použita výchozí adresa kompasu CMPS03, hodnota 0xC

62 public void calibrate() { byte buffer[] = {(byte)0xff; I2CPort.i2cStart(address, 15, 1, buffer, 1, I2CPort.I2C_WRITE); Ke kalibraci kompasu slouží následující postup (světové strany musí být určeny přesně, například pomocí klasického kompasu či buzoly pokud je pouze odhadneme, bude kalibrace víceméně zbytečná a měření velice nepřesné): 1) Natočíme kompas směrem na sever a zapíšeme hodnotu 255 (0xFF) do registru 15 2) Natočíme kompas směrem na východ a zapíšeme hodnotu 255 (0xFF) do registru 15 3) Natočíme kompas směrem na jih a zapíšeme hodnotu 255 (0xFF) do registru 15 4) Natočíme kompas směrem na západ a zapíšeme hodnotu 255 (0xFF) do registru 15 Při kalibraci by měl modul kompasu ležet vodorovně. Nemusíme ji provádět pokaždé, hodnoty zůstanou uloženy v paměti. K zápisu hodnoty 255 (0xFF) do registru 15 (příkazový registr) použijeme metodu I2CPort.i2cStart(), která je popsaná v tabulce výše. public void changeaddress(int newaddress) { byte buffer[] = {(byte)0xa0, (byte)0xaa, (byte)0xa5, (byte)newaddress; I2CPort.i2cStart(address, 12, 4, buffer, 4, I2CPort.I2C_WRITE); address = newaddress; Změna adresy funguje původně jako kalibrace, jen zapíšeme více bajtů, které jsou uloženy v poli buffer. První tři (0xA0, 0xAA a 0xA5) jsou odemykací kód a zapisují se do registrů Poslední bajt je adresa, která se zapíše do registru 15. Protože budeme zapisovat všechny čtyři bajty najednou, nastavíme internaladdress na 12 a numinternalbytes (počet bajtů) na 4. Pozor, pokud z nějakého důvodu potřebujete adresu změnit, nezapomeňte si tu novou poznačit. Adresu modulu můžete vybírat z hodnot 0xC0, 0xC2, 0xC4, 0xC6, 0xC8, 0xCA, 0xCC nebo 0xCE. public int getangle() { byte buffer[] = {0x00, 0x00; I2CPort.i2cStart(address, 2, 2, buffer, 2, I2CPort.I2C_READ); int angle = (buffer[0] << 8) (buffer[1] & 0xFF); return angle/10; Poslední metoda slouží k přečtení naměřené hodnoty, která je uložena v registrech 2 a 3. Budeme tedy číst 2 bajty počínaje registrem 2, uložíme je do pole buffer a spojíme. Kompas sice poskytuje rozlišení na desetiny stupně (proto je natočení uloženo ve dvou registrech každý registr obsahuje jeden bajt), my se ale spokojíme s celým číslem. Hodnotu angle vydělíme deseti a protože je datového typu int, bude obsahovat pouze celé číslo bez desetinných míst

63 Vlákna JVM jbotbrainu II umožňuje tzv. multithreading, tedy paralelní zpracování dvou či více částí programu (pro upřesnění použitý procesor samozřejmě fyzicky neumožňuje běh několika vláken současně, JVM se stará o jejich přepínání a jednotlivá vlákna se tak o procesor dělí podle pravidel, která jim přiděluje plánovač (scheduler) na základě nastavitelné priority). Práci s vlákny zajišťuje třída Thread, kterou najdeme v balíku java.lang. Balík je jedním ze základních a importuje se automaticky. Vytvoření vlákna je velice jednoduché. Buď vytvoříme třídu s implementovaným rozhraním Runnable, nebo třídu, která je od třídy Thread odvozená dědením. Ukážeme si druhý způsob: public class MyThread extends Thread { public void run() { // Náš kód Do metody run() pak patří kód, který vlákno zpracovává, například nekonečná smyčka bliakjící LED diodou. TIP: Pokud v Eclipse založíme novou třídu MyThread a do kódu napíšeme, že má dědit z třídy Thread (extends Thread), objeví se v levém postranním proužku editoru ikonka oznamující chybu. To proto, že v kódu nemáme zahrnuty metody, které musíme povinně implementovat. Můžeme je buď napsat ručně (v našem případě jde pouze o metodu run()), nebo stačí na ikonku kliknout, v nabídce zvolit položku add unimplemented methods a Eclipse metodu run() doplní sám: Vlákno pak spustíme zavoláním metody start(): MyThread mythread = new MyThread(); mythread.start();

64 Vše si ukážeme na příkladu dálkového ovládání dvoukolového vozítka z kapitoly o Bluetoothu, který doplníme o bezpečnostní brzdu realizovanou tlačítkem S4. Pokud bude tlačítko S4 stisknuto, vozítko se zastaví a ovládat je budeme moci až po opětovném stisknutí tlačítka. Brzda se hodí v okamžiku, kdy vozítko půjčíme někomu, komu řízení příliš nejde a nechceme, aby nabouralo do skříně nebo zdi. Nejprve vytvoříme třídu BrakeThread, což je vlákno, které kontroluje stav tlačítka S4 a po jeho stisku zavolá metodu hlavní třídy RemoteControlMain.brakeStop(), která se bude starat o zastavení vozítka: package jbotbrain2.remotecontrol; import jbotbrain2.hw.button; public class BrakeThread extends Thread { public void run() { while (true) { if (Button.S4.isPressed()) { RemoteControlMain.brakeStop(); while (Button.S4.isPressed());

65 Druhou úpravou bude vytvoření metody brakestop() v hlavní třídě a vlastnosti stop, která bude hlídat zastavení vozítka. Kromě toho také musíme vytvořit instanci vlákna BrakeThread, spustit je pomocí metody start() a do hlavního cyklu přidat podmínku, která při změně hodnoty proměnné stop na true zastaví motory, rozsvítí červenou LED diodu a čeká, dokud se její hodnota nezmění opět na false. Původní kód je zobrazen šedou barvou: package jbotbrain2.remotecontrol; import jbotbrain2.hw.*; public class RemoteControlMain { private static boolean stop = false; public static void brakestop() { if (stop) { stop = false; else { stop = true; public static void main(string[] args) { // Původní kód BrakeThread brake = new BrakeThread(); brake.start(); while (true) { if (!stop) { // Původní kód else { Motor.A.setSpeed(0); Motor.B.setSpeed(0); Led.RED.on(); while (stop); Led.RED.off();

66 Časovače Blikáním LED diodou se zabývá jedna z prvních kapitol, slouží k tomu metoda setmode(int mode, int delay), například příkaz Led.RED.setMode(Led.MODE_BLINK, 100) rozbliká červenou LED diodu s periodou 100 milisekund. Ale co když chceme na jbotbrainu II, kde již máme v hlavní smyčce nějaký kód (třeba zpracování a příjem příkazů z rozhraní Bluetooth) rozblikat další LED diody připojené na digitální výstup? Použijeme časovač. Časovač (Timer) je nástroj umožňující jednou za uplynutí zadané periody volat určitou metodu. Inicializuje se jednoduše: Timer mytimer = new Timer(100, timerlistener); mytimer.start(); Prvním parametrem je prodleva v milisekundách, druhým je instance třídy s implementovaným rozhraním TimerListener. Rozhraní TimerListener má definovanou metodu timedout, která je volána právě při uplynutí zadané prodlevy. Ke spuštění časovače slouží metoda start(). Periodu můžeme změnit medotou setdelay(int delay) a metoda stop() slouží k zastavení časovače. Praktické použití si ukážeme na příkladu s dvěma LED diodami připojenými na digitální výstup, stejně jako v příkladu se semaforem. Nezapomeňte k LED diodě zapojit ochranný rezistor! Třída Blinker.java, která se o přepínání LED diody stará, bude obsahovat tento kód: package jbotbrain2.timerexample; import jbotbrain2.util.timerlistener; import jbotbrain2.hw.digitaloutput; public class Blinker implements TimerListener { private boolean on = false; private int pinnumber; public Blinker(int pinnumber) { this.pinnumber = pinnumber; public void timedout() { if (on) { DigitalOutput.PINS[pinNumber].setValue(false); on = false; else { DigitalOutput.PINS[pinNumber].setValue(true); on = true;

67 Třída Timer a rozhraní TimerListener jsou umístěny v balíku jbotbrain2.util, proto je nesmíme zapomenout importovat. Celý kód je velice jednoduchý, klíčová je metoda timedout(), která má v sobě uloženou obsluhu přerušení časovače. Kód v hlavní třídě příkladu TimerExampleMain.java pak bude následující: package jbotbrain2.timerexample; import jbotbrain3.hw.*; import jbotbrain2.util.timer; public class TimerExampleMain { public static void main(string[] args) { Led.GREEN1.set(Led.MODE_BLINK, 100); Timer red = new Timer(500, new Blinker(0)); Timer orange = new Timer(1000, new Blinker(1)); red.start(); orange.start(); Button.waitForPress(); Objekty red a orange, instance časovače Timer, se starají o blikání dvou LED diod připojených na digitálním výstupu, každé s jinou periodou. Připomenu, že digitální výstup 0 odpovídá výstupu 1, číslo 1 pak výstupu

68 3.3 Práce s moduly SD 05 Dotykový spínač Dotykový spínač SD 05 Limit switch se připojuje k jednomu ze šesti digitálních vstupů jbotbrainu II a dá se použít jako zpětná vazba v různých pohyblivých aplikacích. Třída TactileSensor v balíku jbotbrain2.sensors nabízí metody, které nám práci se spínači zjednoduší: Třída jbotbrain2.sensors.tactilesensor TactileSensor(DigitalInput input) boolean ispressed() boolean waitforpress(int timeout) Konstruktor, slouží k vytvoření nové instance. Parametr input určuje, na který digitální vstup je senzor připojen. Vrací hodnotu true, pokud je spínač sepnut. Vyčká na stisknutí spínače nebo vypršení časového limitu timeout zadaného v milisekundách. Pokud má parametr timeout hodnotu 0, je časový limit ignorován a čeká se pouze na sepnutí spínače. Metoda vrací hodnotu true v případě, že byla ukončena stisknutím spínače nebo false v případě, že byla ukončena po vypršení časového limitu

69 Příklad TactileSwitchExample používá spínač jako nárazník u podvozku dvoukolového vozítka s motory připojenými k jbotbrainu II. Vozítko se po spuštění programu rozjede a pokud narazí nárazníkem (spínačem) do překážky nebo pokud vyprší čas 5 sekund (5000 ms), motory se zastaví a rozsvítí se červená LED dioda, která svítí dokud není stisknuto libovolné tlačítko na desce jbotbrainu II. Jeho stiskem se vozítko znovu rozjede: package jbotbrain2.tactileswitchexample; import jbotbrain2.hw.*; import jbotbrain2.sensors.tactilesensor; public class TactileSwitchExampleMain { public static void main(string[] args) { Led.GREEN1.set(Led.MODE_BLINK, 300); TactileSensor ts = new TactileSensor(DigitalInput.A); Motor.A.setDirection(Motor.MOTOR_CLOCKWISE); Motor.B.setDirection(Motor.MOTOR_CLOCKWISE); while (true) { Motor.A.setSpeed(200); Motor.B.setSpeed(200); ts.waitforpress(5000); Led.RED.on(); Motor.A.setSpeed(0); Motor.B.setSpeed(0); Button.waitForPress(); Led.RED.off();

70 3.3.2 SA 02 Senzor atmosférického tlaku Senzor SA 04 Atmospheric pressure sensor měří atmosférický tlak v rozsahu kpa. Připojujeme jej k jednomu ze šesti analogových vstupů jbotbrainu II a práci s ním zajišťuje třída PressureMeter v balíku jbotbrain2.sensors: Třída jbotbrain2.sensors.pressuremeter PressureMeter(AnalogInput input) float getpressure() Konstruktor, slouží k vytvoření nové instance. Parametr input určuje, na který analogový vstup je senzor připojen. Vrátí naměřenou hodnotu tlaku v kpa jako desetinné číslo. Následující příklad PressureMeterExample bude každých 200 milisekund do konzole vypisovat aktuální hodnotu atmosférického tlaku naměřenou senzorem připojeným k analogovému vstupu AIN1: package jbotbrain2.pressuremeterexample; import jbotbrain2.hw.*; import jbotbrain2.sensors.pressuremeter; public class PressureMeterExampleMain { public static void main(string[] args) throws InterruptedException { Led.GREEN1.set(Led.MODE_BLINK, 300); PressureMeter pressure = new PressureMeter(AnalogInput.A); while (true) { System.out.print("Atmosfericky tlak: "+pressure.getpressure()+" kpa \r"); Thread.sleep(200);

71 3.3.3 SA 04 Teploměr Teploměr SA 04 Thermometer slouží k měření teploty okolí ve stupních Celsia ( C) a připojujeme jej na jeden z šesti analogových vstupů jbotbrainu II. Měřící rozsah je C. Práci s teplotním čidlem zajišťuje třída Thermometer v balíku jbotbrain2.sensors: Třída jbotbrain2.sensors.thermometer Thermometer(AnalogInput input) float gettemperature() Konstruktor, slouží k vytvoření nové instance. Parametr input určuje, na který analogový vstup je teploměr připojen. Vrátí naměřenou hodnotu ve stupních Celsia jako číslo s desetinným místem ( C). Jednoduchý příklad ThermometerExample bude do konzole každých 200 milisekund vypisovat naměřenou teplotu teploměru připojeného k analogovému vstupu AIN1: package jbotbrain2.thermometerexample; import jbotbrain2.hw.*; import jbotbrain2.sensors.temperaturesensor; public class ThermometerExampleMain { public static void main(string[] args) throws InterruptedException { Led.GREEN1.set(Led.MODE_BLINK, 300); TemperatureSensor temp = new TemperatureSensor(AnalogInput.A); \r"); while (true) { System.out.print("Teplota: "+temp.gettemperature()+" C Thread.sleep(200);

72 3.3.4 SI 01 Akcelerometr Akcelerometr (modul SI 01 Accelerometer) je zařízení měřící zrychlení ve třech osách, které může být způsobeno gravitací nebo nerovnoměrným zrychlením. Hodnoty můžeme využít k zjištění náklonu nebo rychlosti integrací všech tří os. Rozsah měření akcelerometru je ±5 g, kde g odpovídá přibližně 9,81 m/s 2. V případě nulového zrychlení je hodnota měření příslušné osy 0 g. Senzor s jbotbrainem II komunikuje pomocí sběrnice I 2 C a pro přístup k němu používáme třídu Accelerometer umístěnou v balíku jbotbrain2.sensors: Třída jbotbrain2.sensors.accelerometer Accelerometer(int address) float[] lastvalues Konstruktor, slouží k vytvoření nové instance. Parametr address použijeme v případě, že chceme použít jinou adresu než výchozí 0xB0 Pole o třech prvcích obsahující poslední naměřené hodnoty získané metodou getallaxis(): lastvalues[0] Osa X lastvalues[1] lastvalues[2] Osa Y Osa Z void getallaxis() Přečte zrychlení všech tří os a uloží je do pole lastvalues. float getx() Vrací zrychlení na ose X. float gety() Vrací zrychlení na ose Y. float getz() Vrací zrychlení na ose Z. Příklad AccelerometerExample bude v nekonečném cyklu číst zrychlení na ose Y a nastavovat polohu servomotoru připojeného k digitálnímu výstupu OUT1 podle náklonu desky akcelerometru pokud je hodnota zrychlení 0, nastaví se výstupní osa do středové polohy, jinak se vychýlí podle velikosti zrychlení. Zrychlení vynásobené číslem 100 (abychom dostali celé číslo) je pak vypsáno do konzole

73 Mějme na paměti, že hodnota natočení serva metody ServoMotor.setValue(int value) musí být v rozsahu 1-254, proto musíme zrychlení přepočítat metodou limitservo(int value): package jbotbrain2.accelerometerexample; import jbotbrain2.hw.*; import jbotbrain2.sensors.accelerometer; public class AccelerometerExampleMain { public static int limitservo(int val) { if (val < 1) { return 1; else if (val > 254) { return 254; return val; public static void main(string[] args) { Led.GREEN1.set(Led.MODE_BLINK, 300); Accelerometer acc = new Accelerometer(); ServoMotor servo = new ServoMotor(DigitalOutput.A); int val = 0; while (true) { val = (int)(acc.gety()*100); servo.setvalue(limitservo(127+val)); System.out.print("Zrychleni: "+val+" \r");

74 3.3.5 SI 02 Světelný senzor Světelný senzor SI 02 Light Sensor slouží k měření intenzity záření (anglicky Irradiance, značka E e ), která je udána v jednotkách µw/cm 2. Čím více světla na senzor dopadá, tím je měřená hodnota vyšší. Pokud je senzor v úplné tmě (například přikryjeme-li ho rukou), vrací nulovou hodnotu. Nejvyšší měřitelná hodnota je přibližně µw/cm 2. Senzor s jbotbrainem II komunikuje pomocí sběrnice I 2 C a pro přístup k němu používáme třídu LightSensor umístěnou v balíku jbotbrain2.sensors: Třída jbotbrain2.sensors.lightsensor LightSensor(int address) void setdeviceaddress(int address) Konstruktor, slouží k vytvoření nové instance. Parametr address použijeme v případě, že chceme použít jinou adresu než výchozí 0xC0 Změní I 2 C adresu senzoru. int getirradiance() Přečte hodnotu intenzity záření v µw/cm 2. Jednoduchý příklad LigthSensorExample bude do konzole každých 200 milisekund vypisovat hodnotu intenzity záření: package jbotbrain2.lightsensorexample; import jbotbrain2.hw.*; import jbotbrain2.sensors.lightsensor; public class LightSensorExampleMain { public static void main(string[] args) throws InterruptedException { Led.GREEN1.set(Led.MODE_BLINK, 300); LightSensor light = new LightSensor(); while (true) { System.out.print("Intenzita zareni: "+light.getirradiance() +" µw*cm^-2 \r"); Thread.sleep(200);

75 3.3.6 SI 03 Ultrazvukový dálkoměr Ultrazvukový dálkoměr SI 03 Ultrasonic range finder (sonar) slouží k měření vzdálenosti předmětů na principu vyslání ultrazvukového signálu a měření doby odrazu, podobně jako netopýři. Rozsah měření je cm, na velkou vzdálenost ale zachytí jen velkou plochu. Senzor s jbotbrainem II komunikuje pomocí sběrnice I 2 C a pro přístup k němu používáme třídu UltraSonicRangeFinder umístěnou v balíku jbotbrain2.sensors: Třída jbotbrain2.sensors.ultrasonicrangefinder LightSensor(int address) void setdeviceaddress(int address) int getdistance() Konstruktor, slouží k vytvoření nové instance. Parametr address použijeme v případě, že chceme použít jinou adresu než výchozí 0xA0 Změní I 2 C adresu senzoru. Přečte vzdálenost k překážce v centimetrech. Pokud ultrazvukový dálkoměr žádnou překážku nedetekuje, vrací hodnotu 0 cm. Příklad SonarExample vypisuje v nekonečné smyčce s periodou 200 milisekund naměřenou vzdálenost do konzole: package jbotbrain2.sonarexample; import jbotbrain2.hw.*; import jbotbrain2.sensors.ultrasonicrangefinder; public class SonarExampleMain { public static void main(string[] args) throws InterruptedException { Led.GREEN1.set(Led.MODE_BLINK, 300); UltraSonicRangeFinder us = new UltraSonicRangeFinder(); \r"); while (true) { System.out.print("Vzdalenost: "+us.getdistance()+" cm Thread.sleep(200);

76 3.3.7 MI 04 Řadič krokových motorů Modul MI 04 Stepper motor driver slouží k řízení dvou bipolárních krokových motorů s maximálním proudem 1,4 A na fázi. Napájecí napětí motorů se může pohybovat od 8 do 16 V. Řadič komunikuje s jbotbrianem pmocí sběrnice I 2 C a práci s ním zajišťují dvě třídy, StepperMotor pro přístup k jednotlivým motorům a StepperMotorDriver pro přístup k zařízení jako celku. Obě třídy se nachází v balíku jbotbrain2.devices: Třída jbotbrain2.devices.steppermotordriver StepperMotorDriver(int address) void setdeviceaddress(int address) Konstruktor, slouží k vytvoření nové instance. Parametr address použijeme v případě, že chceme použít jinou adresu než výchozí 0xF0 Změní I 2 C adresu senzoru. Třída jbotbrain2.devices.steppermotor StepperMotor(StepperMotorDriver driver, int port) boolean ismotoractive() Konstruktor, slouží k vytvoření nové instance. Parametr driver slouží k přiřazení řadiče, kterým chceme motor ovládat. Parametr port určije port řadiče, ke kterému je motor připojen. Řadič má dva porty, StepperMotorDriver.STEPPER_PORT_A a StepperMotorDriver.STEPPER_PORT_B. Zjištění stavu motoru. Metoda vrací logickou hodnotu: true Motor se otáčí. false Motor stojí nebo se otáčí v nekonečné smyčce

77 boolean set( int speed, int direction, int steptype, int stepcount ) Nastaví rychlost a směr otáčení, krokování a počet kroků: Parametr speed rychlost: StepperMotor.SPEED_STOP StepperMotor.SPEED_7_5HZ StepperMotor.SPEED_15HZ Motor stojí 7,5 Hz 15 Hz StepperMotor.SPEED_30HZ StepperMotor.SPEED_60HZ StepperMotor.SPEED_120HZ StepperMotor.SPEED_250HZ StepperMotor.SPEED_400HZ StepperMotor.SPEED_650HZ StepperMotor.SPEED_1000HZ 30 Hz 60 Hz 120 Hz 250 Hz 400 Hz 650 Hz 1 khz Parametr direction směr otáčení: StepperMotor.DIRECTION_CLOCKWISE StepperMotor.DIRECTION_ COUNTERCLOCKWISE Parametr steptype krokování: StepperMotor.STEP_HALF StepperMotor.STEP_FULL Poloviční krok. Plný krok. Parametr stepcount udává počet kroků. Pokud je nastaven na hodnotu 0, otáčí se motor kontinuálně (nekonečná smyčka). Metoda vrací v případě špatně nastavené rychlosti hodnotu false

78 Inicializace řadiče s připojenými dvěma krokovými motory, které se kontinuálně otáčejí proti sobě s krokovací frekvencí 30 Hz a polovičním krokováním by vypadala takto: StepperMotorDriver driver = new StepperMotorDriver(); StepperMotor motora = new StepperMotor(driver, StepperMotorDriver.STEPPER_PORT_A); StepperMotor motorb = new StepperMotor(driver, StepperMotorDriver.STEPPER_PORT_B); motora.set(steppermotor.speed_30hz, StepperMotor.STEP_HALF, StepperMotor.DIRECTION_CLOCKWISE, 0); motorb.set(steppermotor.speed_30hz, StepperMotor.STEP_HALF, StepperMotor.DIRECTION_COUNTERCLOCKWISE, 0); Následující příklad StepperMotorExample slouží k ovládání jednoho krokového motoru připojeného na portu A. K řízení slouží tlačítka na jbotbrainu II (výchozí rychlost je 0, takže motor po zapnutí stojí): Tlačítko S1 slouží k přepínání mezi nekonečným krokováním a zadaným počtem kroků (v našem případě 40). Tlačítko S2 přepíná mezi polovičním a plným krokováním. Tlačítko S3 přepíná směr otáčení motoru. Tlačítko S4 slouží ke zvyšování rychlosti. Výchozí rychlost je 0 Hz. package jbotbrain2.steppermotorexample; import jbotbrain2.hw.*; import jbotbrain2.devices.*; public class StepeprMotorExampleMain { public static void main(string[] args) throws InterruptedException { Led.GREEN1.set(Led.MODE_BLINK, 300); StepperMotorDriver driver = new StepperMotorDriver(); StepperMotor motor = new StepperMotor(driver, StepperMotorDriver.STEPPER_PORT_A); int direction = StepperMotor.DIRECTION_CLOCKWISE; int speed = 0; int stepping = StepperMotor.STEP_FULL; int count = 0; Led.RED.on(); while (true) { Button.waitForPress();

79 // Změna směru otáčení if (Button.S3.isPressed()) { if (direction == StepperMotor.DIRECTION_CLOCKWISE) { direction = StepperMotor.DIRECTION_COUNTERCLOCKWISE; else { direction = StepperMotor.DIRECTION_CLOCKWISE; while (Button.S3.isPressed()); // Nastavení krokování if (Button.S2.isPressed()) { if (stepping == StepperMotor.STEP_FULL) { stepping = StepperMotor.STEP_HALF; else { stepping = StepperMotor.STEP_FULL; while (Button.S2.isPressed()); // Nastavení rychlosti if (Button.S4.isPressed()) { speed++; if (speed > StepperMotor.SPEED_1000HZ) { speed = 0; while (Button.S4.isPressed()); // Nastavení počtu kroků if (Button.S1.isPressed()) { if (count == 0) { count = 40; Led.ORANGE.on(); Led.RED.off(); else { count = 0; Led.ORANGE.off(); Led.RED.on(); while (Button.S1.isPressed()); motor.set(speed, stepping, direction, count);

80 4 Programování pro mobilní telefony 4.1 Úvod do J2ME aplikací Jak se píše v úvodu, Java je jazykem určeným k programování různých zařízení, například mobilních telefonů. Tak proč naše znalosti Javy nevyužít k vytvoření jednoduchého dálkového ovládání naší konstrukce? Nejdříve si popíšeme základní stavební kameny aplikace pro mobilní telefony, později se seznámíme s prací s Bluetooth rozhraním Co budeme potřebovat? První věcí, kterou budeme potřebovat, je mobilní telefon vybavený Bluetoothem a podporující Javu. Je dobré si zjistit, kterou verzi MIDP (Mobile Information Device Profile) a CLDC (Connected Limited Device Configuration) váš telefon podporuje. Třída CLDC definuje JVM pro malá, převážně bateriově napájená zařízení, MIDP ji rozšiřuje a upravuje profil převážně pro mobilní telefony. Většina moderních telefonů podporuje MIDP 2.1 a CLDC verze 1.1. Nejčastěji používanými vývojovými prostředími IDE) jsou Eclipse a NetBeans. Pro vývoj aplikací pro jbotbrain se používá Eclipse, na programování aplikace pro mobilní telefon použijeme NetBeans. Je to čistě kvůli osobním preferencím autora článku. Vývojové prostředí je, stejně jako eclipse, volně ke stažení na IDE je k dispozici v několika verzích, nás zajímá verze Java, která v sobě obsahuje balík Java ME (Mobile Edition) Ahoj světe! První aplikace bude tak trošku podvod, protože nám ji celou vygeneruje počítač, potažmo vývojové prostředí. Ve spuštěném okně NetBeans klikneme na File New Project, v levé polovině okna vybereme Java ME, v pravé pak Mobile Application. Tlačítkem Next se dostaneme na další obrazovku, která se nás zeptá na název projektu (můžeme zadat například HelloWorld). Důležité je nechat zaškrtnutý checkbox Create Hello MIDlet, který se nám postará o vygenerování ukázkové aplikace. Tlačítkem Next se dostaneme na poslední obrazovku, kde máme možnost zvolit si konfiguraci mobilního telefonu, pokud nám nevyhovuje ta výchozí. Posledním krokem je stisknutí tlačítka Finish, které nám nový projekt vytvoří. V otevřeném okně můžeme vidět jednoduchý diagram, který ukazuje blokové schéma našeho nového programu, který hned po spuštění zobrazí formulář form

81 Jeho funkčnost si ověříme spuštěním programu v emulátoru (zelené tlačítko Run F6). Spuštěný program vypíše na obrazovku telefonu obligátní Hello World a nabídne tlačítko pro ukončení. Přestože klikací rozhraní NetBeans vývoj aplikací značně ulehčuje, zkusíme si nyní napsat jednoduchý program ručně, abychom se seznámili se základními principy Vypisujeme na displej Pro druhý program založíme úplně nový projekt. Pojmenujeme jej třeba TestApplication a jediným rozdílem oproti předchozímu bude, že checkbox Create Hello MIDlet necháme nezaškrtnutý. Po vytvoření projektu založíme dvě třídy. První z nich bude MainMidlet odvozená od třídy MIDlet. MIDlet je označení pro mobilní aplikaci, která využívá profil MIDP, o kterém jsem se zmínil na začátku. Třída MIDlet má definováno několik metod, které musíme implementovat. Třídu vytvoříme kliknutím pravým tlačítkem na název projektu New MIDlet (jako na obrázku), pojmenujeme ji jako MainMidlet a umístíme do ní následující kód: import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class MainMidlet extends MIDlet { Display display; MyCanvas mc; Thread mcthread; public void startapp() { display = Display.getDisplay(this); mc = new MyCanvas(this); mcthread = new Thread(mc); mc.repaint(); display.setcurrent(mc); mcthread.start(); public void pauseapp() { public void destroyapp(boolean unconditional) {

82 Jak vidíte, třída slouží pouze ke spuštění třídy MyCanvas. Po startu aplikace si vyžádá přístup k displeji, spustí MyCanvas jako vlákno a nastaví jeho výstup na displej. Ostatní metody můžeme zatím nechat prázdné. Z předchozích kapitol víme, že třída spouštěná jako vlákno musí implementovat rozhraní Runnable s metodou run(). Nejinak tomu bude u naší zobrazovací třídy MyCanvas, která kromě něj ještě rozšíří výchozí třídu Canvas, díky které získá možnost vykreslování na displej. Třídu Canvas vytvoříme podobně, jen místo New MIDlet vybereme New Class: import javax.microedition.lcdui.canvas; import javax.microedition.lcdui.graphics; public class MyCanvas extends Canvas implements Runnable { private MainMidlet mid; private int lastkey; private int width, height; public MyCanvas(MainMidlet mid) { width = getwidth(); height = getheight(); this.mid = mid; protected void paint(graphics graphics) { graphics.setcolor(0, 0, 0); graphics.fillrect(0, 0, width, height); graphics.setcolor(255, 255, 255); graphics.drawstring("klávesa: "+lastkey, width/2, 0, Graphics.HCENTER Graphics.TOP); public void run() { while (true) { repaint(); try { Thread.sleep(50); catch (Exception e) { protected void keypressed(int Code) { lastkey = Code; // zero (0) for exit if (Code == 48) { mid.destroyapp(false); mid.notifydestroyed(); protected void keyreleased(int Code) { lastkey = 0;

83 Celý kód je opět velice jednoduchý. V konstruktoru si uložíme instanci MainMidletu, abychom jej mohli později vypnout a zjistíme šířku a výšku displeje v pixelech. Metoda run pak už jen v nekonečném cyklu s prodlevou 50 ms (jak je ta Java krásná na prodlevu použijeme úplně ten stejný příkaz jako u jbotbrainu II) překresluje displej. Metoda paint() nám pomocí objektu graphics umožní vykreslovat na displej, co si zamaneme. Pokud se podíváme do dokumentace třídy Graphics nebo pokud v editoru napíšeme graphics. A chvilku počkáme, můžeme zjistit, jaké metody pro kreslení jsou dostupné možní nám kreslit kružnice, přímky či vykreslovat obrázky. První volání metody setcolor(r, g, b) nastaví barvu kreslení na černou, což následně využije metoda fillrect(x1, y1, x2, y2) pro vykreslení černého pozadí obdélníku s barevnou výplní přes celou plochu displeje. Druhé volání metody setcolor změní barvu kreslení na bílou, abychom mohli metodou drawstring(string, x, y, align) vykreslit řetězec s aktuálně stisknutou klávesou. Zajímavý je především parametr align, který určuje zarovnání vykresleného objektu, tedy bod s nulovými souřadnicemi. Použitím hodnoty Graphics.HCENTER Graphics.TOP zajistíme, že se řetězec zobrazí vycentrovaný a nulová ypsilonová souřadnice středu bude při horním okraji textu. Metody keypressed(code) a keyreleased(code) se zavolají vždy, když je stisktnuto (pressed) nebo uvolněno (released) nějaké tlačítko a vrátí jeho číselný kód. Po spuštění se nám zobrazí černá obrazovka s bílým textem ukazujícím číselný kód právě stisknuté klávesy. Klávesa s kódem 48 je nula, tu využijeme pro ukončení aplikace. Pokud chceme vykreslovat pohyblivý obdélník, musíme si zavést proměnnou x, která bude určovat jeho x-ovou sourřadnici: private int x; V konstruktoru MyCanvas ji musíme za zjištěním rozlišení displeje přiřadit nějakou hodnotu, aby se obdélník zobrazil na středu (jeho šířka bude 20): x = width/2-10;

84 A nakonec přidat do metody paint kód, který se bude starat o posunování modrého obdélníčku šipkami 4 a 6 doleva a doprava tak, aby nevyjel z displeje: graphics.setcolor(0, 0, 255); graphics.fillrect(x, height/2, 20, 20); if (lastkey == Canvas.KEY_NUM4 && x > 0) { x -= 5; else if (lastkey == Canvas.KEY_NUM6 && x < width-20) { x += 5; Třída Canvas umožňuje použít konstanty, které zjednodušují přístup ke klávesám, abychom si jejich číselné kódy nemuseli pamatovat například hodnota Canvas.KEY_NUM0 je 48 o tom se také můžeme přesvědčit v aplikaci, která číselné kódy vypisuje. Jak vidíte, tvorba aplikací (MIDletů) pro mobilní telefony není nic složitého a se znalostí několika základních příkazů si můžeme pěkně pohrát

85 4.2 Vytvoření J2ME aplikace pro dálkové ovládání Část první Nejdříve si v Netbeans založíme nový projekt, který pojemnujeme třeba jbotcontrol. Při vytváření necháme zaškrtnutou možnost Create Hello MIDlet, která nám vytvoří základní aplikaci. Hlavní MIDlet přesuneme do námi vytvořeného balíku application, abychom měli celou aplikaci přehlednější. Vygenerovaný formulář smažeme a na pracovní plochu si z palety umístěné na pravé straně prostředí přetáhneme potřebné prvky (najdeme je v Pallete Displayable), v našem případě jsou to tři komponenty List: Pro přehlednost je dobré si objekty pojmenovat stejně jako na výsledném obrázku níže. Ukázková aplikace je v angličtině, protože jde o jazyk, který se k počítačům náramně hodí a každý správný programátor by ji měl ovládat. ApplicationMenu je hlavní menu celé aplikace, které se uživateli zobrazí po spuštění aplikace. Nabídne možnost ukončit aplikaci nebo spustit vyhledávání Bluetooth zařízení. Nabídka searchdevices slouží k hledání dostupných zařízení Bluetooth a jejich zobrazení na displeji. Po kliknutí na zařízení se zobrazí další nabídka, conenctedmenu. Ta umožňuje odpojení od zařízení a návrat zpět k vyhledaným zařízením nebo otevření Ovladače (CommanderCanvas)

86 Ovladač bude obrazovka vykreslená v grafickém režimu, kterou si naprogramujeme později (podobně jako v příkladu s posunujícím se čtverečkem v minulém dílu). Přejmenování provedeme pravým kliknutím na objekt Properties Instance Name: Do připravených nabídek musíme přidat potřebné položky. Položka nabídky (List) se jmenuje ListElement a najdeme ji v paletě na pravé straně prostředí ve skupině Elements. Položky můžeme libovolně přetahovat a upravovat jejich popisky. Kromě položek využijeme ještě tzv. Commands, což jsou příkazy určující chování funkčních kláves telefonu (typicky OK, zpět, další atd.). Použité položky menu a povelová tlačítka najdete na následujícím obrázku:

87 Posledním krokem vizuálního návrhu bude pospojování objektů, čímž vytvoříme celkovou strukturu aplikace. Pro propojení elementů slouží šipky, které můžeme natáhnout kliknutím a tažením myší. První bude vycházet z položky Mobile Device Started a bude směřovat k položce applicationmenu. Tím jsme určili, že prvním, co se uživateli po spuštění aplikace zobrazí, bude hlavní menu aplikace. Podobně pospojujeme i další objekty. Šipka vychází vždy z položky menu nebo příkazového tlačítka (Command) a směřuje k objektu, na který chceme přejít (zobrazit na displeji) Část druhá Třídy pro práci s Bluetoothem budou umístěny v balíčku bluetooth. V zásadě jde jen o zapouzdření rozhraní JSR-82 do příjemnějšího kabátku. Výpisy jejich zdrojových kódu zde nebudu uvádět, můžete si je stáhnout z adresy uvedené v závěru článku. Třída BTDiscovery slouží k vyhledání dostupných Bluetooth zařízení. Implementuje rozhraní DiscoveryListener z JSR-82 a obsahuje tyto metody: BTDiscovery(BTDiscoveryListener listener) je konstruktorem celé třídy. Parametrem se předá BTDiscoveryListener (rozhraní, které implementuje naše hlavní třída a které se stará o předání informací o nalezených zařízeních)

Paměť počítače. alg2 1

Paměť počítače. alg2 1 Paměť počítače Výpočetní proces je posloupnost akcí nad daty uloženými v paměti počítače Data jsou v paměti reprezentována posloupnostmi bitů (bit = 0 nebo 1) Připomeňme: paměť je tvořena řadou 8-mi bitových

Více

24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1 24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE AUTOR DOKUMENTU: MGR. MARTINA SUKOVÁ DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 UČIVO: STUDIJNÍ OBOR: PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) INFORMAČNÍ TECHNOLOGIE

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Výrazy Operátory Výrazy Verze pro akademický rok 2012/2013 1 Operace, operátory Unární jeden operand, operátor se zapisuje ve většině případů před operand, v některých případech

Více

14.4.2010. Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

14.4.2010. Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod. Základy programování (IZAPR) Přednáška 7 Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 229, Náměstí Čs. legií Michael.Bazant@upce.cz Obsah přednášky 7 Parametry metod, předávání

Více

Z. Kotala, P. Toman: Java ( Obsah )

Z. Kotala, P. Toman: Java ( Obsah ) Z. Kotala, P. Toman: Java ( Obsah ) 13. Výjimky Výjimka (exception) je definována jako událost, která nastane během provádění programu a která naruší normální běh instrukcí. Výjimka je vyvolána například

Více

Výčtový typ strana 67

Výčtový typ strana 67 Výčtový typ strana 67 8. Výčtový typ V této kapitole si ukážeme, jak implementovat v Javě statické seznamy konstant (hodnot). Příkladem mohou být dny v týdnu, měsíce v roce, planety obíhající kolem slunce

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Řídicí struktury jazyka Java Struktura programu Příkazy jazyka Blok příkazů Logické příkazy Ternární logický operátor Verze pro akademický rok 2012/2013 1 Struktura programu

Více

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/04.0006

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/04.0006 Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/04.0006 Lekce 1 Jazyk Java Tento projekt je spolufinancován Evropským sociálním fondem

Více

Zápis programu v jazyce C#

Zápis programu v jazyce C# Zápis programu v jazyce C# Základní syntaktická pravidla C# = case sensitive jazyk rozlišuje velikost písmen Tzv. bílé znaky (Enter, mezera, tab ) ve ZK překladač ignoruje každý příkaz končí ; oddělovač

Více

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech 7 Formátovaný výstup, třídy, objekty, pole, chyby v programech Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost formátovanému výstupu,

Více

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu } 5. Operátor čárka, - slouží k jistému určení pořadí vykonání dvou příkazů - oddělím-li čárkou dva příkazy, je jisté, že ten první bude vykonán dříve než příkaz druhý. Např.: i = 5; j = 8; - po překladu

Více

Programování v Javě I. Leden 2008

Programování v Javě I. Leden 2008 Seminář Java Programování v Javě I Radek Kočí Fakulta informačních technologií VUT Leden 2008 Radek Kočí Seminář Java Programování v Javě (1) 1/ 45 Téma přednášky Datové typy Deklarace třídy Modifikátory

Více

Programování v Javě I. Únor 2009

Programování v Javě I. Únor 2009 Seminář Java Programování v Javě I Radek Kočí Fakulta informačních technologií VUT Únor 2009 Radek Kočí Seminář Java Programování v Javě (1) 1/ 44 Téma přednášky Datové typy Deklarace třídy Modifikátory

Více

Programujeme v softwaru Statistica

Programujeme v softwaru Statistica Programujeme v softwaru Statistica díl druhý Newsletter Statistica ACADEMY Téma: Programování, makra, skripty Typ článku: Návody V tomto článku si ukážeme další možnosti při psaní maker v softwaru Statistica.

Více

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13 Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13 KAPITOLA 1 Na úvod o Javě 15 Počítačový program 15 Vysokoúrovňový programovací

Více

Teoretické minimum z PJV

Teoretické minimum z PJV Teoretické minimum z PJV Pozn.: následující text popisuje vlastnosti jazyka Java zjednodušeně pouze pro potřeby výuky. Třída Zavádí se v programu deklarací třídy což je část programu od klíčových slov

Více

9.3.2010 Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include

9.3.2010 Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h> 9.3.2010 Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include int main(void) { int dcislo, kolikbcislic = 0, mezivysledek = 0, i; int vysledek[1000]; printf("zadejte

Více

Seminář Java II p.1/43

Seminář Java II p.1/43 Seminář Java II Seminář Java II p.1/43 Rekapitulace Java je case sensitive Zdrojový kód (soubor.java) obsahuje jednu veřejnou třídu Třídy jsou organizovány do balíků Hierarchie balíků odpovídá hierarchii

Více

Čtvrtek 3. listopadu. Makra v Excelu. Obecná definice makra: Spouštění makra: Druhy maker, způsoby tvorby a jejich ukládání

Čtvrtek 3. listopadu. Makra v Excelu. Obecná definice makra: Spouštění makra: Druhy maker, způsoby tvorby a jejich ukládání Čtvrtek 3. listopadu Makra v Excelu Obecná definice makra: Podle definice je makro strukturovanou definicí jedné nebo několika akcí, které chceme, aby MS Excel vykonal jako odezvu na nějakou námi definovanou

Více

První kapitola úvod do problematiky

První kapitola úvod do problematiky První kapitola úvod do problematiky Co je to Flex Adobe Flex je ActionSript (AS) framework pro tvorbu Rich Internet Aplications (RIA), tedy knihovna AS tříd pro Flash. Flex používáme k vytvoření SWF souboru

Více

15. Projekt Kalkulačka

15. Projekt Kalkulačka Projekt Kalkulačka strana 143 15. Projekt Kalkulačka 15.1. Základní popis, zadání úkolu Pracujeme na projektu Kalkulačka, který je ke stažení na java.vse.cz. Po otevření v BlueJ vytvoříme instanci třídy

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Typy Základní (primitivní) datové typy Deklarace Verze pro akademický rok 2012/2013 1 Typy v jazyce Java Základní datové typy (primitivní datové typy) Celočíselné byte, short,

Více

7. Datové typy v Javě

7. Datové typy v Javě 7. Datové typy v Javě Primitivní vs. objektové typy Kategorie primitivních typů: integrální, boolean, čísla s pohyblivou řádovou čárkou Pole: deklarace, vytvoření, naplnění, přístup k prvkům, rozsah indexů

Více

DSL manuál. Ing. Jan Hranáč. 27. října 2010. V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

DSL manuál. Ing. Jan Hranáč. 27. října 2010. V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v DSL manuál Ing. Jan Hranáč 27. října 2010 V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v současné době krátký) seznam vestavěných funkcí systému. 1 Vytvoření nového dobrodružství Nejprve

Více

MAXScript výukový kurz

MAXScript výukový kurz MAXScript výukový kurz Díl čtvrtý jazyk MAXScript, část I. Jan Melichar, březen 2008 Jan Melichar (aka JME) strana 1 OBSAH ÚVOD... 4 ZÁKLADNÍ PŘÍKAZY... 5 OPERÁTORY... 6 PROMĚNNÉ... 6 POLE... 7 ZÁVĚREM...

Více

PHP tutoriál (základy PHP snadno a rychle)

PHP tutoriál (základy PHP snadno a rychle) PHP tutoriál (základy PHP snadno a rychle) Druhá, vylepšená offline verze. Připravil Štěpán Mátl, http://khamos.wz.cz Chceš se naučit základy PHP? V tom případě si prostuduj tento rychlý průvodce. Nejdříve

Více

2 Datové typy v jazyce C

2 Datové typy v jazyce C 1 Procedurální programování a strukturované programování Charakteristické pro procedurální programování je organizace programu, který řeší daný problém, do bloků (procedur, funkcí, subrutin). Původně jednolitý,

Více

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false Logické operace Datový typ bool může nabýt hodnot: o true o false Relační operátory pravda, 1, nepravda, 0, hodnoty všech primitivních datových typů (int, double ) jsou uspořádané lze je porovnávat binární

Více

typová konverze typová inference

typová konverze typová inference Seminář Java Programování v Javě II Radek Kočí Fakulta informačních technologií VUT Únor 2008 Radek Kočí Seminář Java Programování v Javě (2) 1/ 36 Téma přednášky Rozhraní: použití, dědičnost Hierarchie

Více

17. Projekt Trojúhelníky

17. Projekt Trojúhelníky Projekt Trojúhelníky strana 165 17. Projekt Trojúhelníky 17.1. Základní popis, zadání úkolu Pracujeme na projektu Trojúhelníky, který je ke stažení na java.vse.cz. Aplikace je napsána s textovým uživatelským

Více

Java a XML. 10/26/09 1/7 Java a XML

Java a XML. 10/26/09 1/7 Java a XML Java a XML Java i XML jsou přenositelné V javě existuje podpora pro práci s XML, nejčastější akce prováděné při zpracování XML: načítání XML elementů generování nových elementů nebo úprava starého zápis

Více

Reliance 3 design OBSAH

Reliance 3 design OBSAH Reliance 3 design Obsah OBSAH 1. První kroky... 3 1.1 Úvod... 3 1.2 Založení nového projektu... 4 1.3 Tvorba projektu... 6 1.3.1 Správce stanic definice stanic, proměnných, stavových hlášení a komunikačních

Více

Stručný návod k programu Octave

Stručný návod k programu Octave Stručný návod k programu Octave Octave je interaktivní program vhodný pro technické výpočty. Je nápadně podobný programu MATLAB, na rozdíl od něho je zcela zadarmo. Jeho domovská vebová stránka je http://www.octave.org/,

Více

Kód. Proměnné. #include using namespace std; int main(void) { cout << "Hello world!" << endl; cin.get(); return 0; }

Kód. Proměnné. #include <iostream> using namespace std; int main(void) { cout << Hello world! << endl; cin.get(); return 0; } Jazyk C++ Jazyk C++ je nástupcem jazyka C. C++ obsahuje skoro celý jazyk C, ale navíc přidává vysokoúrovňové vlastnosti vyšších jazyků. Z toho plyne, že (skoro) každý platný program v C je také platným

Více

Datové typy strana 29

Datové typy strana 29 Datové typy strana 29 3. Datové typy Jak již bylo uvedeno, Java je přísně typový jazyk, proto je vždy nutno uvést datový typ datového atributu, formálního parametru metody, návratové hodnoty metody nebo

Více

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy Úvod do programování Michal Krátký 1,Jiří Dvorský 1 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programování, 2004/2005 Procesor Procesorem je objekt, který vykonává algoritmem popisovanou

Více

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody Dynamická alokace paměti Jazyky C a C++ poskytují programu možnost vyžádat si část volné operační paměti pro

Více

VZORCE A VÝPOČTY. Autor: Mgr. Dana Kaprálová. Datum (období) tvorby: září, říjen 2013. Ročník: sedmý

VZORCE A VÝPOČTY. Autor: Mgr. Dana Kaprálová. Datum (období) tvorby: září, říjen 2013. Ročník: sedmý Autor: Mgr. Dana Kaprálová VZORCE A VÝPOČTY Datum (období) tvorby: září, říjen 2013 Ročník: sedmý Vzdělávací oblast: Informatika a výpočetní technika 1 Anotace: Žáci se seznámí se základní obsluhou tabulkového

Více

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT Číslo a název šablony Číslo didaktického materiálu Druh didaktického materiálu Autor Jazyk Téma sady didaktických materiálů Téma didaktického materiálu Vyučovací předmět Cílová skupina (ročník) Úroveň

Více

Programátorská příručka

Programátorská příručka KAPITOLA 1. PROGRAMÁTORSKÁ PŘÍRUČKA Kapitola 1 Programátorská příručka 1.1 Úvod 1.1.1 Technologie Program je psaný v jazyce Java 1.7. GUI je vytvářeno pomocí knihovny SWT. (http://eclipse.org/swt/) Pro

Více

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií 1 Fakulta elektrotechniky a informatiky Katedra softwarových technologií 12. října 2009 Organizace výuky Přednášky Teoretické základy dle normy jazyka C Cvičení Praktické úlohy odpřednášené látky Prostřední

Více

Proměnné a datové typy

Proměnné a datové typy Proměnné a datové typy KAPITOLA 2 V této kapitole: Primitivní datové typy Proměnné Opakování Mezi základní dovednosti každého programátora bezesporu patří dobrá znalost datových typů. Ta vám umožní efektivní

Více

Úvod do programování - Java

Úvod do programování - Java Úvod do programování - Java Cvičení č.1 1 1 UPR informace Cvičící í RNDr. Eliška Ochodková, kancelář A1010 eliska.ochodkova@vsb.cz www.cs.vsb.cz/ochodkova Přednášející Ing. Michal Krátký, Ph.D., kancelář

Více

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu VÝUKOVÝ MATERIÁL Identifikační údaje školy Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632

Více

SPÍNACÍ HODINY. Nastavení hodin a předvolby. Obr. 1

SPÍNACÍ HODINY. Nastavení hodin a předvolby. Obr. 1 SPÍNACÍ HODINY Při každém zapnutí startuje topení vždy na plný výkon a dále pak pracuje dle poslední nastavené teploty, pokud není tato dále měněna. Při zapnutí topení předvolbou je však funkce topení

Více

1. Programování proti rozhraní

1. Programování proti rozhraní 1. Programování proti rozhraní Cíl látky Cílem tohoto bloku je seznámení se s jednou z nejdůležitější programátorskou technikou v objektově orientovaném programování. Tou technikou je využívaní rozhraní

Více

KAPITOLA 9 - POKROČILÁ PRÁCE S TABULKOVÝM PROCESOREM

KAPITOLA 9 - POKROČILÁ PRÁCE S TABULKOVÝM PROCESOREM KAPITOLA 9 - POKROČILÁ PRÁCE S TABULKOVÝM PROCESOREM CÍLE KAPITOLY Využívat pokročilé možnosti formátování, jako je podmíněné formátování, používat vlastní formát čísel a umět pracovat s listy. Používat

Více

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni!

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni! Java práce s řetězci Trochu povídání.. Řetězce jsou v Javě reprezentovány instancemi tříd StringBuffer a String. Tyto třídy jsou součástí balíčku java.lang, tudíž je možno s nimi pracovat ihned bez nutného

Více

20. Projekt Domácí mediotéka

20. Projekt Domácí mediotéka Projekt Domácí mediotéka strana 211 20. Projekt Domácí mediotéka 20.1. Základní popis, zadání úkolu V projektu Domácí mediotéka (Dome) se jednoduchým způsobem evidují CD a videa. Projekt je velmi jednoduchý

Více

Úvod do programování v jazyce Java

Úvod do programování v jazyce Java Úvod do programování v jazyce Java Petr Krajča Katedra informatiky Univerzita Palackého v Olomouci 5. říjen, 2011 Petr Krajča (UP) KMI/UP3J: Seminář I. 5.10.2011 1 / 17 Organizační informace email: petr.krajca@upol.cz

Více

Objektově orientované programování

Objektově orientované programování 10. října 2011 Pragmatické informace Volitelný předmět, zápočet: zápočtový program(s dokumentací), aktivní účast na cvičení(body v CodExu), praktický test, zkouška: zkoušková písemka na objektový návrh

Více

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu: Čtvrtek 8 prosince Pascal - opakování základů Struktura programu: 1 hlavička obsahuje název programu, použité programové jednotky (knihovny), definice konstant, deklarace proměnných, všechny použité procedury

Více

1 Návod na instalaci prostředí LeJOS-NXJ a přehrání firmwaru NXT kostky

1 Návod na instalaci prostředí LeJOS-NXJ a přehrání firmwaru NXT kostky 1 Návod na instalaci prostředí LeJOS-NXJ a přehrání firmwaru NXT kostky 1. Nainstalujte ovladač na připojení NXJ přes USB rozhraní. Pokud jste nainstalovali software od LEGO Mindstorms, který se k legu

Více

Registrační číslo projektu: CZ.1.07/1.5.00/34.0553 Elektronická podpora zkvalitnění výuky CZ.1.07 Vzděláním pro konkurenceschopnost

Registrační číslo projektu: CZ.1.07/1.5.00/34.0553 Elektronická podpora zkvalitnění výuky CZ.1.07 Vzděláním pro konkurenceschopnost Registrační číslo projektu: CZ.1.07/1.5.00/34.0553 Elektronická podpora zkvalitnění výuky CZ.1.07 Vzděláním pro konkurenceschopnost Projekt je realizován v rámci Operačního programu Vzdělávání pro konkurence

Více

Prezentace a vysvětlení programového prostředí NXC

Prezentace a vysvětlení programového prostředí NXC Úvod Další jazyk, který je možno použít pro programování NXT kostky je NXC Not exatly C Na rozdíl od jazyku NXT-G, kde jsme vytvářeli program pomocí grafických prvků přesněji řečeno pomocí programovacích

Více

WSH Windows Script Hosting. OSY 2 Přednáška číslo 2 opravená verze z 15.10.2007

WSH Windows Script Hosting. OSY 2 Přednáška číslo 2 opravená verze z 15.10.2007 WSH Windows Script Hosting OSY 2 Přednáška číslo 2 opravená verze z 15.10.2007 Co je skript? Skriptování nástroj pro správu systému a automatizaci úloh Umožňuje psát skripty jednoduché interpretované programové

Více

Datové struktury. alg12 1

Datové struktury. alg12 1 Datové struktury Jedna z klasických knih o programování (autor prof. Wirth) má název Algorithms + Data structures = Programs Datová struktura je množina dat (prvků, složek, datových objektů), pro kterou

Více

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44 Algoritmizace a programování Ak. rok 2012/2013 vbp 1. ze 44 Vladimír Beneš Petrovický K101 katedra matematiky, statistiky a informačních technologií vedoucí katedry E-mail: vbenes@bivs.cz Telefon: 251

Více

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Využití OOP v praxi -- Knihovna PHP -- Interval.cz Page 1 of 6 Knihovna PHP Využití OOP v praxi Po dlouhé teorii přichází na řadu praxe. V následujícím textu si vysvětlíme možnosti přístupu k databázi pomocí různých vzorů objektově orientovaného programování

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Řídicí struktury, standardní metody Problematika načítání pomocí Scanner Některé poznámky k příkazům Psaní kódu programu Metody třídy Math Obalové třídy primitivních datových

Více

Testování prvočíselnosti

Testování prvočíselnosti Dokumentace zápočtového programu z Programování II (NPRG031) Testování prvočíselnosti David Pěgřímek http://davpe.net Úvodem V různých oborech (například v kryptografii) je potřeba zjistit, zda je číslo

Více

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu VÝUKOVÝ MATERIÁL Identifikační údaje školy Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632

Více

Praktické měřící rozsahy 50-4000, 50-8000, 50-16000 50-32000, 50-64000 ot/min Přesnost měření 0.02%

Praktické měřící rozsahy 50-4000, 50-8000, 50-16000 50-32000, 50-64000 ot/min Přesnost měření 0.02% Číslicový otáčkoměr TD 5.2A varianta pro napojení na řídící systém SIMATIC zakázka Vítkovice - neplatí kapitola o programování, tento typ nelze programovat ani z klávesnice ani po seriové lince z PC. Určení

Více

MIDAM Verze 1.1. Hlavní okno :

MIDAM Verze 1.1. Hlavní okno : MIDAM Verze 1.1 Podporuje moduly Midam 100, Midam 200, Midam 300, Midam 400, Midam 401, Midam 410, Midam 411, Midam 500, Midam 600, Ghc 2x. Umožňuje nastavení parametrů, sledování výstupních nebo vstupních

Více

Základy jazyka C. Základy programování 1 Martin Kauer (Tomáš Kühr)

Základy jazyka C. Základy programování 1 Martin Kauer (Tomáš Kühr) Základy jazyka C Základy programování 1 Martin Kauer (Tomáš Kühr) Organizační záležitosti Konzultace Pracovna 5.076 Úterý 15:00 16:30 Emailem martin.kauer@upol.cz Web předmětu http://tux.inf.upol.cz/~kauer/index.php?content=var&class=zp1

Více

Základy programování. Úloha: Eratosthenovo síto. Autor: Josef Hrabal Číslo: HRA0031 Datum: 28.11.2009 Předmět: ZAP

Základy programování. Úloha: Eratosthenovo síto. Autor: Josef Hrabal Číslo: HRA0031 Datum: 28.11.2009 Předmět: ZAP Základy programování Úloha: Eratosthenovo síto Autor: Josef Hrabal Číslo: HRA0031 Datum: 28.11.2009 Předmět: ZAP Obsah 1 Zadání úkolu: 3 1.1 Zadání:............................... 3 1.2 Neformální zápis:.........................

Více

Základy algoritmizace a programování

Základy algoritmizace a programování Základy algoritmizace a programování Přednáška 1 Olga Majlingová Katedra matematiky, ČVUT v Praze 21. září 2009 Obsah Úvodní informace 1 Úvodní informace 2 3 4 Organizace předmětu Přednášky 1. 5. Základní

Více

1. Téma 12 - Textové soubory a výjimky

1. Téma 12 - Textové soubory a výjimky 1. Téma 12 - Textové soubory a výjimky Cíl látky Procvičit práci se soubory s využitím výjimek. 1.1. Úvod Program, aby byl programem, my mít nějaké výstupy a vstupy. Velmi častým případem je to, že se

Více

Základy algoritmizace a programování

Základy algoritmizace a programování Základy algoritmizace a programování Přednáška 1 Olga Majlingová Katedra matematiky, ČVUT v Praze 19. září 2011 Obsah Úvodní informace 1 Úvodní informace 2 3 4 Doporučená literatura web: http://marian.fsik.cvut.cz/zapg

Více

Operační systémy. Cvičení 3: Programování v C pod Unixem

Operační systémy. Cvičení 3: Programování v C pod Unixem Operační systémy Cvičení 3: Programování v C pod Unixem 1 Obsah cvičení Editace zdrojového kódu Překlad zdrojového kódu Základní datové typy, struktura, ukazatel, pole Načtení vstupních dat Poznámka: uvedené

Více

Ing. Igor Kopetschke TUL, NTI

Ing. Igor Kopetschke TUL, NTI ALGORITMY A DATOVÉ STRUKTURY 1. Organizace dat v paměti, datové typy Ing. Igor Kopetschke TUL, NTI http://www.nti.tul.cz Jednotlivé body Ukládání a a organizace dat Vnitřní paměť Vnější paměť Přístup k

Více

4.4.2012. Obsah přednášky. Příkaz for neúplný. Příkaz for příklady. Cyklus for each (enhanced for loop) Příkaz for příklady

4.4.2012. Obsah přednášky. Příkaz for neúplný. Příkaz for příklady. Cyklus for each (enhanced for loop) Příkaz for příklady Základy programování (IZAPR, IZKPR) Přednáška 5 Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 03 022, Náměstí Čs. legií Michael.Bazant@upce.cz Obsah přednášky Příkazy cyklu -

Více

Manuál k ovládání aplikace INFOwin.

Manuál k ovládání aplikace INFOwin. Manuál k ovládání aplikace INFOwin. Základní práce s formuláři je ve všech modulech totožná. Vybereme tedy například formulář Pokladní kniha korunová na kterém si funkce ukážeme. Po zápisech se lze pohybovat

Více

Abstraktní datové typy: zásobník

Abstraktní datové typy: zásobník Abstraktní datové typy: zásobník doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz Abstraktní datové typy omezené rozhraní

Více

Implementace LL(1) překladů

Implementace LL(1) překladů Překladače, přednáška č. 6 Ústav informatiky, FPF SU Opava sarka.vavreckova@fpf.slu.cz Poslední aktualizace: 30. října 2007 Postup Programujeme syntaktickou analýzu: 1 Navrhneme vhodnou LL(1) gramatiku

Více

PŘETĚŽOVÁNÍ OPERÁTORŮ

PŘETĚŽOVÁNÍ OPERÁTORŮ PŘETĚŽOVÁNÍ OPERÁTORŮ Jazyk C# podobně jako jazyk C++ umožňuje přetěžovat operátory, tj. rozšířit definice některých standardních operátorů na uživatelem definované typy (třídy a struktury). Stejně jako

Více

Třída DrawingTool. Obrázek 1: Prázdné okno připravené pro kreslení

Třída DrawingTool. Obrázek 1: Prázdné okno připravené pro kreslení Třída DrawingTool strana 1 1. Základ Třída DrawingTool Třída DrawingTool je určena k jednoduchému kreslení pomocí několika základních příkazů do grafického okna zadaných rozměrů (nastavení v konstruktoru),

Více

1. ÚVOD... 3 2. ZÁKLADY JAZYKA...

1. ÚVOD... 3 2. ZÁKLADY JAZYKA... Obsah 1. ÚVOD... 3 2. ZÁKLADY JAZYKA... 4 PROMĚNNÉ... 4 PRIMITIVNÍ DATOVÉ TYPY... 5 Deklarace proměnné promitivního typu...5 Konstanty... 6 Přetypování... 7 Přetečení... 7 VÝRAZY A OPERÁTORY... 8 Aritmetické

Více

11.5.2012. Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

11.5.2012. Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9 Obsah přednášky 9 Základy programování (IZAPR, IZKPR) Přednáška 9 Základy dědičnosti, přístupová práva Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 03 022, Náměstí Čs. legií

Více

Obsah. Začínáme programovat v Ruby on Rails 9. Úvod 11. 1. Vítejte v Ruby 15. O autorovi 9 Poděkování 9

Obsah. Začínáme programovat v Ruby on Rails 9. Úvod 11. 1. Vítejte v Ruby 15. O autorovi 9 Poděkování 9 Začínáme programovat v Ruby on Rails 9 O autorovi 9 Poděkování 9 Úvod 11 Komu je kniha určena 11 Jak je kniha uspořádána 11 Co ke knize potřebujete 12 Konvence 12 Zdrojový kód 13 Poznámka redakce českého

Více

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu VÝUKOVÝ MATERIÁL Identifikační údaje školy Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632

Více

Jak do počítače. aneb. Co je vlastně uvnitř

Jak do počítače. aneb. Co je vlastně uvnitř Jak do počítače aneb Co je vlastně uvnitř Po odkrytí svrchních desek uvidíme... Von Neumannovo schéma Řadič ALU Vstupně/výstupní zař. Operační paměť Počítač je zařízení, které vstupní údaje transformuje

Více

Manuál pro mobilní aplikaci Patron-Pro. verze pro operační systém Symbian

Manuál pro mobilní aplikaci Patron-Pro. verze pro operační systém Symbian Manuál pro mobilní aplikaci Patron-Pro verze pro operační systém Symbian 1 1. Popis Aplikace je určena pro mobilní telefony NOKIA s operačním Symbian a vybavené technologií NFC. Slouží pro správu identifikačních

Více

Generické programování

Generické programování Generické programování Od C# verze 2.0 = vytváření kódu s obecným datovým typem Příklad generická metoda, zamění dva parametry: static void Swap(ref T p1, ref T p2) T temp; temp = p1; p1 = p2; p2 =

Více

Soubory s reklamami musí mít stejný název jako ta výše uvedené. Stávající soubory reklam budou přepsány.

Soubory s reklamami musí mít stejný název jako ta výše uvedené. Stávající soubory reklam budou přepsány. Příloha 5 Výroba a zadávání reklamních obrázků Program umožňuje zobrazovat až 10 reklamních obrázků na monitorech. Obrázky musí splňovat následující parametry: velikost 640 x 480 pixelů formát BMP s 16

Více

3. Třídy. Základní pojmy objektového programování. Třídy

3. Třídy. Základní pojmy objektového programování. Třídy 3. Třídy Základní pojmy objektového programování Jak už víme, je Java objektovým programovacím jazykem. V úvodu této kapitoly si objasníme základní pojmy objektové teorie. Objekt představuje souhrn dat

Více

přetížení operátorů (o)

přetížení operátorů (o) přetížení operátorů (o) - pro vlastní typy je možné přetížit i operátory (tj. definovat vlastní) - pro definici slouží klíčové slovo operator následované typem/znakem operátoru - deklarace pomocí funkčního

Více

Java aplety. Předávání parametrů z HTML

Java aplety. Předávání parametrů z HTML Java aplety Aplety jsou speciální formou Java aplikací - mohou být spouštěny z prostředí WWW prohlížeče. Aby je prohlížeč spustil, musíme vložit do HTML stránky potřebné příkazy:

Více

KAPITOLA 3 - ZPRACOVÁNÍ TEXTU

KAPITOLA 3 - ZPRACOVÁNÍ TEXTU KAPITOLA 3 - ZPRACOVÁNÍ TEXTU KLÍČOVÉ POJMY textové editory formát textu tabulka grafické objekty odrážky a číslování odstavec CÍLE KAPITOLY Pracovat s textovými dokumenty a ukládat je v souborech různého

Více

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh. Ing. Hodál Jaroslav, Ph.D. VY_32_INOVACE_25 09

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh. Ing. Hodál Jaroslav, Ph.D. VY_32_INOVACE_25 09 Střední průmyslová škola a Vyšší odborná škola technická Brno, Sokolská 1 Šablona: Název: Téma: Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Operátory Autor:

Více

Operační systémy. Cvičení 4: Programování v C pod Unixem

Operační systémy. Cvičení 4: Programování v C pod Unixem Operační systémy Cvičení 4: Programování v C pod Unixem 1 Obsah cvičení Řídící struktury Funkce Dynamická alokace paměti Ladění programu Kde najít další informace Poznámka: uvedené příklady jsou dostupné

Více

5 Rekurze a zásobník. Rekurzivní volání metody

5 Rekurze a zásobník. Rekurzivní volání metody 5 Rekurze a zásobník Při volání metody z metody main() se do zásobníku uloží aktivační záznam obsahující - parametry - návratovou adresu, tedy adresu, kde bude program pokračovat v metodě main () po skončení

Více

Popis ovládání. Po přihlášení do aplikace se objeví navigátor. Navigátor je stromově seřazen a slouží pro přístup ke všem oknům celé aplikace.

Popis ovládání. Po přihlášení do aplikace se objeví navigátor. Navigátor je stromově seřazen a slouží pro přístup ke všem oknům celé aplikace. Popis ovládání 1. Úvod Tento popis má za úkol seznámit uživatele se základními principy ovládání aplikace. Ovládání je možné pomocí myši, ale všechny činnosti jsou dosažitelné také pomocí klávesnice. 2.

Více

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje f1(&pole[4]); funkci f1 předáváme hodnotu 4. prvku adresu 4. prvku adresu 5. prvku hodnotu 5. prvku symbolická konstanta pro konec souboru je eof EOF FEOF feof Správné vytvoření a otevření textového souboru

Více

Windows Live Movie Maker

Windows Live Movie Maker Windows Live Movie Maker Tento program slouží k vytváření vlastních filmů, která se mohou skládat z fotografií, videí, titulků a zvuku. Movie Maker je součástí instalace operačního systému Windows 7 a

Více

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39 Programování v C# Hodnotové datové typy, řídící struktury Petr Vaněček 1 / 39 Obsah přednášky Referenční datové typy datové položky metody přístupové metody accessory, indexery Rozhraní Pole 2 / 39 Třídy

Více

ALGORITMIZACE A PROGRAMOVÁNÍ

ALGORITMIZACE A PROGRAMOVÁNÍ Metodický list č. 1 Algoritmus a jeho implementace počítačovým programem Základním cílem tohoto tematického celku je vysvětlení pojmů algoritmus a programová implementace algoritmu. Dále je cílem seznámení

Více

2 Strukturované datové typy 2 2.1 Pole... 2 2.2 Záznam... 3 2.3 Množina... 4

2 Strukturované datové typy 2 2.1 Pole... 2 2.2 Záznam... 3 2.3 Množina... 4 Obsah Obsah 1 Jednoduché datové typy 1 2 Strukturované datové typy 2 2.1 Pole.................................. 2 2.2 Záznam................................ 3 2.3 Množina................................

Více