KURZ: Barevný senzor - Možnosti praktického využití
- Podrobnosti
- Mgr. Jan Baťko
- Aktualizováno: 01.04.2014
- Zobrazení: 8187
KAPITOLY
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 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é R, G a B. Každou z hodnot nyní vypíšeme na displej. Použijeme tři bloky 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 Number 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 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 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 Wait. 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ší.
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 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 Display, který bude po spuštění programu mazat plochu displeje. Nastavíme mu tedy funkci Reset.
Program ke stažení
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); } }