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ů.

KURZ: Multiplexer vstupů HiTechnic

Při vytváření složitého modelu robota může dojít k situaci, že nám již nebudou dostačovat čtyři vstupní porty, které máme k dispozici. Pokud budeme vytvářet robota, který při své orientaci v prostoru, bude snímat více veličin, je velmi pravděpodobné, že tato situace nastane.

V tomto článku se zaměříme na zařízení, které tuto nepříjemnou situaci dokáže řešit. Jedná se o multiplexer určený pro připojení až čtyř senzorů k jedinému vstupnímu portu. Jedná se o multiplexer od společnosti Hitechnic s označením NSX2020. Multiplexer obsahuje čtyři porty. První z nich je označen NXT a slouží k připojení k řídící jednotce NXT (k některému ze vstupních portů S1 - S4). Dále obsahuje čtyři vstupní porty k připojení senzorů, které jsou označené 1-4. Multiplexer vyžaduje pro svůj chod externí napájení. Napětí je přivedeno z přídavného adaptéru, který je k multiplexeru připojen vodičem. Napájení je provedeno pomocí baterie o napětí 9V.

IMAG0663IMAG0666

Velkou výhodou multiplexeru je, že podporuje většinu nejčastěji používaných senzorů. Jmenovitě se jedná o následující:

Senzory LEGO

  • ultrazvukový senzor,
  • světelný senzor,
  • dotykový senzor,
  • zvukový senzor.

Senzory Hitechnic

  • senzor akcelerace,
  • senzor měření úhlu natočení,
  • barometrický senzor,
  • kompasový senzor,
  • barevný senzor,
  • EOPD senzor,
  • gyroskopický senzor,
  • vysílač IR signálů,
  • přijímač IR signálů,
  • přijímač IR signálů V2,
  • senzor pro měření magnetického pole.

PRÁCE S multiplexerem V PROGRAMOVACÍCH PROSTŘEDÍCH

NXT-G

Ovládání multiplexeru

Rozcestník


Připojení multiplexeru a senzorů

Pro každé vstupní zařízení existuje v programovacím prostředí NXT-G speciální programový blok. Bloky pro všechny senzory, které multiplexer podporuje, naleznete ke stažení ZDE. Bloky následně naimportujte do programovacího prostředí. Pokud nevíte jak na to, ZDE naleznete návod.

Programové bloky se od těch klasických, liší jen jedním rozdílem. Obsahují volby portů, ke kterým jsou jednolivá zařízení připojena.

NXT -> MUX

Pokud je u bloku aktivní volba připojení z řídící jednotky NXT do multiplexeru (MUX), tak právě volíme, ke kterému vstupnímu portu řídící jednotky NXT je multiplexer připojen.

NXT MUX

MUX -> Sensor

Pokud je u programového bloku aktivní volba propojení z multiplexeru (MUX) do senzoru, nastavujeme právě, ke kterému vstupnímu portu multiplexeru je daný senzor připojen.

MUX SENSOR

 Přepínání mezi těmito dvěma volbami je realizováno pomocí tlačítka PREPINAC umístěného v pravé části.


Praktické využití

Na obrázku můžete vidět praktické použití multiplexeru vstupních senzorů. Pro ovládání ultrazvukového a světelného senzoru byly použity speciální bloky, které slouží k připojení k multiplexeru. Můžete vidět, že jediné čím se ve svém vzhledu liší od klasických, je označení v levém horním rohu. Je zde umístěna černá ikona multiplexeru a číslo, které označuje, ke kterému ze čtyř portů multiplexeru je senzor připojen. Číslo v pravém horním rohu označuje, ke kterému vstupnímu portu řídící jednotky je připojen multiplexer (port 1). Oba vstupní senzory snímají hodnoty, které následně vypisují na displej řídící jednotky. Stejným způsobem bychom na vstupní port 1 mohli díky multiplexeru připojit další dva senzory.

 

SMUX senzory

RobotC

Příkazy pro ovládání multiplexeru

Rozcestník


Deklarace MULTIPLEXERU

Multiplexer vstupů patří mezi rozšiřující zařízení. Pro jeho využívání tak musíme volat vývojovou knihovnu, která obsahuje příslušné ovladače. Pokud není knihovna obsažena ve vaší instalaci programovacího prostředí RobotC, můžete si jí stáhnout společně s ovladači pro další rozšiřující senzory ZDE. Knihovna multiplexeru se nazývá hitechnic-sensormux.h. Její zavolání v programu provedeme následovně:

 
#include "hitechnic-sensormux.h"
 

Dále musíme deklarovat jeho připojení k řídící jednotce NXT. Deklarace se skládá z klíčového slova #pragma a příkazu config(), který obsahuje v závorce čtyři parametry. První označuje, o jaké vstupní zařízení se jedná. Jelikož multiplexer slouží pouze k připojení senzorů, první parametr bude vždy Sensor. Druhý vyjadřuje, ke kterému vstupnímu portu řídící jednotky NXT je připojen (S1-S4). Třetí parametr je volitelný. Uživatel si zde volí název připojeného zařízení, který bude poté používat v programu. Poslední parametr je určení typu zařízení. Rozšiřující moduly spadají do skupiny sensorI2CCustom. Standardně je deklaraci možné provádět automaticky pomocí funkce programovacího prostředí RobotC pro konfiguraci motorů a senzorů. Ve výběru připojitelných zařízení ovšem nenalezneme multiplexer vstupů a tak budete muset deklaraci zapsat ručně.

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

Deklarace senzorů připojených k multiplexeru

Nyní již víme, jak v programu deklarovat mutliplexer vstupních zařízení. Musíme ovšem ještě nadeklarovat senzory, které jsou k němu připojeny. Jelikož každý ze senzorů nebude připojen přímo k řídící jednotce, musíme pro něj zavolat speciální ovladače, na jejichž stažení naleznete odkaz výše. Volání vývojové knihovny poté vypadá naprosto stejně jako v případě multiplexeru. Pro úplnost uvedeme příklad volání knihovny pro použití dotykového senzoru.

 
#include "lego-touch.h"
 

Abychom mohli senzor připojený k multiplexeru používat, musíme ještě programově zapsat, ke kterému portu multiplexeru je připojen. To se provádí pomocí deklarované konstanty. Konstanta je typu tMUXSensor, což je skupina senzorů připojitelných k multiplexeru. Následuje volitelný název senzoru (v našem příkladu DOTYK). Konstantě poté přiřazujeme označení portu, které je definované ve vývojové knihovně mutiplexeru. Skládá se z výrazu msensor, následuje podtržítko a označení vstupního portu řídící jednotky, ke které je multiplexer připojen (S1-S4). Za označením portu následuje opět podtržítko a označení portu, ke kterému je na multiplexeru senzor připojen (1-4). U zápisu vycházíme z předdefinované knihovny funkcí.

 
const tMUXSensor DOTYK = msensor_S1_1;
 

Praktické využití

Použití multiplexeru si ukážeme na krátkém příkladu. V úvodu vidíte jeho deklaraci, po které následuje volání knihoven. K multiplexeru jsou připojeny dva dotykové senzory. Při stisku prvního z nich, který je připojen k 1. portu multiplexeru se na displeji objeví text "Senzor 1". Při stisku druhého "Senzor 2". Program by bylo možné rozšířit klidně na čtyři dotykové senzory. Výhodou je, že ať již jsou dva nebo čtyři, k řídící jednotce jsou díky multiplexeru připojeny pouze k jednomu vstupnímu portu.

 
// deklarace multiplexeru
#pragma config(Sensor, S1, HTSMUX, sensorI2CCustom)
 
// volani knihoven
#include "hitechnic-sensormux.h"
#include "lego-touch.h"
 
// deklarace pripojenych senzoru
const tMUXSensor DOTYK = msensor_S1_1;
const tMUXSensor DOTYK2 = msensor_S1_2;
 
task main() {
 eraseDisplay();
 while (true) {
  // zjistovani, ktere tlacitko bylo stisknuto
  if (TSreadState(LEGOTOUCH))
   nxtDisplayCenteredBigTextLine(3, "Senzor 1");
  if (TSreadState(LEGOTOUCH2))
   nxtDisplayCenteredBigTextLine(3, "Senzor 2");
  wait1Msec(50);
 }
}
 

1 1 1 1 1 1 1 1 1 1 Hodnocení 5.00 (1 hodnocení)

KURZ: Rozdělovač vstupů MindSensors

Při využívání senzorů a dalších vstupních zařízení máme k dispozici 4 vstupní porty řídící jednotky NXT. V některých případech ovšem nemusí dostačovat. V této kapitole se zaměříme na zařízení, která nám umožní zvýšit počet vstupních portů. Jedním z těchto zařízení je SPLIT-Nx-v2 od společnosti Mindsensors. Jedná se o rozdělovač, který umožňuje připojit až tři senzory. Jeho čtvrtý port je připojen na některý ze vstupních portů řídící jednotky. Na jeden vstupní port kostky tak můžeme zasílat data ze tří senzorů současně.

IMAG0658IMAG0657

Nevýhodou rozdělovače je, že podporuje pouze velmi málo senzorů a dalších zařízení. Z nejběžněji používaných se jedná o ultrazvukový a kompasový senzor. Konkrétně rozdělovač podporuje následující senzory a zařízení (uvádíme standardizované názvy v angličtině):

  • LEGO Ultrasonic Sensor (může být připojen pouze jeden),
  • Magnetic compass for NXT (CMPS-Nx),
  • Multi-sensitivity Acceleration Sensor for NXT (ACCL-Nx-v3),
  • RCX Motor Multiplexer for NXT (MTRMX-Nx),
  • Sony PlayStation 2 Controller interface for NXT (PSP-Nx-v3),
  • High Precision Infrared distance sensor for NXT (DIST-Nx-v2, DIST-Nx-v3 – Long/Short/Medium),
  • 8 Channel Servo Controller for NXT (NXTServo-v2),
  • Vision Subsystem for NXT (NXTcam-v2, NXTCam-v3),
  • PF Motor Controller (PFMate),
  • Human Interface Device for NXT (NXTHID),
  • Line Sensor Array for NXT (NXTLineLeader),
  • Power Meter for NXT (NXTPowerMeter),
  • Sensor Kits with PCF8574 and PCF8591 ICs.

PRÁCE Se rozdělovačem V PROGRAMOVACÍCH PROSTŘEDÍCH

NXT-G

Ovládání Rozdělovače

Rozdělovač SPLIT-Nx-v2 nevyužívá pro programování v programovacím prostředí NXT-G žádný vlastní programový blok. Jeho funkčnost je zajištěna dynamickým přidělováním I2C adres připojeným zařízením na sběrnici.

V některých případech může nastat problém v přidělování adresy a dvě připojená zařízení nemusí fungovat správně, případně fungovat vůbec. Je proto dobré před vytvářením programu vyzkoušet, zda zařízení připojená ke slučovači správně pracují.

 

Praktické využití

Ovládání senzorů připojených k rozdělovači je v programovacím prostředí NXT-G prováděno pomocí adresace připojených zařízení na I2C sběrnici. Ze senzorů, kterým se v kurzu věnujeme, podporuje rozdělovač pouze ultrazvukový a kompasový senzor. Ultrazvukový senzor je možné k rozdělovači připojit pouze jeden. Jelikož ultrazvukový i kompasový senzor mají stejnou I2C adresu, není možné je prostřednictvím rozdělovače používat současně. Můžeme tedy použít pouze jeden z nich a k nim připojit dva libovolné digitální senzory či jiné moduly, které jsou vyjmenované výše.

RobotC

OVLÁDÁNÍ Rozdělovače

Ovládání senzorů připojených k rozdělovači je v programovacím prostředí RobotC prováděno pomocí adresace připojených zařízení na I2C sběrnici. Nastává zde tedy stejný problém jako u NXT-G. Před použitím doporučujeme vyzkoušet funkčnost senzorů ve spojení s rozdělovačem.

1 1 1 1 1 1 1 1 1 1 Hodnocení 5.00 (1 hodnocení)

KURZ: Vyhledávač IR signálů

Vyhledávač IR signálů je senzor, který ve svém okolí detekuje infračervené signály. Návratovou hodnotou senzoru je směr, ze kterého byl signál přijat v podobě čísla sektoru (1-9), do kterých je přijímací plocha senzoru rozdělena. Přijímání infračervených signálů můžeme při použití LEGO Mindstorms NXT využít například pro detekci infračerveného míče, který tento signál vysílá. Pomocí senzoru tak zjistíme, na jaké pozici vůči senzoru se míč nachází a na základě tohoto zjištění poté manipulujeme s robotem.

Druhá verze vyhledávače IR signálů dokáže pracovat ve dvou módech. Prvním je modulovaný AC a druhý nemodulovaný DC. Rozdíl je v typu přijímaných signálů. V AC módu dokáže detekovat pouze modulované signály, které vysílá například infračervený míč. V nemodulovaném DC módu detekuje senzor všechny infračervené signály. Může tak být ovlivňován i slunečním svitem.

PRÁCE S vyhledávačem IR signálů V PROGRAMOVACÍCH PROSTŘEDÍCH

NXT-G

Blok pro ovládání vyhledávače IR signálů

Rozcestník


UMÍSTĚNÍ BLOKU

Vyhledávač IR signálů je v programovacím prostředí NXT-G řízen blokem IRSeekerV2Dragged IRSeeker Sensor V2. 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ů.

 

IRseekerV2 block

 

POPIS BLOKU

Programový blok vyhledávače IR signálů obsahuje celkem 8 konektorů pro propojení s ostatními bloky.

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

IRDirection IRDirection - výstup, který vyjadřuje hodnotu v podobě sektoru, ze kterého byl IR signál přijat.

Mode Mode - konektor, který značí, zda vyhledávač pracuje v módu AC nebo DC.

Boolean Detect - výstup, který v podobě logické hodnoty vyjadřuje, zda byl nebo nebyl detekován IR signál.

Number Strength1označuje hodnotu síly signálu v kanálu 1.

Number Strength2 - označuje hodnotu síly signálu v kanálu 2.

Number Strength3  - označuje hodnotu síly signálu v kanálu 3.

Number Strength4  - označuje hodnotu síly signálu v kanálu 4.

Number Strength5 - označuje hodnotu síly signálu v kanálu 5.

 

PARAMETRY BLOKU

IRseekerV2

Port: vyjadřuje, ke kterému ze vstupních portů je vyhledávač IR signálů připojen.

Mode: značí, zda vyhledávač pracuje v módu AC nebo DC.

RobotC

PŘÍKAZY PRO OVLÁDÁNÍ vyhledávače IR signálů

Rozcestník


NASTAVENÍ SENZORU

Stejně jako u použití jiných senzorů, je i u vyhledávače IR signálů před započetím práce nutné provést deklaraci senzoru. Robotickým prostředím RobotC automaticky generovaný zápis, 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. 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í parametr deklarace je standardizovaný název senzoru (v případě vyhledávače IR signálů = sensorHiTechnicIRSeeker1200).

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

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


NASTAVENÍ TYPU SENZORU

Deklarace senzoru pomocí průvodce není jediná možnost. Druhou variantou deklarace je pomocí příkazu SensorType[]. Parametrem tohoto příkazu je název senzoru, který musí být nejprve nadeklarován pro třídu tSensors, která definuje rozšiřující moduly v prostředí RobotC. Pro úplnost zápisu musíme k příkazu přiřadit standardizovaný název senzoru (vyhledávač IR signálů = sensorHiTechnicIRSeeker1200).

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í Deklarace motorů a senzorů v horní liště menu.

 
tSensors IRvyhledavac;
SensorType[IRvyhledavac] = sensorHiTechnicIRSeeker1200;
 

Práce s hodnotou snímanou senzorem

Vyhledávač IR signálů vrací výstupní hodnotu, která je rovna číslu od 1 do 9. Toto číslo vyjadřuje směr kolem senzoru, ze kterého byl infračervený signál přijat. Naše zařízení nebo robot tak může podle tohoto zjištění reagovat. Můžeme například vytvořit program, ve kterém se bude robot opatřený IR vyhledávačem natáčet za zdrojem infračervených signálů.

Hodnotu zjištěnou senzorem vyjadřujeme pomocí příkazu SensorValue[]. Jeho parametrem v závorce je název senzoru, který jsme si nadefinovali v úvodní deklaraci. Možný zápis příkazu vidíte níže.

 
SensorValue[IRvyhledavac] == 5;
SensorValue[IRvyhledavac] > 5
 

Využití předdefinovaných metod

Stejně jako u ostatních rozšiřujících modulů, tak i u vyhledávače IR signálů nalezneme buďto v instalačních souborech programového prostředí RobotC nebo na stránkách výrobce (můžete si ji stáhnout ZDE) vývojovou knihovnu obsahující ovladače pro senzor. Knihovnu ovšem musíme nejprve v programu zavolat. Provedeme to v jeho úvodu následovně:

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

Úkolem vyhledávače infračervených signálů je vracet číslo, které označuje sektor vyjadřující směr přijetí signálu. Ve vývojové knihovně nalezneme k tomuto účelu dvě předdefinované funkce. Jejich návratový typ je v obou případech datového typu integer. První funkce se nazývá HTIRS2readDCDir(). Vrací nám číslo od 0 do 9, označující sektor, ze kterého byl signál přijat v nemodulovaném DC módu. Druhá se nazývá HTIRS2readACDir(). Její funkce je naprosto totožná jako u předchozí. Ovšem tato funkce vrací hodnotu zjištěnou v modulovaném AC módu. Parametrem uváděným v závorce je u obou volitelný název senzoru, který si uživatel definuje při deklaraci senzoru.


MOŽNOSTI PRAKTICKÉHO VYUŽITÍ

Vyhledávač infračervených signálů slouží k detekci směru, ze kterého vychází zdroj vysílání infračerveného signálu. Můžeme ho proto využít v úlohách, ve kterých budeme mít takovýto zdroj k dispozici. Nejčastěji se ovšem tento modul využívá v robotickém fotbale. Ten se hraje se speciálním infračerveným míčem, který obsahuje vysílač infračervených signálů. Robot tak díky vyhledávači IR signálů detekuje směr, odkud signál přichází a může reagovat na změnu pozice míče. Jeho úkolem je poté vsítit soupeři branku. Pro robotický fotbal se samozřejmě nepoužívá pouze vyhledávač IR signálů. Při řešení této úlohy je důležité zohlednit i další aspekty. Například směr k soupeřově brance, který určujeme kompasovým senzorem. Detekce stěn hracího pole pomocí ultrazvukového senzoru a podobně.

VYUŽITÍ vyhledávače IR signálů

Na jednoduchém příkladu si ukážeme, jak by robot mohl pomocí vyhledávače IR signálů reagovat na změnu polohy infračerveného míče v robotickém fotbale. Pokusíme se vytvořit program, díky kterému se robot v případě, že se infračervený míč bude nacházet přímo před ním, krátce, ale prudce rozjede a posune tak míč směrem k soupeřově brance.

NXT-G

Detekce polohy míče

Při vytváření programu je nejprve důležité si rozmyslet, co všechno musíme ošetřit. Robot se musí pohybovat tak, aby zjistil, kde se nachází míč. Jakmile se míč bude nacházet přímo před ním, tedy ve výseči číslo 5 vyhledávače, musí zareagovat. Adekvátní reakcí bude prudký pohyb vpřed, kterým se pokusí "kopnout" do míče.

Krok 1 - Vyhledávání míče

První krok, který zrealizujeme, bude to, aby robot dokázal rozlišit, jestli se před ním nachází míč či nikoliv. Zjišťovat bude tuto skutečnost tak, že se bude točit kolem své osy. Nejprve použijeme dva bloky MotorDragged Motor. Jeden pro motor A a druhý pro motor B. Zvolíme příslušné porty, ke kterým jsou připojeny a každému z nich nastavíme opačné otáčení. Jeden se bude otáčet vpřed a druhý vzad. Rychlost otáčení jsme zvolili 50%. Tento pohyb bude prováděn stále dokola.

Dále musí robot zjistit, jestli se před ním nenechází infračervený míč. Použijeme tedy blok IRSeekerV2Dragged IR Seeker Sensor v2. Nyní budeme ověřovat, zda se míč nenachází přímo před senzorem, tedy v sektoru číslo 5. Ověříme, jakou hodnotu vrací senzor na výstupu IRDirection IRDirection. Tento výstup přivedeme na vstup bloku FPNumericComparisonDragged Compare, kde budeme porovnávat, zda je tato hodnota rovna 5.

V současné situaci by ověření proběhlo pouze jednou a program by skončil. My ale chceme, aby ověřování probíhalo neustále. Všechny čtyři bloky tak umístíme do cyklu LoopBig Loop. Jeho řízení bude prováděno pomocí hodnoty logického datového typu (Logic). Ukončení tohoto cyklu tak bude závislé na splnění podmínky uvnitř (IRDirection = 5). Pokud bude splněna podmínka, cyklus se ukončí a program pokračuje dále. Výstup Result bloku FPNumericComparisonDragged Compare tak přivedeme na konektor cyklu. 

detekce mice vyhledavani

 
Krok 2 - Reakce

Náš robot už nyní dokáže zjistit, zda se před ním nachází infračervený míč či nikoliv. Nyní musí pouze zareagovat, pokud bude míč přímo před ním. Při splnění podmínky musí "kopnout" do míče. Použijeme blok MoveDragged Move, zvolíme příslušné motory, směr vpřed a pohyb trvající půl vteřiny. Ještě před tento blok ale umístíme dva bloky MotorDragged Motor, které budou zastavovat motory A a B. Při okamžitém přechodu z rotačního pohybu v prudký pohyb vpřed by se totiž mohlo stát, že robot díky setrvačnosti v pohybu infračervený míč mine.

Aby robot i po prvním "kopnutí" pokračoval v hraní fotbalu, musíme ještě všechny bloky umístit do cyklu LoopBig Loop, u kterého nastavíme nekonečné provádění.

 

Výsledný program

Po správné realizaci jednotlivých kroků by měl program vypadat tak, jak vidíte na obrázku. Tento program není kompletním řešením pro realizaci robotického fotbalu. Pro správné řešení bychom museli použít i další moduly a vyřešit mnoho dalších situacích. Tento program slouží pouze jako demonstrace funkce vyhledávače IR signálů

IR seeker priklad

 

Program ke stažení

Stažení ve formátu .rbt

RobotC

DETEKCE POLOHY MÍČE

Při řešení programu v programovacím prostředí RobotC musíme nejprve deklarovat vyhledávač IR signálů. Následně je důležité programově zapsat konstrukt, díky kterému robot detekuje infračervený míč. Na závěr musí robot provést "kopnutí" do míče.

Krok 1 - Deklarace senzoru

Stejně jako v jiných úlohách, ve kterých použijeme některý ze senzorů, tak i v tomto musíme nejprve vyhledávač IR signálů nadeklarovat. Deklaraci je možné zapsat buďto ručně nebo pomocí průvoce deklarací. Deklarace se skládá klíčového slova #pragma a příkazu config(), který obsahuje čtyři parametry. První označuje, že se jedná o senzor (Sensor). Druhý označuje port, ke kterému je senzor připojen (S1-S4). Třetí parametr je volitelný a uživatel si zde volí název senzoru, který bude posléze používat v programu. Poslední je standardizovaný název senzoru (sensorHiTechnicIRSeeker1200).

 
#pragma config(Sensor, S1, vyhledavac, sensorHiTechnicIRSeeker1200)
 
 
Krok 2 - Reakce

Nyní již můžeme začít s vytváření programu. Nejprve musíme zajistit, aby robot dokázal rozlišit, zda se před ním nachází infračervený míč či nikoliv. Konkrétně musí být umístěn ve výseči číslo 5 přímo před senzorem. Použijeme podmínku if(), jejíž parametr v závorce bude, že hodnota zjištěná senzorem bude rovna 5 (SensorValue(vyhledavac) == 5). V tomto okamžiku musí ustat veškerý pohyb robota, to znamená, že oběma motorům přiřadíme nulovou rychlost. Tento úkon jsme nastavili pouze na krátký časový úsek (200 milisekund). Následně se prudce rozjede kupředu. Vteřinu pojedou oba motory vpřed rychlostí 75%.

 
if (SensorValue(vyhledavac) == 5)
 {
   motor[motorA]=0;
   motor[motorB]=0;
   wait1Msec(200);
   motor[motorA]=75;
   motor[motorB]=75;
   wait1Msec(1000);
 }
 
 
Krok 3 - Detekce míče

Po zjištění, že se před robotem nachází infračervený míč, do něj musí robot "kopnout". Kopnutí jsme provedli příkazem motor[]. Podobným způsobem provedeme i detekci míče. Robot se bude při detekování otáčet kolem své osy tak dlouho, dokud míč nenajde. Za podmínku if() vložíme else a použijeme opět dva příkazy motor[] pro motory A a B. Oběma nastavíme rychlost 20% pro otáčení, ovšem každému opačným směrem.

 
 motor[motorA]=20;
 motor[motorB]=-20;
 

 

Výsledný program

Po správné realizaci jednotlivých kroků byste měli dojít k úspěšnému vytvoření úlohy. Nesmíme zapomenout na to, že celý kód musí být umístěný v nekonečném cyklu while(). Hotový program můžete vidět níže.

 
#pragma config(Sensor, S1, vyhledavac, sensorHiTechnicIRSeeker1200)
// deklarace senzoru
 
task main()
{
while(true)
{
 // otaceni a detekce mice
 if (SensorValue(vyhledavac) == 5)
 {
   motor[motorA]=0;
   motor[motorB]=0;
   wait1Msec(200);
   motor[motorA]=75;
   motor[motorB]=75;
   wait1Msec(1000);
 }
 else
 {
   motor[motorA]=20;
   motor[motorB]=-20;
 }
}
}
 

 

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í)

KURZ: Senzor akcelerace

Senzor akcelerace neboli zrychlení umožňuje sledovat, s jakým zrychlením se pohybuje náš robot. Jeho pomocí se také sleduje chování robota a pomocí získaných hodnot se dají eliminovat nežádoucí pohyby, které by mohly ohrozit robotovu stabilitu. Zrychlení je měřeno ve třech osách. Jedná se o osu x, y a z. Osa x je osa souběžná s tělem senzoru. Osa y označuje směr z jedné boční strany senzoru na druhou. Tato osa je k dispozici spíše jako výstupní hodnota. Osa z je stejně jako osa y výstupní hodnota a vyjadřuje měření ve směru od spodní hrany senzoru k horní. Zrychlení se pomocí senzoru akcelerace dá měřit v rozsahu od -2G do +2G. Měření zrychlení není jedinou funkcí senzoru. Dokáže také měřit náklon robota.

PRÁCE Se senzorem akcelerace V PROGRAMOVACÍCH PROSTŘEDÍCH

NXT-G

Blok pro ovládání senzoru akcelerace

Rozcestník


UMÍSTĚNÍ BLOKU

Senzor akcelerace je v programovacím prostředí NXT-G řízen blokem AccelerationSensorDragged Acceleration 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ů.

 
Acceleration sensor block

 

POPIS BLOKU

Programový blok senzoru akcelerace obsahuje celkem sedm konektorů pro propojení s dalším bloky.

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

Number x - výstup vyjadřující hodnotu naměřenou ve směru osy x.

Number y - výstup vyjadřující hodnotu naměřenou ve směru osy y.

z z - výstup vyjadřující hodnotu naměřenou ve směru osy z.

Boolean Yes / Nohodnota logického datového typu vyjadřující výsledek porovnání zrychlení na ose x.

TriggerPoint Trigger Pointv programovacím prostředí nastavená hodnota zrychlení určená k porovnání s hodnotou naměřenou senzorem.

GreaterLess Greater / Less - vstupně výstupní konektor určující znaménko k porovnání hodnot.

 

PARAMETRY BLOKU

Acceleration sensor

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

Compare: část bloku, ve které je možné pomocí tažítka nastavit hodnotu pro osu x určenou k porovnání s hodnotou naměřenou senzorem. Rozsah hodnot je zde možné volit od -400 do +400. Hodnotu je možné nastavit buďto pomocí tažítka nebo přímým zadáním hodnoty do menšího bloku. V rozbalovacím menu jsou k dispozici znaménka určená pro porovnání.

RobotC

Příkazy pro ovládání senzoru akcelerace

Rozcestník


Nastavení senzoru

Před započetím práce se senzorem akcelerace je nutné jej v programovacím prostředí RobotC nadeklarovat. Zápis deklarace 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 (sensorI2CHiTechnicAccel = označení senzoru akcelerace).

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

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


nastavení typu senzoru

Druhou možností deklarace senzoru je definování pomocí  příkazu SensorType[]. Parametrem v závorce je volitelný název senzoru, který je předem definován pro třídu tSensors, která pro programovací prostředí RobotC definuje rozšiřující moduly. K nadefinovanému názvu senzoru poté přiřadíme konkrétní typ senzoru podle jeho označení pro RobotC (např. sensorI2CHiTechnicAccel = označení senzoru akcelerace).

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í Deklarace motorů a senzorů v horní liště menu.

 
tSensors akceleracni;
SensorType[akceleracni] = sensorI2CHiTechnicAccel;
 

Práce s hodnotou snímanou senzorem

Během vyhodnocování nebo porovnávání hodnot snímaných senzorem a fixních hodnot zadaných uživatelem, budeme využívat příkaz k práci s touto hodnotou. V programovacím prostředí RobotC se k této činnosti používá příkaz SensorValue[]. Parametrem tohoto příkazu je předem definovaný název senzoru. Tomuto příkazu může být poté přiřazena určitá hodnota k porovnání s hodnotou ze senzoru.

 
SensorValue[sensorAccel] > 60; // Nastaveni hodnoty senzoru, ktera ma byt porovnana s urcitou fixne zadanou hodnotou.
 

V programovacím prostředí RobotC je připravena vývojová knihovna, která nese název AdvancedSensors.c. Slouží k tomu, abychom mohli provádět s rozšiřujícími senzory pokročilejší operace. V jejím těle jsou předdefinovány některé výpočtové operace, které nám umožní získat jednoduše data z rozšiřujících senzorů. Zavolání tohoto souboru provedeme následovně:

 
#include "AdvancedSensors.c"
 

Pro senzor akcelerace je zde nadefinována funkce getAccel(), která umožňuje získat hodnotu zrychlení v osách x, y a z. Zavoláním funkce getAccel(), která má čtyři parametry - název senzoru a tři hodnoty zjišťujeme, jaké jsou aktuálně snímané hodnoty senzorem. Celý zápis můžete vidět níže.

 
 int X;
 int Y;
 int Z;
 
 getAccel(akceleracni, X, Y, Z);
 


MOŽNOSTI PRAKTICKÉHO VYUŽITÍ

Senzor akcelerace je takzvaný trojosý senzor. Měří totiž zrychlení ve třech osách senzoru. Díky tomu nemusíme s jeho pomocí měřit pouze zrychlení, ale také náklon robota. Tento senzor nám tak umožňuje určovat polohu robota přesněji, než je tomu například u gyroskopického senzoru. Využívá se hlavně jako stabilizační prvek robota. Při nežádoucím pohybu robota můžeme reagovat pohybem, který pohyb ustálí a předejdeme tak pádu modelu. Velmi často se akcelerační senzor také používá u různých herních konzolí a ovladačů. Pomocí monitorování změn na třech osách senzoru můžeme určovat pohyb při ovládání.

NXT-G

VYUŽITÍ SENZORU AKCELERACE

Použití senzoru jako stabilizačního prvku si často vyžaduje vytvoření složitějšího programového konstruktu. Jeho funkci si ukážeme na analýze dat, která zjišťuje. Vytvoříme si jednoduchý program a prozkoumáme, jaký průběh mají křivky vykreslené do grafu pomocí zjištění hodnot všech tří os senzoru. Zároveň si tak blíže představíme funkci Data Logging.

Zobrazení snímaných hodnot

Před analýzou hodnot si musíme vytvořit vhodný program. Použili jsme stejný program jako u analýzy dat gyroskopického senzoru. Jedná se o program, ve kterém se nejprve robot pohybuje vpřed, poté se natočí nejprve vlevo a poté vpravo a nakonec vyrazí kupředu vyšší rychlostí než v úvodu. Pomocí funkce Data Logging programovacího prostředí NXT-G nakonec zanalyzujeme hodnoty zjištěné senzorem a zobrazené v grafu.

Vytvoření programu 

Na obrázku níže můžete vidět finální podobu programu pro analýzu. Robot se nejprve rozjede vpřed pomocí bloku MovePaletteDragged Move po dobu tří vteřin. Následně je pomocí bloků MotorDragged Motor realizováno nejprve natočení o 360° vlevo a poté o 360° vpravo. Nakonec robot vyrazí vpřed dvojnásobnou rychlostí než při rozjetí, opět po dobu tří vteřin. Pro analýzu dat musíme ještě na úvod programu umístit blok StartDatalogDragged Start Datalog a na konec programu StopDatalogDragged Stop Datalog.

accel program

Musíme ještě provést nastavení bloku pro Data Logging. Důležité je hlavně nastavení dostatečného počtu zaznamenaných vzorků dat za sekundu. Nastavili jsme frekvenci snímání 10 sekund za sekundu, což je dostačující. Na port 1 připojíme senzor a navolíme ho v nastavení.

datalog nastaveni 

Analýza dat

Po spuštění programu provedeme pomocí vestavěné funkce pro zaznamenávání dat Data Logging analýzu dat. Zanalyzujeme nejprve hodnoty zjištěné na každé ose zvlášť a nakonec jejich průběhy porovnáme.

Osa X

První osou, na kterou se zaměříme bude osa X. Na náš model robota jsme umístili senzor na přední část, nasměrovaný přímo před robota. Osa X je ta, která směřuje přímo před přední část robota. Měla by tedy měřit zrychlení při pohybu vpřed. Na obrázku níže vidíte průběh hodnot zaznamenaný do grafu. Na křivce je patrný nárůst hodnot po rozjetí robota. Následně se křivka ustálí, protože robot se pohybuje konstantní rychlostí vpřed. Velmi dobře patrné je také natočení vpravo a vlevo. Po započetí natáčení hodnota také lehce naroste. Další nárůst hodnot můžeme vidět také u opětovného rozjetí vpřed. Jelikož při zastavení z vysoké rychlosti robot prudce sníží svoji rychlost a kola se o malinký úsek natočí zpět, můžeme na grafu vidět i prudkou změnu zrychlení do záporných hodnot a okamžitý nárůst do hodnot kladných, na konci programu.

Na základě analýzy této křivky tedy můžeme konstatovat, že senzor přesně zachytil okamžiky, kdy robot změnil svoji rychlost v přímém směru.

X

Osa Y

Osa Y směřuje při našem umístění senzoru do bočních stran robota. Monitoruje tedy zrychlení vpravo a vlevo. Pokud se podíváme na křivku průběhu zaznamenaných hodnot, vidíme, že kmitání je po celou dobu programu přibližně stejně velké. Je to z toho důvodu, že se robot pohyboval po ne úplně rovném povrchu. Je navíc aktivováno řízení pohybu robota, které zajišťuje jeho rovnoměrný pohyb vpřed. Mírné dorovnávání přímého pohybu tedy zapříčiní lehké nachylování do stran. Tuto změnu natáčení tedy senzor také zachytil. Na obrázku níže můžete vidět velice dobře patrný úsek, ve kterém se robot natáčel na obě strany. Na začátku a na konci tohoto pohybu je velmi dobře patrná změna hodnot (zrychlení).

Po analýze hodnot snímaných na ose Y, můžeme na obrázku zřetelně vidět, že senzor přesně zachytil okamžik, kdy se robot vychýlil z přímého směru.

Y

Osa Z

Jako poslední se podíváme na hodnoty snímané v ose Z. Hodnoty jsou snímané ve vertikálním směru senzoru. Na obrázku níže můžete vidět průběh hodnot. Při prudkém rozjezdu je patrný jejich nárůst. Další velmi patrnou změnu můžeme vidět při opětovném rozjezdu vpřed. Jelikož rychlost robota zde dvojnásobně vzrostla, došlo při prudké akceleraci k přizvednutí čelní části robota. Hodnota je proto rozdílná od prvního pohybu vpřed. Velmi dobře partné je také zastavení robota. Při prudkém zastavení opět došlo k mírnému vertikálnímu pohybu robota, což senzor znovu zaznamenal.

Nezvyklý je posun hodnot po ose X grafu. Hodnoty se nezaznamenávají od 0, ale jejich nejnižší hodnota se pohybuje kolem 200 m/s. Senzor akcelerace totiž v této poloze měří gravitační zrychlení. Díky tomu je hodnota neustále takto vysoká.

Z

Porovnání hodnot

Na posledním obrázků můžete vidět průběh hodnot měřených na všech třech osách v jediném grafu. Zeleně je znázorněna osa X, modře osa Y a červeně osa Z. V grafu jsou znázorněny také všechny tři části programu (rozjetí, natáčení, opětovné rozjetí).

Na této analýze můžete vidět, že senzor akcelerace je skutečně užitečný nástroj, který dokáže přesně snímat pohyby robota ve všech třech směrech. Při správném vyhodnocení můžeme následně na jednotlivé změny reagovat podle potřeby.

porovnani

RobotC

VYUŽITÍ SENZORU AKCELERACE

Jelikož v programovacím prostředí RobotC chybí funkce, která by graficky zobrazovala snímané hodnoty ze senzoru, představíme si možnosti práce se senzorem akcelerace na jiném příkladu. Nemusíme jej totiž používat pouze pro zjišťování hodnot, ale také jako řídící prvek. Sestrojili jsme si z technických dílů stavebnice ovládací páku podobnou kniplu letadla, která se pohybuje pomocí spodního pohyblivého kloubu do všech směrů. Vzhled ovladače můžete vidět na obrázku.

IMAG0709

Zobrazení polohy ovladače

Funkci akceleračního senzoru ověříme pomocí jednoduchého programu. Ten bude na displej řídící jednotky vykreslovat kolečko, které se bude po displeji pohybovat v závislosti na pohybu ovladače. Záležet vždy bude na tom, do jaké polohy jej uživatel natočí. Jednoduše tak budeme ověřovat polohu ovladače. Pomocí bluetooth komunikace bychom tímto ovladačem mohli ovládat také vlastní vytvořené vozítko.

Krok 1 - Deklarace senzoru a volání knihoven

Než začneme programovat, musíme si v úvodu našeho programu deklarovat senzor, který používáme. Zápis deklarace vidíte níže. Klíčové jsou čtyři parametry uvedené v závorce. Jedná se o typ modulu (Sensor), port, ke kterému je připojen (S1), volitený název (akcel) a standardizovaný název. V našem programu využijeme vývojovou knihovnu vytvořenou pro rozšiřujícící senzor akcelerace. Musíme proto senzor deklarovat jako rozšiřující. Z toho plyne jeho název v deklaraci - sensorI2CCustom. Následně zavoláme také vývojovou knihovnu, kterou naleznete v knihovnách vývojového prostředí. Její název zní hitechnic-accelerometer.h. Nezapomeňte správně zadat umístění knihovny. V našem příkladu je knihovna umístěna ve stejném adresáři jako program.

 
#pragma config(Sensor, S1, akcel, sensorI2CCustom)
// deklarace senzoru
 
#include "hitechnic-accelerometer.h"
 

 Poznámka: Ve stejném adresáři jako program musí být ještě vývojová knihovna common.h, jinak by program nefungoval správně.

 

Krok 2 - Zjišťování hodnot

 Dále přistoupíme ke zpracování hodnot, které nám senzor vrací. Nejprve jsme si nadeklarovali tři proměnné datového typu integer pro uložení hodnot tří směrů zrychlení (X, Y a Z). Nyní použijeme příkaz, díky kterému hodnoty získáme. Ten nalezneme ve vývojové knihovně hitechnic-accelerometer.h a jeho název je HTACreadAllAxes(). Obsahuje čtyři parametry uvedené v závorce. První je volitelný název senzoru z deklarace a další tři jsou názvy proměnných, do kterých se mají hodnoty uložit (X, Y a Z).

 
 // promenne pro ulozeni hodnot ze senzoru
 int X = 0;
 int Y = 0;
 int Z = 0;
 
 // zjisteni hodnot ze senzoru
 HTACreadAllAxes(akcel, X, Y, Z);
 
 
Krok 3 - Výpočet souřadnic

Po zjištění jsme již mohli přejít ke zpracování hodnoty. Pro neustálé vykreslování kolečka na displeji potřebujeme dvě proměnné, které budou reprezentovat souřadnice jeho umístění v Kartézské soustavě souřadnic (dispX a dispY). Do nich uložíme vypočítanou hodnotu aktuálního umístění. Budeme zpracovávat pouze hodnotu X a Y, protože pro zobrazení na displeji nepotřebujeme pracovat se zrychlením ve vertikálním směru senzoru. Jelikož vrácené hodnoty jsou příliš velké, vydělili jsme je nejprve dvěma. Při výpočtu pozice na ose Y jsme museli hodnotu X ze senzoru ještě vynásobit -1, protože jinak by zobrazování fungovalo opačně. Při pohybu vpřed by se kolečko pohybovalo vzad a naopak. Jako poslední bylo nutné upravit pozici kolečka na displeji tak, aby v případě, že je ovladač ve středové poloze, bylo uprostřed displeje. Pozice na ose X tak byla posunuta o 60 bodů displeje a po ose Y o 40.

 
// promenne pro ulozeni souradnic kolecka
 int dispX;
 int dispY;
 
// vypocet souradnic pro umisteni kolecka na displeji
 dispX = (Y / 2) + 60;
 dispY = ((X * (-1)) / 2) + 40;
 
 
Krok 4 - Vykreslení kolečka

Dynamické vykreslování kolečka na displeji jsme provedli příkazem nxtDrawCircle(). Příkaz obsahuje tři parametry. První dva vyjadřují pozici v Kartézské soustavě souřadnic, ze které se má kolečko začít vykreslovat. Použili jsme proto hodnoty uložené v proměnných dispX a dispY. Třetí parametr vyjadřuje průměr kolečka. Pro konzistentnost vykreslování jsme ještě za vykreslení přidali příkaz wait1Msec() a oddálili tak vykonávání dalšího příkazu o 50 milisekund.

 
 // vykreslovani kolecka
 nxtDrawCircle(dispX, dispY, 15);
 wait1Msec(50);
 
 
Výsledný program

Níže můžete vidět hotový program. Veškeré příkazy pro zjišťování hodnot a vykreslování kolečka jsou umístěny v nekonečném cyklu while(). Před každým průchodem cyklem nesmíme zapomenout na smazání displeje příkazem eraseDisplay().

 
#pragma config(Sensor, S1, akcel, sensorI2CCustom)
// deklarace senzoru
 
#include "hitechnic-accelerometer.h"
 
task main () {
 // promenne pro ulozeni hodnot ze senzoru
 int X = 0;
 int Y = 0;
 int Z = 0;
 
 while (true)
 {
   eraseDisplay();
 
   // promenne pro ulozeni souradnic kolecka
   int dispX;
   int dispY;
 
   // zjisteni hodnot ze senzoru
   HTACreadAllAxes(akcel, X, Y, Z);
 
   // vypocet souradnic pro umisteni kolecka na displeji
   dispX = (Y / 2) + 60;
   dispY = ((X * (-1)) / 2) + 40;
 
   // vykreslovani kolecka
   nxtDrawCircle(dispX, dispY, 15);
   wait1Msec(50);
 }
}
 

 

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í)

KURZ: Gyroskopický senzor

Gyroskopický senzor slouží k orientaci robota v prostoru. Měří rychlost otáčení v horizontální rovině senzoru připevněného k robotu a také jeho směr otáčení. Návratovou hodnotou senzoru je rychlost otáčení ve stupních za sekundu. Rozsah měření se pohybuje od +360° do -360° za sekundu. To nám umožňuje určit, kterým směrem se robot otáčí a díky tomu upravovat jeho polohu. Při použití, musíme pečlivě zvažovat umístění gyroskopu, protože snímá otáčení pouze v jediné ose.

PRÁCE S GYROSKOPICKÝM SENZOREM V PROGRAMOVACÍCH PROSTŘEDÍCH

NXT-G

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

Rozcestník


UMÍSTĚNÍ BLOKU

Gyroskopický senzor je v programovacím prostředí NXT-G řízen blokem GyroSensorDragged Gyro 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ů.


Gyro sensor block

POPIS BLOKU

Port Port - označuje, ke kterému ze vstupních portů je je senzor připojen.

TriggerPoint Trigger Point - značí vstupní nastavenou hodnotu senzoru, která je určena k porovnávání s hodnotami snímanými senzorem. Možný rozsah hodnoty je od -400 do +400 stupňů za sekundu.

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

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

Number Offset - výstup vyjadřující vstupní posun nastavený v poli Offset.

RawValue Raw Value - výstup udávající čistou naměřenou hodnotu rychlosti otáčení v RAW.

 

PARAMETRY BLOKU

Gyro sensor

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

Offset: hodnota, jejímž zadáním určuje vstupní hodnotu posuvu.

Compare: pole, které slouží k zadání hodnoty od -400 do +400 stupňů za sekundu, která je poté porovnávána s hodnotami snímanými senzorem.

RobotC

Příkazy pro ovládání gyroskopického senzoru

Rozcestník


Nastavení senzoru

Na úvod práce s gyroskopickým senzorem v programovacím prostředí RobotC je nutné provést jeho deklaraci. Programový zápis deklarace se skládá z klíčového slova #pragma a příkazu config(), který obsahuje čtyři parametry. Jelikož je možné deklarovat také motory, tak první parametr konkretizuje, že se v našem případě jedná o sensor. Druhý parametr označuje, ke kterému ze vstupních portů (S1 - S4) je senzor připojen. Třetí parametr je volitelný a zadává jej uživatel. Jedná se o název senzoru, který je poté dále používán při odkazování na senzor. Naopak poslední parametr je předdefinovaný a jedná se o standardizované označení gyroskopického senzoru (sensorI2CHiTechnicGyro).

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

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


Nastavení typu senzoru

Senzory je také možné deklarovat pomocí příkazu SensorType[], jehož parametrem je název senzoru. K tomuto příkazu je také nutné přiřadit oficiální název senzoru pro programovací prostředí RobotC (u gyroskopického senzoru sensorI2CHiTechnicGyro). Volitelný název uváděný jako parametr příkazu musí být nejprve definován pro třídu senzoru tSensors, která definuje rozšiřují moduly. Příklad deklarace senzoru je uveden níže.

Tento postup 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í Deklarace motorů a senzorů v horní liště menu.

 
tSensors gyroSensor;
SensorType[gyroSensor] = sensorI2CHiTechnicGyro;
 

Práce s hodnotou snímanou senzorem

Pro práci s hodnotami snímanými senzorem nebo pro jejich vyhodnocování či porovnávání budeme potřebovat použít příkaz, který nám použití hodnoty umožní. V programovacím prostředí RobotC je jím příkaz SensorValue[]. Jeho parametrem uvedeným v hranaté závorce je název senzoru. Senzoru pomocí tohoto příkazu můžeme nastavit vstupní fixně zadanou hodnotu nebo hodnotu, která bude určena pro porovnání s hodnotou snímanou gyroskopickým senzorem.

 
SensorValue[gyroSensor] = 60; // Nastaveni vstupni hodnoty senzoru (u gyroskopickeho senzoru napriklad hodnota posunu - offset).
 

Využití předdefinovaných metod

Gyroskopický senzor patří mezi rozšiřující senzory. Pro jeho využívání nalezneme po nainstalování programovacího prostředí RobotC vývojovou knihovnu, která obsahuje další předdefinované funkce pro ovládání gyroskopu. Knihovnu ovšem musíme nejprve v programu zavolat. Provedeme to v jeho úvodu následovně:

 
#include "drivers/hitechnic-gyro.h"
 

Při zjišťování hodnoty rotace využijeme několik předdefinovaných funkcí, které si nyní představíme. První metoda se nazývá HTGYROstartCal(). Využijeme jí v úvodu programu. Slouží totiž pro kalibraci gyroskopického senzoru, díky které docílíme přesnějšího snímání. Pokud máme senzor správně zkalibrovaný, můžeme zjisit jeho posun oproti stavu po kalibraci. K tomuto účelu slouží příkaz HTGYROreadCal().

Hlavním účelem používání gyroskopického senzoru je ale detekce rotačního pohybu. Ke zjištění aktuální rychlosti otáčení slouží předdefinovaná funkce HTGYROreadRot().

U všech tří 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Í

Gyroskopický senzor slouží ke snímání rotačního pohybu robota. Senzor vyhodnocuje míru natočení ve stupních za sekundu. Jeho praktické využití nalezneme u zařízení, ve kterých potřebujeme přesně detekovat jeho pohyb a míru natočení. Nejznámější takové zařízení je vozítko Segway. Díky vestavěným gyroskopům je přesně snímán jeho pohyb a v každém okamžiku určována jeho aktuální pozice. Je tak možné přesně a včas reagovat a udržovat tak zařízení v rovnováze. Gyroskopický senzor je ovšem pouze jednoosý senzor. Snímá hodnoty pouze v jedné rovině. Není tedy tak komplexní jako senzor akcelerace, který měří zrychlení ve třes osách.

Využití gyroskopického senzoru

Příklady s využitím gyroskopického senzoru jsou většinou složité programové konstrukty. Jeho činnost si ukážeme na jednoduchém příkladu. Vytvoříme si model pohyblivého vozítka na který připevníme gyroskopický senzor. Následně vytvoříme program, díky kterému se bude vozítko pohybovat a natáčet v různých směrech. Hodnotu snímanou gyroskopickým senzorem budeme zaznamenávat, abychom tak viděli jak při pohybu robota senzor reaguje. Více o zaznamenávání a vizualizaci hodnot naleznete ZDE.

NXT-G

Zobrazení snímané hodnoty

Pro analýzu hodnoty, kterou vrací v určitých situacích gyroskopický senzor si musíme nejprve vytvořit vhodný program. Část programu, kterou chceme analyzovat je poté nutné v programovacím prostředí NXT-G vymezit pomocí bloků pro analýzu dat. Až poté můžeme program spustit a zjistit snímané hodnoty.

Vytvoření programu

Nejprve si představíme program, během jehož chodu jsme analyzovaly hodnoty snímané gyroskopickým senzorem. Program je pouze krátký, slouží jen k jednoduché demonstraci. Robot se díky němu tři vteřiny pohybuje vpřed. Následně se natočí o 360° vpravo, poté o 360° vlevo a nakonec se pohybuje opět tři vteřiny vpřed. První úsek vpřed se pohybuje rychlostí 50%, koncový úsek rychlostí 80%. Pohyb vpřed je realizován pomocí bloku MovePaletteDragged Move. Během natáčení do stran jsou motory ovládány blokem MotorDragged Motor (více o ovládání robota pomocí motorů naleznete v kapitolách Motor a jeho pohyb a Synchronizace pohybu dvou motorů).

gyro program

Aby mohla být data zaznamenávána, musíme na začátek programu umístit blok StartDatalogDragged Start Datalog, který spustí zaznamenávání dat. Na konec programu poté vložíme blok StopDatalogDragged Stop Datalog pro ukončení záznamu.

U bloku StartDatalogDragged Start Datalog musíme nastavit parametry záznamu. Dobu trvání jsme zvolili 10 sekund. Pro přesnější záznam hodnot jsme zvolili frekvenci záznamu 10 snímků za sekundu. Poslední věcí, kterou nastavíme, je typ senzoru připojený na příslušném portu.

gyro datalog nastaveni

Analýza dat

Senzor je umístěn na čelní straně robota ve vodorovné poloze a namířen směrem vpřed. Po spuštění programu se začala zaznamenávat data do grafu. Na obrázku můžete vidět křivku vyjadřující jeho průběh. Vodorovná osa grafu označuje čas běhu programu a svislá osa hodnotu, kterou vracel gyroskopický senzor (ve stupních za sekundu). První tři sekundy se robot pohyboval přímo vpřed. Na grafu je vidět, že hodnota gyroskopického senzoru se po tuto dobu pohybovala kolem nuly. Drobné odchylky jsou způsobeny nerovnostmi povrchu, po kterém se robot pohyboval. Dále se robot natočil o 360° vlevo. Hodnota okamžitě klesla až na -100 stupnňů za sekundu. Jakmile se robot začal natáčet o 360° vpravo, stoupla hodnota až na +100 stupňů za sekundu. Při opětovném pohybu vpřed se hodnota znovu pohybovala kolem nuly.

Z tohoto příkladu je patrné, že robot díky gyroskopickému senzoru dokáže reagovat pouze na natočení v jediné ose senzoru. Ačkoliv byl pohyb vpřed v úvodu a na konci programu prováděn rozdílnou rychlostí, z grafu tuto skutečnost nezjistíme. Na křivce je pouze dobře patrné, že bylo provedeno natočení nejprve na jednu stranu (senzor vrací zápornou hodnotu) a následně na druhou stranu (vrácená hodnota je kladná).

 

gyro

RobotC

ZOBRAZENÍ SNÍMANÉ HODNOTY

Analýzu hodnot, které vrací gyroskopický senzor v programovacím prostředí RobotC provedeme na příkladu pojídzného robota. Ten se bude pohybovat vpřed a během pohybu se natočí na obě dvě strany. Měnit bude také svoji rychlost. Pomocí funkce Poll NXT Brick poté zjistíme, na kolik je možné analyzovat v tomto programovací prostředí data ze senzoru.

Vytvoření programu

Nejprve si představíme program, během jehož chodu jsme analyzovaly hodnoty snímané gyroskopickým senzorem. Program je krátký, slouží jen k jednoduché demonstraci. Robot se díky němu tři vteřiny pohybuje vpřed. Následně se natočí o 360° vpravo, poté o 360° vlevo a nakonec se pohybuje opět tři vteřiny vpřed. První úsek vpřed se pohybuje rychlostí 50%, koncový úsek rychlostí 80%. Pokud nevíte, jak takovýto program vytvořit, více o ovládání robota pomocí motorů naleznete v kapitolách Motor a jeho pohyb a Synchronizace pohybu dvou motorů.

Analýza dat

Po spuštění funkce Poll NXT Brick a spuštění vizualizace pomocí tlačítka Poll Continuous začnou být zobrazována aktuálně snímaná data (více o zobrazování hodnot v RobotC v kapitole Zaznamenávání a vizualizace hodnot). Na prvním obrázku můžete vidět náhled při zobrazování hodnot úvodního pohybu robota vpřed. V horním okně se zobrazují informace o motorech. Můžeme vyčíst jak jejich rychlost, tak i počet otáček. Nás bude ale zajímat gyroskopický senzor. Nalezneme jej v dolním okně z pohledu uživatele vlevo. Byl připojen k portu S3. Jelikož patří mezi rozšiřující senzory, nebylo jej možné přiřadit ke třetímu portu a tak se zde zobrazuje popisek No Sensor. Hodnota je ovšem snímána, a to v podobě RAW. Můžete vidět, že v aktuálním okamžiku pořízení snímku byla hodnota 613.

rovne 1

Nyní se zaměříme na okamžik, kdy se robot natáčel do stran. Začneme natočením vpravo. Nahoře vidíme, že se otáčel pouze motor C. Změnu hodnoty zaznamenáme i u tabulky zobrazující hodnotu ze senzoru. Ta oproti pohybu vpřed nepatrně vzrostla.

vpravo

Při natočení na levou stranu je již změna hodnoty patrná více. Při natočení vpravo hodnota rostla, při natočení v opačném směru klesla až na 473. Vidíme tak, že senzor skutečně i v tomto okamžiku zaznamenal odklonění od přímého směru.

vlevo

Jako poslední si můžeme prohlédnout hodnoty naměřené při závěrečném zrychlení. Hodnota ze senzoru je pouze nepatrně nižší. To je způsobeno jak zrychlením, tak také otřesy způsobenými pohybem po drobných nerovnostech podkladu.

rovne 2

 

Jelikož programovací prostředí RobotC umožňuje pouze zaznamenávání v reálném čase, není snímání hodnot z gyroskopického senzoru příliš efektivní. Můžeme sice při pohybu robota pozorovat, v jakém rozmezí se pohybují hodnoty, ale nemůžeme je zaznamenávat. Překážkou také může být skutečnost, že robot musí být připojen k počítači pomocí USB kabelu. Přesto bychom mohli získat přibližnou představu o tom, jak vysoké hodnoty v jednotlivých okamžicích jsou. Reakci na ně následně využijeme při vytváření programu.

 

1 1 1 1 1 1 1 1 1 1 Hodnocení 5.00 (1 hodnocení)