
Witam wszystkich

Chciałbym zaprezentować wykonany i uruchomiony przeze mnie mały odtwarzacz MP3. Wykonałem go w ramach poznawania możliwości mikrokontrolera AT91SAM7S256 i nauki programowania w języku C.
Dane techniczne odtwarzacza:
1. obsługa kart SD (uruchamiałem na karcie SDHC 8GB) z systemem plików FAT32
2. odczytywanie długich nazw plików i podkatalogów (obsługiwane nazwy do 80 znaków)
3. możliwość wymiany dowolnych plików z komputerem poprzez USB (odtwarzacz widziany przez komputer jako Mass Storage Device). Testowane pod Win2000 i WinXP
4. zasilanie z 1 akumulatora NiMH AA/R6
5. czas pracy przy zasilaniu z akumulatora: ok.10...11h (z akumulatora 2450mAh)
6. możliwość ładowania akumulatora poprzez USB lub ładowarką 5V / 500mA (np. odpowiednio dostosowaną do tego ładowarką od telefonu Sony Ericsson T280i, którą akurat mam)
7. możliwość programowania i debugowania poprzez złącze "mini" JTAG. "Mini", bo wykorzystane są tylko sygnały SRST, TDO, TCK, TDI, TMS oraz GND i Vcc, co pozwoliło mi zastosować listwę goldpin 2x5 pin, widoczną na zdjęciach wnętrza odtwarzacza (normalnie jest to 2x10 pin)
8. interfejs użytkownika: LCD 2x16 znaków, 5 podświetlanych przycisków (4 sterujące i 1 włączający zasilanie) oraz 2 LED
9. odtwarzanie plików MP3 VBR i CBR, 128...320kb/s, fs=44,1kHz i 48kHz
10. wymiary odtwarzacza (Długość x Szerokość x Grubość) 84x60x22mm
11. masa 105g
Odtwarzacz do dekodowania MP3 używa biblioteki dekodera MP3 z Atmel'owego projektu "AT91SAM Internet Radio" (PDF i kod źródłowy na www.atmel.com). Biblioteka dekodera MP3 jest z Helix Community, ale dopiero skompilowała mi się biblioteka z Atmel'owego projektu. Obsługę USB zrobiłem na podstawie pliku CDC_ENUMERATE.C z archiwum at91sam7s_usart_usb_20080916.zip (przejrzyście i zrozumiale według mnie napisana funkcja obsługi USB w tym pliku). Niestety, nie pamiętam już, z jakiej www ściągnąłem to archiwum, toteż dołączam go do dokumentacji odtwarzacza.
Działanie odtwarzacza jest następujące: po włączeniu zasilania, przez 2 sekundy na LCD wyświetlana jest nazwa partycji (Volume Label). W przypadku karty SD będzie to prawdopodobnie nazwa producenta karty (u mnie tak jest). Po upływie tych 2 sekund, gdy nie jest dołączone USB, na LCD pojawia się lista z zawartością głównego katalogu karty. Jedyne sortowanie, jakie zaimplementowałem w programie odtwarzacza, to wyświetlanie najpierw nazw podkatalogów, a poniżej nich nazw plików. Toteż podkatalogi są wyświetlane na tej liście w takiej kolejności, w jakiej są zapisane na karcie. To samo dotyczy plików. Przewijanie listy odbywa się za pomocą przycisków przewijania/regulacji głośności w górę i w dół. Zawsze tylko pierwsza pozycja na tej liście jest aktywna, t.zn. wybierana jest przyciskiem odtwarzaj/wejdź do/wyjdź z podkatalogu. Czyli gdy na tej pozycji jest nazwa podkatalogu, to wciśnięcie tego przycisku spowoduje wejście do tego podkatalogu. Po wejściu do podkatalogu znów wyświetlana jest lista z zawartością podkatalogu (inne podkatalogi oraz pliki) oraz dochodzi jeszcze wyświetlanie ". [RootDir]" oraz ".. [UpDir]". Wybranie ". [RootDir]" powoduje wyjście do głównego katalogu karty (niezależnie od tego, jak głęboko się weszło w podkatalogi), wybranie ".. [UpDir]" powoduje wyjście do nadrzędnego podkatalogu w stosunku do tego, z którego się wyszło. Przed nazwą podkatalogu wyświetlany jest mały prostokąt (widoczny na zdjęciach), co pozwala odróżnić nazwę podkatalogu od nazwy pliku.
Gdy natomiast na tej pozycji wyświetlana jest nazwa pliku, to wciśnięcie tego przycisku spowoduje jego odtwarzanie. Sposób poruszania się po tej liście przypomina trochę sposób poruszania się w Windows Commander, co było takim moim zamiarem. Odtwarzane są wszystkie pliki w wybranym podkatalogu, począwszy od wybranego pliku do końca listy. Podczas odtwarzania na LCD jest wyświetlana długa nazwa odtwarzanego pliku, bieżący czas utworu, całkowity czas trwania utworu oraz bitrate. By zmieścić taką ilość informacji na 16-znakowym LCD, zastosowałem samoczynne przewijanie tekstu podczas odtwarzania. Wykorzystałem możliwość wyświetlacza - przesuwania całego tekstu o 1 znak w lewo. Wystarczy cyklicznie, podczas odtwarzania, wysyłać komendę przesuwu o 1 znak wyświetlanego tekstu i otrzyma się taki efekt. Efekt ten jest pokazany na filmie (przepraszam za nienajlepszą jakość filmu - aparat trzymany w ręku) Po zakończeniu odtwarzania odtwarzacz powraca do wyświetlania listy podkatalogów i plików w aktualnie wybranym podkatalogu.
Funkcje oszczędzające energię w akumulatorku:
1. wygaszanie podświetlenia LCD i przycisków po 20sek. od momentu wykrycia braku aktywności przycisków. Oczywiście, naciśnięcie któregoś z 4 przycisków sterujących powoduje max rozjaśnienie podświetlenia.
2. Całkowite wyłączanie odtwarzacza, gdy ten przez 2 minuty wyświetla tylko listę na LCD, a nie odtwarza
3. W przypadku braku karty SD w slocie przy włączeniu odtwarzacza, wyświetlenie przez kilka sekund stosownego komunikatu na LCD i odtworzenie dźwięku ostrzegawczego, po czym całkowite wyłączenie odtwarzacza. To samo jest w przypadku wyjęcia karty podczas odtwarzania muzy
4. Zastosowanie najniższej możliwej częstotliwości taktowania mikrokontrolera: 45,1584MHz przy odtwarzaniu plików z fs=44,1kHz i 49,152MHz przy odtwarzaniu plików z fs=48kHz. Dla tych częstotliwości uzyskałem płynne odtwarzanie bez trzasków, przy jednoczesnej programowej obsłudze innych rzeczy.
Dodałem również pomiar napięcia akumulatora podczas samodzielnej pracy odtwarzacza (bez współpracy z komputerem). Napięcie akumulatorka mierzone jest przez przetwornik A/D wewnątrz mikrokontrolera. Gdy napięcie akumulatorka spadnie do 1V, to odtwarzany jest dźwięk ostrzegawczy, wyświetlany odpowiedni komunikat na LCD, po czym odtwarzacz wyłącza się.
Schemat ideowy i projekt PCB zrobiłem w Protelu 99.
Program odtwarzacza napisałem w języku C w środowisku Rowley Crossworks ver.1.7 i zaprogramowałem mikrokontroler przez JTAG przy użyciu Macraigor Wiggler. Podczas kompilowania trzeba ustawić opcje:
Optimize for Size, bez tego kod wykonuje się zbyt wolno, co objawia się trzeszczeniem podczas odtwarzania.
Heap size na rozmiar 23918 bajtów, by zaalokować zmienne używane przez dekoder MP3
Stack size (IRQ mode) na wartosc 384 bajtów
Stack size (User/System mode) na wartość 1024 bajty.
Użycie pamięci przez program: 93kB pamięci programu Flash i 36kB RAM. Żadnych funkcji nie przenosiłem do RAM, wszystkie są we Flash-u.
Koszty - niestety niemałe. PCB 60zł, części elektroniczne i obudowa (z TME) 280zł. Drobnicę SMD (kondensatory, rezystory, tranzystory) miałem w zapasach. Ale moim założeniem podczas prac nad odtwarzaczem było czegoś się nauczyć, a nie konkurować z producentami mp-trójek.
Elektronika odtwarzacza i akumulatorek umieszczone są w obudowie KM-22 - stąd takie wymiary odtwarzacza, jak w danych technicznych.
Etapy prac nad odtwarzaczem (poważniejsze problemy i sposoby rozwiązania ich) są tu: https://www.elektroda.pl/rtvforum/topic1413095.html
Kod źródłowy napisany przeze mnie można dowolnie modyfikować. Proszę tylko o powiadomienie mnie, co zostało zmienione i w którym miejscu w programie i jakie dało to usprawnienie

Pozdrawiam, KT_priv





Cool? Ranking DIY