Podstawowe informacje:
- Odtwarzanie 4 niezależnych ścieżek dźwiękowych.
- Maksymalny czas trwania każdej ścieżki dźwiękowej ok. 23 s.
- Ścieżki dźwiękowe tworzone z plików WAV.
- Programowanie ścieżek dźwiękowych przy za pomocą aplikacji, poprzez kabel-konwerter USB->UART.
- Wyzwalanie odtwarzania za pomocą 4 wejść sterujących.
- Zasilanie 5...14 V, ok 6 mA w trybie czuwania, do 300 mA podczas odtwarzania.
- Opcjonalny tryb zasilania bateryjnego - zasilanie 3...4,2 V, pobór prądu 0,04 mA trybie czuwania.
- Moc wbudowanego wzmacniacza audio do 1 W.
- Wymiary 60 mm×25 mm×10 mm.
Przewagą nad podobnymi konstrukcjami jest to, że ścieżki dźwiękowe tworzone są z plików dźwiękowych WAV. To daje ogromne możliwości w tworzeniu i edytowaniu ścieżek dźwiękowych i pozwala na całkowitą powtarzalność. Przygotowane pliki, za pomocą specjalnej aplikacji dla komputera PC, są wysyłane do urządzenia i zapisywane w pamięci nieulotnej. Aby później odtworzyć jeden z czterech plików wystarczy zwarcie do masy odpowiadającego mu wejścia.
Schemat ideowy odtwarzacza pokazano na rysunku 1. Jednostką sterującą jest mikrokontroler ATmega88 w obudowie TQFP, natomiast funkcję "magazynu" dla ścieżek dźwiękowych pełni pamięć Flash typu AT45BD161. Jako wzmacniacz audio zastosowano niskonapięciowy wzmacniacz klasy D typu SA58670, a napięcia stabilizowanego 3,3 V dostarcza LM1117-3.3 w wersji SMD. Na schemacie nie widać tylko najważniejszego elementu całego urządzenia - programu sterującego, który został umieszczony w pamięci mikrokontrolera.
Inicjacja pamięci
Jednym z najważniejszych zadań programu jest odpowiednia komunikacja z pamięcią zewnętrzną. Pamięć ta pozwala na przechowywanie 2 MB danych w 8-nóżkowej obudowie SMD. Ma przy tym bardzo szybki interfejs szeregowy SPI, jest wyposażona w dwa bufory i przemyślane mechanizmy obsługi.
W mikrokontrolerze wykorzystano sprzętowy interfejs SPI pracujący w trybie Mode 3. Po uruchomieniu i skonfi gurowaniu peryferiów, program wysyła komendę Status Register Read (0xD7) - żądanie odczytu rejestru statusowego pamięci. Nas interesują poziomy logiczne bitów numer 1 i 0. Bit pierwszy informuje czy którykolwiek z sektorów pamięci ma włączone zabezpieczenie przed zapisem. Fabrycznie nowa pamięć nie ma włączonych zabezpieczeń i bit jest wyzerowany. Bit zerowy informuje o wielkości strony pamięci (pamięć jest podzielona na strony zawierające 528 lub 512 bajtów). Wszystkie operacje - z wyjątkiem niektórych operacji kasowania - wykonywane są właśnie na stronach pamięci.
Fabrycznie nowa pamięć ma stronę 528 bajtów (bit wyzerowany), natomiast program wymaga stron 512-bajtowych. Jeśli jest inaczej, to w kolejnym kroku są wysyłane bajty 0x3D, 0x2A, 0x80, 0xA6. Ta sekwencja zawiera polecenie zmiany wielkości strony. Również to zdarzenie zostanie zasygnalizowane odpowiednim komunikatem. Uwaga! Operacja jest nieodwracalna - po zmianie wielkości strony na 512 bajtów nie można powrócić do stron 528-bajtowych. Po zmianie wielkości strony pamięć musi zostać zrestartowana - w tym celu należy na chwilę odłączyć jej zasilanie.
Kolejnym i ostatnim zadaniem (odnoszącym się do pamięci Flash) wykonywanym po uruchomieniu jest odczyt prostej tablicy alokacji umieszczonej umownie na czwartej stronie obszaru pamięci. Jej zawartość zostaje skopiowana do pamięci operacyjnej mikrokontrolera. Cały proces inicjacji pamięci pokazano na rysunku 2.
Organizacja pamięci
Po zmianie wielkości strony pamięć AT45BD161 jest podzielona na 4096 stron po 512 bajtów. Program dzieli ten obszar na pięć obszarów użytkowych: tablicę alokacji i cztery umowne sektory przypisane czterem ścieżkom dźwiękowym. Każdy sektor ma stały adres początkowy - offset. Pierwszy z nich rozpoczyna się od strony numer 6, każdy kolejny jest przesunięty o 1000 w stosunku do adresu poprzedniego. Łatwo domyślić się, że z tego przesunięcia wynika maksymalna wielkość pliku WAV. Piąta część to tablica alokacji - strona o adresie 4. Program umieszcza tam informacje o adresach początkowych i długościach ścieżek dźwiękowych zapisanych w sektorach. Offsety ścieżek dźwiękowych nie są niezbędne, ponieważ pokrywają się ze stałymi offsetami sektorów, ale mogą być potrzebne przy wykonywaniu ewentualnych zmian w programie. Informacja o długości ścieżki jest potrzebna do tego, aby zakończyć odtwarzanie we właściwym momencie. Ścieżka nie musi zajmować całego sektora i rzadko tak będzie. Organizację pamięci pokazano na rysunku 3.
Odtwarzanie ścieżki dźwiękowej
Ścieżka dźwiękowa jest zapamiętywana w postaci kolejnych, chwilowych wartości amplitudy (próbek) pobranych z sygnału wejściowego. Aby było możliwe odtworzenie sygnału musi być znana rozdzielczość i częstotliwość próbkowania, które w tym wypadku są równe 8-bitów i 22050 Hz. Odczyt danych z pamięci Flash może być wykonywany na dwa sposoby. Pierwszy (domyślny) polega na skopiowaniu strony pamięci do jednego z dwóch buforów, które są częścią kontrolera pamięci, a następnie odczyt danych z bufora. Taki sposób obsługi pozwala na swobodny dostęp do dowolnego słowa danych w buforze.
Dla potrzeb opisywanego urządzenia korzystniejszy jest drugi sposób, który polega na ustawieniu kontrolera pamięci w tryb odczytu ciągłego - Continuous Array Read. Najpierw jest wysyłana jest komenda o kodzie 0x03 z parametrem określającym adres strony, od której rozpoczyna się pobieranie danych, a potem bajt po bajcie jest przesyłana zawartość pamięci z pominięciem buforów. Z punktu widzenia odtwarzacza, ten sposób ma dodatkową zaletę. Gdy zostanie odczytany ostatni bajt z danej strony, to kontroler niezwłocznie rozpocznie odczyt następnej strony.
W trakcie odtwarzania ścieżki dźwiękowej jest wybrany tryb odczytu ciągłego z pamięci, a Timer1 pracuje w trybie generatora PWM i pełni rolę źródła przerwań generowanych z częstotliwością 44,1 kHz. Częstotliwość ta jest podwojoną częstotliwością próbkowania dźwięku, ponieważ odczyt kolejnych próbek z pamięci odbywa się tylko co drugie przerwanie, z częstotliwością 22050 Hz. Pomiędzy odczytami z pamięci jest uaktualniana wartość współczynnika wypełnienia dla generatora PWM oraz odliczana liczba stron pamięci pozostała do końca ścieżki dźwiękowej, zatem cały proces odtwarzania jest realizowany w krótkiej procedurze obsługi przerwania i nie przeszkadza w normalnym wykonywaniu pętli głównej programu. Opisywany proces zobrazowano na rysunku 4.
Na wyjściu generatora PWM (port PB3 mikrokontrolera) jest włączony dolnoprzepustowy filtr RC i w ten sposób zrealizowano przetwornik C/A. Rozdzielczość przetwornika wynosi 8 bitów, częstotliwość przebiegu PWM 44100 Hz, a więc każda próbka jest przetwarzana przez dwa cykle PWM.
Pełny okres przebiegu trwa 272 cykle zegarowe mikrokontrolera (12 MHz/44100 Hz≈272) maksymalna wartość próbki to 255, a więc przetwornik nigdy nie osiągnie wypełnienia 100%. Warto także wspomnieć, że rzeczywista częstotliwość przetwarzania jest nieco większa od 22050 Hz. Dla rezonatora kwarcowego 12 MHz jest dokładnie o 8,8 Hz większa, ale nie powoduje to słyszalnej różnicy podczas odtwarzania.
Komunikacja
Komunikacja z urządzeniem odbywa się poprzez port szeregowy UART. Za pomocą przejściówki USB/UART można połączyć urządzenie z komputerem PC i sterować nim z dowolnego programu terminalowego lub za pomocą specjalnej aplikacji. Parametry komunikacji to: prędkość transmisji 57600 bps, 8 bitów danych, parzystość none, pojedynczy bit stopu.
Ogólna postać komend sterujących oraz odpowiedzi urządzenia to: #, rozkaz, parametr, CR. Znak # to umowny znak początku każdej komendy, CR to znak końca linii odpowiadający naciśnięciu ENTER (wartość hex 0x0D). Opisy rozkazów i parametrów umieszczono w tabeli 1. Pomiędzy znakami nie ma odstepu.
Rozpoczęcie przesyłania pliku ścieżki dźwiękowej do urządzenia wymaga wysłania do niego komendy czwartej z tab. 1. Program najpierw inicjuje zapis do bufora pierwszego komendą Buffer 1 Write o kodzie 0x84, a następnie odpowiada komendą gotowości (10/ tab. 1). Każdy bajt odebrany z UART zostaje od razu wysłany za pomocą SPI do jednego z dwóch buforów w pamięci.
Plik musi być wysyłany w blokach po 512 bajtów, tyle ile wynosi rozmiar strony pamięci AT45DB161. Po skompletowaniu całej strony jest przerywany odbiór z UART, a dany bufor zostaje przepisany do pamięci nieulotnej za pomocą komendy Buffer to Main Memory Page Program with Built-in Erase o kodzie 0x83 lub 0x86. W czasie zapisu dostęp do tego bufora zostaje zablokowany, ale w tym czasie jest gotowy do pracy drugi bufor. Program inicjuje zapis do bufora drugiego i odpowiada komendą gotowości (10/tab. 1). Cały proces powtarza się, ale z użyciem drugiego bufora.
Powyższy schemat działa w pętli i dzięki temu zapis danych jest prawie ciągły. Występują tylko niewielkie opóźnienia przy przełączaniu buforów, czyli co 512 bajtów wysłanych do urządzenia. Przesyłanie pliku zostaje zakończone, gdy urządzenie nie otrzyma żadnych danych w ciągu 4 sekund od wysłania komendy gotowości. Na koniec jest uaktualniana tablica alokacji dla przesłanego pliku i wysyłana informacja podsumowująca przebieg operacji - komenda 7, 8 lub 9/tab. 1.
Aplikacja dla PC
Pliki WAV zawierają więcej informacji, niż urządzenie jest w stanie odtworzyć. Aplikacja Micro Player Manager selekcjonuje z plików tylko niektóre dane i pozwala na ich użycie.
Najpierw odczytywane są podstawowe informacje o pliku - wielkość i typ. Akceptowane są pliki o dowolnej wielkości, ale tylko nieskompresowane typu PCM. Następnie jest ustalana liczba kanałów audio oraz częstotliwość i rozdzielczość próbek. Akceptowane są pliki jedno- lub dwukanałowe, ale przesyłany jest tylko jeden kanał o numerze 0, dla plików stereo jest to kanał lewy. Częstotliwość próbkowania musi być równa 22050 Hz lub 44100 Hz. Dla większej częstotliwości jest pomijana co druga próbka, aby w efekcie uzyskać próbki odpowiadające 22050 Hz. Akceptowana rozdzielczość to 16-bitów, ale jest ona ograniczana do starszych 8 bitów, ponieważ taką rozdzielczość ma przetwornik C/A. Na podstawie powyższych danych jest obliczany odstęp pomiędzy kolejnymi próbkami.
Na rysunku 5 pokazano nagłówek pliku WAV z zaznaczeniem ważniejszych elementów. Właściwe dane dźwiękowe rozpoczynają się od elementu zawierającego ciąg znaków data. Jego adres nie jest stały i należy go obliczyć uwzględniając wartość elementu Subchunk1 Size. Jeśli odpowiedni ciąg znaków nie będzie znajdował się pod obliczonym adresem, to aplikacja nie otworzy pliku. Gdy po wybraniu pliku zostanie naciśnięty przycisk Send, to aplikacja utworzy bufor o pojemności 512 bajtów i zacznie zapisywać do niego przetworzone próbki. Gdy bufor będzie pełny, to rozpocznie się wysyłanie danych do urządzenia poprzez wskazany port szeregowy. W trakcie wysyłania przygotowywana będzie kolejna paczka danych.
Aplikację napisano w Visual Basic 2010 Express Studio, jej wygląd pokazano na rysunku 6. Do uruchomienia aplikacji jest wymagany system operacyjny Windows z zainstalowany pakietem Net Framework w wersji 2.0 lub nowszej. Okienko jest proste - pozwala wysyłać pliki (przyciski "Send") i odtwarzać je na urządzeniu (przyciski "Play"). Każdy proces można w każdej chwili przerwać przyciskami "Stop". W trakcie wysyłania pliku do urządzenia wyświetlany jest adres ("Offset") ostatnio przetworzonej próbki oraz pasek postępu. Po każdej operacji zostanie wyświetlone odpowiednie podsumowanie.
Montaż i obsługa
Schemat montażowy odtwarzacza zamieszczono na rysunku 7, natomiast sposób dołączenia na rysunku 8. Odtwarzacz składa się z drobnych elementów SMD ułożonych gęsto na płytce, więc montaż wymaga cierpliwości, precyzji i doświadczenia. Na rys. 7 opisano funkcje poszczególnych wyprowadzeń.
Po zmontowaniu, do punktów oznaczonych V i G, należy dołączyć napięcie zasilające +5 V. Jeśli po chwili zacznie migać dioda LED dołączona do punktów LED i G, to pierwszy etap uruchomienia przebiegł pomyślnie. Należy teraz na chwilę odłączyć zasilanie, a następnie dołączyć urządzenie do konwertera USB/UART. Najlepszy do tego celu jest AVTMOD09, ponieważ można go włączyć bezpośrednio do złącza komunikacyjnego i zasilającego - należy tam wlutować gniazdo goldpin zamiast szpilek goldpin. W oknie aplikacji należy wskazać jakiś krótki (na próbę) plik WAV, następnie wybrać port COM, przez który podłączone zostało urządzenie i nacisnąć któryś z przycisków Send. Przesyłanie pliku nie jest zbyt szybkie i może potrwać nawet kilka minut. Po zakończeniu należy nacisnąć odpowiedni przycisk Play, aby odsłuchać przesłany plik dźwiękowy. Oczywiście, musi być dołączony głośnik lub słuchawki. Głośność reguluje się potencjometrem R7. W chwili rozpoczęcia odtwarzania może być słyszalne charakterystyczne "puknięcie" w głośniku spowodowane uruchamianiem toru audio.
Należy także sprawdzić, czy odtwarzanie może zostać uruchomione za pomocą wejścia sterującego. W tym celu należy odpowiednie wejście 1...4 zawrzeć do masy G. Gdy punkty LOOP i G nie są połączone, to urządzenie odtworzy jeden raz całą ścieżkę dźwiękową. Gdy LOOP jest zwarty do G, to urządzenie będzie odtwarzało tak długo, jak długo na wejściu sterującym będzie stan aktywny (zwarcie do G). W wypadku zwarcia kilku wejść, najwyższy priorytet ma wejście o najniższym numerze.
Zastosowany wzmacniacz audio ma moc rzędu 1 W, która w zupełności wystarczy do większości zastosowań. Sygnał audio jest dostępny na wyjściu słuchawkowym. Jednak należy pamiętać, że dźwięk nie będzie idealnie czysty, w tle da się dosłyszeć ciche piszczenie o wysokiej częstotliwości i lekki szum - efekt jak z radia.
W wersji standardowej, z wlutowanym stabilizatorem IC1 oraz bez rezystora R11 układ może być zasilany napięciem z przedziału 5...14 V i pobiera w stanie czuwania prąd o natężeniu ok. 6 mA, z czego 5,5 mA "pożera" sam stabilizator! Urządzenie możemy zoptymalizować pod kątem zasilania bateryjnego, wtedy zasilanie musi zawierać się w przedziale 3...4,2 V, a pobór prądu wynosi ok 0,04 mA. Jednak uwaga - blokowana jest wtedy funkcja komunikacji za pomocą UART, a więc taką modyfikację należy wykonać dopiero po zapisaniu ścieżek dźwiękowych. Ustawienie trybu bateryjnego polega na wlutowaniu R11 i usunięciu stabilizatora IC1. Wtedy zasilanie bezpośrednio z wejścia V trafi a do układów na płytce. Należy przy tym zewrzeć ze sobą wyprowadzenia RX i TX. Podczas włączania urządzenia dioda LED mignie dwa razy sygnalizując nowy tryb pracy, a mikrokontroler w znacznej części czasu będzie wprowadzony w stan głębokiego uśpienia Power Down.
Wykaz elementów
Rezystory: (SMD 0805)
R1, R10, L1: 4,7 Ω
R2...R6: 1 kΩ
R8, R9: 10 kΩ
R7: potencjometr 10 kΩ (SMD)
R11: 4,7 Ω (nie montować, opis w tekście)
Kondensatory: (SMD 0805)
C1, C4, C5, C7, C16, C17: 10 µF (SMD "A")
C2, C3, C6, C8...C10, C13...C15, C18, C20: 100 nF
C19: 4,7 nF
C11, C12: 18 pF
Półprzewodniki:
IC1: 1117-3.3 (DPACK)
IC2: Atmega88 (TQFP)
IC3: SA58670 (QFN20)
IC4: AT45DB161 (SOIC8)
Inne:
L2...L6: 1...10 mH (SMD, 0805)
X1: 12 MHz (SMD)
CON9: gniazdo słuchawkowe stereofoniczne
CON8: gniazdo goldpin 1×4
CON7: dioda LED (SMD 0805)
CON1...CON6: listwa goldpin 1×16
Dodatkowe materiały na CD lub FTP:
ftp://ep.com.pl, user: 08252, pass: 852rja63
KS