3. diel - NXJ - senzory a ladenie
V minulom dieli sme sa zoznámili so základmi API a predviedli si jeho použitie na názornom príklade. Tentoraz sa budeme venovať niečomu zajímavějšímu - naučíme sa čítať dáta z rôznych typov senzorov. Pretože pri programoch, ktoré využívajú telemetriu (senzory), môže relatívne ľahko dôjsť k výnimke, ukážeme si, ako sa s nimi vysporiadať.
Senzory
Na NXT nájdeme na spodnej strane celkom 4 porty pre senzory označené číslami 1-4. Do akéhokoľvek portu je možné pripojiť akýkoľvek typ, musíte však NXJ vysvetliť, o aký senzor sa jedná. Ak by ste mali obavy, či vie pracovať NXJ so senzorom, ktorý ste si prikúpili navyše (napríklad gyroskop), odpoveď znie, že pravdepodobne áno. Prácu s takým hardvérom tento seriál nepokrýva, preto vás musím odkázať na oficiálnej článok.
Popíšeme si prácu s tými základnými - tlačidlom, svetelným, zvukovým a ultrazvukovým. Každý z nich je reprezentovaný jednou z tried API, a spôsob vytvárania inštancií je vždy rovnaký - uvediem príklad na tlačidle pripojenom k portu 1.
TouchSensor ts=new TouchSensor(SensorPort.S1);
Tlačidlo
Bezpochyby najjednoduchší typ - nadobúda iba 2 stavov, je reprezentované
triedou TouchSensor a disponuje jedinou metodou- isPressed()
,
ktorá vracia boolean.
Svetelný
Pozor, nepleťte si ho s farebným. Tento senzor funguje na jednoduchom
princípe - obsahuje červenú LEDky a samotný snímač odrazeného (vlastne
akéhokoľvek) svetla. To, či má LED svietiť, je možné určiť metódou
setFloodlight(boolean onoff)
. Z toho tiež vyplýva, že vie
čítať aj intenzitu okolitého svetla bez prisvetlenie. Na čítanie hodnôt
slúži pár metód:
getLightValue()
- vracia intenzitu svetla typu int- 0 = úplná tma, 100 = extrémna svetlogetNormailsedLightValue()
- presnejšie predchádzajúcej metoda- vracia 0-1023
Zvukový
Osobne som pre neho snáď nikdy nenašiel reálne využitie, pretože jediná vec, kde sa na neho dá spoľahnúť je aktivácia niečoho zvukom - akýmkoľvek zvukom. Disponuje dvoma módy dB a dBA - hoci sa môže stať, že bude v oboch módoch vracať rovnakú hodnotu, rozdiel je v tom, že dBA (adjusted) "počuje" iba zvuky, ktoré počuje človek. Metódy má iba 2:
setDBA(boolean dba)
- prepínanie medzi módmi (true = dBA mód)readValue()
- vráti 0-100 podľa intenzity zvuku
Ultrazvukový
Jeden z najzaujímavejších senzorov - dokáže určiť vzdialenosť objektu až na ~ 1,7m s presnosťou ± 3cm. Ako to funguje? Samotný princíp je relatívne jednoduchý - funguje rovnako ako echolokácia, ktorú požíva netopier - vyšlú sa zvukové vlny s frekvenciou vyššou, než dokáže človek vnímať, tie sa odrazí (ak majú od čoho), vráti sa späť k vysielaču az doby, ako dlho im to trval návrat možno spočítať približnú vzdialenosť objektu. Veľké a hladké objekty odráža najlepšie, zatiaľ čo menšie objekty, zvlášť ak sú pokryté jemnou látkou, sú zložité na detekciu - na tú látku naozaj pozor, ak by ste vhodným typom pokryli múr, nemuselo by ju NXT vôbec detekovať.
Pretože detekcia prebieha pomocou zvuku, ktorý sa môže rôzne odrážať,
nie je doporučeníhodné používať viac ultrazvukových senzorov v 1
miestnosti. Senzor pracuje opäť v dvoch módoch (vlastne v 4, ale to je nad
rámec tohto tutoriálu) - ping a priebežný. Priebežný je predvolený,
pričom neustále vysiela vlny a kedykoľvek sa môžete opýtať na
vzdialenosť. Druhý normálne nič nerobí, len na zavolanie
ping()
vyšle sériu signálov a až 8 z nich zachytí.
getDistance()
- vzdialenosť v cm typu int, ak nič nezachytí, vracia 255 (priebežný mód). Blokujúce metóda. V ping móde vráti vzdialenosť prvého echa.continuous()
- prepnutie do priebežného móduping()
- vyšle sériu vĺn, ktoré zachytia. Zároveň zapne ping módgetDistances(int[] distances)
- ako parameter berie pole s dĺžkou 8, kam uloží výsledky (vzdialenosti) z posledného ping (). Pozn .: chvíľu (~~ 70ms) trvá, než sú dáta k dispozícii od ping (), preto je blokujúce.
Vsuvka
Je na mieste podotknúť, že neuvádzam vzorové zdrojové kódy, a mám k tomu 2 veľmi prosté dôvody:
- Predpokladám, že viete Javu - preto sa nebudeme učiť zobrazovať číslo na displeji.
- Kód pre rôzne typy robotov bude určite vyzerať inak, takže čokoľvek pokročilejšieho by nemalo zmysel.
Výnimky
Nebudeme chodiť okolo horúcej kaše, výnimky sú iritujúce a nedá sa im vyhnúť. U NXJ sú ešte o niečo horšie, pretože spôsob, akým sa zisťuje, kde k nej došlo, je mierne povedané nepohodlný. Než zabředne do detailov, napíšte si krátky program, kde dozaista dôjde k výnimke - najjednoduchšie bude asi delenie nulou. Ani nemusíte vytvárať nový projekt, s kľudom môžete nejako provizórne vložiť náš kód do jedného z existujúcich.
int exc=0/0;
Program nahrajte. Asi vás prekvapí na prvý pohľad Nič nehovoriace výpis chyby na LCD. (Vaše čísla sa budú líšiť):
Exception: 27 at: 25:2 at: 31:5
Než tlačidlom ESCAPE ukončíte program, zapíšte si hlásenie. Pred tým, než si povieme, čo to všetko znamená, by bolo na mieste vysvetliť, prečo tomu tak je. NXJ programy po spustení získajú prakticky absolútnu moc nad NXT - vrátane tlačidiel (nedá "pekne" ukončiť program) a USB, popr. Bluetooth komunikácií (Eclipse nevie vôbec nič, s NXT komunikuje len pri nahrávaní). To má za následok, že neexistuje spôsob, ako zobraziť chybu v ľudsky čitateľnom formáte na tak malom displeji, ktorý je jediný spôsob, ako s programátorom komunikovať.
Prvé číslo hovorí, o akú výnimku ide, zvyšok je "stack trace". Aby sme odkryli, čo nám stack trace hovorí, budeme potrebovať otvoriť príkazový riadok v umiestnení s .nxd skompilovanými súborom programu. Nájdete ho v koreňovom priečinku projektu. (Podržte shift + stlačte pravé tlačidlo myši> tu otvoriť príkazový riadok) Použijeme príkaz "nxjdebugtool", a síce nasledovne:
nxjdebugtool -di <.nxd_soubor> -c -m 27 25 2
Všimnite si, že nepotrebujeme čísla 31: 5 a namiesto nich používam čísla z vrchného riadku. Výstup bude približne:
The class number 27 refers to: java.lang.ArithmeticException (ArithmeticException.java) The method number 25 refers to: Sensors.main([Ljava/lang/String;)V (Sensors.java) PC 2 refers to: line 9 in Sensors.java
Moja výnimka bola vyhodená na riadku 9 v súbore Sensors.java v entry
pointu- main(String() args)
a jedná sa o
ArithmeticException.
Existuje ešte niekoľko spôsobov, ako ladiť programy, ale musíte sa vzdať pohodlného rozhrania Eclipse vrátane nahrávania, však spôsob, ktorý sme si uviedli je najjednoduchšie v prípade, keď predpokladáte, že kód je v poriadku. V opačnom prípade by ste mali zvážiť použitie niektorého z alternatívnych spôsobov.
Opäť sme na konci dielu, a vzhľadom na to, že viete všetok potrebný základ, skúšajte si pred prečítaním budúceho dielu robiť vlastné programy, pretože v ňom sa presunieme na počítač.