Differences

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

Link to this comparison view

pm:prj2026:andrei.batasev:ciprian.munteanu04 [2026/05/18 23:19]
ciprian.munteanu04
pm:prj2026:andrei.batasev:ciprian.munteanu04 [2026/05/18 23:33] (current)
ciprian.munteanu04
Line 122: Line 122:
  
 Implementarea finala este realizata in PlatformIO, in C bare-metal pentru Implementarea finala este realizata in PlatformIO, in C bare-metal pentru
-Arduino Nano cu microcontroller ​ATmega328P la 16 MHz. Proiectul nu foloseste +Arduino Nano cu ATmega328P la 16 MHz. Proiectul nu foloseste framework-ul 
-framework-ul Arduino ​si nu depinde de biblioteci externe ​precum Wire, +Arduino ​sau biblioteci externe ​pentru OLED/I2Cci acceseaza ​direct registrele 
-Adafruit_GFX sau Adafruit_SSD1306. Functionalitatile necesare sunt implementate +microcontrollerului.
-direct ​prin registrele microcontrollerului.+
  
 Codul este impartit modular: Codul este impartit modular:
  
 ^ Fisier ^ Rol ^ ^ Fisier ^ Rol ^
-| main.c | Punctul de intrare al aplicatiei, initializare ​module, masina de stari, ecrane OLED si feedback LED | +| main.c | Initializare ​module, masina de stari, ecrane OLED si feedback LED | 
-| gpio.c/h | Configurare ​pini digitali, ​butoane ​cu pull-up intern ​si control ​LED-uri | +| gpio.c/h | Configurare butoane si LED-uri | 
-| adc.c/h | Initializare ADC, citire ​microfon pe ADC0 si potentiometru pe ADC1 | +| adc.c/h | Citire ​microfon pe ADC0 si potentiometru pe ADC1 | 
-| timer.c/h | Timer0 in mod CTC pentru tick de 1 ms, folosit la temporizari si debounce | +| timer.c/h | Tick de 1 ms pentru ​temporizari si debounce | 
-| buzzer.c/h | Timer1 ​in mod CTC, iesire ​OC1A / D9 pentru generarea notelor pe buzzer ​+| buzzer.c/h | Generare nota pe buzzer folosind ​Timer1 ​si OC1A / D9 | 
-| goertzel.c/​h | Algoritmul Goertzel contextual ​si votarea ​LOW / OK / HIGH | +| goertzel.c/​h | Analiza audio si feedback ​LOW / OK / HIGH | 
-| twi.c/h | Driver ​TWI/I2C bare-metal pentru comunicarea ​cu OLED-ul | +| twi.c/h | Comunicare I2C/TWI cu OLED-ul | 
-| ssd1306.c/h | Driver ​text-only pentru ​OLED SSD1306, fara framebuffer complet ​+| ssd1306.c/h | Afisare ​text pe OLED SSD1306 | 
-| uart.c/h | Debug prin USART0 ​la 9600 baud |+| uart.c/h | Debug prin USART0 |
  
 ==== Masina de stari ==== ==== Masina de stari ====
  
-Aplicatia ​este organizata in patru stari principale:+Aplicatia ​foloseste ​patru stari:
  
 ^ Stare ^ Descriere ^ ^ Stare ^ Descriere ^
-| IDLE | Utilizatorul selecteaza nota tinta cu potentiometrul. OLED-ul afiseaza nota curenta. | +| IDLE | Utilizatorul selecteaza nota tinta cu potentiometrul. | 
-| PLAY_NOTE | Buzzerul reda nota de referinta timp de aproximativ 900 ms. LED-ul galben este aprins doar in aceasta stare. | +| PLAY_NOTE | Buzzerul reda nota de referinta timp de aproximativ 900 ms. | 
-| LISTEN_ANALYZE | Buzzerul ​este oprit, LED-urile sunt stinse, iar microfonul ​este esantionat si analizat. | +| LISTEN_ANALYZE | Microfonul ​este citit, iar semnalul ​este analizat. | 
-| RESULT | OLED-ul si LED-urile afiseaza rezultatul: LOW, OK, HIGH, NO SIG sau LOUD. |+| RESULT | Rezultatul este afisat pe OLED si prin LED-uri. |
  
-Butoanele ​au urmatorul comportament+Butoanele ​controleaza aplicatia astfel
-  * START porneste testul pentru nota selectata ​curent+  * START porneste testul pentru nota selectata. 
-  * NEXT alege o nota aleatoare diferita, ca mod de challenge.+  * NEXT alege o nota aleatoare diferita.
   * BACK revine la nota redata anterior.   * BACK revine la nota redata anterior.
  
-Butoanele sunt conectate intre pin si GND si sunt citite cu rezistentele interne +==== Periferice folosite ====
-de pull-up ale microcontrollerului. Astfel, un buton apasat este citit ca LOW. +
-Pentru evitarea declansarilor multiple, se foloseste detectie pe front si +
-debounce de 180 ms.+
  
-==== Utilizarea perifericelor ATmega328P ==== +  ​* **GPIO:​** ​butoane si LED-uri prin DDRD, PORTD si PIND. 
- +  * **ADC:​** ​microfon pe ADC0 / A0 si potentiometru pe ADC1 / A1. 
-Implementarea foloseste direct perifericele microcontrollerului:​ +  * **Timer0:** tick de 1 ms pentru temporizari
- +  * **Timer1:​** ​semnal ​pentru buzzer pe D9 / PB1 / OC1A. 
-  ​* **GPIO:​** ​registrele ​DDRD, PORTD si PIND configureaza butoanele si LED-urile+  * **USART0:​** ​mesaje ​de debug. 
-  * **ADC:** ADC0 / A0 citeste microfonul MAX4466, iar ADC1 / A1 citeste potentiometrul+  * **TWI/​I2C:​** ​comunicare cu OLED-ul SSD1306 pe A4/SDA si A5/SCL.
-  * **Timer0:​** ​functioneaza in mod CTC si genereaza un tick de 1 ms. +
-  * **Timer1:​** ​genereaza semnalul ​pentru buzzer pe D9 / PB1 / OC1A. +
-  * **USART0:​** ​inlocuieste Serial Monitor din Arduino si afiseaza informatii ​de debug. +
-  * **TWI/​I2C:​** ​controleaza ​OLED-ul SSD1306 pe pinii A4/SDA si A5/SCL+
- +
-Pentru buzzer, Timer1 este configurat in mod CTC cu toggle pe OC1A. Frecventa +
-este determinata de valoarea OCR1A, calculata cu formula: +
- +
-  OCR1A = F_CPU / (2 * prescaler * frecventa) - 1 +
- +
-Pentru ADC se foloseste referinta AVcc, deoarece semnalele analogice sunt in +
-intervalul 0-5V. Conversia este pe 10 biti, suficienta pentru selectarea notei +
-cu potentiometrul si pentru estimarea amplitudinii semnalului de la microfon.+
  
 ==== Algoritmul Goertzel contextual ==== ==== Algoritmul Goertzel contextual ====
  
-Pentru analiza audio se foloseste algoritmul Goertzel. In loc sa se realizeze +Pentru analiza audio se foloseste algoritmul Goertzel ​contextual. Pentru fiecare 
-o detectie generala de pitch sau o transformata FFT, proiectul foloseste o +nota tinta sunt comparate ​doar trei frecvente:
-abordare contextuala. Pentru fiecare nota tintasunt analizate ​doar trei +
-frecvente:+
  
-  * nota de sub tinta — LOW+  * nota inferioara ​— LOW
   * nota tinta — OK   * nota tinta — OK
-  * nota de peste tinta — HIGH+  * nota superioara ​— HIGH
  
-Aceasta abordare este potrivita pentru ATmega328P, deoarece reduce memoria +Gama folosita este A2-A3, ​adaptata pentru bass-bariton:​
-necesara si numarul de calcule. Algoritmul proceseaza semnalul in mod streaming,​ +
-fara a salva un buffer audio mare in SRAM. +
- +
-Gama folosita ​pentru antrenament ​este adaptata pentru bass-bariton:​+
  
   A2, B2, C3, D3, E3, F3, G3, A3   A2, B2, C3, D3, E3, F3, G3, A3
  
-Intern, lista contine si nota sub gama si una peste gama: +Aceasta abordare este mai simpla decat detectie completa de pitch si este 
- +potrivita ​pentru ​resursele limitate ale ATmega328P. Semnalul este analizat pe 
-  G2, A2, B2, C3, D3, E3, F3, G3, A3, B3 +mai multe ferestre, ​iar rezultatul ​final este ales prin vot.
- +
-Astfel, ​pentru ​fiecare nota tinta se poate compara energia notei inferioare,​ +
-a notei corecte si a notei superioare. +
- +
-Semnalul ​microfonului MAX4466 ​este centrat in jurul valorii de mijloc a ADC-ului, +
-aproximativ 519. Componenta continua este eliminata printr-un tracker lent al +
-centrului semnalului. Ferestrele cu amplitudine prea mica sunt tratate ca lipsa +
-de semnal, iar ferestrele care ating valorile extreme ale ADC-ului sunt marcate +
-ca fiind clipping. +
- +
-Analiza ruleaza pe mai multe ferestre ​audio. Fiecare fereastra valida voteaza +
-LOWOK sau HIGH. Rezultatul ​final este ales prin vot majoritar. Daca votul este +
-prea apropiat, rezultatul este marcat ca neclar in loc sa se forteze o decizie +
-gresita.+
  
 ==== Afisare OLED ==== ==== Afisare OLED ====
  
-OLED-ul SSD1306 este controlat printr-un driver propriu ​minimal, folosind TWI/I2C. +OLED-ul SSD1306 este controlat printr-un driver ​text-only ​propriu. ​Nu se foloseste 
-Pentru economie de memorie, nu se foloseste un framebuffer complet ​de 1024 bytes. +un framebuffer complet, ​pentru a economisi SRAM. OLED-ul afiseaza starea ​curenta, 
-Textul este scris direct pe paginile display-uluifolosind un font 5x7 stocat in +nota tinta si rezultatul, ​iar detaliile de debug sunt trimise prin USART.
-PROGMEM. +
- +
-OLED-ul afiseaza ​doar informatiile esentiale: ​starea ​sistemului, nota tinta si +
-rezultatul. Informatiile detaliate, precum amplitudinea,​ voturile si energiile +
-Goertzel, sunt trimise prin USART.+
  
 ===== Rezultate Obtinute ===== ===== Rezultate Obtinute =====
  
 Proiectul final este functional pe Arduino Nano cu ATmega328P, fara framework-ul Proiectul final este functional pe Arduino Nano cu ATmega328P, fara framework-ul
-Arduino. Au fost integrate ​toate modulele: butoanepotentiometrumicrofon +Arduino. Au fost integrate ​butoanelepotentiometrulmicrofonul ​MAX4466, 
-MAX4466, ​buzzer, LED-uri si OLED SSD1306.+buzzerul, LED-urile si OLED-ul SSD1306.
  
-Dispozitivul permite selectarea unei note tinta din gama A2-A3, reda nota pe +Dispozitivul permite selectarea unei note tinta din gama A2-A3, reda nota de 
-buzzer, ​apoi analizeaza semnalul ​audio captat de microfon. Feedback-ul este +referinta si apoi analizeaza semnalul captat de microfon. Feedback-ul este afisat 
-afisat ​pe OLED si prin LED-uri: ​rosu pentru ​LOW, verde pentru ​OK, galben pentru +pe OLED si prin LED-uri: LOW, OK, HIGH, NO SIG sau LOUD.
-HIGH, rosu + galben pentru rezultat neclar si toate LED-urile pentru semnal prea +
-puternic.+
  
-Validarea ​a fost facuta ​treptat: GPIO, ADC, buzzer ​cu Timer1, Goertzel ​prin +Proiectul ​a fost testat ​treptat: GPIO, ADC, buzzer, Goertzel, OLED si integrarea 
-USART, OLED prin TWI/​I2C ​si integrarea finala. ​Proiectul ​a fost testat ​cu voce +finala. ​Testarea finala ​a fost facuta ​cu voce.
-si cu o aplicatie de pian pe telefon.+
  
-Utilizarea finala de resurse este:+Utilizarea finala de resurse ​raportata de PlatformIO ​este:
  
 ^ Resursa ^ Utilizat ^ Total ^ Procent ^ ^ Resursa ^ Utilizat ^ Total ^ Procent ^
Line 252: Line 207:
 ===== Concluzii ===== ===== Concluzii =====
  
-Proiectul demonstreaza ​implementarea ​unui sistem embedded de antrenament vocal +Proiectul demonstreaza ​realizarea ​unui sistem embedded de antrenament vocal pe 
-folosind ​direct perifericele ​ATmega328P: GPIO, ADC, timere, USART si TWI/I2C.+Arduino Nano, folosind ​programare bare-metal pentru ​ATmega328P.
  
-Algoritmul Goertzel contextual ​s-a dovedit potrivit pentru hardware-ul folosit, +Algoritmul Goertzel contextual ​permite detectarea relatiei dintre nota cantata si 
-deoarece compara doar nota tinta cu vecinii sai si evita costul unei detectii +nota tinta: LOW, OK sau HIGH. Driverul OLED text-only ​si procesarea streaming au 
-complete de pitch. Driverul OLED text-only, fara framebuffer complet, a redus +ajutat la mentinerea unui consum ​redus de memorie.
-consumul ​de SRAM si a permis rularea stabila pe Arduino Nano.+
  
-Limitarea principala este ca sistemul ​nu functioneaza ca tuner vocal general, +Sistemul ​nu este un tuner vocal general, ci un antrenor pentru o gama restransa 
-ci ca antrenor pentru o gama restransa de note. Pentru scopul proiectului,​ +de note. Pentru scopul proiectului,​ aceasta ​solutie ​este suficienta si eficienta.
-aceasta ​abordare ​este suficienta si eficienta.+
  
 ===== Download ===== ===== Download =====
  
 **Repository GitHub:** https://​github.com/​ciprianmunteanu1/​vocal-coach **Repository GitHub:** https://​github.com/​ciprianmunteanu1/​vocal-coach
- 
-Repository-ul proiectului contine: 
-  * codul sursa PlatformIO; 
-  * fisierele C si header pentru modulele software; 
-  * schema electrica; 
-  * documentatia proiectului. 
  
 ===== Jurnal ===== ===== Jurnal =====
Line 285: Line 232:
 | Etapa 7 | Implementare driver TWI/I2C si SSD1306 text-only | | Etapa 7 | Implementare driver TWI/I2C si SSD1306 text-only |
 | Etapa 8 | Integrare finala: masina de stari, OLED, LED feedback, buzzer si analiza audio | | Etapa 8 | Integrare finala: masina de stari, OLED, LED feedback, buzzer si analiza audio |
-| Etapa 9 | Testare finala cu voce si aplicatie de pian pe telefon ​|+| Etapa 9 | Testare finala cu voce |
  
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
pm/prj2026/andrei.batasev/ciprian.munteanu04.1779135584.txt.gz · Last modified: 2026/05/18 23:19 by ciprian.munteanu04
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