Proiectul Music Audio Spectrum - VU Meter este un vizualizator audio care afișează spectrul sonor în timp real pe un display LED de tip matrice 8×32, iar în modul IDLE se comportă ca un ceas LED cu termometru (reprezentând ora și temperatura din cameră). Scopul său este de a crea o reprezentare vizuală atractivă a intensității și frecvenței semnalului audio captat din mediu. Ideea proiectului a pornit de la dorința de a combina electronica cu muzica și elementele vizuale, pentru a obține un efect interactiv și estetic plăcut. Este util atât pentru uz personal (ambianță luminoasă în funcție de muzică), cât și ca instrument educativ în învățarea componentelor hardware și programarea microcontrolerelor.
Trecerea între cele două moduri se face printr-un singur buton de control, care comută secvențial între ele la fiecare apăsare.
Listă de piese:
Componentă | Descriere |
---|---|
Arduino UNO R3 | Microcontroller |
LM386 | Microfon cu amplificator |
MAX7219 (8×32) | Matrice LED |
DHT11 | Senzor temperatură |
DS1302 | RTC |
Button | Button pentru schimbare mod |
Schemă electrică:
Pini folosiți:
Matrice LED MAX7219 (4x8x8):
Modul microfon LM386:
RTC DS1302:
Senzor DHT11:
Buton mod:
Librării folosite:
Cum am folosit aceste librării:
Pentru afișajul principal, modul Spectru Audio, am utilizat biblioteca MD_MAX72xx, care permite controlul individual al fiecărei coloane din matricea LED (MAX7219). Această funcționalitate este esențială pentru redarea grafică în timp real a nivelului diferitelor frecvențe detectate din semnalul audio. Fiecare coloană a matricei corespunde unei benzi de frecvență, iar înălțimea coloanei este determinată în urma analizei FFT.
Pentru analiza semnalului audio am integrat biblioteca arduinoFFT, care transformă semnalul captat de microfon (pe pinul analog A0) din domeniul timp în domeniul frecvență. Rezultatul este procesat pentru a determina amplitudinile armonicilor principale, care sunt apoi mapate vizual în matricea LED. Am aplicat și o funcție de fereastră Hamming pentru a reduce erorile de margine și a obține un rezultat vizual mai stabil.
În celelalte moduri (temperatură și ceas), afișarea valorilor se face textual. Pentru acestea am utilizat biblioteca MD_Parola, care este optimizată pentru afișarea de texte animate și mesaje derulante pe afișaje cu MAX7219. Această bibliotecă este mult mai prietenoasă pentru text, dar nu permite un control detaliat la nivel de coloană LED, motiv pentru care nu a fost folosită și pentru spectrul audio.
Pentru a simplifica procesul de afișare a înălțimii coloanelor LED în spectru, am definit un vector numit spectralHeight[], care conține valori predefinite binar pentru fiecare nivel de amplitudine (0–8). Astfel, nu este nevoie să construim manual fiecare coloană, ci selectăm rapid modelul corespunzător.
Algoritmi și logică de bază:
Explicare Spectru Audio (FFT)
ETAPA 1: Citire semnal audio brut și pregătire FFT
for (int i = 0; i < 64; i++) { realComponent[i] = analogRead(A0) / sensitivity; imagComponent[i] = 0; }
Ce face:
ETAPA 2: Preprocesare și transformare FFT
FFT.windowing(realComponent, 64, FFT_WIN_TYP_HAMMING, FFT_FORWARD); FFT.compute(realComponent, imagComponent, 64, FFT_FORWARD); FFT.complexToMagnitude(realComponent, imagComponent, 64);
Ce face:
ETAPA 3: Afișare pe matricea LED
for (int i = 0; i < 32; i++) { realComponent[i] = constrain(realComponent[i], 0, 80); realComponent[i] = map(realComponent[i], 0, 80, 0, 8); disp.setColumn(31 - i, spectralHeight[(int)realComponent[i]]); }
Ce face:
Precizări:
Deși am reușit să implementez ce mi-am propus, primele 2 coloane din matrice sunt mereu aprinse pe modul FFT, chiar și atunci când nu există zgomot ambiental (precum în imaginea atașată mai jos). Din păcate, nu am reușit să rezolv acest incovenient.
Urmează să incorporez și să lipesc circuitul într-o cutie pentru prezentarea finala, pentru a ascunde din fire și a face proiectul să arate mai plăcut din punct de vedere estetic.
Demo video:
Realizarea acestui proiect a fost, în primul rând, plină de trial & error, dar plăcută. . Sunt, desigur, numeroase direcții de perfecționare: un RTC mai precis (de ex. DS3231), o carcasă printată 3D care să mascheze cablurile și să îmbunătățească răcirea, un microfon mai sensibil ori animații suplimentare pe matrice.
Din punct de vedere al timpului, partea cea mai mare a mers pe documentare – am vrut să evit greșelile costisitoare și să nu „prăjesc” componente. Montajul hardware propriu-zis și design-ul circuitului s-au dovedit, în final, a fi mai ușor decât îmi închipuiam la început.
Surpriza plăcută a fost că, deși am petrecut multe ore în șir lucrând, am descoperit că îmi place procesul în sine – de la debugging la aranjat fire și conectat pini. Cu toate acestea, am aflat că îmi place și partea hardware a acestei facultăți, nu doar cea software, așa cum credeam înainte.
Proiectul rămâne un punct de plecare solid, iar îmbunătățirile viitoare vor fi cu siguranță mai rapide, având acum o bază hardware și software stabilă.
Resurse Hardware:
Resurse Software: