Skocz do zawartości

Specjalizowany odtwarzacz MP3


Pomocna odpowiedź

No i pierwszy przypał - okazało się, że moja przejścióweczka OTG ma zwyczaj robić zwarcie przy próbie wkładania pendraka... Albo znajdę gdzieś w rupieciach wtyczkę mikro, albo zostawię dostęp do gniazdka malinki. Znając siebie raczej to drugie.

  • Lubię! 1
Link do komentarza
Share on other sites

No i pierwszy (wizualny na razie efekt) - górna część obudowy. Kompletna, z wyświetlaczem, głośnikiem i tak dalej:

usbplayer1.thumb.jpg.4bd22e5ed75b5448babb9b38b24069d9.jpg

Dolna się drukuje (przewidywany czas ukończenia jutro w okolicy śniadania), czyli po południu będzie można to złożyć do kupy i zabrać się za najciekawszą część - czyli pisanie programu 🙂

Na razie testy wychodzą ładnie, ale to takie niezwiązane ze sobą kawałki. Po drodze powstało parę ciekawych rozwiązań dotyczących grafiki (np. wyświetlanie animowanych obrazków i konwerter z GIF/PNG na RLE, ale wrzucę tu kod jak doprowadzę do stanu używalności).

 

  • Lubię! 2
Link do komentarza
Share on other sites

Tak jak obiecałem - programiki do ikonek (animowanych i nie) w RLE. Programy w Pythonie3 wymagają tylko PIL, czyli powinny pójść na wszystkim.

gif2rlea.py - gif na animowaną ikonkę. Sposób użycia:

python gif2rlea.py [opcje] plik.gif [nazwa_tablicy [plik.h]]

Jeśli nie podano plik.h, będzie utworzony w bieżącym katalogu na podstawie nazwy pliku png.

Jeśli nie podano nazwy tablicy, zostanie utworzona też na podstawie nazwy pliku png

Opcje:

  • -r - tworzenie obrazka RGB a nie indeksowanej palety (jeśli plik GIF zawiera różne palety dla każdej klatki)
  • -n - negatyw
  • -b #RRGGBB - kolor tła dla przezroczystych gifów (lepiej użyć gimpa do wywalenia przezroczystości).

mkrle.py - statyczna ikonka, parametry to nazwa pliku png i nazwa tablicy, wynik na stdout

Pliki C++ nie wymagają chyba komentarza - jeśli ktoś bardzo chce mogę opisać dokładniej 🙂 Powinny działać z bibliotekami Adafruit z dowolnym wyświetlaczem SPI.

Załączniczek: animicon.zip

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

No i okazało się, że pisanie w Pythonie co poniektórych programów to zły pomysł.

Demon odtwarzacza MP3 napisany w Pythonie zajmował ponad 60% czasu procesora. Ponieważ pulseaudio żre jakieś 25%, na jednordzeniowym Zero trochę mu brakowało czasu (jako że oprócz odtwarzacza parę rzeczy jeszcze powinno działać).

Po napisaniu odtwarzacza w C okazało się, że w czasie odtwarzania zajętość procka dochodzi do 16% (nie wspomnę o różnicy w zeżarciu RAM-u).

Dla chętnych kod playera. Słucha toto na porcie 2020 UDP, odpowiada na 127.0.0.1:2021, Do skompilowania potrzebne:

  • libpulse-dev
  • libao-dev
  • libmpg123-dev
  • wiringPi (w wersji obsługującej naszą malinkę, w moim przypadku 2.61-1 z githuba)

Można się obejść bez wiringPi po wywaleniu fragmentu na temat kolorowych LED 🙂

Kompletny kod odtwarzacza: player123.tgz

  • Lubię! 1
Link do komentarza
Share on other sites

Ech... ja to mam pecha do przejściówek...

Numer jeden: https://botland.com.pl/przewody-microusb-20/8781-adapter-otg-microusb-usb-5904422312190.html

Działa ślicznie, ale z uwagiba konstrukcję lubi zrobić zwarcie.

Numer 2: https://botland.com.pl/przewody/12490-przewod-otg-host-usb-microusb-bialy-12cm-5904422319397.html

Podziałała dwa dni i przestała.

Chyba wezmę tę pierwszą i dodrukuję jakąś obudowę 😞

Link do komentarza
Share on other sites

O, nawet nieźle wyszło. Obudowa zabezpiecza przez odwrotnym włożeniem pendrive'a (co równa się w tym przypadku zwarciu).

MoKod dla OpenSCAD-a:

module gusb()
{
    win = 12.4;
    gin = 5;
    hin=9.6;
    win2=7.4;
    gin2=2.6;
    dd=0.4;
    gs=1.2;
    gsu=gs-0.4;
    hk=4.5;
    difference() {
        translate([-win/2-gs, -gs,-hk]) cube([win+2*gs, gin+2*gs,hin+hk]);

        hull() {
            translate([-win/2,0,hin-1]) cube([win,gin,1]);
            translate([-win/2-gsu,-gsu,hin+0.01]) cube([win+2*gsu,gin+2*gsu,1]);
        }
        translate([-win/2,0,0]) cube([win,gin,hin+1]);
        translate([-win/2,0,-hk-1]) cube([win,gin,hk]);
        translate([-win2/2,dd,-2]) cube([win2,gin2,10]);
        
    }
}

gusb();

Można sobie zmodyfikować i dostosować do własnej obudowy.

A dla leniwych: gusb.zip

  • Lubię! 1
Link do komentarza
Share on other sites

Cóż... jutro testy terenowe (próba w Grodzkim)... soft na ESP jeszcze trzeba będzie dopracować, na RPi chyba wszystko działa bez problemu. Akumulatorek jakiś z tych starszych paszczatych, ale założenie było takie że nic nie kupuję. Zresztą to ma działać przede wszystkim na zasilaczu.

Ciekawe, czy się spisze...

  • Lubię! 1
Link do komentarza
Share on other sites

Spisał się raczej średnio - ale muszę dokładniej sprawdzić co mu dolega.

Natomiast z jednym nieprzyjemnym efektem sobie poradziłem.

Otóż podczas startu pulseaudio mam w głośniczku podłączonym do MAX98357 głośny trzask, a jednocześnie pobór prądu na chwilę wzrasta do jakichś dziwnych wartości (nie bardzo miałem jak zmierzyć, ale nówka 18650 pożyczona z robota i naładowana do 4.1V oznajmia, że ma 3.6V) - tak jakby głośnik na chwilę był podłączony do zasilania.

Poszukałem trochę w sieci i okazało się, że dość dużo osób ma podobne problemy z PA, na normalnych pecetach a nie tylko RPi.

Mój sposób na obejście problemu:

Podłączyłem wejście ~SD do wolnego pinu malinki, i przy starcie podaję tam zero. Player podaje jedynkę dopiero wtedy, kiedy ma coś zagrać na wbudowanym głośniczku. W ten sposób MAX jest wyłączony gdy startuje PA.

To tak jakby ktoś miał podobne problemy... teraz pozostaje kwestia dekodera MP3., który czasami dziwnie się zacina (w tych samych miejscach)...

Link do komentarza
Share on other sites

No cóż... okazało się że biblioteka której używam od ładnych kilkunastu lat w tym połączeniu nie działa. Czyli:

RPi Zero W + bullseye + libao + pulseaudio = kiszka

Pomogło zastąpienie libao przez bezpośrednio pulse_simple. Jak kogoś interesuje - kod w załączniku: player124.tgz

  • Lubię! 2
Link do komentarza
Share on other sites

No, już chyba koniec. Musiałem dodać gniazdko jack (w jednym miejscu nie chce się połączyć przez BT, nie wiem dlaczego, nie mam tam wstępu, ale telefon też się nie łączy). Dzielnik na wyjściu 1:4 i dodatkowo paplay z /dev/zero żeby driver i2s nie próbował trzasków.

Zobaczymy, co z tego wyjdzie...

Aha, filmiku raczej nie będę wrzucał, bo to trochę bez sensu... raczej mało ciekawe ze jak nacisnę play to gra...

  • Lubię! 2
Link do komentarza
Share on other sites

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ę »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.