Intotdeauna am fost pasionat de jocurile de lumini si de impactul vizual pe care acestea il au asupra spectatorilor. In trecut am mai realizat cateva mici proiecte precum cateva Vu-Meter, dar niciodata unul mai complex ca un Spectrum Analyzer. Acest dispozitiv va analiza input-ul audio primit (ori prin intermediul unei mufe jack, ori prin intermediul unui microfon) si va afisa pe o matrice de LED-uri, in functie de frecventa, amplitudinea semnalului respectiv. Consider ca este o provocare interesanta si poate reprezenta un element decorativ atragator in casa celor pasionati de astfel de proiecte.
Aceasta este o prezentare generala a proiectului pe care il voi implementa.
Se vor prelua date prin intermediul unei surse de semnal audio (jack sau microfon) de catre ADC-ul integrat in uC, vor fi analizate folosind transformari Fourier si vor fi afisate pe matricea de LED-uri in functie de amplitudinea semnalului pe fiecare frecventa.
Utilizatorul va putea actiona trei butoane: unul pentru a schimba sursa semnalului audio, unul pentru a cicla printre diferitele moduri de afisare, unul pentru a schimba culorile led-urilor. Pe LCD se vor afisa modul curent de afisare si sursa semnalului audio.
Semnalul analogic de la input (atat cel de la jack cat si iesirea din preamplificatorul cu LM358N) puteau avea si valori negative, acest lucru afectand microcontroller-ul intr-un mod negativ asa ca am introdus un circuit de DC bias pentru a face ca semnalul sa fie intre 0-5V cu mijlocul in 2.5V. Acest lucru a fost realizat folosind un divizor de tensiune (2 rezistente de 10k) si niste condensatori pentru filtrarea zgomotului. In consecinta, atunci cand nu exista niciun input, ADC-ul citeste valoarea 512. De acest bias trebuie tinut cont atunci cand se iau sample-urile deoarece trebuie scazut din valoarea finala.
Software-ul este scris in C folosind Visual Studio Code. Codul este impartit in mai multe functii dupa cum urmeaza:
Rezultatul final mi-a depasit asteptarile, proiectul fiind unul foarte responsive (cu un refresh rate chiar bun) si cu un impact vizual placut. Carcasa a fost realizata folosind un router CNC, iar una dintre placute (preamplificatorul pentru microfon) a fost realizata de la 0 folosind metoda Toner Transfer.
ADC-ul intern din Atmega324 este unul destul destul de incet si sampling rate-ul maxim este aproximativ 9610 samples/s, prescaler 128. Din aceasta cauza gama de frecvente analizata este undeva intre 30Hz- 4800Hz. A fost un proiect foarte interesant la care chiar am muncit destul de mult pentru ca mi-a facut placere si din care am avut de invatat multe lucruri despre microcontrollere si despre electronica, in general. Satisfactia de a iti vedea proiectul finalizat si functional este una de nedescris.
Codul sursa: ledspectrumanalyzer.zip
Proiect eagle: led_spectrum_analyzer_eagle.zip
18.04.2019 - Realizare placa de baza
4.05.2019 - Realizare PCB preamplificator
8.05.2019 - Comandat piese necesare
10.05.2019 - Procurat piese aditionale + asamblat butoane si placuta DC bias
15.05.2019 - Realizare matrice leduri si inceput de testare pentru FFT
18.05.2019 - Asamblare carcasa
22.05.2019 - Versiune finala de cod + imbunatatiri estetice
Biblioteca FFT: report_e.html
Biblioteca WS2812: https://github.com/cpldcpu/light_ws2812
WS2812B Datasheet: WS2812.pdf
Ideas for frequency buckets: www.waitingforfriday.com
Schema pentru preamplificator: mini-microphone-pre-amplifier-using-lm358