[PROJEKT] Wskaźnik wysterowania mikrofonu MEMS na panelu KAmodWS2812-8 + Arduino

Mając przygotowany i połączony sprzęt można przejść do oprogramowania Arduino (przygotowany program znajduje się w sekcji „Do pobrania”). W pierwszym kroku dołączana jest biblioteka do sterowania diodami, a także zdefiniowana jest: liczba diod, linia z której korzystają oraz liczba próbek, z której będziemy odtwarzać wartość szczytową.

Następnie deklarowane są zmienne globalne potrzebne w programie oraz następuje inicjalizacja biblioteki NeoPixel, za pomocą której sterowany jest łańcuch diod.

W funkcji odbierzSygnal() pobierana jest z przetwornika ADC aktualna wartość dla obu mikrofonów: lewego i prawego. Następnie obie wartości są wprowadzane do buforów kołowych o długości N. Aktualne wartości są wpisywane na i-tą pozycję tablicy, gdzie zastępują próbkę najstarszą. Pętla for wyszukuje w całym buforze (który mieści próbkę aktualną i N-1 poprzednich) wartość najwyższą i wpisuje ją do zmiennej peak zarówno dla prawego, jak i lewego kanału.

Funkcja przeliczPoziom() działa jako konwerter wartości szczytowej sygnału na liczbę diod jaką należy wyświetlić. Najpierw wartość próbki jest przeliczana na wartość w woltach, następnie logarytmowana. Logarytm o podstawie 10 jest tu użyty, aby wskaźnik reagował także na cichsze dźwięki oraz ze względu na charakterystykę ludzkiego ucha. Dzięki temu układ wskazuje natężenie w przybliżeniu odpowiadające naturalnemu odczuwaniu głośności. Następnie odejmowana jest zlogarytmowana składowa stała, a całość dzielona przez 0,3 (ok. log10(2)). W ten sposób otrzymujemy wartość wyskalowaną od 0 do 1, a więc należy pomnożyć ją przez 8 i zaokrąglić, aby otrzymać liczbę diod, jaką należy zapalić. Przetwornik ADC w Arduino jest zasilany napięciem 5V i może przyjmować wartość napięcia aż do VCC. W związku z tym maksymalna liczba zapalonych diod dla kanału ograniczana jest do 8, gdyż w przeciwnym wypadku wskazanie będzie przenosić się na sąsiedni panel.

Funkcja zaswiecDiody() steruje łańcuchami w zależności od wcześniej przeliczonej liczby diod do zapalenia. Należy mieć świadomość, że dla tak połączonego łańcucha dioda nr 8 jest diodą najwyższą w łańcuchu lewym, a dioda nr 15 – najniższą tamże. Oznacza to, że dla lewego kanału diody trzeba zapalać w odwrotnej kolejności. W bibliotece NeoPixel funkcja clear() wygasza cały łańcuch (niezbędne, aby diody nie zatrzaskiwały się po przekroczeniu pewnego poziomu), natomiast funkcja show() wysyła wprowadzone wartości do łańcucha.

W funkcji setup() inicjalizowane są tylko moduły WS2812-8:

W funkcji loop() wywoływane są po kolei wcześniej omówione funkcje:

Działanie programu zostało przedstawione w poniższym filmie:

Do pobrania

O autorze