LAKI PINGVINI<>
012018<><>

Arduino: IC i UZ u akciji

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č

Uređaji za daljinsko upravljanje televizorima su prilično fascinirali autora ovih redova tokom detinjstva . Nije bilo lako razumeti tu nevidljivu silu koja je u stanju da promeni kanal bez potrebe da čovek ustaje iz kreveta. Ranije je bilo prilično komplikovano projektovati uređaj na daljinsko upravljanje, ali sada, zahvaljujući Arduinu, projektovanje sklopova koji koriste tehnologiju zasnovanu na infracrvenim zracima postalo je skoro trivijalno. Zahvaljujući povoljnim ponudama kineskih trgovaca, danas smo u prilici da naručimo sav potreban hardver koji nam na kućnu adresu dolazi po neverovatno niskoj ceni. Komplet koji smo koristili ovom prilikom sastoji se od daljinskog upravljača pod inspirativnim nazivom 042803, sa pratećom „dugmastom” CR2025 baterijom, pločice koja olakšava povezivanje, infracrvene prijemne diode CHQ1838 i trožilnog kabla za povezivanje, a košta 90 evro centi. Da stvar bude lepša, komplet je moguće koristiti na praktično svim uređajima koji rade sa 3,3 ili pet volti (Arduino Due, Raspberry Pi...).

 
Pogledaćemo izbliza kako funkcioniše prenos podataka od daljinskog upravljača do ciljnog senzora. U našem slučaju, „daljinac” radi na frekvenciji od 38 kiloherca i u prenosu koristi standard kompanije NEC. Nažalost, velike kompanije su praktikovale forsiranje sopstvenih standarda, pa postoji visok nivo nekompatibilnosti.

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

Kada smo rešili pitanje rasporeda pinova, na red dolazi pisanje Arduino skeča:

#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

}

}

 
Zadatak skeča je krajnje jednostavan – u konzoli serijskog monitora treba da prikaže kodove pritisnutih tastera na daljinskom upravljaču. Prilikom prvog pritiska na taster ispisuje se heksadecimalni broj koji predstavlja kôd tog tastera. Ukoliko taster držimo duže, u prozoru terminala se prikazuje 32-bitna heksadecimalna vrednost FFFFFFFF (4.294.967.295 decimalno), što predstavlja kôd za ponavljanje. U našem slučaju, vrednosti za sve tastere daljinskog upravljača prikazane su na pratećoj ilustraciji. U slučaju da imate model različit od ovoga, gornji skeč će vam ispisom podataka pomoći da identifikujete potrebne kodove. Ista stvar važi i za bilo koji daljinski upravljač iz domaćinstva koji vam se može naći pri ruci.

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;

}

}

 
Direktno povezivanje Arduina sa senzorom je trivijalno, pa čak i jednostavnije nego sa korišćenjem dodatne pločice. Dovoljno je povezati strujne linije i liniju za slanje podataka i sklop će biti spreman za korišćenje.

Detektor prepreka

U pitanju je modul (najčešće se radi o modelu FC-51) koji na sebi ima diodu za emitovanje infracrvene svetlosti (sa prozirnim staklom) i diodu za prijem IC zračenja (sa tamnim staklom). I ovde je princip rada krajnje jednostavan i sastoji se iz detekcije zraka reflektovanih od površine nekog predmeta. Važi pravilo da svetliji predmeti bolje reflektuju svetlost od tamnih predmeta, pa od toga zavisi na kojoj udaljenosti će biti detektovana prepreka. Od ostalih komponenti na modulu možemo izdvojiti čip LM393, koji obavlja ulogu komparatora (upoređuje dva napona i informiše koji je od njih veći), i potenciometar koji služi za podešavanje osetljivosti merenja. Zbog jednostavne konstrukcije ne može se odrediti udaljenost prepreke, već se blizina detekcije može samo povećavati ili smanjivati putem pomenutog potenciometra, a ona iznosi od tri do 30 centimetara, dok je ugao detekcije oko 35 stepeni. Moduli se mogu pazariti po ceni od 70 centi. Povezivanje je krajnje jednostavno i od nas zahteva da nožicu senzora, najčešće označenu kao OUT, DOUT ili DO (Data Out), priključimo na neki od digitalnih ulaza Arduina. Senzor može da prikaže samo dve vrednosti: HIGH (ne vidi prepreku) i LOW (prepreka detektovana).

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.

Postoje i dovoljno slični (ali i dovoljno različiti) moduli koji na sebi sadrže senzore, kao što su APDS-9930 ili TMD27713, koji se ugrađuju u praktično sve savremene mobilne telefone. Osim detekcije emitera IC zračenja u neposrednoj blizini (do deset centimetra), ovi senzori mogu da služe i za utvrđivanje nivoa osvetljenosti ambijenta, kao i za praćenje gestikulacija. Za komunikaciju sa Arduinom koriste I2C interfejs, tako da su jednostavni za povezivanje. Cena ovakvih modula se kreće od 1,3 evra, pa na više.

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

}

}

Promenljiva napon uzima vrednost sa pina A0 i nju množimo sa vrednošću koju dobijamo deljenjem radnog napona (5V) sa rezolucijom A/D konvertera, koja za model Uno iznosi 1024 (210). Daljinu određujemo formulom koja množi konstantu 65 sa rezultatom funkcije pow, koja ima sledeći oblik:

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)

 
Praktično svi senzori koje smo predstavili u ovom tekstu su krajnje jednostavni za povezivanje, a ista je stvar i sa senzorom za detekciju kretanja, koji se često označava i kao PIR senzor (Pyroelectric Infra-Red motion sensor). Reč je o pasivnom tipu senzora koji se aktivira prisustvom IC zračenja iz bilo kog izvora. Piroelektricitet predstavlja mogućnost pojedinih materijala da stvaraju napon prilikom promene temperature, a sama fizička pojava spada u kategoriju piezoelektriciteta. Pošto je količina infracrvenog zračenja koju emituje ljudsko telo prilično mala, ovi senzori koriste takozvana Fresnelova sočiva, čiji je cilj da koncentrišu što veću količinu zračenja i upute je na aktivnu površinu senzora. Ispod sočiva koje ima oblik bele polulopte nalazi se sam PIR senzor. Jedan od najrasprostranjenijih modela na tržištu nosi oznaku HC-SR501 i njegov radni napon se kreće u opsegu 3–20 volti, dok na izlazu daje napon od 3,3 volta za stanje logičke jedinice. Ugao pokrivenosti posmatrane površine iznosi 120-140 stepeni, udaljenost tela je u rangu od tri do sedam metara, a moguće ga je koristiti pri temperaturama od -15 do +70 celzijusa. Vetar i blizina izvora svetlosti loše utiču na rad senzora.

Džamperima sa donje strane uređaja određujemo da li se detekcija može ponavljati ili ne. Postoje dva modusa koji se nazivaju H (re-triggering mode) i L (non re-triggering mode). Modus H daje logičku jedinicu sve dok se izvor zračenja kreće u zoni senzora, dok L modus nakon detekcije emitera na izlaz postavlja logičku jedinicu, bez obzira na to da li postoji nastavak kretanja, i biva vraćen na logičku nulu nakon zadanog vremenskog intervala.

 
Na modulu se nalaze i dva potenciometra kojima se reguliše osetljivost (desni) i interval između merenja (levi). Okretanjem desnog potenciometra u smeru kazaljke na satu smanjuje se osetljivost, odnosno daljina merenja, koja iznosi tri metra kada je potenciometar krajnje desno i oko sedam metara kada je krajnje levo. Kod potenciometra za određivanje intervala merenja okretanje u smeru kazaljke na satu znači uvećanje perioda, koji u maksimalnom položaju iznosi oko pet minuta, dok je u minimalnom tri sekunde. Napominjemo da je za pravilan rad modula potrebno pričekati jedan minut dok se ne stabilizuje prijem senzora. Mogu se nabaviti po ceni od 90 centi.

Kôd koji prilikom detekcije emitera IC zračenja aktivira ugrađenu LE diodu na Arduino pinu 13 više je nego jednostavan:

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.

Princip funkcionisanja je sličan onom koji smo opisivali kod senzora za detektovanje prepreka, samo što se u ovom slučaju umesto IC svetlosti koristi ultrazvuk, čija se frekvencija kreće u opsegu od 20 kiloherca do nekoliko gigaherca. Jedan od cilindara služi za generisanje zvučnog talasa, dok je uloga drugog da detektuje odbijeni talas. U skladu sa tim, osim pinova za napajanje, imamo i dve dodatne nožice koje služe za slanje signala preko senzora (Trigger) i za hvatanje refleksije emitovanog signala (Echo).

 
Jedan od najčešće korišćenih modula nosi oznaku HC-SR04 i radi na frekvenciji od 40 megaherca, dok po specifikaciji može detektovati predmete sa preciznošću od tri milimetra na razdaljini od dva centimetra do četiri metra i sa širinom merenja od 30 stepeni. U slučaju detektovanja prepreke, na izlazu imamo stanje logičke jedinice.

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.gl/QaCjea).

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

Postoji nekoliko biblioteka za rad sa ovim senzorima, a mi ćemo za ovu priliku koristiti onu pod nazivom Adafruit MLX90614, koja se nalazi u menadžeru biblioteka Arduino IDE.

#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Ć

 
Kuda plovi ovaj brod
SimpleScreenRecorder 0.3.8
Joplin 0.10.25
Arduino: IC i UZ u akciji
Šta mislite o ovom tekstu?
Štitovi Arduina (4): Ethernet Shield
Home / Novi brojArhiva • Opšte temeInternetTest driveTest runPD kutakCeDetekaWWW vodič • Svet igara
Svet kompjutera Copyright © 1984-2018. Politika a.d. • RedakcijaKontaktSaradnjaOglasiPretplata • Help • English
SKWeb 3.22
Opšte teme
Internet
Test Drive
Test Run
PD kutak
CeDeteka
WWW vodič
Svet igara



Naslovna stranaPrethodni brojeviOpšte informacijeKontaktOglašavanjePomoćInfo in English

Svet kompjutera