This is an old revision of the document!
Autor: Tascu Stelian-Andrei Grupa: 331CA GitHub: https://github.com/steliantascu/Proiect-PM
Desktop Companion este un dispozitiv de birou bazat pe microcontrolerul ATmega328P (placa Arduino Uno), care imbina interactiunea om-masina cu un mic element de surpriza mecanica. Robotul detecteaza prezenta utilizatorului in fata sa, asculta mediul ambiental si reactioneaza la stimuli sonori printr-un gest de salut, iar la o secventa specifica de zgomote deschide un compartiment ascuns (sertar).
Scopul proiectului este de a construi un mic companion de birou care sa fie placut vizual, sa raspunda la prezenta utilizatorului si sa ofere o functionalitate practica reala: ascunderea unor obiecte mici (chei, USB stick, monezi) intr-un sertar care se deschide doar la o parola sonora (de exemplu trei batai din palme la interval scurt).
Ideea a pornit de la observatia ca pe birourile de student se aduna mereu obiecte mici care se pierd, iar majoritatea sertarelor de birou sunt fie incuiate cu chei, fie complet deschise. M-am gandit ca un dispozitiv care sa imbine partea ludica (un robot care saluta) cu partea utila (un mini-seif acustic) ar fi un proiect interesant pentru laboratorul de PM, deoarece acopera o gama larga de tehnici invatate: ADC, PWM, intreruperi, I2C si o masinarie de stari complexa.
Ipoteza de pornire: Combinatia dintre detectia de prezenta (ultrasonic) si analiza spectrului audio (ADC pe microfon analogic) permite construirea unui sistem reactiv care nu consuma energie inutil cand nu este nimeni in fata lui, dar reactioneaza prompt cand utilizatorul interactioneaza cu el. In plus, folosirea unei parole sonore in locul unei chei fizice elimina problema clasica a cheilor pierdute.
Sistemul are Arduino Uno (ATmega328P) pe post de nod central. In jurul lui graviteaza patru periferice principale: doi servomotori (unul pentru bratul care saluta, unul pentru zavorul sertarului), un senzor ultrasonic HC-SR04 pentru detectia prezentei si un microfon analogic KY-037 pentru ascultarea mediului. Iesirea catre utilizator se face printr-un LCD 16×2 conectat prin I2C (cu adaptor PCF8574), care afiseaza starea curenta si nivelul de zgomot detectat.
Logica este organizata ca un automat finit de stari (FSM) cu urmatoarele stari principale:
minim (zZz), ADC-ul este oprit, servomotoarele sunt in repaus.
ADC-ul pe microfon si monitorizeaza nivelul sonor.
salut prin servomotorul 1.
in care numara batai succesive.
servomotorul 2 deblocheaza sertarul.
Tranzitiile dintre stari sunt declansate de intreruperi pe Timer (pentru ultrasonic), conversia ADC (pentru analiza audio) si temporizatoare interne pentru starea de SLEEP.
Schema Bloc:
Proiectul cuprinde componente care opereaza la 5V, partajand aceeasi masa (GND). Servomotoarele beneficiaza de o decuplare locala prin condensatorul electrolitic pentru a preveni fluctuatiile de tensiune pe microcontroller.
Toate componentele au fost achizitionate, conectate fizic pe breadboard si testate. Montajul a fost prezentat la laboratorul de PM (17.05.2026), unde a fost demonstrata functionarea sistemului cu codul incarcat pe placa. Sursa de alimentare HW-131 functioneaza corect pe iesirea de 5V. Condensatorul electrolitic de 10000uF montat pe rail-ul de alimentare previne resetarea microcontrollerului la pornirea brusca a servomotoarelor.
Au fost conectate si verificate individual: cele doua servomotoare SG90, senzorul ultrasonic HC-SR04, microfonul analogic KY-037 si afisajul LCD 16×2 cu interfata I2C.
| Componenta | Model | Pin Arduino Uno |
|---|---|---|
| Microcontroler | Arduino Uno (ATmega328P) | — |
| Senzor Ultrasonic | HC-SR04 | Trig=D8, Echo=D2 |
| Microfon Analogic | KY-037 | A0 |
| Servomotor Brat | SG90 (180 grade) | D9 (OC1A) |
| Servomotor Sertar | SG90 (180 grade) | D10 (OC1B) |
| Afisaj | LCD 16×2 I2C (PCF8574) | A4=SDA, A5=SCL |
| Alimentare | Sursa breadboard HW-131 | Baterie 9V |
| Filtrare | Condensator 10000uF 25V | Rail 5V |
Senzor ultrasonic HC-SR04 Masoara distanta prin trimiterea unui puls scurt pe pinul Trig si masurarea latimii pulsului intors pe Echo. Pinul Echo este conectat la D2 (INT0), ceea ce permite masurarea exacta a timpului de zbor prin intrerupere externa, fara delay-uri blocante.
| Pin HC-SR04 | Pin Arduino Uno | Motiv |
|---|---|---|
| VCC | 5V | alimentare modul |
| GND | GND | masa comuna |
| Trig | D8 (PB0) | iesire digitala, puls 10us |
| Echo | D2 (PD2/INT0) | intrerupere externa pentru masurare |
Microfon analogic KY-037 Folosesc iesirea analogica pentru a distinge intensitatea zgomotului. Semnalul intra in canalul ADC0 (A0). Conversia se face la cerere cu asteptare, suficient de rapida pentru frecventa de esantionare necesara detectiei batailor din palme.
| Pin KY-037 | Pin Arduino Uno | Motiv |
|---|---|---|
| VCC | 5V | alimentare modul |
| GND | GND | masa comuna |
| A0 | A0 (ADC0) | canal ADC pentru intensitate sonora |
| D0 | neconectat | nu este folosit |
Servomotoare SG90 Controlate prin PWM la 50 Hz generat hardware de Timer 1. D9 si D10 sunt singurii pini legati la OC1A si OC1B pe ATmega328P, deci nu pot fi schimbati pentru PWM hardware. Alimentarea vine direct din breadboard pentru a nu suprasolicita regulatorul Arduino.
| Pin SG90 | Pin Arduino Uno | Motiv |
|---|---|---|
| Semnal (portocaliu) Brat | D9 (OC1A) | PWM hardware Timer 1 canal A |
| Semnal (portocaliu) Sertar | D10 (OC1B) | PWM hardware Timer 1 canal B |
| VCC (rosu) | 5V breadboard | alimentare directa |
| GND (maro) | GND breadboard | masa comuna |
LCD 16×2 cu interfata I2C (PCF8574) Modulul I2C reduce conexiunile de la 6 la 2. A4 si A5 sunt pinii hardware dedicati I2C pe ATmega328P (SDA/SCL) si nu pot fi inlocuiti pentru TWI hardware. Adresa implicita a modulului PCF8574 este 0x27 (7-bit) = 0x4E (8-bit write).
| Pin LCD I2C | Pin Arduino Uno | Motiv |
|---|---|---|
| VCC | 5V | alimentare modul |
| GND | GND | masa comuna |
| SDA | A4 (PC4) | linie date I2C hardware |
| SCL | A5 (PC5) | linie ceas I2C hardware |
Condensator electrolitic 10000uF 25V Montat pe sinele breadboard-ului langa servomotoare. Absoarbe varfurile de curent la pornirea motoarelor. Piciorul lung (+) la sina de 5V, piciorul scurt (-) la GND.
Schema realizata in Cirkit Designer. Arduino Uno in centru, toate componentele impart masa comuna, servomotoarele au alimentarea decuplata prin condensatorul de 10000uF.
Codul este scris in C, dezvoltat in PlatformIO cu framework Arduino (necesar doar pentru toolchain-ul de upload). Toate perifericele sunt configurate direct prin manipularea registrilor ATmega328P, fara a folosi nicio functie din biblioteca Arduino.
Codul este complet functional si a fost testat pe Arduino Uno. La prezentarea din laborator (19.05.2026) a fost demonstrata functionarea integrala: detectia prezentei, gestul de salut, recunoasterea secventei de 3 batai din palme si deschiderea sertarului cu numaratoare inversa.
hardware directa.
Expune: set_servo_brat(unghi), set_servo_sertar(unghi), citeste_microfon(),
citeste_distanta(). * **lcd_i2c.c / lcd_i2c.h** — Driver complet TWI manual + control LCD HD44780 in mod 4-bit prin expandorul PCF8574.
Proiectul nu foloseste nicio biblioteca externa. Tot codul interactioneaza direct cu registrii hardware. Singurele includeri sunt din AVR-libc standard (avr/io.h, avr/interrupt.h, util/delay.h). Framework-ul Arduino este prezent doar in platformio.ini pentru a permite upload-ul prin USB fara programator extern.
Motivul acestei alegeri: manipularea directa a registrilor demonstreaza intelegerea arhitecturii microcontrollerului si este cerinta explicita a cursului de PM.
Elementul central care diferentiaza proiectul este recunoasterea parolei sonore secventiale. Sistemul nu reactioneaza la orice zgomot — prima bataie declanseaza salutul, iar urmatoarele 3 batai intr-o fereastra de 3 secunde deschid sertarul. Microfonul este folosit pe iesirea analogica (nu digitala), ceea ce permite detectia pragului de intensitate si un mecanism de debounce sonor (200ms cooldown dupa fiecare bataie detectata).
Lab 2 — Intreruperi externe (INT0) Masurarea duratei pulsului Echo de la HC-SR04 cu delay_us() ar bloca procesorul. INT0 pe D2 declanseaza la orice schimbare logica: front crescator reseteaza Timer0, front descrescator citeste TCNT0 si calculeaza distanta. CPU-ul e liber intre fronturi.
Lab 3 — Timere si PWM (Timer 1) SG90 necesita 50Hz cu puls 1ms-2ms. Timer 1 Fast PWM cu TOP=ICR1=39999 genereaza hardware acest semnal pe D9 si D10 fara interventie CPU dupa initializare. Unghiul se schimba scriind in OCR1A sau OCR1B.
Lab 4 — ADC KY-037 pe iesirea analogica produce ~510 ADC in liniste, ~700-900 la bataie din palme. ADC cu AVCC referinta si prescaler 128 converteste tensiunea in 0-1023. Pragul 600 a fost calibrat experimental.
Lab 6 — I2C/TWI Driver TWI manual: TWBR=72 pentru 100kHz, secventa start/adresa/date/stop, protocol HD44780 in mod 4-bit (fiecare byte in doua nibble-uri cu EN toggle prin expandorul PCF8574).
main()
init_hardware() Timer1 PWM + ADC + INT0
lcd_init() TWI 100kHz + secventa init HD44780
loop:
distanta = citeste_distanta() puls Trig, asteapta ISR INT0
SLEEP:
afiseaza ZzZz
distanta < 50cm => IDLE_AWAKE
IDLE_AWAKE:
afiseaza "Sunt treaz!"
nivel = citeste_microfon()
nivel > 600 => GREETING
distanta > 50cm => SLEEP
GREETING:
servo_brat(90) delay(600ms) servo_brat(0)
=> LISTENING_FOR_PASSWORD
LISTENING_FOR_PASSWORD:
bucla 3 secunde:
numara varfuri ADC > 600
debounce 200ms dupa fiecare bataie
3 batai => DRAWER_OPEN
altfel => IDLE_AWAKE
DRAWER_OPEN:
servo_sertar(90)
numaratoare inversa 5s pe LCD
=> DRAWER_CLOSING
DRAWER_CLOSING:
servo_sertar(0)
=> IDLE_AWAKE
Microfon KY-037: In liniste ADC returneaza ~510 (tensiunea de offset a capsulei la jumatatea intervalului 0-5V). O bataie din palme la 50cm produce varfuri 700-900. Procedura de calibrare: am citit valorile in liniste, am notat minimul la 10 batai din palme, am ales pragul cu 90 unitati marja fata de zgomotul de fond. Rezultat: PRAG=600.
HC-SR04: Formula: distanta_cm = (TCNT0 * 109) / 100. Derivata din: 1 tick Timer0 = 64us (prescaler 1024, 16MHz), viteza sunet 343m/s. Verificata cu rigla la 10, 20, 50cm.
Servomotoare SG90: Teoretic: OCR=2000 ⇒ 1ms ⇒ 0 grade, OCR=4000 ⇒ 2ms ⇒ 180 grade. In practica valorile au fost ajustate experimental pana la miscarea corecta.
Fara timeout, lipsa obiectului in camp blocheaza procesorul la nesfarsit.
varfuri ADC. Cooldown-ul de 200ms previne numararea multipla a aceluiasi sunet.
mesaje) fara a complica logica din DRAWER_OPEN.
deschidere sertar la 3 batai din palme.
De completat la finalul proiectului.
hardware cu codul incarcat pe placa.
functional cu toate modulele integrate.