Table of Contents

Desktop Companion: Robot interactiv cu analiza de zgomot si sertar mecanic

Autor: Tascu Stelian-Andrei Grupa: 331CA GitHub: https://github.com/steliantascu/Proiect-PM

1. Introducere

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.

2. Descriere Generala

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:

Schema bloc

3. Hardware Design

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.

Stadiul actual al implementarii

Toate componentele au fost achizitionate, conectate fizic si integrate intr-o carcasa transparenta din plastic. Montajul a fost prezentat la laboratorul de PM, 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.

Carcasa proiectului este o cutie transparenta de plastic in care sunt integrate toate componentele: Arduino Uno si breadboard-ul pe fundul cutiei, LCD-ul 16×2 montat pe peretele frontal, HC-SR04 si microfonul KY-037 fixate pe marginile cutiei, iar servomotorul cu bratul de salut montat in exterior pe peretele din spate.

Au fost conectate si verificate: cele doua servomotoare SG90, senzorul ultrasonic HC-SR04, microfonul analogic KY-037 si afisajul LCD 16×2 cu interfata I2C.

Lista de Componente

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

Descriere Detaliata a Modulelor

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, 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 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 Electrica

Schema electrica Desktop Companion

Schema realizata in Cirkit Designer. Arduino Uno in centru, toate componentele impart masa comuna, servomotoarele au alimentarea decuplata prin condensatorul de 10000uF.

4. Software Design

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.

Stadiul actual al implementarii software

Codul este complet functional si a fost testat pe Arduino Uno. La prezentarea din laborator a fost demonstrata functionarea integrala: detectia prezentei, gestul de salut, recunoasterea secventei de 3 batai din palme si deschiderea sertarului cu numaratoare inversa.

Organizarea codului

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.

Biblioteci folosite

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 de noutate

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

Justificarea laboratoarelor

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

Algoritmul Principal (FSM)

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

Calibrarea senzorilor

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.

Optimizari

Fara timeout, lipsa obiectului in camp blocheaza procesorul la nesfarsit.

varfuri ADC. Cooldown-ul de 200ms previne numararea multipla a aceluiasi sunet.

logica din DRAWER_OPEN.

5. Rezultate Obtinute

Proiectul a fost finalizat si testat in conditii reale. Toate cele 6 stari ale FSM functioneaza conform specificatiilor.

Sistemul detecteaza corect prezenta unei persoane la mai putin de 50cm prin senzorul HC-SR04 si trece din starea de repaus in starea activa. La detectia primului zgomot puternic, servomotorul executa gestul de salut ridicand bratul la 90 de grade si coborand inapoi. Dupa salut, sistemul asteapta 3 secunde in care numara batai din palme — la 3 batai corecte sertarul se deschide si se inchide automat dupa 5 secunde cu numaratoare inversa afisata pe LCD.

Pragul ADC calibrat la 600 functioneaza stabil in mediu de birou. Timeout-ul de 30ms la citeste_distanta() previne blocarea sistemului cand nu este niciun obiect in fata senzorului. Debounce-ul de 200ms elimina detectia multipla a aceleiasi batai.

Carcasa finala este o cutie transparenta de plastic in care sunt integrate toate componentele: electronics pe fundul cutiei, LCD montat pe peretele frontal, senzori pe margini, brat de salut in exterior. Sertarul al doilea urmeaza sa fie montat.

Desktop Companion — vedere frontala cu LCD, HC-SR04 si brat de salut

6. Concluzii

Proiectul Desktop Companion a fost realizat integral, de la alegerea componentelor pana la implementarea software completa si integrarea intr-o carcasa functionala.

Din punct de vedere tehnic, cel mai valoros aspect a fost implementarea de la zero a tuturor driverelor hardware — TWI pentru LCD, PWM pe Timer 1 pentru servomotoare si intreruperea externa INT0 pentru senzorul ultrasonic — fara a folosi nicio functie din biblioteca Arduino. Aceasta abordare a necesitat intelegerea directa a registrilor ATmega328P si reprezinta principala valoare de invatare a acestui proiect in contextul cursului de PM.

Dificultatea principala intalnita a fost calibrarea pragului audio al microfonului KY-037. Valoarea ADC in repaus variaza in functie de mediul ambiental, iar pragul fix de 600 ales experimental poate necesita ajustare in spatii foarte zgomotoase sau foarte silentioase. O imbunatatire naturala ar fi un prag adaptiv calculat automat la pornire.

Carcasa transparenta din plastic s-a dovedit o solutie practica si vizuala — permite vizualizarea completa a electronicii in timp ce ofera o structura rigida pentru montarea componentelor mecanice.

Ca directii viitoare de dezvoltare: adaugarea memoriei EEPROM pentru stocarea parolei (care sa poata fi schimbata), un indicator LED pentru starea FSM si o carcasa mai rigida cu sertarul integrat mecanic mai precis.

7. Jurnal

hardware cu codul incarcat pe placa.

functional cu toate modulele integrate.

documentatiei finale.

8. Bibliografie / Resurse