[157] Gadający woltomierz cz. 3
Polski język nie jest łatwy i to jest zdanie nie tylko tych, którzy się go uczą, ale także informatyków. Do rozpaczy doprowadza mnie kamerka w aucie, która mało sympatycznym głosem oświadcza, że w tryb czuwania przełączy się się po pięć minutach. Nie: po pięciu, a po pięć. Takich historii dookoła mamy mnóstwo. Czasem jeszcze ktoś pamiętał o trzynastce zamiast dziesięć-trzy, ale tysiąc-zero-trzy już słyszałem. Projektując interfejsy „gadane”, czyli wypowiadające komunikaty słowne, należy pamiętać nie tylko o miłym głosie, poprawnym technicznie nagraniu, ale także o właściwej odmianie. I dziś zajmiemy się tym problemem, rozbudowując projekt z poprzedniego artykułu.
Ponieważ korzystaliśmy tam z pamięci pokładowej Arduino, trzeba było zmieścić się w 32 kB, zostawiając nieco miejsca na sam program. Dla brzmienia cyfr tyle wystarczyło, ale było ich tylko dziesięć i wartości większe od dziewięciu składałem z jednostek, na przykład siedem-dwa-pięć dla 725. Nieładnie, ale użytecznie, a zaleta jest konkretna – żadnych kart pamięci ani innych kostek. Dziś jednak nie będę się ograniczać, wszak najmniejsze karty pamięci kosztują grosze i ich podłączenie do Arduino nie stanowi skomplikowanego problemu.
O kartach SD i odtwarzaniu dźwięku pisałem w tym artykule. Jeśli ktoś z zagadnieniem dotąd się nie spotkał, zapraszam tam, a dziś przypomnę pokrótce: karty SD na szczęście dla nas potrafią rozmawiać ze światem między innymi za pomocą standardu SPI, który został w Arduino zaimplementowany sprzętowo.

Ten interfejs wymaga trzech linii danych i czwartej – aktywacji. Z zasilaniem będzie więc sześć przewodów. Problem w tym, że karty te pracują w logice trzywoltowej. W przypadku pięciowoltowych Arduino trzeba będzie dołożyć trzy dzielniki napięcia (linia MISO nie potrzebuje go, bo sama wystawia napięcia).

Na szczęście napięcie zasilające 3,3 V Arduino Uno i pochodne wystawiają na jednej z nóżek. I taki interfejs zrobiłem sobie dawno temu ze starego adaptera dla kart micro SD.

Ale to trochę bez sensu, takie płytki można kupić za grosze, siedzi tam i gniazdko, i konwerter, i zasilacz. I takiego będziemy tu używać. Podłączę go jak zwykle do płytki edukacyjnej TME, zgodnie ze schematem, który znajduje się wyżej.

Ponieważ piny dla SPI zdefiniowano trwale, możemy zmienić jedynie pin aktywacji. Domyślnie używa się tego z numerem czwartym i niech tak zostanie. Cała nasza „karta muzyczna” będzie rozwiązaniem identycznym z poprzedniego artykułu serii, czyli wepniemy głośnik między pin 9, a masę.

Przypominam – gdyby miał opór mniejszy od 100 omów, wraz z rezystorem w szeregu. Warto też dołożyć kondensator 100 uF, by oddzielić składową stałą. Wróćmy do karty SD i jej zawartości. Biblioteka, której użyjemy, upraszcza współpracę z medium do niezbędnego minimum, oszczędzając skąpe tutaj moce. Toteż ograniczeń jest trochę. Po pierwsze, używamy zasad DOS-a, czyli formatu FAT 16 lub 32. Pliki muszą składać się z maksymalnie ośmiu znaków i trzech rozszerzenia, przy czym ustaliło się, by składało się ono z trzech liter: AFM. Muszą siedzieć w głównym katalogu, a sama karta nie powinna przekraczać 32 GB pojemności. I jeszcze jedno: pliki muszą mieć ciągłą strukturę, co oznacza, że najlepiej zaraz przed ich wrzuceniem kartę trzeba sformatować w trybie pełnym – czyli musimy „odhaczyć” opcję szybkiego formatowania.

Zawsze potem można dorzucać kolejne pliki, ale nie wolno usuwać tych, które zostały wrzucone wcześniej. Biblioteka bowiem ustala adres danych tylko na początku, a potem czyta je zgodnie z zadeklarowaną długością i przy dużej fragmentacji moglibyśmy usłyszeć przypadkowe fragmenty innych plików.
Skoro wszystko już podłączyliśmy, przerwijmy wątek sprzętowy i wróćmy do poprzedniego artykułu, gdzie to przygotowywaliśmy nagrania. Zrobimy to ponownie, ale tym razem pakiet będzie bardziej rozbudowany. Najpierw teoria: liczby od zera do dziewięciu nagramy po staremu, a więc: zero, jeden, dwa, trzy… i tak dalej. Potem mamy dziesięć oraz dziewięć liczebników, tak zwanych „nastek”, czyli jedenaście, dwanaście... aż do dziewiętnastu. Później zaczyna obowiązywać nowa reguła: dziesiątki składają się z nowego wyrazu, a za nimi wstawia się znane nam już jednostki. Zaczynamy od dwadzieścia i kończymy dziewięćdziesiątką. Potem mamy sto plus wszystko co było dotąd. Po setce dwieście i tak dalej aż po dziewięciuset pojawi się tysiąc. Tutaj zabawę zakończymy, bo przetwornik Arduino dysponuje rozdzielczością dziesięciobitową i 1023 jest największą mierzoną liczbą. Ale oczywiście program można rozbudowywać dalej, acz ja poprzestanę na tym etapie, bo i tak komplikacji jest już sporo.
Tak więc musimy nagrać aż 38 słów. Tym razem nie musimy ich wypowiadać dobitnie i szybko, miejsca na karcie mamy dość. Proces nagrania i obróbki jest identyczny względem tego, co przedstawiłem w poprzednim artykule, więc pominę ten etap. Różnica będzie na końcu i skorzystamy tutaj z fantastycznej cechy biblioteki, z której korzystamy. Otóż może ona pracować w kilku trybach, z czego nas będzie interesował jeden – osiem bitów przy częstotliwości próbkowania 62,5 kHz. Dlaczego? Bo tak wielki odstęp od granic pasma słyszalnego – tutaj ponad 10 kHz – pozwoli nam wtłoczyć mnóstwo szumu ditheringu w pasmo ultradźwięków i całe skrzeczenie ośmiobitowych sampli stanie się wspomnieniem. No, nie do końca, będzie słychać szum na poziomie -52 dB, ale to jest poziom przyzwoitego magnetofonu kasetowego, więc w zastosowaniach, dla których powstało Arduino, zupełnie nie będzie przeszkadzał. Ale by uczynić tę konwersję, będziemy potrzebowali aplikacji Audition. Proste konwertery nie potrafią tego zrobić.

Gdy już będziemy mieli właściwą postać dźwięku, należy go zapisać w formacie PCM, bez dodatków i w domyślnej formie bez znaku.

Zapiszmy sobie na razie cały plik i wrzućmy go na kartę pamięci. Jeszcze zmieńmy mu wcześniej rozszerzenie na AFM. Nie jest to obowiązkowe, ale trzymajmy się standardów.
#include <SimpleSDAudio.h> // Biblioteka odtwarzania sampli z karty SD.
void setup() {
SdPlay.init(SSDA_MODE_FULLRATE | SSDA_MODE_MONO | SSDA_MODE_AUTOWORKER); // Inicjacja biblioteki.
SdPlay.setFile("liczby.afm"); // Pobierz plik "liczby.afm"
SdPlay.play(); // Odtwórz go.
}
void loop() {}Szkic testujący nasz obwód będzie prościutki. Importujemy wspomnianą bibliotekę SimpleSDAudio.h, następnie inicjujemy ją z parametrami: 62,5 kHz próbkowania, mono, praca samodzielna. Kolejno za pomocą poleceń biblioteki wybieramy nasz plik liczby.afm i odtwarzamy go. Plik ten można znaleźć w załączniku pod artykułem. Plik możemy tu odtwarzać jednorazowo, więc jeśli będziemy chcieli znowu posłuchać mojego gadania, trzeba będzie wcisnąć reset. Skoro wszystko działa, czas zrobić coś pożytecznego. Ale o tym napiszę już w kolejnym artykule.

Inne artykuły z tej kategorii
Fotograficzny kalkulator raz jeszcze
































































