Elektroda.pl
Elektroda.pl
X
Elektroda.pl
OptexOptex
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Nietypowy mówiący termometr V2

Simon79 19 Dec 2020 14:48 1890 6
  • Nietypowy mówiący termometr V2
    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 :). W sieci dostępnych jest kilka bibliotek, wybrałem moim zdaniem najlepszą.
    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 :-? ) lub python wizard (windows, linux).
    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.
    Nietypowy mówiący termometr V2
    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.
    Attachments:

    Cool! Ranking DIY
    Can you write similar article? Send message to me and you will get SD card 64GB.
    About Author
    Simon79
    Level 19  
    Offline 
    Simon79 wrote 309 posts with rating 214, helped 24 times. Been with us since 2007 year.
  • OptexOptex
  • OptexOptex
  • #3
    Bazic
    Level 15  
    Układ jest ciekawy, jednak jakość dźwięku niestety marna. Czy sprawdzałeś może czy da się zastosować większą częstotliwość próbkowania np 16khz? Chodzi tu konkretnie o to czy CPU/pamięć się "wyrobi". Uważam, że poprawiłoby to mocno jakość. Oczywiście kosztem dwukrotnego wydłużenia próbek.
  • #4
    Simon79
    Level 19  
    Problemem tutaj jest program, który konwertuje plik wav. Jeśli plik ma inne parametry, niż te określone, po prostu nie przyjmuje takiego pliku. Również program Qboxpro tak ma "This software processes 16bit mono wav files at a 8kHz samplerate".
    Dźwięk szczególnie jest marny dla głosek typu "sz" "cz" "ś" itd. Być może dałoby się polepszyć jakość, zmieniając parametry w programie, ale tego nie próbowałem.
  • #5
    japko1024
    Level 18  
    Do zamiany dźwięku na ciąg liczb (tekst) można też wykorzystać Audacity. Może jeszcze tej zimy zdążę zrobić bombkę choinkową śpiewającą kolędy moim głosem :D Co ciekawe, ludzka mowa jest zrozumiała nawet przy największym możliwym przesterowaniu (też sprawdzałem tym programem), więc rozmiar próbki można zmniejszyć do 1 bita.
  • #6
    lechoo
    Level 39  
    Jakość dźwięku jest bardzo słaba przy tej kompresji, a wystarczyło dołożyć szeregową kostkę dataflash za kilka zł i nawet przy próbkach 8bit/11kHz jakość dźwięku byłaby dużo lepsza...
  • #7
    Simon79
    Level 19  
    Dodanie kostki jest jakimś pomysłem, ale tak jak pisałem na wstępie, jest to projekt bardziej edukacyjny, udowodnienie, że się da zrobić, w dodatku na tym nieszczęsnym Arduino :) .
    Zamiast kombinować, prościej i taniej użyć modułu.