KURZ: Světelný senzor

  • Vytisknout

Světelný senzor je vstupní zařízení sloužící pro orientaci robota. Mezi jeho hlavní funkce patří rozeznávání světla a tmy a také měření intenzity světla. Jeho hlavní uplatnění je pro navigaci robota. Díky použití světelného senzoru může robot sledovat například dráhu nakreslenou na podkladu, která je dostatečně kontrastní s okolím plochy. Senzor se k řídící jednotce NXT připojuje standardně pomocí kabelu do jednoho ze čtyř vstupních portů (1-4).

U stavebnice LEGO Mindstorms EV3 kombinuje tyto funce barevný senzor (colour senzor), který dokáže měřit intenzitu světla v okolí, intenzitu odraženého světla a zároveň rozeznávat barvy, z čehož je odvozen také jeho název.

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

NXT-G

BLOK PRO OVLÁDÁNÍ MOTORU

Rozcestník


Umístění bloku

Blok LightSensorDragged Light Sensor pro ovládání světelného senzoru nalezneme v programovacím prostředí NXT-G v paletě icon completeCompleteSensorHilight Sensor.

NXTG LightSenzor rozbaleny

 

Popis bloku

Programový blok LightSensorDragged Light Sensor obsahuje celkem sedm různých konektorů pro propojení s dalšími bloky programu:

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

TriggerPoint TriggerPoint- značí nastavenou vstupní hodnotu intenzity světla, která je srovnávána s hodnotou snímanou senzorem. 

GreaterLessGreater / Less - hodnota logického datového typu sloužící pro srovnání dvou hodnot (větší nebo menší).

Floodlight Generate Light - určuje, zda během snímání hodnot svítí LED dioda senzoru.

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

Intensity Intensity - udává hodnotu intenzity světla snímanou senzorem na stupnici (0-100).

RawValue Raw Value - udává čistou, neškálovanou hodnotu intenzity světla snímanou senzorem na stupnici (0-1023).

Aktuální nastavení bloku vyjadřují tři ikonky. První je číslo, které se nachází vpravo nahoře a označuje vstupní port, ke kterému je senzor připojen. Níže se poté zobrazuje, zda LED dioda generuje světlo Floodlight a také úroveň intensity světla Intensity.

 

Parametry bloku

NXTG LightSenzor

Programový blok světelného senzoru umožňuje nastavit následující parametry:

Port: slouží k určení vstupního portu řídící jednotky, ke kterému je senzor připojen.

Compare: sekce slouží k nastavení vstupních dat určených ke srovnání. Pomocí tažítka je možné nastavit intenzitu světla. Volby na obou koncích tažítka umožňují nastavit, jestli chceme zjišťovat, zda světlo snímané senzorem je tmavší než nastavená hodnota intenzity či světlejší. Znaménko větší či menší lze volit i o krok níže a stejně tak zadávat ručně hodnotu intenzity.

Function: zaškrtnutím volby Generate light (generovat světlo) udělujeme příkaz k rozsvícení vláknové žárovky na čelní straně senzoru.

Po spuštění programu začne světelný senzor snímat hodnotu intenzity světla ve svém okolí. Zjištěná hodnota se průběžně zobrazuje ve žlutém poli na levé straně programového bloku (na obrázku hodnota 34).

RobotC

Příkazy pro ovládání světelného senzoru

Světelný senzor obsahuje vláknovou žárovku, jejíž svit lze programově ovládat. Před každým použití jej musíme správně nakonfigurovat a zajistit tak bezproblémový chod. Snímané hodnoty lze zpracovávat ve dvou režimech. První je klasický a druhý ve formátu RAW.

Rozcestník


Nastavení senzoru

Ještě než začneme v programovacím prostředí RobotC pracovat se světelným senzorem, je nutné ho nakonfigurovat. Zápis konfigurace je uveden níže. Skládá se z klíčového slova #pragma a příkazu config(), který obsahuje čtyři parametry. První parametr značí, o jaký druh zařízení se jedná. V našem případě je to senzor (Sensor). Další parametr označuje, do jakého portu řídící jednotky je senzor připojen (S2 = port 2). Následuje volitelný název senzoru (svetelny). Posledním parametrem je druh senzoru (sensorLightActive = světelný senzor). Tato deklarace je v úvodu každého programu, kde budeme pracovat se senzory nezbytná.

 
#pragma config(Sensor, S2, svetelny, sensorLightActive) // Kod je automaticky generovan pruvodcem konfiguraci RobotC.
 

Poznámka: Konfiguraci lze provést ručním zapsáním deklarace v příkladu nebo v menu programovacího prostředí RobotC. Postup konfigurace je uveden v kapitole Konfigurace motorů a senzorů.


Generování světla žárovkou

Snímání intenzity světla světelným senzorem může být doprovázeno světlem z žárovky umístěné na přední části senzoru. Parametr, který vyjadřuje činnost či nečinnost žárovky se nazývá sensorLightActive nebo sensorLightInactive. Tento parametr se používá ve spojení s příkazem SensorType[], u kterého je nutné v závorce zadat název daného senzoru, který jsme si nadefinovali v úvodu programu.

 
SensorType[Svetelny] = sensorLightActive; // LED dioda senzoru generuje po celou dobu chodu programu svetlo.
SensorType[Svetelny] = sensorLightInactive; // LED dioda senzoru je neaktivni, negeneruje svetlo. 
 

Nastavení hodnoty intenzity světla v procentech

Volitelná hodnota intenzity světla, která je určena k programovému zpracování a porovnání s hodnotou snímanou senzorem se nastavuje pomocí příkazu SensorValue[]. V závorce je nutné uvést název senzoru, který jsme si nadeklarovali v úvodu programu. Rozsah číselné hodnoty je zadáván pomocí porovnávacích znamének, která značí hodnotu větší, menší nebo rovnu zadané hodnotě (>, < nebo =).

 
SensorValue[Svetelny] < 45; // Hodnota intenzity svetla je nizsi nez 45.
SensorValue[Svetelny] > 45; // Hodnota intenzity svetla je vyssi nez 45.
SensorValue[Svetelny] = 45; // Hodnota intenzity svetla je rovna 45.
 

Využití hodnoty intenzity světla v RAW

Hodnota udávaná jako raw, je vyjádření hodnoty přečtené senzorem v čisté, neškálované podobě. Lze s ní pracovat v rozmezí od 0 do 1023. Pro vyjádření této hodnoty slouží příkaz SensorRaw[]. V závorce je nutné uvést název senzoru, který jsme si nadeklarovali v úvodu programu. Stejně jako tomu bylo u předchozího vyjádření hodnot v procentech, je možné i zde ovlivnit rozsah hodnot pomocí porovnávacích znamének.

 
SensorRaw[Svetelny] < 512; // Hodnota intenzity svetla v RAW je nizsi nez 512. 
SensorRaw[Svetelny] > 512; // Hodnota intenzity svetla v RAW je vyssi nez 512.
SensorRaw[Svetelny] = 512; // Hodnota intenzity svetla v RAW je rovna 512.
 

EV3

Blok pro práci s barevným senzorem 

Rozcestník


Umístění bloku pro práci s barevným senzorem

Programový blok Colour Sensor je umístěn v paletě Sensor Sensor.

UMISTENI BAREVNY


Změna režimu

Programový blok Colour Sensor můžeme využívat ve třech základních režimech. Přepínání mezi nimi se provádí pomocí tlačítka v levé spodní části bloku (červeně zvýrazněno).

REZIMY


Přidání vstupního portu 

Kliknutím do pole pro výběr vstupního portu v pravém horním rohu programového bloku a vybráním možnosti Wired přidáme do programového bloku nový vstupní port Identification 515 Port Port (červeně zvýrazněno).

WIRED


Režimy programového bloku

Measure - Colour (měření barvy)

Režim sloužící k identifikaci barvy snímaného povrchu. Programový blok obsahuje v tomto režimu jediný výstupní port, který vrací číselnou návratovou hodnotu odpovídající zjištěné barvě.

MEASURE COLOR

Identification 501 MeasuredColorColour - výstupní port vracející číselnou návratovou hodnotu odpovídající zjištěné barvě. Návratové hodnoty mohou být následující:

  • 0 = žádná barva
  • 1 = černá
  • 2 = modrá
  • 3 = zelená 
  • 4 = žlutá 
  • 5 = červená
  • 6 = bílá
  • 7 = hnědá 

 

 

Measure - Reflected Light Intensity

Režim sloužící k měření intenzity světla odraženého od aktuálně snímaného povrchu. Programový blok obsahuje v tomto režimu jediný výstupní port.

REFLECTED LIGHT

Identification 502 MeasuredLight Light - návratovou hodnotou výstupního portu je číselná hodnota odpovídající intenzitě odráženého světla snímaného povrchu.

 

 

Measure - Ambient Light Intensity

Režim sloužící k měření intenzity světla v okolí. Programový blok obsahuje v tomto režimu jediný výstupní port.

AMBIENT LIGHT

Identification 502 MeasuredLightLight - návratovou hodnotou výstupního portu je číselná hodnota odpovídající intenzitě světla snímaného z okolního prostředí. 

 

 

Compare - Colour

Režim sloužící k ověření, zda barva snímaného povrchu odpovídá zadané/ým barvě/ám. Programový blok obsahuje v tomto režimu jeden vstupní a dva výstupní porty.

COMPARE COLOR

Identification 019 Color NoColor Set of Colours - vstupní port sloužící k zadání jedné či více barev. Při snímání se bude zjišťovat, zda snímaný povrch odpovídá zadané barvě/ám.

Identification 030 ComparisonType EqualCompare Result - výstupní port vracející logickou návratovou hodnotu podle toho, zda byla zadaná barva/y detekována/y (True) nebo nikoliv (False).

Identification 501 MeasuredColorColour - výstupní port vracející číselnou návratovou hodnotu odpovídající zjištěné barvě.

 

 

Compare - Reflected Light Intensity

Režim sloužící k porování zjištěné intenzity odraženého světla se zadanou prahovou hodnotou. Programový blok obsahuje v tomto režimu dva vstupní a dva výstupní porty.

COMPARE REFLECTED

Identification 034 ComparisonType LessThan Compare Type - výběr způsobu porovnání zjištěné hodnoty s prahovou. Vybíráme, zda chceme zjistit, jestli je snímaná hodnota menší, větší nebo rovna prahové. 

Identification 412 Threshold Less 0Threshold Value - prahová hodnota, s kterou se porovnává intenzita odraženého světla zjištěná senzorem.

Identification 030 ComparisonType EqualCompare Result - výstupní port vracející logickou návratovou hodnotu v závislosti na tom, zda zjištěná hodnota byla v námi požadované intenzitě vůči prahové (True) či nikoliv (False).

Identification 502 MeasuredLightLight - návratovou hodnotou výstupního portu je číselná hodnota odpovídající intenzitě světla odraženého od snímaného povrchu. 

 

 

Compare - Ambient Light Intensity

Režim sloužící k porování zjištěné intenzity světla v okolí se zadanou prahovou hodnotou. Programový blok obsahuje v tomto režimu dva vstupní a dva výstupní porty.

COMPARE AMBIENT

 Identification 034 ComparisonType LessThan Compare Type - výběr způsobu porovnání zjištěné hodnoty s prahovou. Vybíráme, zda chceme zjistit, jestli je snímaná hodnota menší, větší nebo rovna prahové. 

Identification 412 Threshold Less 0Threshold Value - prahová hodnota, s kterou se porovnává intenzita snímaného světla z okolí zjištěná senzorem.

Identification 030 ComparisonType EqualCompare Result - výstupní port vracející logickou návratovou hodnotu v závislosti na tom, zda zjištěná hodnota byla v námi požadované intenzitě vůči prahové (True) či nikoliv (False).

Identification 502 MeasuredLightLight - návratovou hodnotou výstupního portu je číselná hodnota odpovídající intenzitě snímaného světla v okolí senzoru. 

 

 

Calibrate Reflected Light Intensity - Minimum

Režim sloužící pro kalibraci senzoru, díky kterému nastavíme prahovou hodnotu, která bude senzorem dále vyhodnocována jako minimální a bude tedy označována jako 0. Programový blok v tomto režimu obsahuje jeden vstupní port.

MINIMUM

Identification 502 MeasuredLightValue - hodnota zadávaná při kalibraci senzoru. Dále bude při snímání chápána jako minimum.

 

 

Calibrate Reflected Light Intensity - Maximum

Režim sloužící pro kalibraci senzoru, díky kterému nastavíme prahovou hodnotu, která bude senzorem dále vyhodnocována jako maximální a bude tedy označována jako 100. Programový blok v tomto režimu obsahuje jeden vstupní port.

MAXIMUM

 Identification 502 MeasuredLightValue - hodnota zadávaná při kalibraci senzoru. Dále bude při snímání chápána jako maximum.

 

 

Calibrate Reflected Light Intensity - Reset

Režim sloužící ke zrušení všech změn provedených při kalibraci a tudíž navrácení senzoru opět do výchozího nastavení.

RESET


MOŽNOSTI PRAKTICKÉHO VYUŽITÍ

Světelný senzor snímá veličiny ve svém okolí. Chování robota tak může být ovlivněno určitou hodnotou. Může být reagováno na nízkou či vysokou intenzitu světla. Následkem může být kupříkladu rozsvícení signalizačních diod, výpis na displej, či jiná reakce robota.
Druhou možností využití je světelného senzoru je při pohybu robota. Může totiž snímat povrch po kterém se pohybuje a vyhodnocovat intenzitu odráženého světla od různě barevných povrchů. Využívá se toho například v úlohách, ve kterých se robot pohybuje po předem vytyčené dráze, která má podobu různě zakřivené černé čáry na světlém porchu. Robot se tedy musí pohybovat kupředu a přitom neustále zjištovat, zda se stále nachází nad černou čárou či nikoliv.

VYUŽITÍ Světelného SENZORU

Praktické využití světelného senzoru si ukážeme právě na příkladu, ve kterém se robot pohybuje po černé čáře. Program by měl být univerzální, aby šel použít na různé dráhy. Použijeme tedy robota, jehož řízení bude zajištěno dvěma motory pohánějícími přední kola. V přední části robota bude umístěn světelný senzor namířený směrem dolů, který bude zjišťovat intenzitu odráženého světla od povrchu dráhy.


NXT-G

Pohyb robota po černé čáře

Během realizace programu budeme muset ošetřit několik situací. Nejprve musíme určit mez intenzity světla, při které se bude měnit chování robota. Robot musí neustále zjišťovat, zda se nachází na černé čáře. Bude tedy provádět jakýsi kmitavý pohyb od jedné strany čáry ke druhé. Jakmile zjistí, že je v místě, kde je okraj černé čáry, vnější kolo zrychlí a robot zamíří zároveň vpřed, ale také ke druhému okraji čáry. Musíme si také uvědomit co vrací světelný senzor při snímání černého a světlého povrchu. Pokud snímá intenzitu světla na světlém povrchu, je hodnota podstatně vyšší, než pokud senzor namíříme na černý povrch.

Krok 1 - Rozlišení intenzity světla

Robot musí při průjezdu vytyčenou dráhou zjišťovat, zda se stále nachází nad černou čárou nebo zda náhodou nevyjel mimo. Toto chování bude rozlišeno intenzitou odráženého světla. Pro rozlišení těchto hodnot použijeme blok podmíněného vykonání Blok Switch Switch. Podmínka bude řízena hodnotou ze senzoru, proto v sekci Control zvolíme možnost Sensor. Typ senzoru bude LightSensorDragged Light Sensor (světelný senzor). Zvolíme příslušný port, ke kterému je připojen a přejdeme k nastavení hodnot. V našem příkladu jsme zvolili jako mezní hodnotu 30%. To znamená, že robot bude zjišťovat, zda je snímaná barva tmavší než 30% či nikoliv (0 = nejtmavší, 100 = nejsvětlejší). Mezní hodnotu můžete nastavit i jinou. Záleží na tom, po jakém povrchu se robot pohybuje. Na lesklejších površích může senzor vracet pro stejný barevný odstín jiné hodnoty než na povrchu matném. Kompletní nastavení podmínky vidíte na obrázku.

Sledovac switch blok

Doporučení: před vytvářením programu si nejprve zjistěte intenzitu odráženého světla povrchů, po kterých se bude robot pohybovat. Použijte světelný senzor a hodnou si vypisujte například na displej řídící jednotky. Snáze tak určíte mezní hodnotu.

 

Krok 2 - Pohyb po čáře

Po zjištění, jaký povrch se nachází pod senzorem je nutné nastavit další chování robota. Robot nyní bude provádět kmitavý pohyb od jedné strany čáry ke druhé. Naším úkolem je zde pouze přiřadit do každé části podmínky přesně opačné chování. Jestliže tedy bude intenzita světla nižší jak 30%, budeme chtít, aby se motor B zastavil a naopak motor C prudce vyrazil vpřed. Použili jsme výkon 75%. Díky tomu robot popojede mírně šikmo vpřed a dojede k okraji čáry. Nyní ale chceme, aby nevyjel mimo, ale natočil se opačně a rozjel se k druhému okraji čáry. Do druhé části podmínky tedy vložíme znovu dva bloky MotorDragged Motor a nastavíme jim opačné chování než v první části podmínky. Motor C se nyní zastaví a motor B vyrazí prudce vpřed. Díky tomu bychom měli zaručit, že robot bude kmitavým pohybem neustále pokračovat v jízdě po čáře, kterou neopustí.

 

Krok 3 - Dokončení programu

Potřebujeme, aby se program vykonával neustále dokola, proto celou podmínku umístíme do nekonečného cyklu LoopBig Loop.

 

Výsledný program

Tento styl řešení průjezdu bludištěm po čáře pomocí světelného senzoru patří k těm nejjednodušším. Na obrázku můžete vidět kompletní program.

Sledovac cary komplet

 

Program ke stažení

Stažení ve formátu .rbt

RobotC

POHYB ROBOTA PO ČERNÉ ČÁŘE

Realizace příkladu projetí robota po černé čáře v programovém prostředí RobotC není příliš náročná. Musíme si uvědomit, jak požadujeme, aby se robot v různých situacích choval a na čem jeho chování závisí.

Krok 1 - Deklarace senzoru

Jelikož v programu využijeme světelný senzor, musíme si jej, jako v každém příkladu, kde senzory používáme, nadeklarovat. Deklaraci provedeme pomocí průvodce deklarací v sekci Robot > Motors and Sensors Setup. Výsledný zápis deklarace vidíte níže.

 
#pragma config(Sensor, S1, svetelny, sensorLightActive)
 
 
Krok 2 - Rozlišení intenzity odráženého světla

Robot se při průjezdu po čáře bude orientovat na základě hodnoty zjištěné intenzity světla odrážené od podložky. Bude se jinak chovat pokud zjistí, že je nižší než nastavená mez a jinak pokud bude vyšší. Jako pomyslnou mez jsme si pro potřeby našeho programu zvolili hodnotu 30%. Světelný senzor vrací hodnotu v rozmezí 0 - 100. Hodnota 0 odpovídá černé barvě a 100 bílé barvě. Robot tedy nejprve zjistí, na porvchu jaké barvy se nachází a následně udělá šikmý pohyb vpřed až narazí na okraj čáry. Zde zjistí, že je na okraji, kde už se nachází podklad jiné barvy, a tak vykoná šikmý pohy na opačnou stranu. Tímto kmitavým pohybem ze strany na stanu projede po celé délce čáry.

Doporučení: před vytvářením programu si nejprve zjistěte intenzitu odráženého světla povrchů, po kterých se bude robot pohybovat. Použijte světelný senzor a hodnou si vypisujte například na displej řídící jednotky. Snáze tak určíte mezní hodnotu.

 
Krok 3 - Pohyb po čáře

Nyní již přejdeme k samotnému zápisu kódu. Potřebujeme ošetřit dvě nastalé situace. Použijeme tedy podmínku if(). Jejím parametrem bude skutečnost, kdy hodnota zjištěná světelným senzorem bude nižší než 30. Hodnotu ze senzoru vyjadřujeme příkazem SensorValue(). Zápis tedy bude vypadat takto: SensorValue(svetelny) < 30. V těle podmínky se bude vykonávat samotný pohyb robota. Použijeme tedy příkaz motor[]. Jednomu z motorů nastavíme, aby stál (výkon = 0) a druhý se musí pohybovat vpřed (výkon = 75). Tím jsme ošetřili první možnost, kdy je hodnota intenzity nižší, než je stanovená mez. Zbývá vyřešit druhou možnost. Za podmínku tedy napíšeme slovo else (jinak - druhá možnost podmíněného vykonávání) a doplníme opět příkazy pro ovládání motorů, ovšem s přesně opačnými hodnotami výkonu. Díky tomu zajistíme kmitavý pohyb robota i v opačném směru.

 
 if(SensorValue(svetelny) < 30)
 {
   motor[motorB] = 0;
   motor[motorC] = 75;
 } 
 else
 {
   motor[motorB] = 75;
   motor[motorC] = 0;
 }
 
 
Krok 4 - Dokončení programu

Program by byl takto vykonán pouze jednou a skončil by. Musíme zajistit jeho neustále provádění. Celý programový zápis tedy umístíme do nekonečného cyklu while().

 
Výsledný program
 
#pragma config(Sensor, S1, svetelny, sensorLightActive)
 
task main()
{
while(true)
{
 if(SensorValue(svetelny) < 30)
 {
   motor[motorB] = 0;
   motor[motorC] = 75;
 }
 else
 {
   motor[motorB] = 75;
   motor[motorC] = 0;
 }
}
 
}
 

 

Program ke stažení

Stažení ve formátu .c

1 1 1 1 1 1 1 1 1 1 Hodnocení 2.50 (2 hodnocení)