Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Programowy odtwarzacz/dyktafon na STM32F407VGT6

Tytus Kosiarski 28 Oct 2014 15:49 8295 14
Altium Designer Computer Controls
  • Programowy odtwarzacz/dyktafon na STM32F407VGT6
    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ą :D
    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
    Programowy odtwarzacz/dyktafon na STM32F407VGT6








    Cool? Ranking DIY
    Can you write similar article? Send message to me and you will get SD card 64GB.
    About Author
    Tytus Kosiarski
    Level 15  
    Offline 
    Has specialization in: programowanie mikrokontrolerów
    Tytus Kosiarski wrote 233 posts with rating 389, helped 10 times. Been with us since 2007 year.
  • Altium Designer Computer Controls
  • #2
    deton24
    Level 12  
    22,05kHz dyktafonu to nie jest jakaś specjalna jakość, pozornie do mowy wystarcza, ale nie jest specjalna.
  • #3
    badworm
    Level 18  
    W przypadku dyktafonu i tak najwięcej zależy od przetwornika czyli mikrofonu.

    Sam projekt całkiem ciekawy aczkolwiek zastanawia planowany wybór obudowy - z pewnością dałoby się za rozsądne pieniądze znaleźć coś bardziej gustownego.
  • Altium Designer Computer Controls
  • #4
    Tytus Kosiarski
    Level 15  
    Mógłbyś, Badworm, coś podpowiedzieć odnośnie ładniejszej obudowy? Wstępnie wybrałem wspomnianą KM22 z uwagi na akceptowalne jej wymiary zewnętrzne oraz względnie łatwą możliwość upchnięcia całej elektroniki wraz z zasilaniem wewnątrz. Jednakże mogę zmienić swój wybór.
    Pozdrawiam, KT
  • #5
    Freddy
    Level 43  
    deton24 wrote:
    22,05kHz dyktafonu to nie jest jakaś specjalna jakość, pozornie do mowy wystarcza, ale nie jest specjalna.
    To jest jakość taka jak na CD, no to rzeczywiście lipa :D. Autor napisał, że sygnał jest mono.
  • #6
    Pokrentz
    Level 22  
    Freddy, ale CD próbkuje jeden kanał z częstotliwością 44,1 kHz, 16 bit, z tego, co pamiętam. Próbkowanie 22,05 kHz to połowa powyższego i pasmo przenoszenia obcięte do ok. 10 kHz. Ale do mowy, istotnie, wystarczy.
  • #7
    Freddy
    Level 43  
    Pokrentz wrote:
    Freddy, ale CD próbkuje jeden kanał z częstotliwością 44,1 kHz, 16 bit, z tego, co pamiętam. Próbkowanie 22,05 kHz to połowa powyższego i pasmo przenoszenia obcięte do ok. 10 kHz. Ale do mowy, istotnie, wystarczy.
    Słyszałeś głosy około 10kHz, bo ja nie :P w radiach jest z tego co pamiętam 16kHz i to wystarcza
  • #8
    Gigantor
    Level 19  
    Freddy wrote:
    w radiach jest z tego co pamiętam 16kHz i to wystarcza


    Do zapisu mowy przeciętnego człowieka, bez wielkich wymagań co do jakości, starczy cz. próbkowania 8kHz. Układ ISD1700 (message voice recorder) schodzi do 4kHz. Tak więc te ~22kHz to praktycznie szaleństwo.
  • #9
    badworm
    Level 18  
    Tytus Kosiarski wrote:
    Mógłbyś, Badworm, coś podpowiedzieć odnośnie ładniejszej obudowy? Wstępnie wybrałem wspomnianą KM22 z uwagi na akceptowalne jej wymiary zewnętrzne oraz względnie łatwą możliwość upchnięcia całej elektroniki wraz z zasilaniem wewnątrz. Jednakże mogę zmienić swój wybór.

    Zobacz co jest w ofercie np. w reichelt.de Mają obudowy takich firm jak Bopla czy Teko - jakieś ładne i zgrabne pudełko powinieneś tam znaleźć. Do tego ceny są bardzo rozsądne - za jedną z obudów Bopla zapłaciłbym u nich mniej (cena brutto wraz z wysyłką kurierem) niż u jednego z polskich dostawców (cena netto bez wysyłki!).
  • #10
    Tytus Kosiarski
    Level 15  
    Dzięki za info, Badworm. Jak znajdę chwilę czasu, to zerknę - może będą mieli obudowy z otworem przysłoniętym przeźroczystą folią akurat na wyświetlacz z panelem dotykowym - tak sobie gdybam.
  • #11
    Freddy
    Level 43  
    Bopla prowadzi wiele firm w Polsce, choćby TME.
    Zerknij jeszcze na obudowy Gainta też są bez problemu w Poslce.
  • #13
    deton24
    Level 12  
    Tak, jeden kanał to nie połowa częstotliwości, ale połowa bitrate. Powinno być słychać różnice, ale samo stereo nie powinno mieć wielkiego znaczenia, chyba że dla kompresji. To samo bitrate i częstotliwość stereo, a mono potrafi się gorzej skompresować.
  • #14
    Tytus Kosiarski
    Level 15  
    Witam

    Da się, oczywiście, zwiększyć częstotliwość próbkowania, tak samo ilość kanałów. W tym celu wystarczy odpowiednio zmodyfikować zmienne: fsample oraz channels w funkcji create_file_and_start_record (plik record_files.c), skompilować i wgrać do mikrokontrolera. Sam też się bawiłem zmianą tych nastaw (ustawiłem 44,1kHz oraz 1 lub 2 kanały), różnica była taka, że było słychać więcej szumów (nagrania z mikrofonu), poza tym nie słyszałem jakichś innych różnic w nagranych dźwiękach, toteż zostawiłem takie nastawy, jak opisałem na początku. Ale jeszcze sprawdzę to, przy chwili wolnego czasu, chociażby po to, by wiedzieć, jak zwiększy się rozmiar nagrywanego pliku. Nie przewiduję budowy może nie profesjonalnego, ale bardziej rozbudowanego urządzenia, powiedzmy w wersji stacjonarnej lub większej przenośnej, bo akurat mi takie coś nie jest potrzebne. Ale prezentowany projekt może być bazą wyjściową do budowy takiego urządzenia. Na pewno można dorobić wejścia liniowe, regulację poziomu nagrywania, balansu, wyprowadzić wyjścia liniowe (TLV320 ma takie możliwości), dorobić dodatkowe pozycje w menu obsługujące te możliwości kodeka, oraz dodatkowe funkcje potrzebne w takim urządzeniu.

    Pozdrawiam
  • #15
    Tytus Kosiarski
    Level 15  
    Witam

    W międzyczasie dorobiłem trochę usprawnień podczas nagrywania. Jedno z tych usprawnień polega na obliczeniu wolnego miejsca na karcie SD przed rozpoczęciem nagrywania. Stosownie do wyniku tego obliczenia są wyświetlone komunikaty o ilości wolnego miejsca na SD w MB i o przewidywanym maksymalnym czasie nagrywania.Gdy brak jest miejsca na SD, to wyświetlane jest info o braku wolnego miejsca na SD - wtedy niemożliwe jest rozpoczęcie nagrywania. Obliczenie wolnego miejsca polega na przepatrzeniu wpisów tablicy FAT, sprawdzeniu, które z tych wpisów są równe 0, zliczeniu ilości tych zerowych wpisów i pomnożeniu tej ilości przez rozmiar klastra w bajtach.
    Kolejnym usprawnieniem jest zwiększenie ilości 512-bajtowych paczek danych do zapisu na kartę z początkowych 4 do obecnych 16. Przyczyną zmiany był zbyt wolny zapis na niektórych kartach przy początkowej wartości ilości zapisywanych paczek.
    Przeniosłem nastawę ilości kanałów oraz częstotliwości próbkowania (zmienne channels oraz fsample) do pliku main.c. Zmiana była potrzebna, by obliczyć przewidywany czas nagrywania jeszcze przed rozpoczęciem nagrywania. Teraz te nastawy są przekazywane jako parametry dla funkcji create_file_and_start_record w pliku record_files.c.

    Przeprowadziłem próby nagrań mikrofonowych przy częstotliwości próbkowania 44,1kHz i ustawieniu 1 lub 2 kanały.
    8 godzin nagrania 1 kanału - plik o rozmiarze ok. 800MB.
    8 godzin nagrania 2 kanałów - plik o rozmiarze ok. 1,05GB


    Słuchowo jakość nagrywania przy tych nastawach - dźwięk trochę bogatszy w szczegóły, choć przy dwóch kanałach jest większa ilość szumów.


    Dołączony filmik prezentuje zmieniony sposób pracy nagrywarki.

    Pozdrawiam