Popularny post ethanak Napisano Wrzesień 11, 2025 Popularny post Udostępnij Napisano Wrzesień 11, 2025 Miałem opisać zupełnie inne urządzenie - cóż, w ostatniej chwili postanowiłem coś poprawić i wyskoczyło parę niedogodności. Ponieważ w międzyczasie udało mi się dokończyć mój odtwarzacz do książek - więc pozwolę sobie go przedstawić: oto Lekton. Dla tych którzy pamiętają poprzedną wersję: zrezygnowałem z określenia "czytak" z uwagi na istnienie komercyjnego produktu o tej nazwie, z którym nie mam zamiaru konkurować. Niech więc będzie (jak przystało na maniaka SF) Lekton... Zacząłem od przeanalizowania zalet i wad poprzedniego urządzenia (które zresztą uległo awarii, co prawda dość szybko usuniętej ale jednak). Na pierwszy rzut poszła konstrukcja. Niewątpliwie układ klawiatury był trafieniem w dziesiątkę: tylko dziewięć klawiszy, łatwych do odróżnienia bezwzrokowo, obsługujących najpotrzebniejsze funkcje... No i z zalet to tak praktycznie wszystko. Matrycowe podłączenie klawiatury praktycznie eliminowało możliwość odczytania więcej niż jednego klawisza jednocześnie. W dodatku stanowiąca całość z resztą obudowy klawiatura do jakiegokolwiek serwisowania wymagała rozebrania praktycznie całego urządzenia (a to mi się zdarzyło, bo wskutek upadku urwał mi się jeden z przewodów). Dalej: co prawda udało mi się zmieścić urządzenie w zakładanym rozmiarze paczki papierosów, ale okazało się to nieco bez sensu. Wewnątrz panował straszliwy ścisk, złożenie całości wymagało jakiejś potwornej ekwilibrystyki, rozmiar implikował niewygodne rozmieszczenie poszczególnych modułów których zresztą było za dużo. W dodatku użyty moduł WROVER co prawda miał wystarczającą ilość pamięci (16 MB flash, 8 MB PSRAM z czego praktycznie 4 MB do bezpośredniego użytku) ale konwerter UART/USB już się nie zmieścił i trzeba było użyć dedykowanego zewnętrznego konwertera. Poza tym stwierdziłem, że głośnik jest tu absolutnie niepotrzebny. Mogłem zamienić moduł MAX98357 na PCM5702A, w efekcie otrzymując możliwość zarówno odtwarzania w stereo (o tym potem), jak i podłączenia przycisku w słuchawkach (czego mi w poprzedniej wersji brakowało). Zahaczając nieco o program: Przede wszystkim założenie o trzymaniu wszystkiego w wewnętrznej pamięci flash modułu ESP32 wydawało się dobrym pomysłem - okazało się jednak, że miejsca nawet po kompresji jest trochę za mało. Co prawda teoretycznie obsługa przez interfejs WWW nie wymagała jakichś specjalnych dedykowanych aplikacji - jednak samo przygotowanie książki jej wymaga, co czyni ów pomysł niespecjalnie trafnym. Dlatego postanowiłem wrócić do pierwotnej koncepcji karty microSD. Dzięki temu mogłem ograniczyć wymagania co do pojemności pamięci flash do 8 MB (przy czym należało pamiętać, że ponad 4MB zajmuje partycja z głosem Mbroli), a tym samym użycie miniaturowej płytki XIAO S3. Tak więc postanowiłem nie opierać się na poprzednim projekcie. Ponieważ największym elementem był akumulator 5000 mAh - wewnętrzna szerokość wyszła mi 75mm. Pozostałe wymiary dopasowywałem na bieżąco w trakcie projektowania. Zacząłem od klawiatury. Postanowiłem zrobić z niej oddzielny moduł (zawierający również gniazdko słuchawkowe) po prostu wsuwany w odpowiednie szczeliny w obudowie. Jako że długość gniazda wyznaczała rozmiar modułu, nie musiałem bawić się w miniaturyzację. Na kawałku taniej płytki uniwersalnej umieściłem klawisze i wyłącznik, na drugiej (takiej porządniejszej) ekspander MCP23017 Wyszło to tak: Dzięki ekspanderowi mogłem podłączyć wszystkie klawisze oddzielnie oraz przycisk na słuchawkach. Oprócz scalaka są tak tylko dwa rezystory - jeden 10k jako pullup do resetu, drugi 3.3k do przysisku słuchawek. Całość łączy się pięcioma przewodami z główną płytką. Jako że z założenia konstrukcja miała być raczej prowizorycznym prototypem - nie bawiłem się w jakieś wymyślne płytki i miniaturyzacje. Znów kawałek uniwersalnej, na nim XIAO wetknięty w dwa żeńskie goldpiny (żeby można było później wyjąć) i dekoder I2S (co prawda wlutowany, ale pięć pinów wystarczy dmuchnąć hotairem). Dodatkowo rezystory dzielnika i kondensatorek do pomiaru stanu akumulatora - i prowizorka wyszła tak: Oddzielnie umieściłem moduł DS3231 (ten z EEPROM-em) i gniazdo karty microSD (miałem takie do Wemosa D1 Mini, wystarczyło dociągnąć jeden drucik żeby mieć wszystkie piny po jednej stronie): Docelowo miało to być umieszczone nad akumulatorem, czyli miejsca miałem dużo... I tu uwaga: mimo że starałem się zrobić to z gotowych modułów, jednego nie mogłem przeskoczyć: pamięci FRAM. Postanowiłem po prostu przylutować ją "na plecach" EEPROM-u moduły zegarka, zwierając linie adresowe do masy. W ten sposób miałem tam dwie pamięci: EEPROM na adresie 0x57 i FRAM na 0x50. Obudowa po umieszczeniu w niej akumulatora (widać, skąd takie a nie inne wymiary wygląda tak): A zmontowana całość razem z płytką główną i kłębowiskiem kabli: Teraz wystarczyło wydrukować górną część obudowy i urządzenie było gotowe do testów (przy okazji w zdjęciu zawarta jest informacja że nie jestem wielbłądem): W międzyczasie oczywiście powstawał program. Nie będę wnikał w szczegóły (kod w załączniku, każdy może obejrzeć), powiem tylko jakie są możliwości: Odtwarzanie audiobooków z możliwością przyspieszenia (pliki sonicFiler.cpp i sonicFilter.h w katalogu src są przystosowane do współpracy z popularną biblioteką ESP8266Audio) Odtwarzanie ebooków za pomocą syntezatora Mbrola Głosowe komunikaty (również generowane Mbrolą) Możliwość zrobienia zakładki (jednej na książkę) Autozakładka czyli możliwość zrobienia "redo" jeśli coś się pogubiłem w przewijaniu Możliwość przechowywania 511 książek (audio i ebook razem) z zapamiętywaniem ostatnio słuchanej książki oraz pozycji w każdej książce Zapis pozycji w pamięci FRAM co kilka sekund (audiobook) lub co zdanie (ebook) umożliwia powrót do ostatnio słuchanej pozycji nawet w przypadku nieoczekiwanego wyłączenia zasilania Ebooki podzielone na zestawy po max. 16 pozycji, ilość zestawów nieograniczona Przewijanie w trakcie odtwarzania jest możliwe (czasowe przy audio, zdanie/akapit przy ebookach) ale bez przeskoczenia granic pliku mp3 (audio) czy rozdziału (ebook), jast to możliwe tylko w trybie pauzy Podanie ogólnych lub szczegółowych informacji o bieżącej pozycji czytania Zegarek (godzina i minuta) oraz stan akumulatora (w procentach) Do wgrania audiobooka trzeba wyjąć kartę i przełożyć do czytnika. Za pomocą programu mkaudiobook mogę wgrać audio na kartę, z możliwą korektą (mono 65 kbps dla czytanych książek lub kopia dla słuchowisk stereo). Program przy okazji tworzy pliki informacyjne dla każdego pliku mp3 - nie jest to konieczne, Lekton potrafi sobie sam te pliki utworzyć, ale wtedy pierwsza próba odtworzenia rozpoczyna się od stworzenia owych plików, i ma się czas na zrobienie kawy. Co prawda nie przewiduję takiej sytuacji - ale pozostawiam sobie możliwość przegrania audiobooka z komputera na którym nie mogę uruchomić programu. Ebook (w odpowiednim formacie tekstowym, można go zrobić dowolnym edytorem tekstu w ciągu paru chwil z pliku txt ebooka) też może być przegrany bezpośrednio, ale wygodniejsze jest przegranie za pomocą dedykowaniej aplikacji. Aplikacja (Python3 i Gtk+ 3) umożliwia wygodne wgrywanie/usuwanie książek i robienie porządków na karcie poprzez połączenie do USB. Ogólnie jest tam tego trochę więcej, ale nie będę Was zanudzać szczegółami. Oczywiście jak najszybciej wziąłem się do testowania. Już następnego dnia wyskoczył problem: czy ja to coś wyłączyłem czy może leży sobie i podgryza akumulator? Mógłbym oczywiście dodać jakieś ledy ale w porę się opamiętałem: przecież na dekoderze I2S świeci sobie na czerwono śliczna dioda, wystarzy dodać okienko przez które będzie ją widać. Drugi problem był raczej natury usability: identyczne przyciski utrudniały szybkie znalesienie właściwego. Tak więc przycisk START zrobiłem nieco większy i wyczuwalny pod palcem, przy okazji poprawiłem suwak wyłącznika (na zdjęciu wydrukowane żółtym filamentem), dorobiłem okienka nad diodą I2S i przy okazji nad kontrolką ładowania XIAO - i wyszło to tak: Teraz mogłem wziąć się do dłuższych testów. Jak zwykle wyskoczyły jakeś drobne poprawki w programie, ale to było do przewidzenia i poprawiałem na bieżąco. I pewnie bym to w takiej postaci pozostawił, gdyby nie dwie sprawy: po pierwsze urządzenie było jednak nieco za duże, po drugie nie wziąłem pod uwagę drobiazgu - mianowicie naładowanie do pełna akumulatora za pomocą rachitycznej ładowareczki XIAO trwałoby jakiś tydzień... Ponieważ nie miałem jakiegoś porządnego modułu z gniazdem microSD, a nie bardzo miałem ochotę na lutowanie jakiegoś milimetrowego rastra (cóż, oczy już nie te co kiedyś) poszukałem trochę po sieci i znalazłem coś co wydawało mi się idealne do moich celów: produkcji Adafruit płytka z gniazdem, którą montuje się pod płytką XIAO. Trochę musiałem poczekać, bo botlandowe "kilka dni" zmieniło się w dwa tygodnie, ale wreszcie zamówiłem, przyszła... I po rozpakowaniu myślałem że mnie coś strzeli. Nauczka na przyszłość: zanim coś zamówisz obejrzyj sobie duże zdjęcie i nie chrzań, że się nie chce okularów szukać. Okazało się, że jakiś geniusz z Adafruit nie bardzo chyba wiedział jak się obchodzić z chińskimi wynalazkami. Gniazdo jest na płytce umieszczone tak, że kartę trzeba włożyć centralnie na płytce (trochę by to było niewygodne ale ujdzie), to jeszcze od tyłu (nie od strony gniazda USB na XIAO). Po prostu nie zauważyłem, że gniazdo na płytce nie jest umieszczone tak jak myślałem (czyli z przodu przy krawędzi) ale dokładnie odwrotnie! Czyli mój piękny projekt PCB mogłem wyrzucić do kosza i zacząłem się zastanawiać, co z tym fantem zrobić. W desperacji chwyciłem nożyce do laminatu, przyciąłem płytkę tak że mogłaby się zmieścić na PCB... i udało się! Teraz już mi sie nie chciało siadać do projektowania. Przed nosem leżała sobie porządna płytka uniwersalna 70x50 mm, akurat mieściły się obok siebie S3 i to nieszczęsne gniazdko. Rezystorki i kondensator w wersji SMD poszły na spód płytki (na szczęście 0805 bardzo ładnie pasują do rozstawu pól lutowniczych na płytce), parę połączeń kynarem - i gotowe! Mogłem zmniejszyć obudowę do jakichś rozsądnych rozmiarów! Wewnątrz wygląda to tak: Jak widać, cała elektronika zmieściła się nad akumulatorem, co pozwoliło mi na zmniejszenie długości obudowy. Dodałem jeszcze otwór przez który mogę się dostać do wtyczki akumulatora (zrobiłem sobie kiedyś taką uniwersalną ładowarkę do LiPo, przy 1A powinno się przez noc naładować), wydrukowane z polipropylenu zaślepki (wolałbym żeby jakieś paprochy z kieszeni nie dostały się do wnętrza), drugie okienko na drugą diodę XIAO (sygnalizuje stan urządzenia STOP/PAUZA/PLAY) - i w efekcie wygląda to tak: Tym razem kilkudniowe intensywne testy wykazały, że urządzenie w tej wersji jest wygodne i spełnia wszystkie moje oczekiwania. Na zakończenie kilka słów o załączonym pliku Lekton.zip. W kodzie pozostawiłem wyłączone fragmenty. MSC nie udało mi się uruchomić (zresztą w pewnym momencie zrezygnowałem z uwagi na dziwaczne problemy z komunikacją serial w trybier TinyUSB/CDC). Plik wifi pozostawiłem bo jest dość uniwersalny, krótki i być może ktoś będzie potrzebować czegoś podobnego. Plik OpenSCAD-a jest raczej do pooglądania sobie, nie jest stuprocentowo kompletny ale raczej chciałem pokazać w jaki sposób można w tym programie stworzyć projekt w miarę skomplikowanej obudowy. Gdyby ktoś koniecznie chciał uruchomić to u siebie, należy z GitHuba zgrać plik espola_pl1_full.blob i wgrać go do ESP od adresu 0x36E000 (zgodnie z adresem w mbro8nof.csv). W razie jakichkolwiek pytań jestem do dyspozycji. 13
ethanak 7 maja Autor tematu Udostępnij 7 maja (edytowany) Kod już na githubie - można obejrzeć jak poradziłęm sobie z wysokimi prędkościami: w pliku src/speech/nymbrola.cpp poszukać #ifdef MILENA_FAST Niestety - próby dalszego zwiększana prędkości mie wyszły... na razie cieszę się z tego co mam (prędkość ok. 2.2x) Aha, README.md na githuba się właśnie pisze Edytowano 7 maja przez ethanak 1
kroszkanorber 24 maja Udostępnij 24 maja PCM5702A. Ten układ pobiera dane cyfrowe i dekoduje je do audio. Nie dekoduje mp3. Czy dekoder mp3 jest w esp32? Nie wiem czy dobrze zrozumiałem...
ethanak 25 maja Autor tematu Udostępnij 25 maja 10 godzin temu, kroszkanorber napisał: Ten układ pobiera dane cyfrowe i dekoduje je do audio. Oczywiście - on dostaje audio po I2S i wywala na analog (słuchawki). 10 godzin temu, kroszkanorber napisał: Czy dekoder mp3 jest w esp32 Dekoder jest czysto programowy (z biblioteki 8266Audio) i sprawdza się całkiem nieźle. Do tego pamiętaj, że między dekoderem a driverem I2S jest jeszcze Sonic (przyspieszenie odtwarzania mowy bez zmiany wysokości). Poza tym odtwarzanie mp3 to akurat najrzadziej używana funkcja w Lektonie - jeśli mam książkę w epub to wolę poświęcić parę minut na stworzenie słownika wymowy wyrazów obcych i wrzucić to na wbudowany syntezator. Przynajmniej czyta mi książkę, a nie (jak większość żywych "czytaczy") próbuje zrobić teatr z własną osobą w roli głównej. Może to zboczenie zawodowe (lata pracy w teatrze), ale nigdy nie uważałem, że jeśli ktoś jest zawodowym aktorem to koniecznie musi sprawdzić się jako lektor... 1
kroszkanorber 25 maja Udostępnij 25 maja @ethanak Dzięki za odpowiedź. Czyli mp3 jest tylko dla kompresji mowy by zaoszczędzić miejsca. Czy ta biblioteka jest typu otwartego? Chciałbym się dowiedzieć skąd można pobrać kody źródłowe albo najlepiej jak to jest kodowane, by zrozumieć algorytm. Jestem ciekawy, czy można MP3 dekodować sprzętowo...
ethanak 25 maja Autor tematu Udostępnij 25 maja 4 godziny temu, kroszkanorber napisał: Czyli mp3 jest tylko dla kompresji mowy by zaoszczędzić miejsca Skąd taki pomysł? MP3 to po prostu jeden ze sposobów kodowania stratnego audio (czyli mowy, muzyki i wszystkiego ogólnie co można usłyszeć). Lekton równie dobrze praktycznie bez zmiany kodu mógłby odtwarzać muzykę (tyle że nie ma takiej potrzeby). A kodek MP3 jest zastosowany wyłącznie dlatego, że audiobooki są rozprowadzane właśnie w tym formacie - po prostu każde praktycznie współczesne urządzenie jest w stnie odtworzyć taki plik. Do kompresji mowy są zupełnie inne kodeki (np. Speex, wojskowe MELP/MELPe czy oferujący największy stopień kompresji Codec2). 4 godziny temu, kroszkanorber napisał: skąd można pobrać kody źródłowe albo najlepiej jak to jest kodowane, by zrozumieć algorytm Z samego kodu nic nie zrozumiesz nie mając podstaw (matematyka). Oczywiście możesz popatrzeć na kody źródłowe (otwarte oczywiście) LAME (enkoder) czy MPG123 (dekoder) ale to raczej niewiele da. Ogólnie zasada działania tego typu kodeków sprowadza się do tego że enkoder po analizie źródłowego sygnału tworzy dane dla syntezatora (szukaj pod hasłem "szybka transformata Fouriera"), a dekoder (syntezator) tworzy w wyniku falę przypominającą w pewnym stopniu to, co enkoder dostał na wejście. No i w przypadku Lektona odtwarzanie MP3 jest wyłącznie funkcją pomocniczą (poprzednia wersja w ogóle nie miała takiej możliwości), główne zadanie to synteza mowy (która z MP3 ani jakimikolwiek innymi kodekami nie ma nic wspólnego). 4 godziny temu, kroszkanorber napisał: czy można MP3 dekodować sprzętowo... Co rozumiesz przez "dekodowanie sprzętowe"? Czy jakiś DSP z zaszytym na stałe programem to "dekoder sprzętowy"? Chyba że chodzi o coś takiego jak DFPlayer Mini - no to jak widać można. 1
kroszkanorber 25 maja Udostępnij 25 maja 3 godziny temu, ethanak napisał: Co rozumiesz przez "dekodowanie sprzętowe"? Czy jakiś DSP z zaszytym na stałe programem to "dekoder sprzętowy"? Chyba że chodzi o coś takiego jak DFPlayer Mini - no to jak widać można. Dekodowanie sprzętowe miałem na myśli w FPGA — czyli implementację algorytmu bez użycia gotowego DSP lub układów typu VS1053. Algorytmów MP3 nie rozumiem jeszcze w pełni, bo to już transformacje sygnału (FFT, MDCT, psychoakustyka). Żeby wejść w to głębiej, musiałbym najpierw ogarnąć podstawy matematyczne, a ja lubię zaczynać od fundamentów, żeby wiedzieć dlaczego coś działa, a nie tylko że działa. Dzięki za wyjaśnienia i za sugestie dotyczące źródeł — na pewno przejrzę LAME i MPG123, nawet jeśli tylko poglądowo. Wiem też, że MP3 jest objęte prawami autorskimi, ale są ludzie, którzy zrobili własne implementacje od zera (np. kanał „Majsterkowanie i nie tylko” na YT), więc temat mnie ciekawi bardziej od strony edukacyjnej niż praktycznej.
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »