Rozšiřující vstupní moduly

Rozšiřující vstupní moduly (získávání a interpretace dat, praktické využití)
• teplotní,
• barevné,
• gyroskopické,
• kompasové,
• akcelerace,
• vyhledávač IR signálů,
• multiplexování vstupů.

Barevný senzor je vstupní zařízení, které umožňuje zjišťovat barvu snímaného povrchu. Senzor dokáže rozeznávat 17 různých barev. Při zjišťování vrací čísla od 0 do 17. Číslo 0 označuje černou barvu, naopak 17 je označení barvy bílé. Při zjišťování by měl být senzor umístěn několik centimetrů od snímaného předmětu, ne přímo pod pravým úhlem, aby se zdrojové světlo diody senzoru neodráželo přímo zpět do snímače. Senzor je primárně nastaven pro snímání barev doplňkových komponent stavebnice LEGO Mindstorms NXT. Může proto občas u odlišných odstínů barev dojít k nepřesnostem. 

Práce s barevným senzorem v programovacích prostředích

NXT-G

Blok pro ovládání barevného senzor

Rozcestník


Umístění bloku

Barevný senzor je řízen pomocí bloku ColorSensorDragged Color Sensor. Tento blok není součástí základní instalace. Pro jeho použití je nutné jej do prostředí importovat. Návod k importu rozšiřujících modulů naleznete v kapitole Instalace rozšiřujících modulů.
 

 Hightechnic color sensor blok

 

POPIS BLOKU

Blok ColorSensorDragged Color Sensor obsahuje celkem 8 konektorů pro propojení s dalšími bloky:

 Port Port - značí, ke kterému ze vstupních portů je senzor připojen (1-4).

A A - vyjadřuje nižší číselnou hodnotu označení rozmezí barev určeného k porovnání.

B B -  vyjadřuje vyšší číselnou hodnotu označení rozmezí barev určeného k porovnání.

Number Color - výstupní konektor označující číslo zjištěné barvy (0-17).

Red Red - výstupní konektor vyjadřující relativní červenou složku zjištěné barvy.

Green Green - výstupní konektor vyjadřující relativní zelenou složku zjištěné barvy.

Blue Blue - výstupní konektor vyjadřující relativní modrou složku zjištěné barvy.

Boolean Yes / No - hodnota logického datového typu vyjadřující, zda zjištěná barva je v zadaném barevném rozpětí či nikoliv.

 

Parametry bloku

Hightechnic color sensor

Port: určuje, ke kterému ze vstupních portů je barevný senzor připojen.

Compare: pomocí tažítka si navolíme, s jakým rozsahem barev chceme pracovat (0 - 17). Nad tažítkem vidíme všech 17 barev, které dokáže senzor rozpoznávat. Dále si v rozbalovacím menu vybereme, zda chceme ověřovat, jestli je zjištěná barva v zadaném rozmezí (Inside Range), které jsme si tažítkem navolili, nebo mimo něj (Outside Range).

RobotC

PŘÍKAZY PRO OVLÁDÁNÍ barevného SENZORU

Rozcestník


Deklarace SENZORU

Barevný senzor patří do skupiny rozšiřujících senzorů od společnosti Hitechnic. Pro jeho ovládání v programovacím prostředí RobotC je v základní instalaci prostředí přiložena vývojová knihovna obsahující ovladače a předdefinované funkce pro získání hodnot z barevného senzoru. Pokud ji nemáte k dispozici, můžete si ji stáhnout ZDE. Soubor knihovny se nazývá hitechnic-colour-v2 a zavoláme jej v úvodu programu následovně:

 
#include "drivers/hitechnic-colour-v2.h"
 

Poznámka: Příklad demonstruje volání knihovny umístěné ve stejném adresáři jako program. Pokud je knihovna umístěna v jiném adresáři, je nutné uvést celou cestu k souboru.

Než začneme pracovat s barevným senzorem je nutné jej nadeklarovat, aby s ním bylo možné v programovacím prostředí RobotC pracovat. Automaticky generovaný zápis deklarace se skládá z klíčového slova #pragma a příkazu config(), který obsahuje čtyři parametry. První parametr definuje, zda se jedná o deklaraci senzoru či motoru. Budeme používat senzor, proto v deklaraci uvedeme Sensor. Druhý parametr definuje, ke kterému vstupnímu portu (S1 - S4) je senzor připojen. Třetí parametr je volitelný, zadávaný uživatelem. Jedná se o název senzoru, který se poté dále používá při vytváření programu. Posledním parametrem zápisu označujeme skupinu, do které senzor patří či jeho standardizovaný název. Jelikož barevný senzor patří mezi rozšiřující senzory, uvedeme zde sensorI2CCustom.

 
#pragma config(Sensor, S1, barevny, sensorI2CCustom)
 

Využití předdefinovaných metod

Barevný senzor umožňuje získávat několik typů dat. Pro jejich správné zpracování jsou ve vývojové knihovně definovány následující funkce (v závorce jsou uvedeny parametry včetně potřebných proměných a jejich datových typů):

  • HTCS2readColor(nazev_senzoru) - vrací číselné označení aktuálně snímané barvy,
  • HTCS2readRGB(nazev_senzoru, int cervena, int zelena, int modra) - vrací hodnoty všech tří složek barvy v režimu RGB,
  • HTCS2readHSV(nazev_senzoru, float odstin, float sytost, float jas) - vrací hodnoty všech tří složek barevného modelu HSV (hue - odstín, saturation - sytost, value - jas),
  • HTCS2readWhite(nazev_senzoru, int bila) - vrací úroveň odstínu bílé barvy,
  • HTCS2readNormRGB(nazev_senzoru, int cervena, int zelena, int modra) - vrací hodnoty všech tří složek barvy v režimu RGB v normalizovaném tvaru,
  • HTCS2readRawRGB(nazev_senzoru, bool aktivace_prisviceni, long cervena, long zelena, long modra) - vrací hodnoty všech tří složek barvy v režimu RGB vyjádřené ve formátu RAW (jedním z parametrů je přisvícení na čelní straně senzoru),
  • HTCS2readRawWhite(nazev_senzoru, bool aktivace_prisviceni, long bila) - vrací úroveň odstínu bílé barvy vyjádřenou ve formátu RAW (jedním z parametrů je přisvícení na čelní straně senzoru),
  • _HTCSsendCommand(nazev_senzoru, byte prikaz) - funkce, která slouží ke změně módu snímání.

Všechny zmíněné funkce mají při svém použití jediný společný parametr uvedený v závorce. Jedná se o volitelný název senzoru, který uživatel zadává při deklaraci senzoru.

Poznámka: Pokud budeme tyto předdefinované funkce používat, je nutné mít ve stejném adresáři jako ovladače pro barevný senzor umístěny ještě dvě další vývojové knihovny. Jedná se o ovladače s názvy common.h a common-light.h. Obsahují totiž funkce, na které odkazují některé z funkcí uvedené ve vývojové knihovně barevného senzoru.


MOŽNOSTI PRAKTICKÉHO VYUŽITÍ

Barevný senzor umožňuje, díky funkcím definovaných ve vývojové knihovně, snímat několik veličin v různých vyjádřeních. Jeho hlavní funkcí zůstává zjištění všech tří složek barvy v RGB režimu. Je možné je měřit v klasickém režimu nebo vyjádřené ve formátu RAW. Další možností je zjišťování hodnot barevného modelu HSV. Opět můžeme hodnoty zjišťovat klasicky nebo ve formátu RAW. Třetí možností je měření úrovně odstínu bílé barvy.

Barevný senzor využijeme v případě, že budeme chtít, aby robot analyzoval a reagoval na barvu podkladu, po kterém se pohybuje. Další možností je realizace zařízení, které bude zjišťovat odstín snímané barvy. Záleží pouze na nás, zda budeme chtít zjišťovat hodnoty RGB či raději využijeme snímání hodnot barevného modelu HSV. Na tomto principu bychom mohli sestrojit například třídící linku barevných dílů.

Využití barevného senzoru

Na jednoduchém praktickém příkladu si ukážeme, jakým způsobem se používají fukce vývojové knihovny. Vytvoříme krátký program, díky kterému bude barevný senzor snímat jakýkoliv předmět, který před něj umístíme a na displej budeme vypisovat hodnoty všech tří složek v barevném režimu RGB.

NXT-G

ZJIŠŤOVÁNÍ HODNOT V RGB

Vytvoření programu v programovacím prostředí NXT-G není příliš složité. Musíme si uvědomit, jaké hodnoty potřebujeme z barevného senzoru získat a jak je na displej co nejpřehledněji a nejpřesněji vypsat.

Krok 1 - Vypsání hodnot na displej

Jako první v programu zrealizujeme zjišťování hodnot z barevného senzoru a jejich výpis na displej. Použijeme blok pro barevný senzor ColorSensorDragged Color Sensor. Chceme zjišťovat jednotlivé složky barvy v barevném režimu RGB. Využijeme proto tři výstupní konektory bloku označené Red R, Green G a Blue B. Každou z hodnot nyní vypíšeme na displej. Použijeme tři bloky DisplayDragged Display. Na displej ovšem můžeme vypsat pouze hodnotu, která je datového typu Text. Hodnota zjišťěná senzorem je ovšem datového typu Number. Použijeme proto ještě tři bloky FPNumberToTextDraggedNumber to Text, které slouží k převodu číselné hodnoty na řetězec znaků. Každý ze tří výstupních konektorů přivedeme na vstup bloku pro převod a výstup převodního bloku následně na vstup Text bloku DisplayDragged Display. Zvolíme možnost vypisování textu na displej a příslušný řádek pro každou hodnotu (například řádky 2, 3 a 4). Celý konstrukt následně umístíme do cyklu LoopBig Loop, u kterého nastavíme nekonečné provádění (Forever).

Pro konzistentnost vykreslování ještě umístíme za bloky zajišťující vypisování hodnot na displej blok WaitForTimeDragWait. U něj zvolíme řízení časem a nastavíme hodnotu 0,2 sekundy. Díky tomu se o tento časový úsek oddálí vykonávání dalšího příkazu (další průchod cyklem) a vykreslování na displej bude plynulejší.

 

RGB priklad

 

Krok 2 - Vypsání popisků hodnot

Aby bylo vypsání na displej přehlednější a bylo vidět, kterou hodnotu daná čísla zobrazují, přidáme na displej ještě popisky hodnot. Před cyklus vložíme tři bloky DisplayDragged Display. U všech nastavíme vypisování textu a na daný řádek vypíšeme popisky hodnot (R, G a B). Pokud bychom ale nechali hodnoty zarovnané vlevo, překrývaly by se s popisky. Musíme proto vypsané hodnoty posunout o něco vpravo po ose X. Záleží pouze na Vás, jak si data na displeji zarovnáte.

Pro úplnost programu můžeme ještě na úplný úvod vložit blok DisplayDragged Display, který bude po spuštění programu mazat plochu displeje. Nastavíme mu tedy funkci Reset.

 

Program ke stažení

Stažení ve formátu .rbt

RobotC

Zjišťování hodnot v RGB

Pro realizaci programu v programovacím prostředí RobotC je důležité neprve správně provést deklaraci senzoru a zavolání příslušné vývojové knihovny, abychom mohli využít v ní definované funkce. Následně již pouze musíme zvolit vhodnou funkci pro zjišťování jednotlivých složek barvy v režimu RGB a přehledně je zobrazit na displeji.

Krok 1 - Deklarace senzoru a volání vývojové knihovny

První krok, který musíme provést, je deklarace barevného senzoru. Její zápis můžete vidět níže. Skládá se z klíčového slova #pragma a příkazu config(), který má v závorce 4 parametry. Prvním je označení, že se jedná o senzor (Sensor). Druhý je označení vstupního portu, ke kterému je připojen (S1-S4). Následuje volitelný název senzoru a skupina, do které senzor patří (sensorI2CCustom = skupina rozšiřujících senzorů).

 
#pragma config(Sensor, S1, barevny, sensorI2CCustom)
 

Dále musíme zavolat vývojovou knihovnu, ve které jsou deklarovány ovladače barevného senzoru a daší funkce pro práci s ním. Zavolání provedeme následovně:

 
#include "hitechnic-colour-v2.h"
 

Jelikož některé funkce definované ve vývojové knihovně barevného senzoru využívají funkce definované v jiných knihovnách, musíme do stejného adresáře s ovladači hitechnic-colour-v2.h přidat také knihovny common.h a common-light.h.

Poznámka: Umístění vývojové knihovny odkazuje do kořenového adresáře, ve kterém je umístěn i vytvářený program. Pokud je váš program v počítači uložen na jiném místě než knihovna, musíte při zavolání zadat přesnou adresu umístění vývojové knihovny.

 
Krok 2 - Deklarace proměnných 

Nyní si musíme rozmyslet, který příkaz pro zjištění složek barvy v RGB použijeme a podle toho si deklarovat příslušné proměnné. My chceme zjišťovat hodnoty vyjádřené v klasické podobě, nikoliv v RAW. Použijeme proto příkaz HTCS2readRGB(). Příkaz využíva čtyři parametry. Název senzoru a tři proměnné pro uložení hodnot jednotlivých složek. Proměnné jsou datového typu long. Deklarujeme si tedy následující tři proměnné:

 
 long cervena = 0;
 long zelena = 0;
 long modra = 0;
 
 
Krok 3 - Zjišťování a výpis hodnot

U výpisu hodnot budeme požadovat, aby probíhal neustále dokola. Všechny příkazy tak budeme umisťovat do nekonečného cyklu while(). Jako první použijeme již zmíněný příkaz HTCS2readRGB(). Jako jeho parametry uvedeme název senzoru z deklarace (barevny) a názvy tří proměnných, do kterých se hodnoty budou ukládat (cervena, zelena, modra). Následně provedeme vypsání hodnot na displej. Použijeme pro to příkaz nxtDisplayBigTextLine(). Zvolíme si příslušné řádky displeje, výpis řetězce znaků, který případně doplníme o popisky hodnot a jako hodnoty pro výpis zvolíme naše tři proměnné. Pro úplnost zápisu je dobré ještě před cyklus umístit příkaz eraseDisplay(), který smaže celý displej předtím, než se na něj začne vypisovat.

 
eraseDisplay();
 while (true)
 {
   HTCS2readRGB(barevny,cervena, zelena, modra);
 
   nxtDisplayBigTextLine(0, "R: %5d", cervena);
   nxtDisplayBigTextLine(2, "G: %5d", zelena);
   nxtDisplayBigTextLine(4, "B: %5d", modra);
   wait1Msec(100);
 }
 
 
Výsledný program

Po správném provedení jednotlivých kroků by měl výsledný zápis programu vypadat následovně:

 
#pragma config(Sensor, S1, barevny, sensorI2CCustom)
 
#include "hitechnic-colour-v2.h"
 
task main ()
{
 
  long cervena = 0;
  long zelena = 0;
  long modra = 0;
 
  eraseDisplay();
  while (true)
  {
    HTCS2readRGB(barevny,cervena, zelena, modra);
 
    nxtDisplayBigTextLine(0, "R: %5d", cervena);
    nxtDisplayBigTextLine(2, "G: %5d", zelena);
    nxtDisplayBigTextLine(4, "B: %5d", modra);
    wait1Msec(100);
  }
}
 

 

Program ke stažení

Stažení ve formátu .c

Teplotní senzor je jedním ze senzorů, které dokáží snímat hodnoty okolního prostředí. Chování robota tak může být ovlivněno teplotou okolního prostředí. Ovládání a chování na základě snímané teploty patří mezi rozšiřující možnosti stavebnice LEGO Mindstorms NXT. Teplotní senzor dokáže pracovat s teplotou udávanou jak ve stupních Celsia tak Fahrenheita. Jeho využití je možné nejen pro konstrukci robota, ale hlavně při různých laboratorních měřeních.

PRÁCE S teplotním SENZOREM V PROGRAMOVACÍCH PROSTŘEDÍCH

NXT-G

Blok pro ovládání teplotního senzoru

Rozcestník


UMÍSTĚNÍ BLOKU

Blok NXTTempSensorDragged Temperature Sensor je součástí základní instalace programovacího prostředí NXT-G a nalezneme ho v paletě icon completeComplete > SensorHilight Sensor.

Temperature sensor block

 

POPIS BLOKU

Blok NXTTempSensorDragged Temperature Sensor obsahuje šest konektorů pro propojení s dalšími bloky:

Port Port - značí, ke kterému z portů (1-4) je senzor připojen.

TriggerPoint Trigger Point - značí zadanou vstupní hodnotu, kterou je možné porovnat s hodnotou snímanou teplotním senzorem.

GreaterLess Greater / Less - logická hodnota sloužící k porovnání dvou hodnot (větší nebo menší).

Boolean Yes / No - hodnota logického datového typu vyjadřující výsledek porování.

Temperature Temperature - škálovaná hodnota zjištěná senzorem (ve stupních Celsia nebo Fahrenheita).

Raw(Ambient) Raw Value - udává čistou hodnotu v RAW zjištěnou senzorem na stupnici od 0 do 1024.

 

PARAMETRY BLOKU

Temperature sensor 

Port: udává, ke kterému vstupnímu portu je teplotní senzor připojen (1-4).

Compare: slouží k zadání hodnoty, která má být porovnávána s hodnotou snímanou senzorem (větší či menší než zvolená hodnota).

Show: volba, která slouží ke zvolení jednotek, ve kterých se bude s teplotou pracovat (stupně Celsia nebo Fahrenheita).

Průběžně snímaná teplota se během chodu programu zobrazuje v levé části bloku.

RobotC

Příkazy pro ovládání teplotního senzoru

Rozcestník


Deklarace senzoru  

Teplotní senzor patří mezi sezory vyráběné firmou LEGO, ovšem nepatří mezi základní senzory. Při jeho použití tak musíme v programovacím prostředí RobotC použít vývojovou knihovnu, která obsahuje ovladače a funkce sloužící k jeho ovládání. Knihovna je obsažena v zdrojových souborech instalace programovacího prostředí nebo si ji můžete stáhnout ZDE. V balíku knihoven pro rozšiřující senzory ji najdete pod názvem lego-temp.h. Její zavolání v programu poté provedeme následovně:

 
#include "lego-temp.h"
 

Poznámka: Příklad demonstruje volání knihovny umístěné ve stejném adresáři jako program. Pokud je knihovna umístěna v jiném adresáři, je nutné uvést celou cestu k souboru.

Po zavolání příslušné vývojové knihovny je nutné deklarovat používaný senzor. Deklarace se skládá z klíčového slova #pragma a příkazu config(), který obsahuje čtyři parametry. První parametrem je určení, o jaké zařízení se jedná. V našem případě používáme senzor, tudíž zapíšeme Sensor. Druhý parametr udává, ke kterému portu je senzor připojen (S1-S4). Třetí parametr je volitelný a uživatel si zde volí název senzoru, který je následně v programu používán jako parametr funkcí a podobně. Posledním parametrem je zařazení senzoru. Teplotní senzor patří mezi rozšiřující senzory a ty jsou v programovacím prostředí RobotC zařazeny do skupiny sensorI2CCustom.

 
#pragma config(Sensor, S1, LEGOTMP, sensorI2CCustom)
 

Využití předdefinovaných metod

Vývojová knihovna teplotního senzoru obsahuje předdefinované metody pro jeho ovládání. Snímání teplotním senzorem může být prováděno ve dvou režimech. První režim je nazýván Single Shot mode. Jedná se o běžné snímání, kdy je teplotním senzorem vracena každá okamžitá hodnota. Jeho aktivování je možné provést příkazem LEGOTMPsetSingleShot(). Druhý režim snímání se nazývá Continuous mode. Pokud senzor pracuje v tomto režimu, provede ve velice krátkém časovém úseku v řádu milisekund několik měření. Následně jako výsledek senzor vrací poslední naměřenou hodnotu. Díky tomu dokáže ověřit, zda je naměřená hodnota přesná a nemělo by tak dojít ke zkreslení. Režim aktivujeme pomocí příkazu LEGOTMPsetContinuous(). Parametrem uvedeným v závorce je u obou metod volitelný název senzoru. 

Jestliže budeme používat teplotní senzor, hlavní věcí která nás bude zajímat, bude jím zjištěná teplota. Její hodnotu zjistíme v programovacím prostředí RobotC použitím příkazu LEGOTMPreadTemp(). Příkaz vyžaduje zadání dvou parametrů uvedených v závorce. První je volitelný název senzoru zadávaný při deklaraci senzoru a druhý název proměnné datového typu float, do které se zjištěná hodnota následně uloží.


MOŽNOSTI PRAKTICKÉHO VYUŽITÍ

Funkcí teplotního senzoru je vracet uživateli informaci o zjištěné teplotě okolního prostředí. Jeho využití pro konstrukci pojízdného robota nepřipadá příliš v úvahu. Využití najde hlavně v případě, že budeme chtít reagovat na náhlé teplotní změny v okolí. V závislosti na teplotě by poté následovala určitá reakce robota. Široké uplatnění by našel také při provádění laboratorních pokusů a měření. Pomocí senzoru by byla snímána teplota kapaliny nebo jiných vzorků a průměrný přírůstek či úbytek vypisován na diplej nebo zaznamenáván do grafu pomocí funkce Data Logging.

Využití teplotního senzor

Použití teplotního senzoru v programování si ukážeme na jednoduchém příkladu. Senzor bude připojen ke vstupnímu portu řídící jednotky a k jednomu z výstupních portů bude připojen servomotor, který bude pohánět model ventilátoru. Otáčky ventilátoru se budou dynamicky měnit na základně naměřené teploty. Dokud bude teplota nižší než 20°C, ventilár nebude spuštěný. Od 20°C začne se stoupající teplotou zrychlovat, až dosáhne při 30°C maximálního výkonu 100%. Jakmile začne teplota klesat, motor bude opět postupně zpomalovat, až se při 20°C zastaví úplně.

NXT-G

ŘÍZENÍ VENTILÁTORU POMOCÍ TEPLOTNÍHO SENZORU

Realizace programu v programovacím prostředí NXT-G není příliš složitá. Důležité je si správně uvědomit, jaké kroky musíme realizovat. Zjištěné hodnoty z teplotního senzoru musíme ukládat do proměnné, abychom je následně mohli využívat při výpočtu intenzity otáček motoru. U výpočtu je důležité správně pracovat s matematickými bloky.

Krok 1 - Deklarace proměnných

Abychom mohli hodnotu zjištěnou teplotním senzorem využívat nejenom pro rozhodnutí, zda se má ventilátor roztočit nebo zůstat v nečinnosti, ale také při výpočtu intenzity otáčení motoru, musíme si pro její ukládání nadeklarovat proměnnou. Deklaraci provedeme v horní části menu Edit -> Define Variables (podrobný popis naleznete ZDE). Pro ukládání hodnoty jsme si nadeklarovali proměnnou teplota, která je datového typu Number.

 
Krok 2 - Snímání hodnot senzorem

V dalším kroku musíme hodnotu naměřenou teplotním senzorem uložit do proměnné. První blok, který v programu použijeme, bude NXTTempSensorDraggedTemperature Sensor. Dále si do programu vložíme také blok VariableDragged Variable, který reprezentuje proměnnou. U proměnné nastavíme, že se jedná o proměnnou teplota a nastavíme blok pro zápis. U teplotního senzoru zvolíme měření ve stupních Celsia. Uložení hodnoty do proměnné provedeme propojením konektoru Temperature Temperature teplotního senzoru se vstupním portem bloku proměnné.

 
Krok 3 - Zapnutí ventilátoru

Zapnutí ventilátoru je prováděno až v okamžiku, že teplota překročí 20°C. Musíme tak v programu tuto situaci rozlišit. Použijeme proto blok podmíněného vykonání  Switch, který nám umožní rozlišit dvě nastalé situace. Podmínka bude řízena hodnotou (Value) logického datového typu (Logic). To, jaká část (True nebo False) podmínky bude vykonávána, bude ovlivněno hodnotou uloženou v proměnné teplota. Použijeme blok NumericComparisonDragged Compare, který vložíme mezi blok proměnné a podmínku Switch. Pomocí bloku NumericComparisonDragged Compare budeme zjišťovat, zda je úroveň teploty větší než 20°C. Hodnotu z proměnné přivedeme na vstup bloku k porovnání a jeho výstup přivedeme na vstup bloku Switch.

 
Krok 3 - Řízení otáček na základě teploty

V případě, že teplota překročí 20°C, motor se spustí a jeho intenzita otáčení bude řízena na základě naměřené teploty. Bude tedy vykonávána část True bloku Switch. Opět musíme využít hodnotu uloženou v proměnné teplota. Použijeme proto znovu blok VariableDragged Variable. Při výpočtu intenzity otáčení motoru musíme vzít hodnotu v proměnné, odečíst od ní hodnotu spuštění (20°C) a výsledek vynásobit 10. Do programu vložíme dva bloky pro matematické operace NumericOperationsDragged Math. Hodnotu z proměnné přivedeme na vstup prvního z nich, kde se bude od hodnoty odečítat 20. Výsledek přivedeme na vstup druhého bloku NumericOperationsDragged Math, kde se bude násobit 10. Výslednou hodnotu nakonec přivedeme na vstup konektoru Power Power programového bloku MotorDragged Motor, díky čemu nastavíme intenzitu otáčení na právě vypočítanou hodnotu. Celý programový konstrukt můžete vidět na obrázku.

ventilator vypocet

Pro úplné ošetření programu ještě vložíme do sekce False blok MotorDragged Motor, jemuž nastavíme nečinnost. Aby byl program prováděn neustále a nebyl uskutečněn pouze jeden průchod, musíme ještě celou programovou konstrukci umístit do cyklu LoopBig Loop, u nějž nastavíme nekonečné provádění (Forever). Díky tomu bude program prováděn stále dokola.

 
Výsledný program
Na následujícím obrázku můžete vidět kompletní program i s příslušným propojením bloků.
 

 ventilator program

 

Program ke stažení

Stažení ve formátu .rbt

RobotC

Řízení ventilátoru pomocí teplotního senzoru

Při vytváření programu si musíme rozmyslet, jaké náležitosti musíme provést, než začneme používat rozšiřující senzor. Jedná se o jeho deklaraci a zavolání patřičné vývojové knihovny. Pro úspěšné zvládnutí konstruktu, který provádí dynamický výpočet rychlosti otáček motoru si musíme rozmyslet, jaká bude správná podoba zápisu výpočtu.

Krok 1 - Deklarace senzoru a volání vývojové knihovny

Prvním krokem pro úspěšné zvládnutí programu je deklarace senzoru. Jak jsme si již popsali v teoretické části, deklarace se skládá z klíčového slova #pragma a příkazu config(). Do jeho parametrů následně uvedeme, že se jedná o senzor (Sensor), port řídící jednotky, ke kterému je připojen (S1-S4), následně volitelný název senzoru (v našem případě LEGOTMP) a poté skupinu definující rozšiřující senzory sensorI2CCustom.

 
#pragma config(Sensor, S1, LEGOTMP, sensorI2CCustom)
 

Následně musíme zavolat vývojovou knihovnu, která obsahuje ovladače teplotního senzoru a funkce, které v programu dále využijeme. Ve stejné složce, kde je umístěna knihovna teplotního senzoru musí být umístěna také vývojová knihovna common.h. Zavolání provedeme následovně:

 
#include "lego-temp.h"
 

Poznámka: Umístění vývojové knihovny odkazuje do kořenového adresáře, ve kterém je umístěn i vytvářený program. Pokud je váš program v počítači uložen na jiném místě než knihovna, musíte při zavolání zadat přesnou adresu umístění vývojové knihovny.

 
Krok 2 - Nastavení režimu snímání

Teplotní senzor dokáže pracovat ve dvou režimech. Je dobré proto na úvod programu udat, v jakém režimu bude senzor snímat. V našem programu použijeme snímání v režimu Continuous. Pro jeho aktivování použijeme příkaz LEGOTMPsetContinuous(), jehož parametrem v závorce bude volitelný název senzoru.

 
LEGOTMPsetContinuous(LEGOTMP);
 
 
Krok 3 - Řízení otáček na základě teploty

Hlavní částí programu je řízení otáček motoru pomocí snímané teploty okolního vzduchu. Nejprve potřebujeme, aby nám senzor vracel zjištěnou hodnotu teploty. Nadefinujeme si proto proměnnou teplota, která bude datového typu float, do níž se bude hodnota ukládat. Následně použijeme příkaz LEGOTMPreadTemp(), který vrací hodnotu zjištěnou senzorem. V závorce jsou uvedeny dva parametry. První je volitelný název senzoru a druhý název proměnné, do které se zjištěná hodnota uloží.

Nyní musíme zapsat výpočet, který zajistí dynamické otáčení motoru. Ventilátor se začne otáčet až v případě, že teplota stoupne nad 20°C. Použijeme podmínku if(), jejíž parametrem bude teplota > 20. Intenzita otáčení motoru se v rozmezí 20 - 30 °C bude měnit od 0 do 100%. Musíme tedy vzít hodnotu uloženou v proměnné teplota a odečíst od ní teplotu, při které má motor být v nečinnosti (20°C). Výslednou hodnotu poté vynásobíme 10 a tento výsledek následně přiřadíme motoru jako hodnotu otáček. Celý zápis příkazu můžete vidět níže.

Abychom ošetřili všechny nastalé možnosti programu, musíme ještě zapsat, co se stane, pokud teplota bude niší než 20°C. Za podmínku tedy přidáme else a příkaz motor[], jemuž přiřadíme nulovou hodnotu otáčení.

 
float teplota;
while(true)
 {
 
 LEGOTMPreadTemp(LEGOTMP, teplota);
 
 if (teplota > 20)
  {
   motor[motorA] = (teplota - 20) * 10;
  }
  else
  {
   motor[motorA] = 0;
  }
 }
 
 
Výsledný program

Po úspěšném zvládnutí všech dílčích kroků bychom měli dospět ke zdárnému zápis programu, který můžete vidět zde:

 
#pragma config(Sensor, S1, LEGOTMP, sensorI2CCustom)
 
#include "lego-temp.h"
 
task main()
{
 LEGOTMPsetContinuous(LEGOTMP);
 float teplota;
 while(true)
 {
 
 LEGOTMPreadTemp(LEGOTMP, teplota);
 
 if (teplota > 20)
  {
    motor[motorA] = (teplota - 20) * 10;
  }
  else
  {
    motor[motorA] = 0;
  }
 }
}
 

 

Program ke stažení

Stažení ve formátu .c

Kompasový senzor je vstupní zařízení sloužící pro orientaci robota. Jeho hlavní funkcí je určení natočení k magnetickému poli země (kompas). Ten je vracen jako úhel v rozsahu 0 - 179 (0 = sever; 45= východ; 90 = jih; 135 = západ); Pro výpočet natočení odpovídající běžnému kompasu musíme hodnotu vynásobit 2.

Kompasový senzor může být ovlivněn kovovými předměty v okolí (např. servomotorem). Pro návod na kalibraci ovlivněného senzoru a další informace navštivte stránku Rozšiřující moduly (NXT) > Kompasový senzor.

Použití v programovacích prostředích

NXT-G

Blok pro ovládání kompasového senzoru

Rozcestník


Umístění bloku

Kompasový senzor je v programovacím prostředí NXT-G řízen blokem CompassSensorDragged Compass Sensor. Tento blok není součástí základní instalace. Pro jeho použití je nutné jej do prostředí importovat. Návod k importu rozšiřujících modulů naleznete v kapitole Instalace rozšiřujících modulů.

Compass sensor block

 

Popis bloku

Blok senzoru obsahuje osm konektorů, jejichž pomocí je možné jej propojit s dalšímy moduly.

Port Port - vyjadřuje, ke kterému z portů (1-4) je kompasový senzor připojen.

Action Action - udává, zda je zvoleno absolutní čtení, relativní čtení nebo kalibrace (Absolute Reading, Relative Reading, Calibration).

Number Target - cílové natočení ve směru, kterého chceme dosáhnout (vyjádřeno ve stupních).

A A - číslo, které vyjadřuje dolní mez rozsahu hodnot určeného pro porovnání (nastavena v sekci Compare).

B B - číslo, které vyjadřuje horní mez rozsahu hodnot určeného pro porovnání (nastavena v sekci Compare).

Boolean Yes / No - hodnota logického datového typu, která vyjadřuje, zda je hodnota v rozmezí mezi zadanými hodnotami  (Inside Range - výstup je roven Yes) nebo vně rozsahu zadaných hodnot (Outside Range - výstup je roven No).

Number RelativeHeading - výstup vyjadřující relativní hodnotu natočení senzoru (rozdíl mezi cílovým směrem (Target) a absolutní hodnotou (Absolute Heading).

AbsoluteHeading Absolute Heading - výstup vyjadřující aktuální natočení senzoru (kterým směrem je momentálně natočen).

 

Parametry bloku

Compass sensor

Port: určuje, ke kterému vstupnímu portu je kompasový senzor připojen.

Action: volba, která udává, jakým způsobem se bude s hodnotami pracovat. Absolute Reading pracuje s přesnými hodnotami od 0 do 360 stupňů. Aktuální natočení senzoru je určováno podle magnetického pólu Země.  Relative reading používá k určování pozice hodnoty od -180 do 180. Mód Relative Reading je častěji používán k řízení robota, protože jsou zde porovnávány relativní hodnoty s hodnotami snímanými senzorem, což je pro řízení jednodušší způsob než využití hodnot absolutních. Nejprve volíme aktuální pozici senzoru a následně zjišťujeme relativní přírůstky úhlu. Volba Calibrate označuje kalibraci senzoru.

Compare: volba sloužící k porovnání zadaných hodnot (rozsah hodnot při jejichž docílení je senzor aktivován). Volba Inside Range značí, zda je naměřená hodnota v rozmezí mezi zadanými hodnotami A a B. Outside Range má opačnou funkci. Vyjadřuje, zda je hodnota mimo zadané rozmezí. Target označuje cílovou pozici.

RobotC

PŘÍKAZY PRO OVLÁDÁNÍ kompasového senzoru

Rozcestník


NASTAVENÍ SENZORU

Před započetím práce s kompasovým senzorem, je nutné jej v programovacím prostředí RobotC nadeklarovat. Zápis konfigurace se skládá z klíčového slova #pragma a příkazu config(), který obsahuje čtyři parametry. Prvním parametrem je rozlišeno, zda se jedná o deklaraci motoru či senzoru (v našem případě se jedná o senzor). Druhý parametr udává, ke kterému vstupnímu portu (S1-S4) je senzor připojen (v příkladu port číslo 1). Třetí parametr je volitelný. Jedná se o název senzoru v deklaraci a je zadáván uživatelem. Poslední částí deklarace je typ senzoru (sensorI2CHiTechnicCompass = označení kompasového senzoru).

 
#pragma config(Sensor, S1, kompas, sensorI2CHiTechnicCompass)
// Kod je automaticky generovan pruvodcem deklaraci RobotC.
 

NASTAVENÍ TYPU SENZORU

Výše popsaná možnost deklarace senzoru není v programovacím prostředí RobotC jediná. Existuje ještě pokročilejší způsob zápisu. Kompasový senzor patří do skupiny rozšiřujících senzorů definovaných ve skupině s názvem tSensors. První co tedy musíme učinit, je říci programu, že se jedná o senzor tohoto druhu (tSensors kompas). Slovo kompas je volitelný název senzoru pro potřeby našeho programu, který budeme dále používat. K zápisu můžeme přidat ještě označení portu, ke kterému je senzor připojen (S1-S4). Následně musíme zapsat, o který konkrétní rozšiřující senzor se jedná. Použijeme příkaz SensorType[]. Jeho parametrem v hranaté závorce bude námi zvolený název senzoru, tedy kompas. Do tohoto příkazu poté přiřadíme standardizované označení kompasového senzoru (sensorI2CHiTechnicCompass).

Tento typ deklarace je doporučeno provádět zkušenějším uživatelům. Začátečníkům se doporučuje deklarovat moduly pomocí Deklaraci motorů a senzorů v horní liště menu.

 
tSensors kompas = S1;
SensorType[kompas] = sensorI2CHiTechnicCompass;
 
 

PRÁCE S HODNOTOU SNÍMANOU SENZOREM

Při práci s každým senzorem budeme zpracovávat hodnotu, kterou nám senzor vrací. Tuto hodnotu můžeme dále porovnávat, ukládat do proměnné nebo s její pomocí ovlivňovat další chování robota. K vyjádření aktuálně zjišťované hodnoty ze senzoru se používá příkaz SensorValue[]. Jeho parametrem v závorce je uživatelem deklarovaný název senzoru. V příkladech o něco níže vidíte možné použití příkazu. Můžeme hodnotu jím vyjádřenou porovnávat s fixně zadanou hodnotou. Další možností je průběžné ukládání hodnoty do proměnné, s kterou budeme dále v programu pracovat a bude nám reprezentovat hodnotu vrácenou senzorem.

 
SensorValue[kompas] > 60; // Zjistovani, zda je hodnota zjistena senzorem vyssi nez 60.
 
a = SensorValue[kompas]; // Prirazeni hodnoty ze senzoru do promenne.
 
 

Využití předdefinovaných metod

Kompasový senzor nepatří mezi senzory obsažené v základní sadě stavebnice LEGO MINDSTORMS NXT. Při práci v programovacím prostředí RobotC máme k dispozici vývojové knihovny, které obsahují ovladače, ve kterých jsou předdefinovány metody pro práci s rozšiřujícími moduly a senzory. Knihovna pro práci s kompasovým senzorem se jmenuje hitechnic-compass a zavoláme ji v úvodu programu následovně:

 
#include "drivers/hitechnic-compass.h"
 
 

Před započetím práce s kompasovým senzorem je možné, nikoliv ovšem nezbytné senzor zkalibrovat. Postupem času může dojít k určitému ovlivnění z vnějšku, díky působení magnetického pole, nebo určitých točivých zařízení (podrobný popis kalibrace najdete ZDE). Předdefinovaná funkce, která spustí kalibraci se nazývá HTMCstartCal(). Po spuštění kalibrace by se měl senzor otočit o více než 360° podél horizontální roviny po dobu alespoň 20 vteřin. Kalibraci následně zastavíme zavoláním funkce HTMCstopCal(), díky čemuž se senzor znovu přepne do režimu snímání.

Po správném zkalibrování senzoru můžeme přejít ke zpracovávání hodnot, které s jeho pomocí zjišťujeme. První údaj, který dokážeme kompasovým senzorem zjistit, je aktuální natočení podle magnetického pólu Země (Absolute Heading). Funkce, která nám tuto hodnotu vrací se nazývá HTMCreadHeading(). Zjištěná hodnota je datového typu integer.

Druhou možností prezentace dat z kompasového senzoru je pomocí vyjádření relativní hodnoty natočení senzoru. Tato hodnota se vypočte jako rozdíl mezi požadovaným směrem, kterého chceme dosáhnout, a absolutní hodnotou natočení senzoru (Absolute Heading). Vypočtenou hodnotu nám vrací předdefinovaná funkce HTMCreadRelativeHeading(), jejíž výsledná hodnota, která může být v rozsahu od -179 do 180, je datového typu integer. Při využití této funkce budeme potřebovat ještě stanovit, kde se na zmíněném rozmezí nachází nulový bod. K tomu slouží funkce HTMCsetTarget().

U všech funkcí zadáváme pouze jediný parametr umístěný v závorce. Jedná se o volitelný název senzoru, který uživatel zadává při deklaraci.


MOŽNOSTI PRAKTICKÉHO VYUŽITÍ

Kompasový senzor patří k modulům, které zaručují orientaci robota v prostoru. Umožňuje nám zjišťovat, jakým směrem se robot pohybuje. Velmi často se tohoto využívá například v robotickém fotbale. Robot potřebuje vědět, kde se nachází soupeřova branka. Musíme předejít tomu, aby si díky dezorientaci vsítil vlastní branku. Použijeme proto kompasový senzor, díky kterému robotovi udáme směr, kterým se soupeřova branka nachází.

Využití kompasového senzoru 

Praktické využití kompasového senzoru si ukážeme na příkladu, ve kterém nebudeme využívat možnosti, které nám nabízí vývojová knihovna. Budeme zpracovávat pouze hodnotu, kterou nám senzor vrací. Na displej si vykreslíme kompas, který bude mít kruhový tvar a bude zobrazovat také světové strany. Na displeji se bude dynamicky vykreslovat ručička kompasu, která nám bude ukazovat směr (světovou stranu), na kterou je senzor namířen.

NXT-G

VYKRESLENÍ KOMPASU

Realizace programu v programovacím prostředí NXT-G může být poněkud zdlouhavější. Při vytváření programu musíme vytvořit programový konstrukt, který dynamicky vypočítává novou pozici ručičky kompasu. K tomu musíme použít několik bloků, díky čemuž se program stane rozsáhlejší. Začínajícím programátorům tak může orientace v něm činit potíže.

Při vytváření programu musíme zrealizovat několik kroků. Nejprve si rozmyslet, jaké proměnné budeme potřebovat pro ukládání hodnot. Následně rozhodnout, jak pomocí hodnoty zjištěné senzorem vypočítat novou pozici ručičky kompasu. Poslední částí bude správné vykreslení celého kompasu a také ručičky.

Krok 1 - Deklarace proměnných

V programu budeme zpracovávat několik hodnot, které si musíme uložit do příslušných proměnných. Před započetím programování si je tedy nadeklarujeme. Budeme potřebovat dvě proměnné, které budou reprezentovat výchozí pozici pro vykreslování ručičky kompasu. Jedna bude vyjadřovat souřadnici X a druhá souřadnici Y bodu displeje. Pojmenujeme si je poslX a poslY. Obě budou datového typu Number. Poslední dvojicí proměnných budou ty, které budou symbolizovat dynamicky se měnící pozici ručičky kompasu. Tento bod bude při vykreslení propojen přímkou spojující osu ručičky kompasu a právě tuto pozici. Proměnné si pojmenujeme X a Y a budou datového typu Number.

 
Krok 2 - Úvodní ošetření programu

Než přejdeme ke zpracování hodnoty snímané kompasovým senzorem, musíme určit, na jakém bodě displeje bude osa ručičky kompasu. Tento bod určují proměnné poslX a poslY. Do programu tedy jako první vložíme dva bloky VariableDraggedVariable, jimž nastavíme příslušnou hodnotu. Pro potřeby našeho programu jsme souřadnice osy ručičky kompasu zvolili na pozici (30,30). Na úvod programu je také dobré smazat plochu displeje, než na něj začneme kompas vykreslovat. Použijeme proto blok DisplayDragged Display a v sekci Action zvolíme Reset.

Ošetřili jsme úvod programu. Všechny další kroky, které budeme realizovat, se budou opakovat, dokud uživatel program neukončí. Pro opakování použijeme blok LoopBig Loop, u nějž zvolíme nekonečné opakování (Forever). Všechny další bloky budou nyní umístěny v něm.

 
Krok 3 - Výpočet pozice ručičky

Nyní již přejdeme ke zpracování hodnot ze senzoru. Použijeme blok CompassSensorDragged Compass Senzor a nastavíme snímání v režimu Absolute Reading. Z hodnoty zjištěné senzorem nyní vypočítáme dynamicky se měnící pozici ručičky kompasu. Ta se vypočte následujícím způsobem. Souřadnici X získáme tak, že vypočteme sinus hodnoty ze senzoru, výsledek vynásobíme 30 a následně k němu přičteme 30, což je posun po ose X. Souřadnici Y získáme tak, že vypočteme cosinus hodnoty ze senzoru, výsledek vynásobíme 30 a následně k němu přičteme 30 (posun po ose Y).

V programovacím prostředí výpočet zrealizujeme pomocí následujících bloků. Výstupní hodnotu ze senzoru (AbsoluteHeading Absolute Heading) přivedeme na vstup bloku Data HiTechnic Sin/Cos. Výstup Sin (pro souřadnici X) nebo Cos (pro souřanici Y) poté přivedeme na vstup bloku NumericOperationsDragged Math, kde provedeme násobení (Multiplication) 30. Výsledek přivedeme na vstup dalšího bloku NumericOperationsDragged Math, kde k hodnotě přičteme (Addition) 30. Vypočtenou hodnotu poté uložíme do proměnné X (pro souřadnici X) a Y (pro souřadnici Y).

 
Krok 4 - Vykreslení ručičky a samotného kompasu

Než přejdeme k samotnému vykreslování kompasu, musíme si uvědomit, kdy vlastně chceme, aby se na displeji zobrazila ručička měnící pozici. Bude to v případě, kdy pozice natočení kompasu bude jiná než výchozí pozice ručičky. Musíme proto tuto situaci programově ošetřit. Porovnáme, zda hodnota uložená v proměnné X není náhodou rovna hodnotě v proměnné poslX nebo zda hodnota v proměnné Y není rovna poslY. Pro porovnání dvou proměnných použijeme blok FPNumericComparisonDragged Compare. Logický součet dvou výroků provedeme pomocí bloku  BooleanOperationDragged Logic, v jehož nastavení zvolíme operaci OR (logický součet).

Pokud bude splněna popsaná podmínka, může začít vykreslování kompasu. V opačném případě se nestane nic. Pro rozlišení těchto dvou stavů použijeme blok podmíněného vykonání Switch. Ten bude řízen právě splněním podmínky nerovnosti proměnných. V sekci True se proto bude provádět vykreslování a v sekci False nebude umístěn žádný blok.

Pro vykreslování jednotlivých součástí kompasu budeme používat blok DisplayDragged Display. Nejprve si vykreslíme kružnici reprezentující kompas. Zvolíme akci vykreslování (Drawing) a typ objektu kruh (Circle). Jak jsme zmínili v úvodu, osu ručičky jsme si umístili na pozici (30,30). Střed kružnice proto umístíme na totožnou pozici a jako poloměr nastavíme 30 bodů. Přejdeme k vykreslení písmen popisujících světové strany. Musíme dbát na to, abychom je umístili na displeji symetricky. V sekci Action zvolíme pro vykreslování písmen volbu Text. V programu jsme popisky kompasu umístili na následující pozice:

  • S - (29,55)
  • J - (29,8)
  • Z - (3,30)
  • V - (54,30)

Zbývá provést dynamické vykreslování ručičky kompasu. Použijeme dva bloky VariableDragged Variable, které budou reprezentovat proměnné X a Y, ve kterých máme uloženu vypočtenou pozici ukazatele ručičky. Výstupy těchto proměnných následně přivedeme na vstupní porty End point X a End point Y bloku DisplayDragged Display. U bloku musí být nastaveno vykreslování křivky (Line) a souřadnice počátečního bodu křivky (X a Y) musí být nastaveny na pozici (30,30).

Pro zajištění dynamického vykreslování umístíme ještě za bloky pro vykreslení blok WaitForTimeDrag Wait, kterému nastavíme dobu pro oddálení vykonávání dalšího příkazu na 0,2 sekundy. Nesmíme také zapomenout zaškrtnout u prvního bloku DisplayDragged Display, který realizuje vykreslování možnost Clear. Jinak by při každém dalším vykreslení ručička kompasu nezmizela a zůstávala by na displeji zobrazena každá její předchozí pozice. U všech ostatních bloků bude tato možnost neaktivní.

 
Výsledný program

Co do počtu bloků, je program poněkud rozsáhlejší. Po pečlivém rozvrhnutí a realizaci jednotlivých kroků byste ovšem měli dojít k úspěšnému řešení.

 

Program ke stažení

Stažení ve formátu .rbt

RobotC

Vykreslení kompasu

Realizace příkladu v programovacím prostředí RobotC se skládá z úspěšného provedení několika kroků. Základem je správná deklarace senzoru a promyšlení, jaká vlastně bude výsledná podoba kompasu a z kterých kroků se jeho vykreslení skládá. Pro dobrý vizuální efekt musíme symetricky na displej vykreslit kružnici reprezentující displej a jednotlivé světové strany. Nejobtížnější částí programu je beze sporu dynamický výpočet pozice ručičky kompasu.

Krok 1 - Deklarace senzoru

Než začneme s realizací programu, musíme si deklarovat kompasový senzor, jinak bychom jej nemohli používat. Zápis deklarace vidíte níže. Skládá se z klíčového slova #pragma a příkazu config(). Ten obsahuje čtyři parametry. Označení, že se jedná o senzor (Sensor), port jeho připojení (S1), volitelný název senzoru a standardizované označení senzoru (sensorI2CHiTechnicCompass).

 
#pragma config(Sensor, S1, kompas, sensorI2CHiTechnicCompass)
 
 
Krok 2 - Deklarace proměnných

Během chodu programu se hodnota udávající natočení kompasového senzoru musí někam ukládat. Nadeklarovali jsme si proto proměnnou natoceni, která bude sloužit právě k tomuto účelu. Dále musíme také určit, na jaké pozici displeje bude osa ručičky kompasu. Zvolili jsme pozici (30,30). Tato pozice bude také výchozím bodem pro první vykreslování ručičky. Vytvořili jsme si dvě proměnné (poslX a poslY), které definují tuto pozici a jejichž hodnota je 30.

 
 int natoceni;
 
 int poslX = 30;
 int poslY = 30;
 
 
Krok 3 - Vykreslení kompasu a světových stran

V dalším kroku si na plochu displeje vykreslíme kružnici, která bude reprezentovat kompas a následně také označení světových stran. Střed kružnice bude v bodě (30,30) a poloměr kružnice bude také 30 bodů displeje. Pomocí příkazu nxtDrawEllipse() tedy vykreslíme kružnici, jejíž levý horní roh bude na pozici (0,60) a pravý dolní roh na pozici (60,0).

Nyní přejdeme k vykreslení popisků světový stran. Použijeme příkaz nxtDisplayStringAt(), který umožňuje vykreslit znak nebo řetězec znaků na požadovanou pozici. Umístění popisků může být pro někoho náročné. Pro výsledný dobrý vizuální efekt je důležité popisky umístit na pozice tak, aby byly symetrické. Pozice jednotlivých písmen označujících světové strany, které jsme zvolily, vidíte níže. Ještě před vykreslením kružnice a světových stran je dobré displej smazat příkazem eraseDisplay().

 
 eraseDisplay();
 
 nxtDrawEllipse(0, 60, 60, 0);
 
 nxtDisplayStringAt(29, 58, "S");
 nxtDisplayStringAt(29, 9, "J");
 nxtDisplayStringAt( 3, 34, "Z");
 nxtDisplayStringAt(54, 34, "V");
 
 
Krok 4 - Výpočet pozice ručičky

Dostáváme se k části, kde musíme určit pozici, na jakou se bude ručička natáčet. Jelikož od tohoto kroku se budou všechny příkazy provádět neustále dokola a pozice ručičky se bude dynamicky měnit, musíme všechny příkazy začít zapisovat do nekonečného cyklu while(). Nejprve si nadeklarujeme dvě proměnné, které budou reprezentovat pozici X a Y bodu, který se propojí se středem ciferníku kompasu a vykreslí se tak ručička. Obě budou datového typu integer. Následně si do proměnné natoceni přiřadíme hodnotu z kompasového senzoru pomocí příkazu SensorValue().

Nyní přicházíme k tomu, jak vypočítat pozici proměnlivého bodu. Pro výpočet pozice na ose X vezmeme hodnotu 30, která značí posun po ose X, přičteme k ní sinus hodnoty uložené v proměnné natoceni vynásobený 30. Pozici na ose Y získáme tak, že k posunu na ose Y (30) přičteme cosinus hodnoty uložené v proměnné natoceni vynásobený 30.

 
 int X;
 int Y;
 
 natoceni = SensorValue[kompas];
 
 // vypocet pozice rucicky kompasu
 X = 30 + (sinDegrees(natoceni) * 30);
 Y = 30 + (cosDegrees(natoceni) * 30);
 
 
Krok 5 - Vykreslování pozice ručičky

Posledním krokem při vytváření programu je vykreslování ručičky kompasu. Budeme chtít, aby se ručička vykreslila pouze v případě, že senzor bude snímat, což je případ, kdy hodnota proměnných X a Y bude jiná, než výchozí pozice (poslX a poslY). Použijeme podmínku if(), jejíž podmínka pro vykonávání dalších příkazů bude, že poslední pozice X (poslX) se nebude rovnat X a poslední pozice Y (poslY) se nebude rovnat Y - (poslX != X) || (poslY != Y). Pokud bude podmínka splněna, vykreslí se ručička kompasu. Vykreslení dosáhneme pomocí příkazu nxtInvertLine(), který pomocí vykreslení přímky propojí dva zadané body na displeji. V našem případě se bude jednat o střed ciferníku, tedy bod (30,30) a vypočtenou pozici ukazatele ručičky (X,Y).

Neustálým vykreslováním nové pozice ručičky, v závislosti na natáčení kompasového senzoru, by se na displeji zobrazovaly nové a nové přímky. Předchozí pozice ručičky by se ovšem nemazaly. Smazání předchozí pozice dosáhneme opětovným použitím příkazu nxtInvertLine(). Jelikož před prvním vykreslováním byla ručička v pozici středu ciferníku, smažeme přímku propojující body (30,30) a (poslX,poslY). Hodnota proměnných reprezentujícíh poslední umístění je ovšem v současné době 30. Musíme proto ještě do těchto proměnných přiřadit souřadnice posledního bodu, který byl při vykreslení propojen s osou ciferníku. Do proměnné poslX tedy přiřadíme hodnotu proměné X a do poslY hodnotu proměnné Y. Pro zajištění dynamického vykreslování je dobré jestě před přiřazení do proměnných umístit příkaz wait1Msec(), který oddálí vykonávání dalšího příkazu. Jako jeho hodnotu jsme zvolili 0,2 vteřiny, což se ukázalo jako dostačující.

 
 if ((poslX != X) || (poslY != Y))
 {
  // vykresluje novou pozici ukazatele od (31,31) do (X,Y)
  nxtInvertLine(30, 30, X, Y);
 
  // prekresli predchozi pozici
  nxtInvertLine(30, 30, poslX, poslY);
  wait1Msec(200);
  poslX = X;
  poslY = Y;
 }
 
 
 
Výsledný program

Vytvoření tohoto programu může začátečníkům činit obtíže. Jedná se spíše o pokročilejší úlohu. Pokud ovšem správně zrealizujete jednotlivé kroky a budete si počínat pečlivě, dojdete ke zdárnému výsledku. Hotový program by poté měl vypadat následovně:

 
// deklarace kompasoveho senzoru
#pragma config(Sensor, S1, kompas, sensorI2CHiTechnicCompass)
 
task main()
{
  int natoceni;
 
  // pozice osy rucicky
  int poslX = 30;
  int poslY = 30;
 
  eraseDisplay();
 
  // vykresleni kompasu a svetovych stran
  nxtDrawEllipse(0, 60, 60, 0);
  nxtDisplayStringAt(29, 58, "S");
  nxtDisplayStringAt(29, 9, "J");
  nxtDisplayStringAt( 3, 34, "Z");
  nxtDisplayStringAt(54, 34, "V");
 
  while (true)
  {
    int X;
    int Y;
 
    natoceni = SensorValue[kompas];
 
    // vypocet pozice rucicky kompasu
    X = 30 + (sinDegrees(natoceni) * 30);
    Y = 30 + (cosDegrees(natoceni) * 30);
 
    if ((poslX != X) || (poslY != Y))
    {
      // vykresluje novou pozici ukazatele od (31,31) do (X,Y)
      nxtInvertLine(30, 30, X, Y);
 
     // prekresli predchozi pozici
     nxtInvertLine(30, 30, poslX, poslY);
     wait1Msec(200);
     poslX = X;
     poslY = Y;
   }
  }
}
 
 

 

Program ke stažení

Stažení ve formátu .c

Seznam článků kapitoly

  1. Kompasový senzor
  2. Gyroskopický senzor
  3. Senzor akcelerace
  4. Vyhledávač infračervených signálů
  5. Barevný senzor
  6. Teplotní senzor
  7. Multiplexer vstupů HiTechnic
  8. Rozdělovač vstupů MindSensors

Úvod

Během vytváření robotů a dalších modelů z robotické stavebnice LEGO  MINDSTORMS NXT nejsme vázáni pouze na využívání dílů obsažených v základní sadě stavebnice. Mnoho dalších výrobců nabízí širokou paletu dalšího příslušenství.

Při pohybu robota v prostoru můžeme využít několik senzorů, které budou jeho konání monitorovat a vracet nám údaje, které můžeme dále vyhodnocovat a upravovat tak robotovo chování. Kompasový senzor nám bude vracet směr, kterým se robot pohybuje v závislosti na světových stranách. Gyroskopický senzor bude měřit rychlost otáčení v horizontální rovině. Nebo můžeme použít Senzor akcelerace, který sleduje, s jakým zrychlením se robot pohybuje.

Oblíbenou disciplínou při robotických soutěžích je robotický fotbal. K detekci hracího míče, který vysílá infračervený signál, se používá Vyhledávač infračervených signálů. V kapitole nesoucí stejný název se dozvíte, jak s ním pracovat v obou programovacích prostředích.

Možnost zjišťovat, jaké barvy je snímaný povrch pod robotem nebo různé díly pohybující se po třídící lince, nám umožňuje Barevný senzor. Naopak pokud chceme monitorovat změny teploty v okolí, využijeme Teplotní senzor.

V případech, kdy nám přestanou dostačovat čtyři vstupní porty, kterými disponuje řídící jednotka NXT, máme k dispozici různé multiplexery nebo rozdělovače. V kapitole Multiplexer vstupů HiTechnic se dozvíte, jak připojit až čtyři různé senzory na jediný vstupní port řídící jednotky.  Podobnou funkci má také Rozdělovač vstupů MindSensors, o jehož možnostech využití se dozvíte ve stejnojmenné kapitole.