Infrazračenje i ultrazvučanje U ovom broju ćemo govoriti o funkcionisanju sistema koji u osnovi imaju senzore za registraciju infracrvenih i ultrazvučnih talasa. Tema je zanimljiva, a realizacija jednostavna. IC senzor je uređaj koji detektuje zračenje u infracrvenom elektromagnetnom opsegu, odnosno, od 700 nanometara do jednog milimetra. Ti talasi nisu vidljivi ljudskom oku, ali se suštinski ne razlikuju od vidljive svetlosti. Po načinu funkcionisanja, IC senzori se dele na dve grupe: aktivne i pasivne. Aktivni senzori imaju nekoliko načina realizacije, a najčešći su oni koji se koriste refleksijom o neki predmet, blokiranjem svetlosti korišćenjem fizičkih prepreka (recimo, brojanje obrtaja prolaskom svetlosti kroz otvor) ili generisanjem svetlosnih impulsa u određenom vremenskom intervalu. Ova vrsta senzora se sastoji od predajnika koji predstavlja LE diodu koja emituje infracrvenu svetlost i IC prijemnika koji tu svetlost detektuje. Sa druge strane, pasivni senzori prihvataju infracrveno zračenje koje emituju druga tela i oni imaju samo prijemni deo. Pasivni senzori se koriste za merenje temperature koju ispuštaju druga tela, otkrivanje požara, kao i za detekciju kretanja. Našli su primenu i u uređajima za noćno osmatranje i termovizijskim kamerama. Manje je poznato da se oni nalaze i u okviru uređaja koji imaju sasvim druge funkcije. Tu, recimo, možemo izdvojiti senzore za detekciju prisustva gasova, koji do rezultata dolaze spektroskopskom analizom vazduha u infracrvenom opsegu. Daljinski upravljač NEC standard predviđa signal sa zaglavljem koje traje devet milisekundi, iza čega sledi pauza od 4,5 milisekunde. Za generisanje vrednosti „0” potrebno je 1,125 milisekundi, dok za „1” ono iznosi dvostruko više, odnosno 2,25 milisekundi. Bajt adrese i bajt naredbe se šalje dva puta. Drugo slanje je u inverznom obliku. Postoji više vrsta IC prijemnih dioda koje se mogu razlikovati po frekvenciji rada, koja je najčešće 36, 38 ili 40 kiloherca (opseg je između 30 i 56 kiloherca). Treba imati u vidu da se raspored njihovih pinova često razlikuje od onog koji smo mi ovde koristili, pa, u slučaju da nema prenosa podataka, prvo treba proveriti da li je sve u redu sa pinovima. U tabeli je prikazan raspored za nekoliko modela IC senzora („S” označava pin podataka). Često ćemo videti da IC prijemnici u nazivu imaju slova TSOP, što je u tom slučaju akronim za Temic Semiconductors Optoelectronics Photo modules, a ne naziv vrste kućišta za integrisana kola (Thin Small Outline Package). #include <IRremote.h> decode_results podaci; // bafer podataka IRrecv pin(2); // pin prijemnika void setup() { Serial.begin(9600); // brzina COM porta pin.enableIRIn(); // aktivacija prijema } void loop() { if (pin.decode(&podaci)) { // ima podataka? Serial.println( podaci.value, HEX ); // ispisi heksadecimalno pin.resume(); // idemo dalje } } U cilju uštede prostora nećemo pisati puni kôd programa koji bi obrađivao klik na sve pojedinačne tastere i umesto toga navodimo šablon koji treba da se nađe u okviru glavne petlje loop(): if (pin.decode(&podaci)) { switch(podaci.value) { case 0xkod_1: // uradi nesto break; case 0xkod_2: // uradi nesto break; } } Detektor prepreka int prepreka = HIGH; // pocetna inicijalizacija //HIGH = nema prepreke, LOW = prepreka void setup() { pinMode(2, INPUT); // senzor ocitavamo na pinu 2 pinMode(13, OUTPUT); // LED pin 13 za signal Serial.begin(9600); } void loop() { prepreka = digitalRead(2); // ocitaj senzor if (prepreka == LOW) // ako je na pinu 2= LOW { // znaci, otkrivena je prepreka Serial.println("Prepreka!"); digitalWrite(13, HIGH); // upali LED } else { // nema prepreke Serial.println("........."); digitalWrite(13, LOW); // ugasi LED } delay(1000); // pauza 1 sekund } Kôd je krajnje jednostavan, nema potrebe za dodatnim bibliotekama. Kada je potrebno preciznije detektovanje prepreka na relativno većoj udaljenosti, u igru možemo da uvedemo IC senzore kompanije Sharp GP2D120 i GP2Y0A41 (4-30 centimetara), GP2D12 (10-80 centimetara) ili GP2Y0A21 i GP2D120 (20-150 centimetara). Ovde se, za razliku od senzora FC-51, pin namenjen izlaznim podacima priključuje na analogni ulaz Arduina. // radni napon je 5v void setup() { Serial.begin(9600); } void loop() { float napon = analogRead(A0)*0.0048828125; //podatak sa A0 * (5/1024) int daljina = 65*pow(napon, -1.10); //racunaj daljinu delay(1000); // pauza u ocitavanju if (daljina <= 30){ // opseg tacnog merenja do 30cm Serial.println(daljina); // ispisi daljinu } } pow(baza, eksponent) Cilj te funkcije jeste da stepenuje vrednost baznog broja sa eksponentom koji, u našem slučaju, ima vrednost -1.10. Vraća vrednost u formatu pokretne zapete. Cene za Sharpove IC senzore se kreću od četiri evra za GP2Y0A41 do 20 i više evra za GP2D120. Senzor detekcije kretanja (PIR) void setup(){ pinMode(13,OUTPUT); pinMode(2,INPUT); } void loop(){ digitalWrite(13,digitalRead(2)); } Detektor plamena Ovi moduli naročito podsećaju (kako izgledom, tako i po principu funkcionisanja) na modul za otkrivanje prepreka. Detektuju IC svetlost u rasponu od 760 do 1100 nanometara i pri tome im radni ugao iznosi oko 60 stepeni. Postoje moduli sa više IC prijemnih dioda kako bi se povećala širina merenja. U prodaji se nalaze modeli sa tri ili četiri nožice koji se razlikuju po tome što, pored digitalnog izlaza koji postoji kod oba modela, četvrti pin predstavlja liniju analognih podataka. To su uređaji jednostavne konstrukcije koji dobijaju signal preko IC prijemnika i zatim se putem analognog integrisanog kola sa ulogom diferencijalnog komparatora porede nivoi napona dobijeni sa senzora sa onima koji određuju prag aktivacije. Podešavanje osetljivosti senzora obavlja se potenciometrom, i to tako što okretanje u smeru kazaljke na časovniku povećava osetljivost. Ukoliko je struja generisana senzorom jača od zadatog praga osetljivosti, na digitalnom izlazu se pojavljuje jedinica, što je znak da je detektovan plamen. Sa druge strane, na analognom izlazu se pojavljuju različiti podaci preko kojih je moguće pratiti intenzitet plamena, što u pojedinim situacijama može da bude od koristi za sofisticiranije nadgledanje procesa. Od vrste upotrebljenog IC senzora zavisi i talasna dužina svetlosti na koju modul reaguje, kao i daljina na kojoj se nalazi detektovani izvor plamena. Obično se radni opseg nalazi u granicama 20 do 100 centimetara, a važi pravilo – što je plamen intenzivniji, udaljenost može da bude veća. Prilikom merenja je važno ne prinositi senzor previše blizu plamena, pošto to može da uništi uređaj. int stanje = LOW ; // nema plamena void setup () { pinMode(2, INPUT); // ulazni pin senzora pinMode(13, OUTPUT); // LED lampica Serial.begin(9600); } void loop () { delay (2000); float analogni= analogRead(A0); //analogne vrednosti Serial.println(analogni); // ispisujemo ih stanje = digitalRead(2) ; // ocitavamo pin 2 if (stanje == HIGH) // ima li plamena? { //ima Serial.println ("DETEKTOVAN PLAMEN!" ); digitalWrite(13, HIGH); } else { Serial.println ( "................" ) ; digitalWrite (13 ,LOW); } } Mi smo za ovu priliku koristili modul KY-026 čija cena iznosi oko 90 centi. U slučaju korišćenja nekih drugih modula, postoji mogućnost da logička jedinica predstavlja stanje bez plamena, dok logička nula znači da je plamen detektovan. Sonar Jedna od glavnih prednosti koje nude ultrazvučni senzori u odnosu na svoju sabraću koja koriste IC svetlost jeste mogućnost preciznog merenja, bez obzira na boju prepreke, pošto tamni predmeti upijaju svetlost i time komplikuju rad svetlosnih senzora. Udaljenost se računa pomoću jednostavne formule: udaljenost = trajanje_eha * brzina_zvuka / 2 Pošto znamo da se brzina zvuka najčešće zaokružuje na 340 metara u sekundi (0,034 centimetara u mikrosekundi), onda se udaljenost u centimetrima računa ovako: udaljenost = trajanje _eha * 0.034 / 2 Dužinu trajanja eha u mikrosekundama saznajemo preko funkcije pulseIn(), dok deljenje sa dva ima zadatak da prepolovi ukupno pređeni put zvuka. void setup() { pinMode(2, OUTPUT); // izlazni Trig pin pinMode(3, INPUT); // ulazni Echo pin Serial.begin(9600); } void loop() { digitalWrite(2, LOW); // saljemo LOW na Trig radi bolje tacnosti delayMicroseconds(2); // u trajanju 2 mikrosekunde digitalWrite(2, HIGH); // stavljamo Trig na HIGH (slanje signala) delayMicroseconds(10); // cekamo 10 mikrosekundi digitalWrite(2, LOW); // vracamo Trig na LOW int daljina = pulseIn(3, HIGH) * 0.034/2; //racunanje udaljenosti Serial.print(daljina); Serial.println(" cm"); // ispis rezultata delay(1000); // ponavljamo svaki sekund } Iako je i ovde u pitanju jednostavan kôd, stvari se mogu odraditi još jednostavnije korišćenjem biblioteke NewPing (goo. #include <NewPing.h> // Trig, Echo i maksimalna udaljenost NewPing ultrazvuk(2, 3, 400); void setup() { Serial.begin(9600); } void loop() { delay(500); Serial.print("Daljina: "); Serial.print(ultrazvuk.ping_cm()); Serial.println("cm"); } Precizniji rezultati se postižu uvođenjem formule koja uzima u obzir faktore koji utiču na brzinu zvuka, kao što su temperatura i relativna vlažnost vazduha, ali to prelazi okvire ovog teksta. Daljinsko merenje temperature Ovu temu ćemo zbog ograničenog prostora predstaviti u kraćim crtama. Moduli za daljinsko merenje temperature koštaju od četiri do preko 20 evra. Najčešće se kao osnova takvih modula javljaju senzori Melexis MLX90614 i MLX90615, koji mogu funkcionisati i samostalno (bez modula), pošto u sebi imaju ugrađenu logiku kompatibilnu sa poznatim I2C interfejsom. Dve nožice senzora su namenjene napajanju, dok preostale dve služe kao linije za sinhronizaciju (SCL) i prenos podataka (SDA), koje povezujemo sa Arduino pinovima A4 i A5. Postoje modeli koji rade na pet volti, kao i oni za 3,3 volta. Ovi senzori imaju fiksnu I2C adresu (0x5A), pa je istovremeno moguće priključiti samo jedan ovakav uređaj. Reč je o senzorima sa opsegom merenja od -70 do 380°C, pri čemu, zahvaljujući ugrađenom 17-bitnom ADC konverteru, garantuju pouzdanost rezultata od ±0,5°C u opsegu 0-50°C, dok prilikom merenja temperatura bliskih maksimalnim vrednostima odstupanja iznose i do 3-4°C. Postoje i varijante senzora čija preciznost odgovara medicinskim standardima, što podrazumeva merenja sa greškom od ±0,1°C u opsegu temperature ljudskog tela. Istovremeno su u stanju da mere kako temperaturu posmatranog objekta, tako i temperaturu ambijenta. #include <Wire.h> //I2C biblioteka #include <Adafruit_MLX90614.h> Adafruit_MLX90614 MLX= Adafruit_MLX90614(); void setup() { Serial.begin(9600); MLX.begin(); // Inicijalizacija MLX90614 } void loop() { float prostor = MLX.readAmbientTempC(); //temperatura prostorije float objekt = MLX.readObjectTempC(); //temp. posmatranog predmeta Serial.println("Prostorija: " + String(prostor)); Serial.println("Predmet: " + String(objekt)); Serial.println(); delay(500); } Igor S. RUŽIĆ |
| ||||||||||||||||||||||||||||||||||||
Home / Novi broj | Arhiva • Opšte teme | Internet | Test drive | Test run | PD kutak | CeDeteka | WWW vodič • Svet igara Svet kompjutera Copyright © 1984-2018. Politika a.d. • Redakcija | Kontakt | Saradnja | Oglasi | Pretplata • Help • English | |
SKWeb 3.22 |