This shows you the differences between two versions of the page.
|
pm:prj2026:andrei.batasev:ciprian.munteanu04 [2026/05/10 14:54] ciprian.munteanu04 |
pm:prj2026:andrei.batasev:ciprian.munteanu04 [2026/05/18 23:33] (current) ciprian.munteanu04 |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Vocal Coach ====== | ====== Vocal Coach ====== | ||
| + | Ciprian-Marian Munteanu, 332CB | ||
| ===== Introducere ===== | ===== Introducere ===== | ||
| Line 14: | 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 33: | 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 70: | Line 71: | ||
| ==== Schema electrica ==== | ==== Schema electrica ==== | ||
| - | {{:pm:prj2026:andrei.batasev:electrical_schematic_cm.png?800|}} | + | {{:pm:prj2026:andrei.batasev:cm_electrical_schematic.png?600|}} |
| Schema electrica prezinta conexiunile dintre Arduino Nano si modulele externe. Microfonul MAX4466 este conectat la intrarea analogica A0, potentiometrul la A1, OLED-ul foloseste magistrala I2C prin pinii A4/SDA si A5/SCL, iar buzzerul pasiv este controlat de pe pinul D9. | Schema electrica prezinta conexiunile dintre Arduino Nano si modulele externe. Microfonul MAX4466 este conectat la intrarea analogica A0, potentiometrul la A1, OLED-ul foloseste magistrala I2C prin pinii A4/SDA si A5/SCL, iar buzzerul pasiv este controlat de pe pinul D9. | ||
| Line 96: | 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 114: | Line 115: | ||
| Dispozitivul este alimentat prin portul USB al placii Arduino Nano, de la laptop sau de la un power bank de 5V. Alimentarea prin USB este suficienta pentru versiunea curenta a proiectului, deoarece modulele folosite au consum redus: microfonul MAX4466, OLED-ul, buzzerul pasiv si modulul LED semafor. | Dispozitivul este alimentat prin portul USB al placii Arduino Nano, de la laptop sau de la un power bank de 5V. Alimentarea prin USB este suficienta pentru versiunea curenta a proiectului, deoarece modulele folosite au consum redus: microfonul MAX4466, OLED-ul, buzzerul pasiv si modulul LED semafor. | ||
| - | Toate modulele folosesc masa comuna (GND). Alimentarea de 5V este distribuita catre microfon, OLED, potentiometru, modul LED si buzzer. Inainte de conectarea finala, trebuie verificat ca modulele folosite accepta alimentare la 5V. In cazul in care un modul functioneaza doar la 3.3V, acesta va fi alimentat din pinul 3V3 al placii Arduino Nano. | + | Toate modulele folosesc masa comuna (GND). Alimentarea de 5V este distribuita catre microfon, OLED, potentiometru, modul LED si buzzer. |
| Pentru reducerea zgomotului pe alimentare, se folosesc condensatori de filtrare intre 5V si GND. Condensatorul electrolitic de 10uF ajuta la stabilizarea alimentarii, iar un condensator ceramic de 100nF poate fi adaugat langa microfon pentru decuplare locala. | Pentru reducerea zgomotului pe alimentare, se folosesc condensatori de filtrare intre 5V si GND. Condensatorul electrolitic de 10uF ajuta la stabilizarea alimentarii, iar un condensator ceramic de 100nF poate fi adaugat langa microfon pentru decuplare locala. | ||
| Line 120: | 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 | | ||
| + | | 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 | ||
| - | * MAX4466 Datasheet — Maxim Integrated | + | * [[https://www.analog.com/media/en/technical-documentation/data-sheets/MAX4465-MAX4469.pdf|MAX4465-MAX4469 Datasheet]] — Analog Devices / Maxim Integrated |
| - | * 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://github.com/olikraus/u8g2|U8g2 Library]] — olikraus, GitHub | + | |
| + | * [[https://en.wikipedia.org/wiki/Goertzel_algorithm|Goertzel Algorithm]] | ||