Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Music LED Cube na procesorze STM32F4

mKostek92 03 Jan 2016 16:46 5139 9
  • Music LED Cube na procesorze STM32F4
    Witam,

    Chciałbym zaprezentować wszystkim swoją konstrukcję, która była również tematem mojej pracy inżynierskiej. Jest to LED Cube 4x4x4, który mruga w rytm muzyki.

    Układ sterowany jest za pomocą mikrokontrolera STM32F4Discovery.
    Sześcian można podzielić na cztery kolumny oraz cztery ściany. Po spróbkowaniu i obliczeniu transformaty Fouriera, sygnał audio dzielony jest na cztery pasma częstotliwości. Każde pasmo uaktywnia inną kolumnę. Dzięki temu można rozróżnić na przykład stopę perkusji of werbla (Widać na ząłączonym filmiku). Ilość zapalonych diod w danej kolumnie zależy od amplitudy sygnału. Kolejne ramki danych przesuwane są po ścianach wyświetlacza.

    Music LED Cube na procesorze STM32F4


    Sterowanie LED Cubem zrealizowane jest za pomocą mikrokontrolera STM32F4 Discovery. Na rys. 2 zaprezentowano schemat działania całego układu.

    Music LED Cube na procesorze STM32F4


    W tym projekcie jako źródło dźwięku wykorzystano telefon komórkowy, jednak równie dobrze może być to odtwarzacz MP3 czy laptop. Ważne jest, aby międzyszczytowa wartość amplitudy źródła sygnału nie przekraczała 1.5 V, ponieważ maksymalne możliwe do zmierzenia napięcie na pinach mikrokontrolera to 3 V. Warto także pamiętać, że do zapalenia czterech diod w kolumnie wystarcza napięcie powyżej 0.16 V.
    Schemat podłączenia źródła dźwięku do pinu pomiarowego (PIN PC1) przedstawiony jest w Music LED Cube na procesorze STM32F4schema..png Download (54.52 kB). Zastosowany kondensator C1 eliminuje składową stałą sygnału. Rezystory R20 oraz R21 tworzą dzielnik 3 woltowego napięcia dołączonego do R20. Dzięki temu, przy zerowym napięciu ze źródła sygnału, na wejściu mikrokontrolera mierzone jest napięcie 1.5V. Pozwala to na pomiar sygnału zmiennego pochodzącego ze źródła dźwięku. Sygnał próbkowany jest z częstotliwością 25 KHz, co zgodnie z twierdzeniem Kotielnikowa-Shannona pozwala na odtworzenie sygnału o częstotliwości fmax=12.5 kHz. Próbki gromadzone są w rejestrze przetwornika A/D. Pobierane są z niego przez układ DMA, a następnie konwertowane na napięcie w miliwoltach. Po konwersji liczona jest dyskretna transformata Fouriera. Otrzymane amplitudy danych częstotliwości wykorzystane są do zapalenia odpowiednich diod na wyświetlaczu.


    Jak wspomniano wcześniej, LED Cube zbudowany jest z 64 diod LED. Aby efektownie operować wyświetlaczem, każda z diod musi być sterowana osobno. Wymagało by to podłączenia każdej z diod do osobnego pinu mikrokontrolera. Użycie 64 wyjść mikrokontrolera do sterowania wyświetlaczem wydaje się niedorzeczne. Stąd pomysł zastosowania multipleksingu. Zasada działania jest prosta: wszystkie 16 pionowych kolumn połączono wspólną anodą, natomiast 4 poziome warstwy połączone są wspólną katodą. Schemat połączenia diod LED przedstawiono w załączniku 2. Aby zapalić wybraną diodę należy dostarczyć masę dla odpowiedniej warstwy oraz zasilanie dla odpowiedniej kolumny. Problem pojawia się, wówczas gdy zajdzie potrzeba zapalenia diod z różnych warstw i kolumn, na przykład diody w lewym górnym rogu z tyłu oraz diody w prawym dolnym rogu z przodu. Dostarczając masę do warstwy górnej i dolnej oraz napięcie zasilania do dwóch kolumn zostaną zapalone cztery diody zamiast dwóch (lewa górna z tyłu, lewa dolna z tyłu, prawa górna z przodu, prawa dolna z przodu). Rozwiązaniem tego problemu jest cecha ludzkiego wzroku zwana bezwładnością wzroku [7]. Powoduje ona opóźnienie w czasie pomiędzy powstaniem wrażenia wzrokowego u obserwatora, a bodźcem wywołującym to wrażenie. Wystarczy więc dostatecznie szybko przełączać się pomiędzy poszczególnymi warstwami oraz wybierać odpowiednie kolumny, aby móc sterować każdą diodą niezależnie. Podczas pracy urządzenia zawsze aktywna jest tylko jedna warstwa oraz wybrane kolumny. Maksymalnie zapalonych jest więc 16 diod jednocześnie.

    Music LED Cube na procesorze STM32F4


    Rysunek przedstawia schemat blokowy głównej pętli programu. To tutaj surowe wartości pobrane z przetwornika ADC są odpowiednio obrabiane i wykorzystywane do sterowania LED Cubem. Zmienna Transfer służy do sygnalizacji, czy gotowa jest porcja danych do przetworzenia. Jest ona ustawiana nie w głównej pętli programu, lecz funkcji przerwania wywoływanej przez układ DMA. DMA zgłasza przerwanie, gdy jego bufor jest połowicznie wypełniony lub pełny. Przy wypełnieniu połowicznym Transfer=1, natomiast przy buforze pełnym Transfer=2. Pierwsza porcja danych może być wykorzystana do sterowania wyświetlaczem, podczas gdy ADC pobiera kolejne próbki dla następnej ramki. Unika się dzięki temu smużenia, a kostka świeci płynnie. Gdy Transfer > 0 oznacza to, że tablica jest wypełniona wartościami gotowymi do obróbki.

    Następnie liczona jest dyskretna transformata Fouriera. Jest to podstawowe narzędzie do analizy częstotliwościowej sygnałów dyskretnych. Do obliczenia wykorzystano funkcje dostarczane przez producenta rdzenia wraz z gotową biblioteką. FFT liczone jest na podstawie algorytmu radix4. Zastosowano 512 punktową transformatę, co przy częstotliwości próbkowania 25 kHz daje rozdzielczość pojedynczego prążka 48.8 Hz

    Jest to kompromis pomiędzy czasem zbierania próbek na tyle krótkim, aby nie dało się zauważyć smużenia na wyświetlaczu, a rozdzielczością pozwalającą odróżnić konkretne instrumenty. Cztery pasma częstotliwości zostały wstępnie dobrane na podstawie częstotliwości emitowanych przez wybrane instrumenty, a następnie skalibrowane podczas eksperymentów i klasyfikują się następująco:

    • 48-97 Hz (bęben basowy perkusji)
    • 146-292 Hz (gitara basowa)
    • 341-830 Hz (gitara rytmiczna)
    • 878-5029 Hz (wokal, gitara solowa).

    Po obliczeniu transformaty Fouriera, następuje przeliczenie wartości zespolonych na amplitudy. Również tutaj wykorzystana jest funkcja z bibliotek DSP. Po wykonaniu obliczeń, w tablicy buforFFTAmp znajdują się amplitudy poszczególnych prążków. Należy pamiętać, że zawiera ona symetryczne odbicie próbek widma, dlatego w dalszej analizie brana pod uwagę będzie tylko jej pierwsza połowa. W każdym paśmie szukana jest maksymalna amplituda prążka, a następnie zapisywana jest w tablicy maxvalue. Ta operacja także wykonywana jest za pomocą funkcji z bibliotek producenta. Czteroelementowa tablica zawierająca maksymalne amplitudy z czterech pasm, posłuży do inicjalizacji dwuwymiarowej tablicy Amp, która z kolei przekazana zostanie do funkcji sterującej wyświetlaczem. Wcześniej jednak elementy w tablicy Amp przesunięte zostają na zasadzie kolejki FIFO, robiąc miejsce dla nowych wartości. Daje to ciekawy efekt płynięcia muzyki przez wyświetlacz. Następnie tablica Amp otrzymuje nowe wartości zgodnie z regułą:

    • 4 jeśli maxvalue[i] >= MAX_AMP∙0.708
    • 3 jeśli maxvalue[i] >= MAX_AMP∙0.5
    • 2 jeśli maxvalue[i] >= MAX_AMP∙0.354
    • 1 jeśli maxvalue[i] >= MAX_AMP∙0.25
    • 0 jeśli maxvalue[i] < MAX_AMP∙0.25.

    Odpowiada to wzmocnieniu kolejno -3dB, -6dB, -9dB, -12dB. Wartość MAX_AMP została zmierzona i przyjęta na stałe w programie. Przy maksymalnej głośności telefonu na analizator podano sygnał o częstotliwości 1 KHz i zmierzoną amplitudę przyjęto jako MAX_AMP. Kolejnym krokiem algorytmu jest ustawienie zmiennej Transfer na wartość 0, by ostatecznie przejść do pętli while, w której uruchamiana jest funkcja zapalająca poszczególne diody na sześcianie. Pętla wykonuje się tak długo, aż zmienna Transfer przyjmie wartość różną od zera. Stanie się to w momencie, kiedy zostanie wywołane przerwanie DMA, sygnalizujące gotowość kolejnej paczki danych.
    Music LED Cube na procesorze STM32F4


    Film prezentujący działanie:





    Music LED Cube na procesorze STM32F4 Music LED Cube na procesorze STM32F4
    P.S
    Powyższy opis został w większości skopiowany z mojej pracy inżynierskiej, także jeśli ktoś chce tego użyć gdzieś u siebie na uczelni, uważajcie programy antyplagiatowe :)

    Cool? Ranking DIY
    About Author
    mKostek92
    Level 10  
    Offline 
    mKostek92 wrote 50 posts with rating 7. Live in city Sulechów. Been with us since 2012 year.
  • #2
    deus.ex.machina
    Level 32  
    Ciekawy jestem dlaczego wybrałeś DFT a nie FFT i dlaczego 512 punktów a nie np 128 (mam na uwadze rozdzielczość wyświetlacza)?
  • #3
    mKostek92
    Level 10  
    deus.ex.machina wrote:
    Ciekawy jestem dlaczego wybrałeś DFT a nie FFT

    Skąd pomysł, że wybrałem DFT? Wszędzie na rysunkach i w opisie jest FFT i tej transformaty używałem.
    deus.ex.machina wrote:
    dlaczego 512 punktów a nie np 128 (mam na uwadze rozdzielczość wyświetlacza)?

    Wybrałem 512 bo.. po prostu mogłem. Moc obliczeniowa STM32F4 pozwalała liczyć te transformaty bez zająknięcia, więc czemu nie skorzystać w lepszej rodzielczości.
    512 punktów daje 4 razy większą dokładność niż 128 punktów. Przy 128 punktach i wybranej przeze mnie częstotliwości próbkowania miałbym dokładność 195.2 Hz. To zdecydowanie za mało, by (w miarę) precyzyjnie wychwytywać różnice w dolnych częstotliwościach.
  • #4
    deus.ex.machina
    Level 32  
    mKostek92 wrote:
    deus.ex.machina wrote:
    Ciekawy jestem dlaczego wybrałeś DFT a nie FFT

    Skąd pomysł, że wybrałem DFT? Wszędzie na rysunkach i w opisie jest FFT i tej transformaty używałem.
    deus.ex.machina wrote:
    dlaczego 512 punktów a nie np 128 (mam na uwadze rozdzielczość wyświetlacza)?

    Wybrałem 512 bo.. po prostu mogłem. Moc obliczeniowa STM32F4 pozwalała liczyć te transformaty bez zająknięcia, więc czemu nie skorzystać w lepszej rodzielczości.
    512 punktów daje 4 razy większą dokładność niż 128 punktów. Przy 128 punktach i wybranej przeze mnie częstotliwości próbkowania miałbym dokładność 195.2 Hz. To zdecydowanie za mało, by (w miarę) precyzyjnie wychwytywać różnice w dolnych częstotliwościach.


    Wydawało mi się że użyłeś w opisie określania Dyskretna Transformata Fouriera - zdziwiło mnie to bo z opisu wynikało ze jednak jest to FFT (DFT posiada mniej ograniczeń niż FFT).

    Co do rozdzielczości no tak ale z drugiej strony przekłada się to na mniejsza rozdzielczość w dziedzinie czasu.

    Przepraszam za pytania ale zaciekawiło mnie to po prostu.
  • #7
    szczywronek
    Level 27  
    I bądź tu człowieku mądry jak każdy mówi co innego :-?

    The Scientist and Engineer's Guide to Digital Signal Processing wrote:
    The Fast Fourier Transform (FFT) is another method for calculating the DFT. While it produces the same result as the other approaches, it is incredibly more efficient, often reducing the computation time by hundreds. This is the same improvement as flying in a jet aircraft versus walking!

    (książka z której pochodzi powyższy cytat jest dostępna za darmo w Internecie, jakby ktoś był zainteresowany)

    @mKostek92 - pomijając biblioteki DSP, korzystałeś z jakichś bibliotek ST (SPL, HAL, itp) czy odwoływałeś się bezpośrednio do rejestrów mikrokontrolera?
  • #8
    mKostek92
    Level 10  
    deus.ex.machina wrote:
    Co do rozdzielczości no tak ale z drugiej strony przekłada się to na mniejsza rozdzielczość w dziedzinie czasu.

    Tak, ale z trzeciej strony :P :przy próbkowaniu 25 KHz bufor 512 próbek zapełniany jest w 0.02 s. To oznacza, że jesteśmy w stanie wychwycić (dla przykładu) każdą nutę szesnastkę w utworze z tempem 150 ( i to z 20 krotnym zapasem)
    $$ \frac{150*\frac{16}{4}}{60s}=10 $$ Granych jest 10 nut na sekundę, czyli jedna nuta co 0.1s. My mamy pełny bufor w 0.02s Dla zobrazowania nuty 16 w tempie około 150 są grane w intro piosenki B.Y.O.B zespołu System of a Down.

    szczywronek wrote:
    pomijając biblioteki DSP, korzystałeś z jakichś bibliotek ST (SPL, HAL, itp) czy odwoływałeś się bezpośrednio do rejestrów mikrokontrolera?

    Założenie pierwotne było takie, żeby korzystać bezpośrednio z rejestrów, ponieważ chciałem się jak najwięcej nauczyć, ale często miałem problemy i wtedy uciekałem do biblioteki SPL.
  • #9
    deus.ex.machina
    Level 32  
    szczywronek wrote:
    I bądź tu człowieku mądry jak każdy mówi co innego :-?

    The Scientist and Engineer's Guide to Digital Signal Processing wrote:
    The Fast Fourier Transform (FFT) is another method for calculating the DFT. While it produces the same result as the other approaches, it is incredibly more efficient, often reducing the computation time by hundreds. This is the same improvement as flying in a jet aircraft versus walking!

    (książka z której pochodzi powyższy cytat jest dostępna za darmo w Internecie, jakby ktoś był zainteresowany)


    FFT jest szczególnym przypadkiem DFT - ogólnie DFT sprawdza się tam gdzie nie potrzeby tak dużej rozdzielczości w domenie częstotliwości - przy kilku - kilkunastu punktach może być szybsza niż FFT.
    Poza tym ponieważ nie jest się ograniczonym właśnie tym ze FFT wymaga określonego "rozmiaru" to można zmniejszyć zjawisko "spectral leakage" i uzyskać dokładniejsze rezultaty pomiarów.
    http://file.yizimg.com/320527/2010112211541556.pdf

    Wszystko zależy od tego co robimy.