
Jakiś czas temu przedstawiłem na forum pierwszą wersję „nietypowego mówiącego termometru”, o której nożna przeczytać tu: https://www.elektroda.pl/rtvforum/topic3330635.html#16486416
Druga wersja tego gadżetu ma raczej charakter dydaktyczny. Do odtwarzania komunikatów wcale nie jest potrzebny dodatkowy moduł odczytujący pliki z karty pamięci, do tego celu można użyć PWM - przykładem jest ciekawy i prosty układ ze strony elm-chan „Simple SD Audio Player”.
Byłem ciekawy, czy można pójść o krok dalej i zrezygnować nie tylko z modułu ale i także z …...karty pamięci ? Okazuje się, że można.
W wersji drugiej nietypowego mówiącego termometru komunikaty zapisane są w pamięci mikrokontrolera. Do tego celu wykorzystano liniowe kodowanie predykcyjne LPC (linear predictive coding).
LPC zaczęło się rozwijać już na początku lat siedemdziesiątych, najbardziej znanym układem był TMC0280 stosowany w zabawkach Speak & Spell firmy Texas Instruments ….ale zostawmy historię. Dziś mamy przecież Arduino

Od czego zacząć? Od przygotowania komunikatów. Potrzebne będą komunikaty zapisane w formacie wav, koniecznie mono, 16bit i częstotliwości próbkowania 8000Hz. Komunikaty mogą być wygenerowane przez translator np. https://ttsmp3.com/ czy https://soundoftext.com jako mp3 a następnie przekonwertowane do formatu wav o żądanych parametrach np. tu https://audio.online-convert.com/convert-to-wav. Można też nagrać własny głos, choćby w Audacity.
Następnie trzeba „zamienić” komunikaty do postaci mniej więcej takiej:
const unsigned char spTRZY[] PROGMEM = {0x01, 0x58, 0xBE, 0x3D, 0x00, 0xDB, 0x7F, 0x1B, 0xE0, 0xBA, 0x5F, 0x03, 0x7C, 0x7F, 0x6B, 0x80, 0x9F, 0x66, 0x1C, 0xF0, 0xF3, 0x4E, 0x00, 0x7E, 0xDE, 0x6E, 0xC0, 0x22, 0xE6, 0x0B, 0x6A, 0x26, 0x4C, 0xDA, 0x15, 0x2F, 0xA9, 0x4A, 0x77, 0xBF, 0x52, 0x33, 0x98, 0x6E, 0xDC, 0xE8, 0xC2, 0x71, 0x33, 0xAB, 0x76, 0xD3, 0x37, 0xDB, 0xC9, 0x29, 0xCA, 0x23, 0x5E, 0x22, 0x27, 0x37, 0x69, 0xCB, 0x7A, 0x89, 0xED, 0xBC, 0xE4, 0xA4, 0x66, 0xA9, 0x96, 0x73, 0xA3, 0xB1, 0xA8, 0x81, 0x28, 0xC2, 0xB6, 0x32, 0xC2, 0x0B, 0xEB, 0x12, 0x52, 0x28, 0x8B, 0x2A, 0x8D, 0x86, 0x70, 0x23, 0x25, 0x62, 0xD2, 0x31, 0x3C};
(to jest akurat komunikat o treści „trzy”).
W tym celu trzeba posłużyć się odpowiednimi programami takimi jak: BlueWizard dla systemu MAC lub Qboxpro (Windows 3.11

Ja użyłem tego ostatniego. Do jego uruchomienia potrzebne jest zainstalowanie Python’a w wersji nie niższej niż 3.5 oraz biblioteki SciPy. Na Windows7 i Python w wersji 3.7 nie miałem problemów z uruchomieniem. Wystarczyło w konsoli wydać polecenie python python_wizard -f arduino nazwa_pliku.wav po chwili objawiły się cyferki (plik wav musi być w tym samym katalogu co python_wizard).
Lepszym rozwiązaniem jest polecenie python python_wizard_gui -f arduino nazwa_pliku.wav które otworzy nam okno programu. W programie tym można dokonać rozmaitych ustawień, a po wczytaniu pliku wav, pojawi się ciąg cyfr, który po zaznaczeniu i skopiowaniu można wkleić do Arduino.

Aby zacząć zabawę w Arduino należy zainstalować bibliotekę o nazwie TALKIE https://github.com/ArminJo/Talkie oraz bibliotekę czujnika temperatury DallasTemperature.
Na początku programu znajdują się wklejone komunikaty, ale można by było pokusić się o utworzenie własnego słownika; sprawdzana jest obecność czujnika temperatury. W głównej pętli programu, gdy pojawi się stan wysoki na wejściu 9, następuje odczyt temperatury. W przeciwieństwie do pierwszej wersji termometru, do uruchomienia termometru nie użyto czujnika ruchu, ale przycisku dotykowego TTP223. Czujnik temperatury podpięty jest do wejścia A5.
Odczytana temperatura z czujnika DS18B20 jest zaokrąglona do jednego miejsca po przecinku, gdyż bardzo drażniły mnie setne części temperatury (i nie wiem czy wogóle można to zmienić w bibliotece), dalej zmieniona jest na poszczególne cyfry (liczby). Tutaj, jako początkujący "programista", natknąłem się na pewne problemy.
Polecenie "say" spowoduje wypowiedzenie komunikatu odpowiedniej cyfry (liczby), zależnie od temperatury. W tej wersji termometr mówi zero po przecinku. Termometr ma zakres od 0-100st. Gdy temperatura jest poza tym zakresem, lub brak czujnika, wypowiadany jest stosowny komunikat.
https://filmy.elektroda.pl/43_1608384911.mp4
Udostępniam plik źródłowy, aby osoby chętne do wykonania takiego termometru, mogły dostosować go do swoich potrzeb.
Schemat jest na tyle prosty, że nie zdecydowałem się robić płytki, tylko zmontować układ na płytce uniwersalnej. Jak widać nie jest to Arduino nano, pro mini czy uno (program był skompilowany dla Arduino nano) ale zwykła Atmega328 z zewnętrznym kwarcem 16MHz z zapasów, w dodatku THT. Fusebity ustawione na low: 0xFF, high: 0xD9. Zasilanie 5V pochodzi od zasilacza do raspberry pi, stąd gniazdo microUSB. W czasie testów użyłem powerbanka.
W celu wypowiedzenia temperatury należy przez ok. 2s nacisnąć przycisk dotykowy. Można z niego zrezygnować i podać stan wysoki na pin 9 (pin 19 atmegi). Do wyjść 3 i 11 (odpowiednio pin 5 i 17 atmegi) podłącza się głośnik, koniecznie 16Ohm lub 32Ohm. W czasie testów użyłem głośnika 8Ohm i rezystora 10R. W zależności od tego, jaka będzie jego sprawność, wydobywane dźwięki mogą być nieco ciche, dlatego konieczne może być zastosowanie dodatkowo wzmacniacza mocy. Wejście wzmacniacza należy podłączyć wówczas do pinu 3 (i masę), koniecznie poprzez filtr dolnoprzepustowy. Pin 11 jest wtedy niewykorzystany.
Szczegóły dotyczące biblioteki dostępne są na github'ie.
W załączniku znajduje się: schemat, plik źródłowy arduino oraz plik hex do wgrania do ATMEGA328, biblioteka TALKIE i program python_wizard.
Podsumowanie.
Ogólnie jakość dźwięków nie jest najgorsza, zależy także od ustawień w programie dokonującego konwersji. Ja użyłem tych domyślnych i nie wnikałem w szczegóły. Ponadto zastosowanie wzmacniacza z dobrze dobranym filtrem dolnoprzepustowym dwu lub trzy stopniowym, aktywnym, z pewnością da lepsze rezultaty.
Myślę, że warto uzupełnić swoje projekty, realizowane z użyciem nie tylko na Arduino o możliwość wygłaszania komuników, tym bardziej, że nie ma potrzeby użycia dodatkowych modułów i karty pamięci.
Mam nadzieję, że kogoś zaciekawię tym opisem i zachęcę do własnych eksperymentów, szczególnie osoby interesujące się techniką retro.
Cool! Ranking DIY