
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.

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

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

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.

Film prezentujący działanie:


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