- 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.
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 skonfigurowaniu 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.
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.
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.
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).
Rozpoczęcie przesyłania pliku ścieżki dźwiękowej do urządzenia wymaga wysłania do niego komendy. Program najpierw inicjuje zapis do bufora pierwszego komendą Buffer 1 Write o kodzie 0x84, a następnie odpowiada komendą gotowości. 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. 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.
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.