12. diel - Arduino - Senzory a programovanie pohybového senzora PIR
V predchádzajúcej lekcii, Arduino - Druhy motorov a programovanie servo motora , sme si predstavili rôzne druhy motorov a vytvorili sme nový projekt s mikroservem.
Dnešný diel nášho HW Arduino tutoriálu bude viac teoretický. Predstavíme si totiž novú skupinu elektronických komponentov, a to senzory. Povieme si základné informácie o senzorike a senzoroch všeobecne a potom sa pozrieme podrobnejšie na pohybový senzor typu PIR. Nakoniec si urobíme malý projekt, kde nasimulujeme automatické vonkajšie osvetlenie. Ukážeme si zapojenie nášho senzora, ktorý si vzápätí aj naprogramujeme.
Senzorika
Najprv by sme začali tým, čo to vôbec je senzorika. Senzorika zaisťuje automatické funkcie rôznych strojov, výrobných liniek a dopravných systémov. Pre tieto systémy sú potrebné špeciálne snímače, snímače a meracie systémy. Dnes sú už senzory prakticky všade, na autách, v domoch a napríklad aj v mobiloch. Aká je teda definícia senzora?
Senzor je všeobecne zdroj informácií pre nejaký riadiaci systém, ktorým môže byť napr. ústredňa alebo mikropočítač Arduino. V užšom slova zmysle je senzorom technické zariadenie, teda súčiastka, ktorá meria určitú fyzikálnu alebo technickú veličinu a prevádza ju na signál. Tento signál je možné diaľkovo prenášať a ďalej spracovať v meracích riadiacich systémoch. Najčastejšie ide o elektrický signál (časový priebeh napätia alebo prúdu).
Pokiaľ meraná veličina nie je elektrická, hovoríme o elektrickom meraní neelektrickej veličiny.
Senzory môžu byť používané drôtovo alebo dokonca aj bezdrôtovo.
Požiadavky na senzory
Na senzory je kladených mnoho požiadaviek, ktoré musia spĺňať:
- jednoznačná závislosť výstupnej veličiny na vstupnej,
- vysoká presnosť,
- vhodné dynamické vlastnosti,
- odolnosť voči vonkajším vplyvom, ktoré nemeriame,
- minimálne zaťažovanie meraného objektu,
- jednoduchá konštrukcia,
- jednoduchá montáž a údržba,
- prijateľná cena.
Senzory je možné rozdeliť do niekoľkých skupín, kritériom môže byť:
- typ meranej veličiny,
- spôsob prenosu signálu (elektrické, hydraulické, pneumatické a iné senzory),
- druh fyzikálneho princípu, teda spôsob prevodu hodnoty meranej veličiny na hodnotu signálu,
- možnosť styku s prostredím (dotykové či dištančné, bezdotykové senzory),
- stupeň integrácie.
Merané veličiny delíme na elektrické a neelektrické. Medzi elektrické veličiny patrí napätie, prúd, odpor, výkon, frekvencia, kapacita a indukčnosť. Neelektrickou veličinou je napríklad poloha, rýchlosť, zrýchlenie, teplota, tlak, sila či objem.
Poďme si teraz bližšie predstaviť sľúbený pohybový senzor.
Pohybový senzor
Pasívne infračervené čidlo, skrátene PIR (Passive Infrared Sensor), je elektromagnetické čidlo, ktoré meria infračervené žiarenie (IR) vyžarujúce z objektov v zornom poli čidla. Toto čidlo sa najčastejšie používa v domácnosti, najviac ho uvidíme ako súčasť elektronického zabezpečovacieho systému (EZS), kde stráži konkrétne objekty pred vniknutím narušiteľa. Hojne sa používa aj pri osvetlení riadenom na základe pohybu.
Existujú rôzne druhy PIR čidiel, tie sa hlavne líšia v dosahu a rozptyle šošovky:
- Klasické PIR má dosah cca 12 ma rozptyl okolo 115 ° a je vhodný do klasických miestností.
- Vejár má dosah cca 7 ma rozptyl 360 °, je vhodný do kúpeľní alebo vstupných hál.
- Chodbové PIR s najvyšším dosahom, cca 25 ma rozptylom 45 ° nájdeme najmä v dlhých chodbách.
- Duálny PIR je vhodný použiť, ak máme doma domáceho maznáčika. Aby sa spustil alarm, musia sa aktivovať obe zóny. Dosah má cca 12 ma rozptyl okolo 115 °.
My si naprogramujeme trochu iný model, ktorý však pracuje na rovnakom princípe. Poďme sa teda vrhnúť na zapojenie nášho senzora.
Schéma zapojenia
Naše zapojenie bude veľmi jednoduché, tu je zoznam súčiastok, ktoré budeme potrebovať:
- Arduino,
- nepájivé pole,
- 1x LED,
- 1x fotorezistor,
- 1x rezistor 1 [kΩ],
- 1x rezistor 150 [Ω],
- PIR senzor a
- prepojovacie káble.
Ak máme zapojené, môžeme sa vrhnúť na programovanie.
Programovanie PIR senzora
Najprv si povieme, čo by mal náš projekt vedieť. Chceme nasimulovať vonkajšie osvetlenie ovládané pomocou pohybu. Keď teda PIR senzor zaznamená pohyb, rozsvieti LED na určitú dobu. To všetko ale nastane iba ak bude noc, nie deň. Z toho dôvodu sme do projektu zapojili aj fotorezistor, ktorý reaguje na množstvo prijatého svetla.
Poďme si teda spoločne popísať jednotlivé časti nášho kódu:
#define PIR 2 // Definování digitálního pinu pro PIR #define LED 3 // Definování digitálního pinu pro LED #define FOTOREZISTOR A0 // Definování analogového pinu pro FOTOREZISTOR int hodnota_fotorezistor; // Proměnná, ve které budeme uchovávat hodnotu fotorezistoru volatile bool pohyb;
Ako prvé si definujeme jednotlivé piny pomocou príkazu
#define
, PIR senzor a LED zapojíme klasicky do digitálnych pinov,
avšak fotorezistor musíme zapojiť do analógového pinu, pretože pracujeme s
inými hodnotami ako 0
a 1
.
Ďalej si vytvoríme dve premenné. Do prvej budeme ukladať hodnotu
fotorezistora, druhá nám poslúži ako pomocná premenná na zistenie
aktivácie čidla. Jej pomocou potom určíme, či sa má LED rozsvietiť alebo
zostať zhasnutá. Premenná má označenie volatile
, ktoré si
vysvetlíme nižšie.
Vo funkcii setup()
nastavíme pinMode()
pre
jednotlivé prvky a Serial.begin(9600)
, aby sme mohli písať do
sériového monitora:
void setup() { pinMode(PIR, INPUT); pinMode(LED, OUTPUT); pinMode(FOTOREZISTOR, INPUT); Serial.begin(9600); }
Hlavná slučka
V hlavnom cykle budeme volať pomocnú funkciu Pohyb()
, poďme
si ju doplniť:
void Pohyb() // Funkce pro zaznamenání pohybu { if (hodnota_fotorezistor < 200) { pohyb = true; } }
Uvedenou funkciou meníme hodnotu našej pomocnej premennej, ale iba za predpokladu, že je vonku tma. Máme tu teda najskôr podmienku testujúcu hodnotu fotorezistora.
Teraz môžeme doplniť funkciu loop()
:
void loop() { hodnota_fotorezistor = analogRead(FOTOREZISTOR); Serial.print("Hodnota fotorezistoru je: "); Serial.println(hodnota_fotorezistor); // Funkce pro správné fungování PIR čidla, jako parametry bere pin, volanou funkci a mód attachInterrupt(digitalPinToInterrupt(PIR), Pohyb, RISING); if (pohyb) { Serial.println("Pohyb zaznamenan"); digitalWrite(LED, HIGH); delay(5000); digitalWrite(LED, LOW); pohyb = false; } }
Na začiatku tu načítame hodnoty z fotorezistora a ukladáme ich do
premennej hodnota_fotorezistor
, ktorú hneď vypíšeme do
sériového monitora.
Funkcia attachInterrupt()
:
Ako ďalšia je tu funkcia
attachInterrupt(digitalPinToInterrupt(PIR), Pohyb, RISING)
, ktorá
je pre nás úplne nová. Táto funkcia pripojí užívateľskú funkciu obsluhy
prerušenia na pin externého prerušenia. To umožňuje vyhnúť sa periodickej
kontrole nejakého pinu a reagovať iba na konkrétnu udalosť na pinu.
Prerušenie Arduino spustí, keď dôjde k zmene digitálneho signálu, ktorý
chceme monitorovať.
Môžeme si ale vybrať, čo presne chceme sledovať. Na to slúži tretí
parameter funkcie attachInterrupt()
. Máme na výber zo štyroch
typov prerušení:
RISING
: Prerušenie bude spustené, keď signál prejde zLOW
doHIGH
.FALLING
: Prerušenie bude spustené, keď signál prejde zHIGH
naLOW
.CHANGE
: Prerušenie bude spustené, keď sa signál zmení.LOW
: Prerušenie bude spustené vždy, keď je signálLOW
.
digitalPinToInterrupt()
. Druhý parameter potom
obsahuje volanú pomocnú funkciu.
Pomocná funkcia, ktorú v prerušení voláme nesmie mať
žiadnu návratovú hodnotu (je typu void
) a nesmie brať žiadne
parametre!
Funkciu attachInterrupt()
sme nastavili obsluhu nášho PIR
senzora a volania funkcie Pohyb()
, pokiaľ senzor pohyb zaznamená,
teda dosiahne hodnotu HIGH
. Vo funkcii Pohyb()
potom
meníme pomocnú premennú pohyb
, ktorú sme v úvode kvôli tomu
označili ako volatile
.
V prípade záznamu pohybu a nízkych hodnotách fotorezistora bude teda
nasledujúca podmienka splnená. Informáciu vypíšeme do sériového monitora
a na päť sekúnd rozsvietime diódu. Tú potom zhasneme a nastavíme pomocnú
premennú na false
.
Testovanie
Teraz máme funkčný PIR senzor! Projekt si môžeme spustiť a vyskúšať. Ako ale v Tinkercade zariadime zmenu osvetlenia alebo simuláciu pohybu? Na zmenu svetla stačí, keď pri spustenej simulácii klikneme na fotorezistor a zobrazí sa nám posuvná vodorovná lišta, kde intenzitu svetla posunutím zmeníme. Ako môžeme vidieť, pri spustení je fotorezistor nastavený na nulovú hodnotu, teda najväčšiu tmu.
Simuláciu pohybu zariadime obdobne. Pri spustenej simulácii klikneme na pohybový senzor a zobrazí sa nám uhol jeho záberu. V ňom je malé koliesko, ktorým môžeme pohnúť a pohybový senzor tak aktivovať.