
Witam wszystkich
Tym razem chciałbym przedstawić jeszcze programowy projekt odtwarzacza i dyktafonu zrealizowany na STM32F4Discovery. Pisząc ten program, sporo rozwiązań wykorzystałem z mojego poprzedniego projektu małego odtwarzacza MP3 na ARM-ie, ale dołożyłem też dużo nowości i usprawnień. Obecnie program umożliwia odtwarzanie plików MP3, AAC-LC (również HE-AAC), MP4 (tylko ścieżka audio), WMA, FLAC ze zmiennym i stałym bitrate oraz szerokim zakresem fsample do 48kHz. Odtwarzane pliki pobierane są z karty SD poprzez interfejs SDIO 4-bit. Obecnie istnieje również możliwość przewijania w przód/tył odtwarzanych plików podczas grania, podobnie jak przewija się taśmę w magnetofonie. Program również umożliwia nagrywanie dźwięków lub mowy z mikrofonu elektretowego i zapisywanie nagrań na kartę SD w postaci plików FLAC do podkatalogu o ustalonej nazwie Records. Gdy program stwierdzi brak takiego podkatalogu na karcie, to sam utworzy ten podkatalog przed rozpoczęciem nagrywania. Maksymalny czas ciągłego nagrywania ustaliłem na 8 godzin, co w połączeniu z próbkowaniem z częstotliwością 22,05kHz jednego kanału audio (dźwięk monofoniczny) daje mi max rozmiar pliku wynikowego ok 360MB. Tworzone pliki przybierają nazwę MIC_dzien-miesiac-rok godzina_minuta_sekunda.flac. Sterowanie pracą odtwarzacza/dyktafonu oraz wizualizacja jego pracy odbywa się poprzez wyświetlacz LCD TFT 240x320 z rezystancyjnym panelem dotykowym. 8-bit dane do LCD przesyłane są przez interfejs FSMC, natomiast obsługą panela dotykowego zajmuje się ADC wbudowany w mikrokontroler. Gdy wybrany jest tryb odtwarzacza, na LCD wyświetlana jest przewijalna w górę/dół lista podkatalogów i plików. Wybór podkatalogu/pliku na tej liście odbywa się poprzez najechanie podświetleniem na interesujący wiersz tej listy i zatwierdzenie go przyciskiem Enter/Play (podobnie, jak w Windows Commander), przy czym gdy nazwa podświetlonego podkatalogu/pliku jest zbyt długa, by w całości wyświetlić się na LCD, to będzie przewijać się w poziomie. Gdy wybrany plik, odtwarzacz gra pliki począwszy od wybranej pozycji aż do końca listy. Oczywiście, w każdej chwili można zakończyć odtwarzanie/nagrywanie przyciskiem Pause/Stop. Również zapewniłem możliwość wymiany plików między kartą SD i komputerem poprzez interfejs USB.
Zastosowałem przetworniki ADC/DAC wbudowane w układ kodeka TLV320AIC23, skonfigurowane do przetwarzania słów 16-bit, dane do przetworzenia/przetworzone są przesyłane miedzy mikrokontrolerem i kodekiem poprzez interfejs I2S. Dodatkowy interfejs SPI służy do konfigurowania kodeka.
Do przechowywania odczytanego z SD drzewa podkatalogów/plików zastosowałem pamięć SPI 23K256. Takie rozwiązanie podyktowane było koniecznością zapewnienia całej wbudowanej w mikrokontrolerze pamięci RAM (128kB + 64kB TCM) dla dekodera WMA. Pozostałe moduły nie są już tak pamięciochłonne, toteż po rezygnacji z możliwości odtwarzania WMA, można by pozbyć się tej pamięci SPI, a drzewo podkatalogów/plików ulokować np. w TCM.
Kilka filmików prezentuje działanie projektu.
Biblioteki użyte w programie.
Do odtwarzania plików MP3 i AAC oraz MP4 użyłem bibliotek z wcześniejszego projektu małego odtwarzacza MP3. Jedyną poważniejszą zmianą w stosunku do wcześniejszej wersji było uruchomienie dekodowania plików HE-AAC, co wiązało się z dołożeniem funkcji realizujących obliczenia SBR.
Do odtwarzania plików WMA wykorzystałem stałoprzecinkowy dekoder WMA oparty na projekcie FFmpeg, którą pobrałem stąd: http://www.rockbox.org/tracker/task/4984 .Jako projekt referencyjny, potrzebny do usunięcia błędów, dopisania ekstrakcji danych z formatu ASF niezbędnych do dekodowania i uruchomienia powyższego dekodera wykorzystałem zmiennoprzecinkowy dekoder WMA pobrany stąd: http://en.pudn.com/downloads138/sourcecode/multimedia/audio/detail594413_en.html .Krótki opis "bojów" z tą biblioteką opisany jest we wcześniejszym projekcie.
Do nagrywania i odtwarzania plików FLAC wykorzystałem otwartoźródłową bibliotekę FLAC w wersji 1.2.1 stąd: http://downloads.xiph.org/releases/flac/ ,którą musiałem dostosować do swojego projektu. Z ważniejszych przeróbek tej biblioteki mogę wymienić dostowanie jej do enkodowania danych "w locie" tzn. odbieranych z ADC, a nie z pliku WAV do pliku FLAC, jak w oryginale. Ten sam zabieg objął też dekodowanie FLAC, tyle, że w drugą stronę - zdekodowane dane z pliku FLAC wysyłane od razu do DAC, a nie do pliku WAV, jak w oryginale. Ponadto niezbędne było dorobienie buforowania danych przez zapisem do pliku FLAC podczas enkodowania, by wykorzystać zalety zapisu naraz kilku sektorów na SD - w oryginale na nośnik było zapisywane już niekiedy kilka bajtów danych, a w praktyce kilkaset (!= 512 * n, n - liczba naturalna) bajtów, co bardzo spowalniało zapis.
Obsługą systemu plików FAT16/FAT32 na karcie SD zajmuje się biblioteka FAT16/32 File IO Library V2.6 pobrana z Ultra-Embedded.com .Tu również nie obeszło się bez ważniejszych zmian takich jak: zmniejszenie zajętości sekcji .bss (oryginał zajmował mi chyba ponad 4kB - deklaracje struktur w plikach *.h), dorobienie możliwości obsługi polskich znaków w nazwach plików i podkatalogów, przyspieszenie wyszukiwania klastrów pliku podczas odczytu/zapisu (w oryginale przeszukiwanie zawsze rozpoczynało się od początkowego klastra pliku - zmieniłem to tak, że poszukiwanie następnych klastrów rozpoczyna się od bieżącego klastra będącego w użyciu) oraz usunięciu błędu w kodzie polegającego na braku tworzenia podkatalogów "." oraz ".." przy tworzeniu podkatalogu "Records". W efekcie karta SD z takim niepełnym wpisem podkatalogu była naprawiana przez system Windows w sposób polegający na usunięciu tego podkatalogu wraz z jego zawartością

Do programowania peryferiali mikrokontrolera (za wyjątkiem zegarów i GPIO - te zrobiłem na piechotę) użyłem bibliotek SPL STMicroelectronics.
Program napisałem w środowisku Rowley Crossworks ver 2.0.11. Zajętość Flash przez obecny program 460kB. Częstotliwość zegara mikrokontrolera 96MHz.
Zaproponowany schemat ideowy, to w zasadzie przerysowane fragmenty schematu zestawu Discovery, do tego doszedł schemat podłączenia LCD wzięty z wcześniej prezentowanego projektu zegarka na STM32F4Discovery oraz otoczenie kodeka TLV320 wzięte stąd: http://www.propox.com/download/docs/MMcodec01_sch.pdf .Nie projektowałem jeszcze zasilania, gdyż nie jest to zakończony projekt.
W planach:
Dorobienie radia internetowego na module WiFi. Obecnie przyciski "Radio" w głównym menu oraz "WiFi" w menu Settings są nieaktywne.
Dorobienie dodatkowych przycisków (może wykorzystanie akcelerometru), by podstawowe funkcje odtwarzacza (regulacja głośności, pauza/wznowienie odtwarzania) realizować nie patrząc na jego wyświetlacz (np. jest w kieszeni).
Zapakowanie całości do obudowy KM-22.
Dorobienie zarządzania zasilaniem (regulacja jasności podświetlenia wyświetlacza, włączanie i wyłaczanie odtwarzacza, wizualizacja ładowania akumulatorka).
Pozdrawiam, KT

Cool? Ranking DIY