Donnerstag, 12. Oktober 2023

Retro-Player mit Pintel-Board


 Dieses Projekt hat sich sehr chaotisch entwickelt und hat mich einige Wochen Arbeit gekostet. Schon vor längerer Zeit hatte ich die Bauanleitung gefunden und ging von einem einfachen und entspannten Nachbau aus. Aber weit gefehlt.

DIY Retro Audio Player github

DIY Retro Audio Player hackaday

Der Entwickler hatte eine eigene Platine kreiert, die Gerberdateien stehen zur Verfügung. Ich dachte, es kann ja nicht so schwer sein ein Standard DevKit Board zu verwenden. Um mir den Platz für einen Card-Reader zu sparen begann ich mit einem TTGO T8 Board mit integriertem Kartenleser. So war außer dem Schaltfeld nur ein MAX98357 für die Tonausgabe und das Display zu beschalten.
Erst gab es mal nur Bootschleifen. Das lag an dem Core 2.0.14 der IDE. Ich musste auf die Version 1.0.6 runtergehen. Später fand ich den entsprechenden Hinweis in den ersten Zeilen des Quellcode. Da hatte ich es schon selbst rausgefunden. Dann gab es eine ruckelnde Wiedergabe. Das lag an einer ungünstigen GPIO-Wahl. Dann liefen die Titel nur 30 Sekunden und begannen wieder von vorne. Das Gerät war fast nicht zu bedienen, es machte was es wollte. Auch hier war es die GPIO-Auswahl bei den Bedienteilen. Da ich die Probleme zuerst an der falschen Stelle suchte, nämlich beim Zusammenspiel zwischen VSPI und HSPI, wechselte ich zwischendurch auf ein Pintelboard, um von der festgelegten Verdrahtung des Readers wegzukommen. Damit hatte ich jetzt ein I2S-Modul onboard, also einen direkten Lautsprecherausgang, musste dafür aber einen Card-Reader dazu setzen. Dann bastelte ich auch noch an den Bibliotheken, was aber unnötig war. Mit der richtigen Beschaltung und vor allem auch vollständigen Beschaltung der Bedienteile mit Pullup's fand ich irgendwann tatsächlich eine Kombination die flüssig läuft und genau das macht was ich erwartete.

Andere Probleme bereitete das Gehäuse. Das Oberteil druckte ich mit extrem viel Support mit der Front nach oben weil ich eine schöne Oberfläche haben wollte. Inzwischen habe ich den neuen Drucker, jetzt könnte ich es auch auf dem Kopf drucken mit wenig Support. Ein PEI ist doch eine andere Hausnummer als ein Plastikbett mit Klebematte.

Es passte keines meiner Display in den Ausschnitt. Ich musste das teure Waveshare einkaufen, welches beim Projekt in der Stückliste steht.

Den ganzen Elektronikkram in das Gehäuse zu bekommen war unmöglich. Ich musste ein Zwischenteil drucken um mehr Höhe zu bekommen. Aus dem hübschen schlanken Retro-Gehäuse ist dadurch ein Klotz geworden. Eigentlich war das Mittelteil erst mal als Entwurf gedacht. Meine Frau meinte aber die Farbkombination wäre okay. Also verbaute ich es und machte nachträgliche Anpassungen zwar auf dem Bildschirm, am Gehäuse aber durch Nachbearbeitung.

Auswahl der Tasten: Eigentlich hatte ich schöne Tasten aus einer Rechenmaschine eingeplant. Sie bauten aber minimal zu breit und verkeilten sich gegeneinander, und ich musste die Tastenkappen weglassen. Also auch hier noch ein Provisorium. Dass man die Lochrasterplatte so krass sieht stört mich auch.

Der Displayausschnitt ist auch kein optisches Highlight. Die Unsymmetrie des TFT ist nicht im geringsten kaschiert. Da werde ich mir auch noch was einfallen lassen.

Immerhin hab ich jetzt schon mal etwas vorzeigbares. Die Strichmännchen-Animation begeistert mich immer wieder auf neue. Da die Software gedacht war um Hörbücher abzuspielen kann ich z.B. längere Aufzeichnungen von Radiosendungen abspielen. Beim Aus- und wieder Einschalten wird die Abspielposition wieder aufgegriffen, da sie alle paar Sekunden auf die SD geschrieben wird. Wechsel auf den nächsten oder vorherigen Titel funktioniert prima mit kurzem Druck. Die mittlere Taste ist für Pause/Wiedergabe zuständig.

Hier meine funktionierende Belegung für Standard-ESP32:

#define SD_CS        13
#define SD_MOSI     15
#define SD_MISO    2
#define SD_SCK      14
#define TFT_MISO    19
#define TFT_MOSI    23
#define TFT_SCLK    18
#define TFT_CS        5
#define TFT_DC      22
        TFT_RES        EN
#define LCD_BL      0 // ist definiert, aber nicht aufgelegt
#define ABUT        4
#define BBUT        3 // RX0
#define CBUT        34
#define ENCINTA    39
#define ENCINTB    35
#define ENCBUT      36
#define JACK_SENS 32 // ist definiert, aber nicht aufgelegt
#define VBAT_SENS 33 // auf 3,3V gelegt damit die Low-Bat Anzeige keine leere Batterie anzeigt


so waren die Gehäuseteile vom Autor geplant (abgesehen davon dass ich das Innenteil des Batteriefaches beschnitten habe). Halt passend für seine eigene Platine, aber nicht für Standardteile.

Befestigungsmöglichkeiten für die Bauteile sind Fehlanzeige:


 

ich habe einen Innenrahmen konstruiert, der Lautsprecher, Prozessor, Card-Reader und eine Potentialverteilung trägt sowie das TFT festklemmt. Er wird zum Griffteil zu eingeschoben und an der Lautsprecherseite mit 2xM3 Schrauben auf eingeleimte Klötzchen geschraubt:

noch ohne Verdrahtung:

hier ist alles verkabelt:


 


der Batteriefachdeckel könnte die SD zugänglich machen, das wird bei dem Kabelgewirr aber wohl nicht möglich sein (oder nur mit Fingerbruch):

der vorzeigbare, vorläufige Player:


modifizierte STL-Dateien:


.zip   3D.zip

3 von 4 kosmetischen Aufgaben sind erledigt. Die Tasten haben jetzt Kappen, das Tastenfeld eine Umrandung und der Displayausschnitt ist durch Einleimen eines Stäbchens symmetrisch. Fehlt noch eine USB-Buchse, die ist bestellt. Andere Musik will ich noch aufspielen. Man kann nicht tagelang Beth Hart hören.


Das hier verwendete Lesegerät kann FAT16 (bis 2GB) und FAT32 (bis 16GB). Einige Lesegeräte, vor allem welche die auf TFT-Displays zu finden sind, können nur 2GB-Karten. Ich verwende hier eine 8GB HC Micro-SD mit Adapter. Wegen dem besseren Datendurchsatz empfiehlt sich Class 10

 die Titel laufen alphabetisch ab. Eine Auswahl gibt es nicht. Nur die Vor-/Zurück-Tasten um auf den nächsten/vorherigen Titel zu springen.

Was mir heute aufgefallen ist: die Software wurde ja für das Hören von Hörbüchern geschrieben. Bei diesen großen Dateien merkt es sich auch die ungefähre Wiedergabeposition. Bei einer Fülle kleinerer Dateien, die bei Musikwiedergabe nun mal anfallen, beginnt die Wiedergabe aber immer ganz von vorne mit dem ersten Titel. Das schaue ich mir im Quellcode noch genauer an. Vermutlich sind die Abstände beim Zurückschreiben der Position zu groß. 

im Monitor ist zu sehen: die Speicherung geschieht minütlich. ABER die erste Speicherung geschieht erst nach 10 Minuten. Titel die kürzer als 10 Minuten sind lösen keine Speicherung aus.

Code:
17:20:44.435 -> info        Reading file: "/sr1_classic_rock_07.mp3"
17:20:44.684 -> info        MP3Decoder has been initialized, free Heap: 240648 bytes , free stack 2344 DWORDs
17:20:44.751 -> info        Content-Length: 90544407
17:20:56.403 -> Volume saved: 1004
17:22:58.317 -> Volume saved: 0604
17:30:44.854 -> File saved at position 0073329942
17:31:45.046 -> File saved at position 0074775126
17:32:45.185 -> File saved at position 0076218582
17:33:45.263 -> File saved at position 0077660886
17:34:45.357 -> File saved at position 0079104918
17:35:45.527 -> File saved at position 0080548950
17:36:45.715 -> File saved at position 0081993558
17:37:45.830 -> File saved at position 0083437014
17:38:45.995 -> File saved at position 0084881622
17:39:46.125 -> File saved at position 0086325654
17:40:46.309 -> File saved at position 0087770838
17:41:46.456 -> File saved at position 0089214294
 
ich hab den Angriffspunkt gefunden in Zeile 257 und die Zeit jetzt auf 3 Minuten gesetzt. Kürzer will ich die Zeit nicht einstellen weil man mit Schreibzyklen bei der SD sparsam sein muss. Das sollte aber für die allermeisten Musiktitel reichen. Eine Speicherung wird also ausgelöst wenn ein Titel 3 Minuten gelaufen ist, danach jede Minute. Beim nächsten Titel zählen die 3 Minuten wieder von vorne. Beim Einschalten wird der Titel und die zuletzt gespeicherte Position aufgegriffen.

Code:
//savePosFlag = millis() + 600000;  // save position only for files longer than 10min
  savePosFlag = millis() + 180000;  // save position only for files longer than 3min
 
Anders verhält es sich bei der Lautstärke. Die wird nur gespeichert wenn sie sich geändert hat. Das macht ja auch Sinn.  

 





 






 


 


 


Keine Kommentare:

Kommentar veröffentlichen