LED Spectrum Analyzer

Email contact: andreilica1@gmail.com

Introducere

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.

Descriere generală

Aceasta este o prezentare generala a proiectului pe care il voi implementa.

Schema bloc

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.

Interfata cu utilizatorul

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.

Hardware Design

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.

Lista de piese

  • ATmega 324A
  • 120 LED-uri WS2812B
  • 3 Butoane
  • Alimentare externa pentru LED-uri (sursa PC)
  • Microfon ( + preamplificator folosind LM358N )
  • Afisaj LCD 16×2 pentru a afisa status-ul proiectului si diferitele moduri de reprezentare
  • Condensatoare, Rezistente, Diode

Schema electrica

Software Design

Software-ul este scris in C folosind Visual Studio Code. Codul este impartit in mai multe functii dupa cum urmeaza:

  • Partea de initializari in care setez pinii de intrare pentru butoane si pentru banda de leduri, imi creez vectorul de culori, initializez display-ul folosind functia LCD_init() din laboratoare, initializez ADC-ul (referinta la VCC=5V, prescaler 128 → pentru a mentine frecventa ADC-ului intre 50-200kHz), afisez un splash screen pe matricea de LED-uri cu textul “SOUND ANALYZER”, activez intreruperile globale si permit MCU-ului sa intre in sleep folosind sleep_enable()
  • Initializez timerul 1 cu 2 valori OCR1A = 1665 si OCR1B = 1640 cu top la OCR1A si prescaler 1 si activez intreruperile de comparare cu cele 2 valori. In ISR-ul pentru comparatia cu OCR1A iau un sample de la una din intrari(Jack sau microfon, schimbarea intre acestea facandu-se folosind un macro SET_ADC_CH(ch)) si scad 512 deoarece avem DC offset-ul de la intrare. Valoarea este setata astfel incat sampling rate-ul sa fie aproximativ 9600 samples/s, reprezentand aproape limita maxima a ADC-ului intern cand procesorul functioneaza la 16MHz. Cealalta valoare este folosita pentru a pune MCU-ul in sleep cu foarte putin timp inainte sa luam un sample, acest lucru asigurand o preluare precisa a datelor (ADC Noise-Reduction Sleep).
  • O functie in care printez pe LCD input-ul audio(Jack sau microfon), iar dupa ce 64 de sample-uri au fost preluate apelez functiile din biblioteca FFT, rezultatul final fiind un spectru scalar(liniar). Fiecare bucket de frecvente avea valoarea maxima in jur de 200, asa ca am impartit intervalul 0-192 in 12 parti, iar in functie de plasarea in cele 12 intervale aprindeam un numar de leduri. Tot aici se poate cicla, folosind unul din butoane, prin cele 8 culori posibile si cu un alt buton se poate alege unul din cele 3 moduri de afisare (bara intreaga, peek value, top 3 values).

Rezultate Obţinute

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.

Demo Video

Concluzii

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. :-D

Download

Jurnal

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

Bibliografie/Resurse

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

Generare PDF

pm/prj2019/mlungoci/spectrumanalyzer.txt · Last modified: 2021/04/14 17:07 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0