KURZ: Barevný senzor

  • Vytisknout

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

1 1 1 1 1 1 1 1 1 1 Hodnocení 0.00 (0 hodnocení)