This is an old revision of the document!


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

Autor: Tascu Stelian-Andrei Grupa: 331CA GitHub: Proiect-PM

1. Introducere

Desktop Companion este un dispozitiv de birou bazat pe microcontrolerul ATmega324P, 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 ATmega324P 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:

  • SLEEP: Niciun utilizator detectat in ultimele secunde; LCD-ul afiseaza un mesaj minim (zZz), ADC-ul este oprit, servomotoarele sunt in repaus.
  • IDLE_AWAKE: S-a detectat prezenta la mai putin de 50 cm; sistemul porneste ADC-ul pe microfon si monitorizeaza nivelul sonor.
  • GREETING: S-a detectat un singur prag de zgomot; robotul executa gestul de salut prin servomotorul 1.
  • LISTENING_FOR_PASSWORD: Dupa salut, sistemul intra intr-o fereastra de timp in care numara batai succesive.
  • DRAWER_OPEN: Daca secventa corecta a fost recunoscuta (trei batai rapid), servomotorul 2 deblocheaza sertarul.
  • DRAWER_CLOSING: Dupa o pauza de 5 secunde, sertarul revine in pozitia inchis.

Tranzitiile dintre stari sunt declansate de intreruperi pe Timer (pentru ultrasonic), intreruperea de finalizare a conversiei 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 pentru a preveni fluctuatiile de tensiune pe microcontroller.

Lista de Componente

Componenta Model Interfata MCU
Microcontroler ATmega324P Unitate Centrala
Senzor Ultrasonic HC-SR04 GPIO + Input Capture
Microfon Analogic KY-037 ADC (canal ADC0)
Servomotor Brat SG90 (180 grade) PWM hardware (OC1A)
Servomotor Sertar SG90 (180 grade) PWM hardware (OC1B)
Afisaj LCD 16×2 I2C I2C (TWI)
Alimentare Sursa breadboard Baterie 9V
Filtrare Condensator 1000uF Rail-ul servo

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. Pentru o masurare precisa, Echo este conectat la pinul de Input Capture al unui timer pe 16 biti, permitand calcularea distantei fara delay-uri blocante.

  • VCC: 5V
  • GND: GND
  • Trig: PB0
  • Echo: PD6 (ICP1)

Microfon analogic KY-037 Folosesc iesirea analogica pentru a distinge intensitatea zgomotului. Semnalul intra in canalul ADC0. Conversia se face in mod liber (free running) cu intrerupere la finalul fiecarei conversii, astfel incat CPU-ul sa fie liber pentru logica FSM.

  • A0 (analogic): PA0 (ADC0)

Servomotoare SG90 Sunt controlate prin semnal PWM la 50 Hz (perioada 20 ms), generat hardware de Timer 1 pe doua canale. Pe rail-ul de alimentare am montat un condensator de 1000uF pentru a evita resetarea microcontrollerului la pornirea motoarelor.

  • Servo Brat: PD5 (OC1A)
  • Servo Sertar: PD4 (OC1B)

LCD 16×2 I2C Afiseaza starea FSM si o bara grafica de nivel sonor. Folosirea adaptorului I2C reduce numarul de pini ocupati la doar 2 (SDA/SCL), lasand restul porturilor libere pentru senzori.

  • SDA: PC1
  • SCL: PC0

4. Software Design

Codul este scris in C, dezvoltat in PlatformIO, fara framework-ul Arduino. Toate perifericele sunt configurate direct prin manipularea registrilor.

Organizarea Codului

Codul este impartit pe module pentru o logica curata:

  • main.c: Bucla principala si automatul finit de stari.
  • adc.c: Initializarea ADC in free running mode si rutina de tratare a intreruperii ADC_vect.
  • timer.c: Configurarea Timer 1 pentru PWM pe doua canale si Input Capture.
  • ultrasonic.c: Functii de generare a pulsului Trig si interpretarea valorilor Echo.
  • i2c.c & lcd.c: Driver minimal TWI si controlul LCD in mod 4-bit prin expanderul PCF8574.
  • uart.c: Rutina de print pe serial folosita exclusiv pentru debug.

Algoritmul Principal (FSM)

Logica de baza este implementata fara delay-uri blocante, folosind contoare incrementate in intreruperi de timer:

loop:
    if (timp_inactiv > PRAG_SLEEP) state = SLEEP
    switch (state):
        case SLEEP:
            opreste ADC, LCD afiseaza "zZz"
            daca distanta < 50 cm => IDLE_AWAKE
        case IDLE_AWAKE:
            porneste ADC, LCD: bara nivel sonor
            daca detectat varf audio => GREETING
        case GREETING:
            misca servo brat 0 -> 90 -> 0
            state = LISTENING_FOR_PASSWORD
        case LISTENING_FOR_PASSWORD:
            numara varfuri audio in 2 s
            daca contor == 3 => DRAWER_OPEN
            daca timp expirat => IDLE_AWAKE
        case DRAWER_OPEN:
            servo sertar 0 -> 90
            asteapta 5 s => DRAWER_CLOSING
        case DRAWER_CLOSING:
            servo sertar 90 -> 0 => IDLE_AWAKE

Implementari Tehnice Specifice

Detectia varfurilor audio: ADC-ul ruleaza cu prescaler de 128. In ISR-ul ADC mentin o medie mobila a ultimelor esantioane si compar valoarea curenta cu un prag adaptiv. Cand depasesc pragul, marchez un varf si activez un cooldown de 100 ms pentru a evita citirile multiple ale aceleiasi batai din palme (debounce sonor).

Generare PWM pentru Servo: Timer 1 este configurat in Fast PWM cu TOP din ICR1 (39999 pentru 16 MHz, prescaler 8), asigurand perioada de 20 ms. Latimea pulsului se controleaza scriind in OCR1A si OCR1B (valori intre 2000 si 4000 tick-uri).

5. Rezultate Obtinute

De completat dupa asamblarea fizica. Voi include:

  • Fotografii cu montajul final pe breadboard.
  • Un scurt video demonstrativ pe YouTube.
  • Detalii despre calibrarea pragului audio.

6. Concluzii

De completat la finalul proiectului.

7. Jurnal

  • Saptamana 1: Alegerea temei si documentarea componentelor necesare.
  • Saptamana 2: Comanda pieselor (ATmega324P, SG90, HC-SR04, etc.).
  • Saptamana 3: Redactarea Milestone 1 (Introducere, Schema Bloc, Hardware Design).
  • Saptamana 4 (planificat): Asamblarea pe breadboard si testarea individuala a modulelor.

8. Bibliografie / Resurse

  • Resurse Hardware:
    • Datasheet ATmega324P;
    • Datasheet HC-SR04 ultrasonic ranging module;
    • Datasheet KY-037 sound sensor module.
  • Resurse Software:
    • Laboratoarele de PM (UPB, ACS) - Lab 2, 3, 4, 6;
    • Documentatia AVR-libc.
pm/prj2026/bianca.popa1106/stelian.tascu.1778256854.txt.gz · Last modified: 2026/05/08 19:14 by stelian.tascu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0