This is an old revision of the document!
Autor: Tascu Stelian-Andrei Grupa: 331CA GitHub: Proiect-PM
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.
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:
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:
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.
| 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 |
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.
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.
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.
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.
Codul este scris in C, dezvoltat in PlatformIO, fara framework-ul Arduino. Toate perifericele sunt configurate direct prin manipularea registrilor.
Codul este impartit pe module pentru o logica curata:
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
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).
De completat dupa asamblarea fizica. Voi include:
De completat la finalul proiectului.