This shows you the differences between two versions of the page.
|
pm:prj2026:andrei.batasev:ciprian.munteanu04 [2026/05/10 18:41] ciprian.munteanu04 |
pm:prj2026:andrei.batasev:ciprian.munteanu04 [2026/05/18 23:33] (current) ciprian.munteanu04 |
||
|---|---|---|---|
| Line 15: | Line 15: | ||
| depinde de un smartphone sau conexiune la internet. Spre deosebire de | depinde de un smartphone sau conexiune la internet. Spre deosebire de | ||
| aplicatiile generale de tuning, acest dispozitiv este construit special | aplicatiile generale de tuning, acest dispozitiv este construit special | ||
| - | pentru antrenament vocal pe un set restrans de note (C4-C5), ceea ce il | + | pentru antrenament vocal pe un set restrans de note (A2-A3), ceea ce il |
| face fezabil pe hardware cu resurse limitate. | face fezabil pe hardware cu resurse limitate. | ||
| Line 34: | Line 34: | ||
| **Module software:** | **Module software:** | ||
| - | * **Masina de stari** — IDLE -> PLAY_NOTE -> LISTEN -> ANALYZE -> RESULT | + | * **Masina de stari** — IDLE -> PLAY_NOTE -> LISTEN_ANALYZE -> RESULT |
| - | * **Esantionare ADC** — configurata prin registre pentru ~8kHz | + | * **Esantionare ADC** — citire microfon pe ADC0 si potentiometru pe ADC1 |
| - | * **Motor Goertzel** — calculeaza energia pe 8 frecvente tinta | + | * **Motor Goertzel contextual** — compara nota tinta cu vecinii sai inferior si superior |
| - | * **Calibrare zgomot** — masurare zgomot ambiental la pornire | + | * **Validare semnal** — detectie amplitudine prea mica si clipping |
| - | * **Logica feedback** — compara nota detectata cu nota tinta | + | * **Logica feedback** — decide LOW, OK, HIGH, NO SIG sau LOUD |
| **Interactiunea modulelor:** | **Interactiunea modulelor:** | ||
| - | Utilizatorul selecteaza nota tinta cu butoanele. La apasarea START, | + | Utilizatorul selecteaza nota tinta cu potentiometrul. La apasarea START, |
| - | Arduino reda nota pe buzzer, apoi deschide o fereastra de ascultare | + | Arduino reda nota pe buzzer, apoi intra intr-o fereastra de ascultare |
| - | in care ADC-ul esantioneaza microfonul intr-un buffer. Algoritmul | + | in care ADC-ul esantioneaza microfonul. Algoritmul Goertzel contextual |
| - | Goertzel proceseaza bufferul si identifica frecventa dominanta. | + | proceseaza semnalul in mod streaming si compara energia pentru nota tinta, |
| - | Rezultatul este comparat cu nota tinta si afisat pe OLED si prin | + | nota inferioara si nota superioara. Rezultatul este afisat pe OLED si prin |
| modulul LED. | modulul LED. | ||
| Line 97: | Line 97: | ||
| | Tranzistor NPN | Colector | Buzzer - | Comutare buzzer catre GND | | | Tranzistor NPN | Colector | Buzzer - | Comutare buzzer catre GND | | ||
| | Tranzistor NPN | Emitor | GND | Masa comuna | | | Tranzistor NPN | Emitor | GND | Masa comuna | | ||
| - | | LED semafor | R | D4 | LED rosu, feedback LOW/HIGH | | + | | LED semafor | R | D4 | LED rosu, feedback LOW | |
| - | | LED semafor | Y | D5 | LED galben, stare LISTEN/ANALYZE | | + | | LED semafor | Y | D5 | LED galben, redare nota / feedback HIGH | |
| | LED semafor | G | D6 | LED verde, feedback OK | | | LED semafor | G | D6 | LED verde, feedback OK | | ||
| | LED semafor | GND | GND | Masa comuna | | | LED semafor | GND | GND | Masa comuna | | ||
| Line 121: | Line 121: | ||
| ===== Software Design ===== | ===== Software Design ===== | ||
| - | //(De completat in etapele urmatoare)// | + | Implementarea finala este realizata in PlatformIO, in C bare-metal pentru |
| + | Arduino Nano cu ATmega328P la 16 MHz. Proiectul nu foloseste framework-ul | ||
| + | Arduino sau biblioteci externe pentru OLED/I2C, ci acceseaza direct registrele | ||
| + | microcontrollerului. | ||
| + | |||
| + | Codul este impartit modular: | ||
| + | |||
| + | ^ Fisier ^ Rol ^ | ||
| + | | main.c | Initializare module, masina de stari, ecrane OLED si feedback LED | | ||
| + | | gpio.c/h | Configurare butoane si LED-uri | | ||
| + | | adc.c/h | Citire microfon pe ADC0 si potentiometru pe ADC1 | | ||
| + | | timer.c/h | Tick de 1 ms pentru temporizari si debounce | | ||
| + | | buzzer.c/h | Generare nota pe buzzer folosind Timer1 si OC1A / D9 | | ||
| + | | goertzel.c/h | Analiza audio si feedback LOW / OK / HIGH | | ||
| + | | twi.c/h | Comunicare I2C/TWI cu OLED-ul | | ||
| + | | ssd1306.c/h | Afisare text pe OLED SSD1306 | | ||
| + | | uart.c/h | Debug prin USART0 | | ||
| + | |||
| + | ==== Masina de stari ==== | ||
| + | |||
| + | Aplicatia foloseste patru stari: | ||
| + | |||
| + | ^ Stare ^ Descriere ^ | ||
| + | | IDLE | Utilizatorul selecteaza nota tinta cu potentiometrul. | | ||
| + | | PLAY_NOTE | Buzzerul reda nota de referinta timp de aproximativ 900 ms. | | ||
| + | | LISTEN_ANALYZE | Microfonul este citit, iar semnalul este analizat. | | ||
| + | | RESULT | Rezultatul este afisat pe OLED si prin LED-uri. | | ||
| + | |||
| + | Butoanele controleaza aplicatia astfel: | ||
| + | * START porneste testul pentru nota selectata. | ||
| + | * NEXT alege o nota aleatoare diferita. | ||
| + | * BACK revine la nota redata anterior. | ||
| + | |||
| + | ==== Periferice folosite ==== | ||
| + | |||
| + | * **GPIO:** butoane si LED-uri prin DDRD, PORTD si PIND. | ||
| + | * **ADC:** microfon pe ADC0 / A0 si potentiometru pe ADC1 / A1. | ||
| + | * **Timer0:** tick de 1 ms pentru temporizari. | ||
| + | * **Timer1:** semnal pentru buzzer pe D9 / PB1 / OC1A. | ||
| + | * **USART0:** mesaje de debug. | ||
| + | * **TWI/I2C:** comunicare cu OLED-ul SSD1306 pe A4/SDA si A5/SCL. | ||
| + | |||
| + | ==== Algoritmul Goertzel contextual ==== | ||
| + | |||
| + | Pentru analiza audio se foloseste algoritmul Goertzel contextual. Pentru fiecare | ||
| + | nota tinta sunt comparate doar trei frecvente: | ||
| + | |||
| + | * nota inferioara — LOW | ||
| + | * nota tinta — OK | ||
| + | * nota superioara — HIGH | ||
| + | |||
| + | Gama folosita este A2-A3, adaptata pentru bass-bariton: | ||
| + | |||
| + | A2, B2, C3, D3, E3, F3, G3, A3 | ||
| + | |||
| + | Aceasta abordare este mai simpla decat o detectie completa de pitch si este | ||
| + | potrivita pentru resursele limitate ale ATmega328P. Semnalul este analizat pe | ||
| + | mai multe ferestre, iar rezultatul final este ales prin vot. | ||
| + | |||
| + | ==== Afisare OLED ==== | ||
| + | |||
| + | OLED-ul SSD1306 este controlat printr-un driver text-only propriu. Nu se foloseste | ||
| + | un framebuffer complet, pentru a economisi SRAM. OLED-ul afiseaza starea curenta, | ||
| + | nota tinta si rezultatul, iar detaliile de debug sunt trimise prin USART. | ||
| ===== Rezultate Obtinute ===== | ===== Rezultate Obtinute ===== | ||
| - | //(De completat in etapele urmatoare)// | + | Proiectul final este functional pe Arduino Nano cu ATmega328P, fara framework-ul |
| + | Arduino. Au fost integrate butoanele, potentiometrul, microfonul MAX4466, | ||
| + | buzzerul, LED-urile si OLED-ul SSD1306. | ||
| + | |||
| + | Dispozitivul permite selectarea unei note tinta din gama A2-A3, reda nota de | ||
| + | referinta si apoi analizeaza semnalul captat de microfon. Feedback-ul este afisat | ||
| + | pe OLED si prin LED-uri: LOW, OK, HIGH, NO SIG sau LOUD. | ||
| + | |||
| + | Proiectul a fost testat treptat: GPIO, ADC, buzzer, Goertzel, OLED si integrarea | ||
| + | finala. Testarea finala a fost facuta cu voce. | ||
| + | |||
| + | Utilizarea finala de resurse raportata de PlatformIO este: | ||
| + | |||
| + | ^ Resursa ^ Utilizat ^ Total ^ Procent ^ | ||
| + | | Flash | 9964 bytes | 30720 bytes | 32.4% | | ||
| + | | SRAM | 856 bytes | 2048 bytes | 41.8% | | ||
| ===== Concluzii ===== | ===== Concluzii ===== | ||
| - | //(De completat in etapele urmatoare)// | + | Proiectul demonstreaza realizarea unui sistem embedded de antrenament vocal pe |
| + | Arduino Nano, folosind programare bare-metal pentru ATmega328P. | ||
| + | |||
| + | Algoritmul Goertzel contextual permite detectarea relatiei dintre nota cantata si | ||
| + | nota tinta: LOW, OK sau HIGH. Driverul OLED text-only si procesarea streaming au | ||
| + | ajutat la mentinerea unui consum redus de memorie. | ||
| + | |||
| + | Sistemul nu este un tuner vocal general, ci un antrenor pentru o gama restransa | ||
| + | de note. Pentru scopul proiectului, aceasta solutie este suficienta si eficienta. | ||
| ===== Download ===== | ===== Download ===== | ||
| - | //(De adaugat in etapele urmatoare)// | + | **Repository GitHub:** https://github.com/ciprianmunteanu1/vocal-coach |
| ===== Jurnal ===== | ===== Jurnal ===== | ||
| - | ^ Data ^ Activitate ^ | + | ^ Data ^ Activitate ^ |
| - | | Etapa 1 | Documentatie initiala, lista componente, schema bloc | | + | | Etapa 1 | Documentatie initiala, lista componente, schema bloc | |
| - | | Etapa 2 | Realizare schema electrica in KiCad, validare conexiuni hardware pe breadboard pentru Arduino Nano, OLED, LED semafor, butoane, potentiometru si buzzer | | + | | Etapa 2 | Realizare schema electrica in KiCad, validare conexiuni hardware pe breadboard | |
| + | | Etapa 3 | Testare GPIO: butoane START/NEXT/BACK si LED-uri prin registre | | ||
| + | | Etapa 4 | Testare ADC pentru potentiometru si microfon MAX4466 | | ||
| + | | Etapa 5 | Implementare buzzer cu Timer1 pe OC1A / D9 | | ||
| + | | Etapa 6 | Implementare si testare algoritm Goertzel contextual prin USART | | ||
| + | | 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 9 | Testare finala cu voce | | ||
| ===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
| **Resurse Hardware:** | **Resurse Hardware:** | ||
| + | |||
| * [[https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf|ATmega328P Datasheet]] — Microchip | * [[https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf|ATmega328P Datasheet]] — Microchip | ||
| * [[https://www.analog.com/media/en/technical-documentation/data-sheets/MAX4465-MAX4469.pdf|MAX4465-MAX4469 Datasheet]] — Analog Devices / Maxim Integrated | * [[https://www.analog.com/media/en/technical-documentation/data-sheets/MAX4465-MAX4469.pdf|MAX4465-MAX4469 Datasheet]] — Analog Devices / Maxim Integrated | ||
| * [[https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf|SSD1306 Datasheet]] — Solomon Systech | * [[https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf|SSD1306 Datasheet]] — Solomon Systech | ||
| + | * [[https://docs.arduino.cc/hardware/nano/|Arduino Nano Hardware Documentation]] — Arduino | ||
| **Resurse Software:** | **Resurse Software:** | ||
| - | * [[https://docs.arduino.cc/software/ide/|Arduino IDE Documentation]] — Arduino | + | |
| - | * [[https://github.com/adafruit/Adafruit_SSD1306|Adafruit SSD1306 Library]] — Adafruit, GitHub | + | * [[https://en.wikipedia.org/wiki/Goertzel_algorithm|Goertzel Algorithm]] |
| - | * [[https://github.com/adafruit/Adafruit-GFX-Library|Adafruit GFX Library]] — Adafruit, GitHub | + | |