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:
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.
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
//savePosFlag = millis() + 600000; // save position only for files longer than 10min
savePosFlag = millis() + 180000; // save position only for files longer than 3min
Keine Kommentare:
Kommentar veröffentlichen