This shows you the differences between two versions of the page.
|
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/I2C, ci 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 tinta, sunt 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 o nota sub gama si una peste gama: | + | Aceasta abordare este mai simpla decat o 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 | + | |
| - | LOW, OK 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-ului, folosind 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: butoane, potentiometru, microfon | + | Arduino. Au fost integrate butoanele, potentiometrul, microfonul 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 ===== | ||