KURZ: Teplotní senzor
- Podrobnosti
- Mgr. Jan Baťko
- Aktualizováno: 01.04.2014
- Zobrazení: 6289
KAPITOLY
Teplotní senzor je jedním ze senzorů, které dokáží snímat hodnoty okolního prostředí. Chování robota tak může být ovlivněno teplotou okolního prostředí. Ovládání a chování na základě snímané teploty patří mezi rozšiřující možnosti stavebnice LEGO Mindstorms NXT. Teplotní senzor dokáže pracovat s teplotou udávanou jak ve stupních Celsia tak Fahrenheita. Jeho využití je možné nejen pro konstrukci robota, ale hlavně při různých laboratorních měřeních.
PRÁCE S teplotním SENZOREM V PROGRAMOVACÍCH PROSTŘEDÍCH
NXT-G
Blok pro ovládání teplotního senzoru
Rozcestník
UMÍSTĚNÍ BLOKU
Blok Temperature Sensor je součástí základní instalace programovacího prostředí NXT-G a nalezneme ho v paletě Complete > Sensor.
POPIS BLOKU
Blok Temperature Sensor obsahuje šest konektorů pro propojení s dalšími bloky:
Port - značí, ke kterému z portů (1-4) je senzor připojen.
Trigger Point - značí zadanou vstupní hodnotu, kterou je možné porovnat s hodnotou snímanou teplotním senzorem.
Greater / Less - logická hodnota sloužící k porovnání dvou hodnot (větší nebo menší).
Yes / No - hodnota logického datového typu vyjadřující výsledek porování.
Temperature - škálovaná hodnota zjištěná senzorem (ve stupních Celsia nebo Fahrenheita).
Raw Value - udává čistou hodnotu v RAW zjištěnou senzorem na stupnici od 0 do 1024.
PARAMETRY BLOKU
Port: udává, ke kterému vstupnímu portu je teplotní senzor připojen (1-4).
Compare: slouží k zadání hodnoty, která má být porovnávána s hodnotou snímanou senzorem (větší či menší než zvolená hodnota).
Show: volba, která slouží ke zvolení jednotek, ve kterých se bude s teplotou pracovat (stupně Celsia nebo Fahrenheita).
Průběžně snímaná teplota se během chodu programu zobrazuje v levé části bloku.
RobotC
Příkazy pro ovládání teplotního senzoru
Rozcestník
Deklarace senzoru
Teplotní senzor patří mezi sezory vyráběné firmou LEGO, ovšem nepatří mezi základní senzory. Při jeho použití tak musíme v programovacím prostředí RobotC použít vývojovou knihovnu, která obsahuje ovladače a funkce sloužící k jeho ovládání. Knihovna je obsažena v zdrojových souborech instalace programovacího prostředí nebo si ji můžete stáhnout ZDE. V balíku knihoven pro rozšiřující senzory ji najdete pod názvem lego-temp.h. Její zavolání v programu poté provedeme následovně:
#include "lego-temp.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.
Po zavolání příslušné vývojové knihovny je nutné deklarovat používaný senzor. Deklarace se skládá z klíčového slova #pragma a příkazu config(), který obsahuje čtyři parametry. První parametrem je určení, o jaké zařízení se jedná. V našem případě používáme senzor, tudíž zapíšeme Sensor. Druhý parametr udává, ke kterému portu je senzor připojen (S1-S4). Třetí parametr je volitelný a uživatel si zde volí název senzoru, který je následně v programu používán jako parametr funkcí a podobně. Posledním parametrem je zařazení senzoru. Teplotní senzor patří mezi rozšiřující senzory a ty jsou v programovacím prostředí RobotC zařazeny do skupiny sensorI2CCustom.
#pragma config(Sensor, S1, LEGOTMP, sensorI2CCustom)
Využití předdefinovaných metod
Vývojová knihovna teplotního senzoru obsahuje předdefinované metody pro jeho ovládání. Snímání teplotním senzorem může být prováděno ve dvou režimech. První režim je nazýván Single Shot mode. Jedná se o běžné snímání, kdy je teplotním senzorem vracena každá okamžitá hodnota. Jeho aktivování je možné provést příkazem LEGOTMPsetSingleShot(). Druhý režim snímání se nazývá Continuous mode. Pokud senzor pracuje v tomto režimu, provede ve velice krátkém časovém úseku v řádu milisekund několik měření. Následně jako výsledek senzor vrací poslední naměřenou hodnotu. Díky tomu dokáže ověřit, zda je naměřená hodnota přesná a nemělo by tak dojít ke zkreslení. Režim aktivujeme pomocí příkazu LEGOTMPsetContinuous(). Parametrem uvedeným v závorce je u obou metod volitelný název senzoru.
Jestliže budeme používat teplotní senzor, hlavní věcí která nás bude zajímat, bude jím zjištěná teplota. Její hodnotu zjistíme v programovacím prostředí RobotC použitím příkazu LEGOTMPreadTemp(). Příkaz vyžaduje zadání dvou parametrů uvedených v závorce. První je volitelný název senzoru zadávaný při deklaraci senzoru a druhý název proměnné datového typu float, do které se zjištěná hodnota následně uloží.
MOŽNOSTI PRAKTICKÉHO VYUŽITÍ
Funkcí teplotního senzoru je vracet uživateli informaci o zjištěné teplotě okolního prostředí. Jeho využití pro konstrukci pojízdného robota nepřipadá příliš v úvahu. Využití najde hlavně v případě, že budeme chtít reagovat na náhlé teplotní změny v okolí. V závislosti na teplotě by poté následovala určitá reakce robota. Široké uplatnění by našel také při provádění laboratorních pokusů a měření. Pomocí senzoru by byla snímána teplota kapaliny nebo jiných vzorků a průměrný přírůstek či úbytek vypisován na diplej nebo zaznamenáván do grafu pomocí funkce Data Logging.
Využití teplotního senzor
Použití teplotního senzoru v programování si ukážeme na jednoduchém příkladu. Senzor bude připojen ke vstupnímu portu řídící jednotky a k jednomu z výstupních portů bude připojen servomotor, který bude pohánět model ventilátoru. Otáčky ventilátoru se budou dynamicky měnit na základně naměřené teploty. Dokud bude teplota nižší než 20°C, ventilár nebude spuštěný. Od 20°C začne se stoupající teplotou zrychlovat, až dosáhne při 30°C maximálního výkonu 100%. Jakmile začne teplota klesat, motor bude opět postupně zpomalovat, až se při 20°C zastaví úplně.
NXT-G
ŘÍZENÍ VENTILÁTORU POMOCÍ TEPLOTNÍHO SENZORU
Realizace programu v programovacím prostředí NXT-G není příliš složitá. Důležité je si správně uvědomit, jaké kroky musíme realizovat. Zjištěné hodnoty z teplotního senzoru musíme ukládat do proměnné, abychom je následně mohli využívat při výpočtu intenzity otáček motoru. U výpočtu je důležité správně pracovat s matematickými bloky.
Krok 1 - Deklarace proměnných
Abychom mohli hodnotu zjištěnou teplotním senzorem využívat nejenom pro rozhodnutí, zda se má ventilátor roztočit nebo zůstat v nečinnosti, ale také při výpočtu intenzity otáčení motoru, musíme si pro její ukládání nadeklarovat proměnnou. Deklaraci provedeme v horní části menu Edit -> Define Variables (podrobný popis naleznete ZDE). Pro ukládání hodnoty jsme si nadeklarovali proměnnou teplota, která je datového typu Number.
Krok 2 - Snímání hodnot senzorem
V dalším kroku musíme hodnotu naměřenou teplotním senzorem uložit do proměnné. První blok, který v programu použijeme, bude Temperature Sensor. Dále si do programu vložíme také blok Variable, který reprezentuje proměnnou. U proměnné nastavíme, že se jedná o proměnnou teplota a nastavíme blok pro zápis. U teplotního senzoru zvolíme měření ve stupních Celsia. Uložení hodnoty do proměnné provedeme propojením konektoru Temperature teplotního senzoru se vstupním portem bloku proměnné.
Krok 3 - Zapnutí ventilátoru
Zapnutí ventilátoru je prováděno až v okamžiku, že teplota překročí 20°C. Musíme tak v programu tuto situaci rozlišit. Použijeme proto blok podmíněného vykonání Switch, který nám umožní rozlišit dvě nastalé situace. Podmínka bude řízena hodnotou (Value) logického datového typu (Logic). To, jaká část (True nebo False) podmínky bude vykonávána, bude ovlivněno hodnotou uloženou v proměnné teplota. Použijeme blok Compare, který vložíme mezi blok proměnné a podmínku Switch. Pomocí bloku Compare budeme zjišťovat, zda je úroveň teploty větší než 20°C. Hodnotu z proměnné přivedeme na vstup bloku k porovnání a jeho výstup přivedeme na vstup bloku Switch.
Krok 3 - Řízení otáček na základě teploty
V případě, že teplota překročí 20°C, motor se spustí a jeho intenzita otáčení bude řízena na základě naměřené teploty. Bude tedy vykonávána část True bloku Switch. Opět musíme využít hodnotu uloženou v proměnné teplota. Použijeme proto znovu blok Variable. Při výpočtu intenzity otáčení motoru musíme vzít hodnotu v proměnné, odečíst od ní hodnotu spuštění (20°C) a výsledek vynásobit 10. Do programu vložíme dva bloky pro matematické operace Math. Hodnotu z proměnné přivedeme na vstup prvního z nich, kde se bude od hodnoty odečítat 20. Výsledek přivedeme na vstup druhého bloku Math, kde se bude násobit 10. Výslednou hodnotu nakonec přivedeme na vstup konektoru Power programového bloku Motor, díky čemu nastavíme intenzitu otáčení na právě vypočítanou hodnotu. Celý programový konstrukt můžete vidět na obrázku.
Pro úplné ošetření programu ještě vložíme do sekce False blok Motor, jemuž nastavíme nečinnost. Aby byl program prováděn neustále a nebyl uskutečněn pouze jeden průchod, musíme ještě celou programovou konstrukci umístit do cyklu Loop, u nějž nastavíme nekonečné provádění (Forever). Díky tomu bude program prováděn stále dokola.
Výsledný program
Program ke stažení
RobotC
Řízení ventilátoru pomocí teplotního senzoru
Při vytváření programu si musíme rozmyslet, jaké náležitosti musíme provést, než začneme používat rozšiřující senzor. Jedná se o jeho deklaraci a zavolání patřičné vývojové knihovny. Pro úspěšné zvládnutí konstruktu, který provádí dynamický výpočet rychlosti otáček motoru si musíme rozmyslet, jaká bude správná podoba zápisu výpočtu.
Krok 1 - Deklarace senzoru a volání vývojové knihovny
Prvním krokem pro úspěšné zvládnutí programu je deklarace senzoru. Jak jsme si již popsali v teoretické části, deklarace se skládá z klíčového slova #pragma a příkazu config(). Do jeho parametrů následně uvedeme, že se jedná o senzor (Sensor), port řídící jednotky, ke kterému je připojen (S1-S4), následně volitelný název senzoru (v našem případě LEGOTMP) a poté skupinu definující rozšiřující senzory sensorI2CCustom.
#pragma config(Sensor, S1, LEGOTMP, sensorI2CCustom)
Následně musíme zavolat vývojovou knihovnu, která obsahuje ovladače teplotního senzoru a funkce, které v programu dále využijeme. Ve stejné složce, kde je umístěna knihovna teplotního senzoru musí být umístěna také vývojová knihovna common.h. Zavolání provedeme následovně:
#include "lego-temp.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 - Nastavení režimu snímání
Teplotní senzor dokáže pracovat ve dvou režimech. Je dobré proto na úvod programu udat, v jakém režimu bude senzor snímat. V našem programu použijeme snímání v režimu Continuous. Pro jeho aktivování použijeme příkaz LEGOTMPsetContinuous(), jehož parametrem v závorce bude volitelný název senzoru.
LEGOTMPsetContinuous(LEGOTMP);
Krok 3 - Řízení otáček na základě teploty
Hlavní částí programu je řízení otáček motoru pomocí snímané teploty okolního vzduchu. Nejprve potřebujeme, aby nám senzor vracel zjištěnou hodnotu teploty. Nadefinujeme si proto proměnnou teplota, která bude datového typu float, do níž se bude hodnota ukládat. Následně použijeme příkaz LEGOTMPreadTemp(), který vrací hodnotu zjištěnou senzorem. V závorce jsou uvedeny dva parametry. První je volitelný název senzoru a druhý název proměnné, do které se zjištěná hodnota uloží.
Nyní musíme zapsat výpočet, který zajistí dynamické otáčení motoru. Ventilátor se začne otáčet až v případě, že teplota stoupne nad 20°C. Použijeme podmínku if(), jejíž parametrem bude teplota > 20. Intenzita otáčení motoru se v rozmezí 20 - 30 °C bude měnit od 0 do 100%. Musíme tedy vzít hodnotu uloženou v proměnné teplota a odečíst od ní teplotu, při které má motor být v nečinnosti (20°C). Výslednou hodnotu poté vynásobíme 10 a tento výsledek následně přiřadíme motoru jako hodnotu otáček. Celý zápis příkazu můžete vidět níže.
Abychom ošetřili všechny nastalé možnosti programu, musíme ještě zapsat, co se stane, pokud teplota bude niší než 20°C. Za podmínku tedy přidáme else a příkaz motor[], jemuž přiřadíme nulovou hodnotu otáčení.
float teplota; while(true) { LEGOTMPreadTemp(LEGOTMP, teplota); if (teplota > 20) { motor[motorA] = (teplota - 20) * 10; } else { motor[motorA] = 0; } }
Výsledný program
Po úspěšném zvládnutí všech dílčích kroků bychom měli dospět ke zdárnému zápis programu, který můžete vidět zde:
#pragma config(Sensor, S1, LEGOTMP, sensorI2CCustom) #include "lego-temp.h" task main() { LEGOTMPsetContinuous(LEGOTMP); float teplota; while(true) { LEGOTMPreadTemp(LEGOTMP, teplota); if (teplota > 20) { motor[motorA] = (teplota - 20) * 10; } else { motor[motorA] = 0; } } }