Senzor de prezenta cu infrarosu
Proiectul presupune aprinderea unui bec atunci cand o persoana se apropie de microcontroler.
Este util pentru becurile din parcuri sau din institutii publice. O alta utilizare a ideii ar putea fi pentru implementarea unei alarme de apartament: in cazul unei intrari prin efractie se poate declansa o alarma sau se poate trimite un semnal unei firme de paza etc.
Sistemul poate fi, de asemenea, folosit la supermarketuri ca senzor pentru banda rulanta de cumparaturi.
Schema am gandit-o eu. Mi-am ales subiectul uitandu-ma in mare peste proiectele de anul trecut, dar cand am ajuns sa implementez mi-am dat seama ca nu erau terminate.
Vom folosi un receptor si un emitor.
Emitorul trimite semnal un timp (tp), apoi asteapta (toff):
Am ales SFH 5110, un receptor care detecteaza lumina de la sisteme remote cu infrarosu.
Receptorul functioneaza la frecventa de 38 de KHz si primeste semnalul trimis de emitor; daca semnalul nu ajunge la receptor inseamna ca a intervenit ceva intre cei doi, deci este sesizata o prezenta. Emitorul functioneaza intr-o gama larga de frecvente, acoperind-o si pe cea de 38 de KHz, deci nu mai este nevoie sa sincronizez eu din soft emitorul si receptorul.
Schema proiectului, facuta in Proteus, este urmatoarea:
Fata de aceasta schema am schimbat un pin, pentru ca erau conectorii prea apropiati si faceau scurt-circuit. Pinul 35 a devenit acum pinul 34.
Voi atasa microcontrolerului inca o placuta, pe care o voi conecta la cea de baza folosind 4 fire, care sa duca la ground, vcc si PA4 si PA6.
Pe langa componentele placii de baza voi mai folosi:
* un receptor SFH 5110-38
* un emitor (led infrarosu)
* un condensator de 5uF
* o rezintenta de 90 de Ohmi
* o rezistenta de 20 de kOhmi
* un led
* o rezistenta de 1 kOhm
Schema conectarii receptorului este urmatoarea:
Rezistenta de 90 de Ohmi (R1) si condensatorul (C1) au rolul de a nivela fluctuatiile de tensiune.
Rezistenta R3 protejeaza becul sa nu se arda.
In privinta emitorului, anodul lui va fi conectat la VCC iar catodul la ground.
Aceste componente le-am lipit pe o placuta auxiliara, pe care o voi conecta la placa de baza prin 4 fire: unul va duce la ground, unul la vcc si doua la pini de date al microcontrolerului. Pentru ground voi folosi pinul 11(GND), pentru vcc voi folosi pinul 10(VCC) iar pentru comunicatia catre si de la microcontroler voi folosi pinii 36(PA4) si 34(PA6).
Programul va fi dezvoltat in AVR Studio.
Principiu:
Atunci cand este sesizata o prezenta(se intrerupe conexiunea dintre emitator si receptor), microcontrolerul nu mai primeste semnal pe pinul PA4 si aprinde ledul. In restul timpului, ledul ramane stins.
Hardware:
Software:
Intr-o bucla infinita:
/************************************************************************ ********* * Proiectarea cu Microprocesoare * Proiect *********************************************************************************/ #include <avr\io.h> #include <avr\interrupt.h> #include <stdio.h> #include <util/delay.h> /************************************************************************ * DEFINE-uri ************************************************************************/ #define DATA_DDR DDRA // Portul pe care conectam firele la placuta #define DATA_PORT PORTA #define LcdDATA_PIN PINA #define Recv PA4 // Pin-ul pe care se primesc date de la receiver #define Led PA6 // Pin-ul pe care se trimit date catre led /************** * API Senzor * **************/ void Senzor_init(); //initializare modul Senzor. O vom apela prima. unsigned int read_from_recv(); //primeste date de la receiver void set_led(); //aprinde led void unset_led(); //stinge led int main() { Senzor_init(); unsigned int buffer; while(1) { //daca primeste ceva de la senzor nu aprinde becul, altfel il aprinde buffer = read_from_recv(); loop_until_bit_is_set(DDRA,DDA4); set_led(); _delay_ms(1000); unset_led(); } } /***************************** * IMPLEMENTARE API Senzor * *****************************/ void Senzor_init() //initializare modul Senzor. O vom apela prima. { //setam pinul PA4 de intrare si pinul PA6 de iesire // setam toti pinii portului A ca pini de iesire (ii punem pe 1) DATA_DDR = 0xFF; // pinul PA6 il setam de intrare (il punem pe 0) DATA_DDR &= ~(1<<Led); //pinul PA6 (Led) il punem pe 0; restul sunt pusi pe 1 } unsigned int read_from_recv() //primeste date de la receiver { unsigned int read = Led; return read; } void set_led() //aprinde led { // aprindere LED DATA_PORT |= (1<<PD7); } void unset_led() //stinge led { // stingere LED DATA_PORT &= ~(1<<PD7); }
Nu mi-a mers sa incarc fisierul .hex pe placuta. Imi dadea eroarea urmatoare:
Atasez proiectului codul scris de mine si fisierul .hex obtinut, in speranta ca pot sa il pun pe placuta si sa mearga din prima la laborator.
Microcontrolerele sunt usor de programat, ieftine si pot fi produse in masa facil. Ele sunt utile pentru a controla o varietate de echipamente si senzori in vederea automatizarii producerii.