Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2026:atoader:marius.tudosie [2026/05/16 00:00]
marius.tudosie [3. Hardware Design]
pm:prj2026:atoader:marius.tudosie [2026/05/21 16:31] (current)
marius.tudosie [Componenta Software]
Line 9: Line 9:
 **Laboratoare folosite**: SPI, I2C, Intreruperi,​ GPIO. **Laboratoare folosite**: SPI, I2C, Intreruperi,​ GPIO.
  
-**Bonus**: pentru audio -> I2S, carcasă printată 3D+**Bonus**: pentru audio -> I2S, carcasă printată 3D, RTOS
  
 ===== Descriere generală ===== ===== Descriere generală =====
Line 49: Line 49:
  
 Nota 15.05.2026 - LED-ul de pe buton pare ca este ars, asa ca nu va mai fi conectat la ESP :( Nota 15.05.2026 - LED-ul de pe buton pare ca este ars, asa ca nu va mai fi conectat la ESP :(
 +
 +{{:​pm:​prj2026:​atoader:​marius.tudosiehardware.jpeg?​300|}}
  
 {{:​pm:​prj2026:​atoader:​marius.tudosie.schema.pdf|Schema electrica}} {{:​pm:​prj2026:​atoader:​marius.tudosie.schema.pdf|Schema electrica}}
-===== Software ​Design ​=====+====== Componenta ​Software ​======
  
 +În acest moment, implementarea software este complet funcțională,​ stabilă și integrată cu toate modulele hardware. Sistemul utilizează un **state machine** (automat de stări) pentru a gestiona asistentul inteligent:
 +  * **''​STATE_IDLE''​**:​ Starea de repaus în care sistemul așteaptă declanșarea prin senzori.
 +  * **''​STATE_RECORDING''​**:​ Înregistrarea activă a fluxului audio primit de la microfon.
 +  * **''​STATE_PROCESSING''​**:​ Faza de simulare a procesării de rețea. Aceasta este faza în care asistentul va primi informații de la server.
 +  * **''​STATE_PLAYBACK''​**:​ Redarea răspunsurilor. În acest moment, el redă înregistrarea vocii primită din starea de recording.
  
 +Task-urile secundare non-critice (citirea senzorilor de distanță și scanarea RFID) se realizează în background prin intermediul **FreeRTOS**. **FreeRTOS** este un sistem de operare "​real-time"​ care are ca scop orchestrarea între procese. Deoarece citirea senzorilor prin I2C durează destul de mult, sistemul beneficiază de acest scheduling inteligent. Un video care a inspirat această abordare poate fi vizionat aici: [[https://​www.youtube.com/​watch?​v=i_eU16X67qU]].
 +
 +**Biblioteci folosite**
 +Pentru realizarea funcționalităților au fost integrate următoarele biblioteci:
 +  * **''​driver/​i2s.h''​ (ESP-IDF API)**: Am preferat utilizarea API-ului nativ pus la dispoziție de Espressif în detrimentul bibliotecilor standard Arduino I2S. Această alegere oferă control deplin asupra bufferelor DMA și a configurării canalelor, element critic pentru microfonul INMP441, care necesită maparea specifică pe canalul drept (''​I2S_CHANNEL_FMT_ONLY_RIGHT''​) din cauza unui quirk de design hardware (a se vedea pagina 8 din documentația microfonului,​ în tabel la linia "​L/​R"​).
 +  * **''​FastLED.h''​**:​ Aleasă datorită eficienței,​ fiind o bibliotecă comună și extrem de stabilă. Permite actualizarea culorilor inelului RGB fără a introduce întârzieri blocante.
 +  * **''​MFRC522.h''​**:​ Biblioteca standardizată pentru interfațarea prin protocolul SPI cu modulul de citire a tag-urilor RFID.
 +  * **''​Wire.h''​**:​ Bibliotecă utilă pentru lucrul cu senzorul OPT3001, care nu beneficiază de o bibliotecă proprie standard.
 +  * **''​Adafruit_BME680.h''​**:​ Biblioteca oficială pentru utilizarea senzorului de mediu BME680.
 +  * **''​Adafruit_VL53L0X.h''​**:​ Biblioteca oficială pentru utilizarea senzorului de distanță (ToF) VL53L0X.
 +  * **''​WiFi.h''​**:​ Bibliotecă folosită pentru conexiunea la o rețea Wi-Fi. Momentan a fost implementat doar init-ul (cod boilerplate),​ integrarea cu serverul urmând să fie adăugată ulterior.
 +
 +**Elemente de noutate și funcționalități din laborator**
 +Noutatea proiectului constă în crearea unui ecosistem complet de asistență care folosește doi declanșatori (autentificare RFID și senzor de apropiere) și oferă un feedback dual: vizual complex (inel RGB cu coduri de stare) și audio bidirecțional. O altă noutate este printarea integrală 3D a carcasei; roboțelul R2-D2 a fost creat în integralitate și montat custom pentru aplicația noastră. De asemenea, utilizarea FreeRTOS reprezintă un element tehnic de noutate, orchestrând eficient task-urile direct pe microcontroler.
 +
 +La nivel de software, proiectul se distinge prin realizarea unui **sistem intern de înregistrare-redare "​in-memory"​** adaptat pentru arhitectura ESP32. Deși microcontrolerul are un spațiu limitat de memorie RAM, sistemul reușește să stocheze și să proceseze blocuri de eșantioane audio de lungă durată (4 secunde) printr-un procedeu custom de downsampling și upsampling în timp real, eliminând necesitatea unui card SD extern. Acest proces este realizat în prezent pentru demonstrație,​ scopul final fiind trimiterea înregistrării prin rețea spre a fi procesată de server.
 +
 +Proiectul integrează cu succes concepte studiate în cadrul laboratorului de PM:
 +  * **Întreruperi Hardware**: Butonul de reset folosește o rutină de întrerupere mapată direct în memoria RAM rapidă (''​IRAM_ATTR''​). Acest lucru garantează oprirea instantanee a mașinii de stări din orice fază și resetarea asistentului la starea inițială.
 +  * **SPI (Serial Peripheral Interface)**:​ Utilizat pentru comunicarea de mare viteză cu cititorul RFID MFRC522.
 +  * **I2C**: Folosit pentru comunicarea cu senzorii I2C.
 +
 +**Arhitectura aplicației și interacțiunea modulelor**
 +Aplicația este modularizată pe fișiere cu responsabilități clare:
 +  * **''​ui.cpp / ui.h''​**:​ Se ocupă de feedback-ul vizual (LED-uri, WS2812B) și de întreruperea butonului.
 +  * **''​audioIn.cpp / audioIn.h''​**:​ Gestionează achiziția audio și calculul metricilor de semnal (RMS).
 +  * **''​audioOut.cpp / audioOut.h''​**:​ Controlează redarea bufferelor audio pe amplificator.
 +  * **''​rfid.cpp / rfid.h''​ & ''​sensors.cpp / sensors.h''​**:​ Module dedicate achiziției de date de la periferice.
 +  * **''​main.cpp''​**:​ Conține bucla principală (loop-ul) și mașina de stări.
 +  * **''​network.cpp / network.h''​**:​ Conține funcționalitatea de bază pentru Wi-Fi și Bluetooth.
 +
 +Un ciclu complet de funcționare decurge astfel:
 +  - În starea **''​IDLE''​**,​ inelul LED are culoarea albastră.
 +  - Dacă se percepe un semnal de la senzorul de distanță (distanța < 50 mm, deci R2-D2 este atins) se schimbă starea în **''​RECORDING''​**. LED-urile devin roșii și începe înregistrarea. Alternativ, scanarea unui tag RFID validează prezența utilizatorului,​ redă un sunet scurt de confirmare și colorează inelul în gri.
 +  - După înregistrare,​ sistemul intră în starea **''​PROCESSING''​**,​ iar inelul devine galben.
 +  - În final, în starea **''​PLAYBACK''​**,​ inelul devine verde și se redă răspunsul audio, urmat de reproducerea vocii înregistrate anterior.
 +
 +Validarea funcționării s-a efectuat prin corelarea datelor transmise pe interfața UART (monitorul Serial rulat la 115200 baud) cu modificările fizice observate. Mesajele de tipul ''​[State] Recording...''​ sau ''​[RFID] UID: XX XX XX XX''​ au asigurat trasabilitatea și corectitudinea tranzițiilor.
 +
 +**Calibrare și optimizări software**
 +Pentru microfonul INMP441, datele brute citite prin I2S vin pe un format aliniat de 32 de biți (dar semnalul util ocupă doar 24 de biți). Pentru calibrare, s-a efectuat o deplasare bit cu bit la dreapta cu 16 poziții pentru a aduce semnalul la un format standard pe 16 biți PCM (semnat). Ulterior, s-a implementat o funcție matematică de calcul a valorii medii pătratice (**RMS - Root Mean Square**) și transformarea acesteia în decibeli (''​rmsDb = 20.0f * log10f(...)''​),​ stabilindu-se pragul de zgomot ambiental al camerei. De asemenea, senzorul de proximitate ToF a fost calibrat software în interiorul funcției de polling pentru a asigura declanșarea asistentului doar când utilizatorul se află la o distanță de sub 50 mm.
 +
 +O optimizare critică a fost necesară pentru gestionarea memoriei în timpul înregistrării. Deoarece asistentul înregistrează continuu timp de 4 secunde, o rată nativă de 16 kHz cu eșantioane pe 16 biți ar fi necesitat un buffer masiv de **128 KB** de RAM, resursă de care ESP32 Dev Kit nu dispune liber. Soluția aplicată a fost realizarea unui **downsampling**:​ deși hardware-ul citește la 16 kHz, software-ul extrage doar primul eșantion din două (efectiv 8 kHz), reducând la jumătate memoria utilizată. Pentru faza de playback, fluxul suferă un **upsampling**,​ fiecare eșantion fiind duplicat pentru a reconstrui semnalul necesar amplificatorului.
 +
 +Cod: https://​github.com/​Mars-Zero/​AI-Home-Assistant
  
  
Line 59: Line 111:
  
  
 +{{:​pm:​prj2026:​atoader:​marius.tudosier2fata.jpeg?​300|}}
  
 +{{:​pm:​prj2026:​atoader:​marius.tudosier2lateral.jpeg?​300|}}
 +
 +{{:​pm:​prj2026:​atoader:​marius.tudosier2sus.jpeg?​300|}}
 +
 +Demo:
 +[[https://​youtube.com/​shorts/​jC4Zk_jOYps?​feature=share]]
 ===== Concluzii ===== ===== Concluzii =====
  
-===== Download =====+Chiar daca nu este chiar ce voiam, am ajuns destul de departe cu implementarea. State machine-ul este complet, functiile de conectare la  WI-FI+bluetooth fiind simulate, impreuna cu functia de  verificare a administratorului 
 + 
 +{{:​pm:​prj2026:​atoader:​marius.tudosie.sensors.jpg?​300|}}
  
 ===== Jurnal ===== ===== Jurnal =====
Line 70: Line 131:
   *  5.05.2026 - Schema electrica modificata pentru senzorul BME680(verificare datasheet)   *  5.05.2026 - Schema electrica modificata pentru senzorul BME680(verificare datasheet)
   *  10.05.2026 - Printat 3D corpul R2-D2   *  10.05.2026 - Printat 3D corpul R2-D2
-  *  12.05.2026 - Inceput implementare hardware pe placuta de prototipare+  *  12.05.2026 - Inceput implementare hardware pe placuta de prototipare ​+ scris niste cod boilerplate i2c pentru verificare 
 +  *  15.05.2026 - Terminat de lipit si testat pe placuta de prototipare prototipare 
 +  *  16.05.2026 - Plecat la Dedeman pentru niste piulite pentru a prinde corpul de picioarele robotului. 
 +  *  17.05.2026 - Asamblat robotul + "​translplantul de creier + adaugat codul state machine si implemementat modularizat codul 
 +  *  19.05.2026 - Rafinat comportamentul robotului. 
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
  
pm/prj2026/atoader/marius.tudosie.1778878824.txt.gz · Last modified: 2026/05/16 00:00 by marius.tudosie
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