Senzory¶
Když už umíme ovládat motory, měli bychom se naučit pracovat se senzory. Pomocí senzorů můžeme získávat informace z okolí a reagovat na ně. Lze tak třeba řídit rychlost motorů, podle pozice robota na čáře nebo zastavit robota před překážkou. V EV3CXX jsou k dispozici všechny základní senzory z LEGO MINDSTORMS EV3.
TouchSensor
- dotykový senzor (detekce nárazu, překážky, STOP tlačítko)ColorSensor
- barevný senzor (jízda po čáře, třídění dle barvy)UltrasonicSensor
- ultrazvukový senzor (měření vzdálenosti od překážky nebo mantinelu)GyroSensor
- gyro senzor (určení o kolik stupňů se robot otočil - jízda rovně)
Inicializace¶
Všechny senzory se inicializují:
//ev3cxx::nazev_tridy_senzoru nazev_objektu(ev3cxx::SensorPort::oznaceni_portu);
ev3cxx::TouchSensor touchS(ev3cxx::SensorPort::S1);
Vytvořili jsme tedy objekt touchS
, která je nastavena na port číslo S1
.
Na Bricku můžeme využít všechny porty pro senzory: S1
, S2
, S3
a S4
.
TouchSensor¶
Metody dostupné ve třídě TouchSensor
:
isPressed()
- vracítrue
pokud je senzor zmáčklýwaitForPress()
- čekání, dokud se senzor nezmáčknewaitForRelease()
- čekání, dokud se senzor neuvolníwaitForClick()
- čekání na zmáčknutí a uvolnění senzoru
waitForRelease()¶
void waitForRelease();
Program je pozastaven, dokud nebude dotykový senzor uvolněn.
Varování
Nezapomínejte, že v běžném stavu může být dotykový senzor uvolněn. Volání této metody program pozastaví pouze pokud je v daný okamžik dotykový senzor zmáčknutý.
waitForClick()¶
void waitForClick();
Program je pozastaven, dokud neproběhne zmáčknutí a uvolnění dotykového senzoru.
ColorSensor¶
Barevný senzor může pracovat v několika režimech:
reflected()
- vrací naměřenou intenzitu odrazureflectedRawRgb()
- vrací naměřenou intenzitu odrazu pro jednotlivé barevné složky (RGB - červená, zelená, modrá)ambient()
- vrací naměřenou intenzitu odrazu bez přisvětlení (vhodné pro kalibraci)color()
- vrací rozpoznanou barvu
reflected()¶
int reflected();
Vrací naměřenou intenzitu odraženého světla z povrchu. Lze tak rozpoznat barvu povrchu a například tak detekovat černou čáru na bílém podkladu.
Rozsah výstupních hodnot je od 0 do 100.
Poznámka
Senzor si při své činnosti snímanou plochu přisvětluje vlastními světly, tak aby mohl lépe určit odrazivost povrchu a nebyl tolik závislý na okolním osvětlení.
Přes metodu ambient()
je možné určit odrazivost při vypnutém přisvětlení.
Po odečtení této hodnoty od reflected()
by měly být hodnoty za různých světelných podmínek pro stejné povrchy konstantní.
reflectedRawRgb()¶
rgb_raw_t reflectedRawRgb();
Vrací strukturu s naměřenými hodnotami jednotlivých barevných složek.
Jako návratová hodnota je použita struktura rgb_raw_t
, která obsahuje jednotlivé složky (r,g,b).
Poznámka
Tato metoda nemá odpovídající blok v LEGO Softwaru.
Příklad:
rgb_raw_t rgb_values; rgb_values = colorS.reflectedRawRgb(); rgb_values.r; // RED value rgb_values.g; // GREEN value rgb_values.b; // BLUE value
ambient()¶
int ambient();
Vrací naměřenou intenzitu světla dopadajícího na senzor, ale bez přisvětlení vlastními světly.
Vhodné např. pro kalibraci senzoru pro různá osvětlení. Více informací v poznámce u metody reflected()
.
Rozsah výstupních hodnot je od 0 do 100.
color()¶
colorid_t color();
Vrací rozpoznanou barvu povrchu z výčtového typu enum colorid_t
.
Hodnoty v typu colorid_t
:
COLOR_NONE
- barva nerozpoznánaCOLOR_BLACK
- černá barvaCOLOR_BLUE
- modrá barvaCOLOR_GREEN
- zelená barvaCOLOR_YELLOW
- žlutá barvaCOLOR_RED
- červená barvaCOLOR_WHITE
- bílá barvaCOLOR_BROWN
- hnědá barva
Příklad:
colorid_t color_value; color_value = colorS.color(); if (color_value == COLOR_BLACK) { // sensor on black color }
UltrasonicSensor¶
Ultrazvukový senzor je primárně určen na měření vzdálenosti. Můžeme jej využít pro detekci překážky, určení vzdálenosti od mantinelu nebo i pro korekci jízdy.
Poznámka
Šíření ultrazvukových vln v prostoru
Ultrazvuk v EV3CXX poskytuje tyto metody:
centimeters()
- vrací naměřenou vzdálenost v centimetrechmillimeters()
- vrací naměřenou vzdálenost v milimetrechinches()
- vrací naměřenou vzdálenost v palcíchinchesLine()
- vrací naměřenou vzdálenost v line (1/12 palce)listen()
- vrací zda přijímá signál z jiného ultrazvukového vysílače
Varování
Ultrazvuk v EV3 umí měřit v rozsahu od 3 do 255 centimetrů. Pokud se budete pohybovat na hranici 3 centimetrů, může se stát, že ultrazvuk nedokáže danou vzdálenost změřit a místo hodnoty blízké 3 cm vrátí hodnotu rovnou maximální vzdálenosti => 255 cm.
Pamatujte na tuto vlastnost při návrhu a programování vašich robotů. Nejbezpečnějším řešením je umístit ultrazvuk tak, aby samotná konstrukce nedovolila menší vzdálenost než 4 a více centimetrů.
centimeters()¶
int centimeters();
Vrací naměřenou vzdálenost v centimetrech.
Rozsah měření je od 3 do 255.
Varování
Na rozdíl od LEGO Softwaru, v EV3CXX tato metoda pracuje v celých číslech. Pokud chcete vyšší přesnost použijte metodu millimeters()
.
millimeters()¶
int millimeters();
Vrací naměřenou vzdálenost v milimetrech.
Rozsah měření je od 30 do 2550.
Poznámka
Tato metoda nemá odpovídající blok v LEGO Softwaru. Jelikož ultrazvuk v EV3 má rozlišení na milimetry a v LEGO Softwaru to řeší pomocí desetinných čísel, je v EV3CXX implementována tato metoda.
inches()¶
int inches();
Vrací naměřenou vzdálenost v palcích (1 palec = 2,54 cm).
Rozsah měření je od 1 do 100.
Varování
Na rozdíl od LEGO Softwaru, v EV3CXX tato metoda pracuje v celých číslech. Pokud chcete vyšší přesnost použijte metodu inchesLine()
.
inchesLine()¶
int inchesLine();
Vrací naměřenou vzdálenost v linech (1 line = 1/12 palce).
Rozsah měření je od 10 do 1200.
Poznámka
Tato metoda nemá odpovídající blok v LEGO Softwaru. Jelikož ultrazvuk v EV3 má rozlišení na milimetry a v LEGO Softwaru to řeší pomocí desetinných čísel, je v EV3CXX implementována tato metoda.
listen()¶
int listen();
Senzor poslouchá a pokud zachytí ultrazvukový signál, od jiného vysílače, vrací true
, jinak false
.
GyroSensor¶
Gyroskop umožňuje změřit o kolik stupňů se robot otočil nebo jak rychle se otáčí. EV3 obsahuje jednoosý gyroskop a tak si při stavbě musíte vybrat v jaké rovině chcete měřit.
Gyroskop v EV3CXX poskytuje tyto metody:
angle()
- vrací aktuální úhel natočení ve stupníchrate()
- vrací aktuální rychlost otáčení ve stupních za vteřinureset()
- nastavuje počáteční polohu gyroskopuresetHard()
- provádí úplný restart senzoru
Varování
Gyroskop v EV3 se občas zasekne a začne měnit aktuální úhel (ujíždět), i když se robot nehýbe.
Většinou nepomůže standardní reset()
a proto je v těchto případech potřeba provést resetHard()
.
Při každém vytváření objektu ze třídy GyroSensor se provádí resetHard()
. V tento moment se nesmí gyroskop pohybovat, jinak bude měřit špatně.
angle()¶
int angle();
Vrací aktuální úhel natočení vůči počáteční pozici (odchylku od počáteční pozice). Počáteční pozice se nastavuje při vytváření objektu nebo pomocí metody reset()
.
Rozsah měření je od -32768 do 32767. Při překročení maximální nebo minimální hodnoty (např. 32767 + 1) začne gyroskop vracet hodnotu z druhého konce rozsahu (=> -32768).
Varování
Při použití metody rate()
dochází k restartu počáteční polohy u metody angle()
. Ta pak ukazuje opět od nuly.
reset()¶
void reset();
Nastavuje počáteční polohu gyroskopu pro metodu angle()
a také kalibruje senzor.
Při volání metody reset()
by se Gyro senzor neměl vůbec hýbat. Jinak bude špatně měřit. Dejte pozor na vibrace a dojezdy setrvačností.
Metoda může v některých případech odstranit ujíždění aktuálního úhlu gyroskopu pro metodu angle()
, ale ne vždy funguje.
resetHard()¶
void resetHard();
Provádí úplný restart senzoru. Měl by odstranit problém s ujížděním, kdy ačkoliv se Gyro senzor vůbec nehýbe, jeho poloha má konstantní přírůstek. V tento moment gyroskop nelze využívat a je potřeba jej restartovat.
Poznámka
Tato metoda nemá odpovídající blok v LEGO Softwaru.
Varování
Počítejte s tím, že resetHard()
může trvat i několik sekund a po tuto dobu bude zastaven běh programu.
Je tedy potřeba provádět úplný reset jen v nutných případech a na místech v programu, kde tato prodleva nebude vadit.
Během restartu se nesmi gyroskop pohybovat, jinak nebude měřit správně.
Poznámka
Implementace úplného restartu je v celku jednoduchá.
Aby došlo k restartu, je potřeba přepnout gyroskop mezi režimy v jakých pracuje.
První režim je měří úhel natočení (angle()
) a druhý režim měří rychlost otáčení (rate()
).
Při přepínání mezi těmito režimy dochází k úplnému restartu gyroskopu.
Pro stoprocentní funkčnost se v metodě resetHard()
provádí vícenásobné přepínání (angle()
=> reset()
=> rate()
=> reset()
=> angle()
).
Zdroj 1: https://bricks.stackexchange.com/questions/7115/how-can-ev3-gyro-sensor-drift-be-handled