ESP32-Internetradio

Nach meinem Toasterumbau sind nun schon mehrere Umbauten vorhandener UKW Radios als WLAN-Radio erfolgt. Diese Methode hat den Charme, dass man sich nicht um ein Gehäuse, die Knöpfe und den Lautsprecher kümmern muss, sondern es ist alles schon da. Sogar die Stromversorgung kann nicht selten noch benutzt werden.

Bei der Recherche nach Vorhandenem, kommt man an KaRadio32 und die Software von Edzelf’s kaum vorbei. Im Radiobastler-forum habe ich von ’saarfranzose‘ eine Platine bekommen, die in Zusammenarbeit mit Edzelf super funktioniert und im Grunde noch diverse Freiheitsgrade bietet. Mit Hilfe dieser Platine sind dann auch schon 2 Radioumbauten entstanden. Leider kann diese Platine nicht zusammen mit der KaRadio32-Software benutzt werden … zumindest habe ich es nicht hinbekommen, das Pin-mapping entsprechend umzustellen . Aber das nur am Rande.

Mein Hobby hat sich im Bekanntenkreis rumgesprochen, so dass eines Tages ein kleines Küchenradio von Rossmann oder Tchibo zum Umbau bei mir landete. Die Platine von saarfranzose ist leider zu gross. Kurzerhand wurde also google bemüht, und ich habe eine Platine passend zu KaRadio32 gefunden, die die selben Ausmaße wie das VS1053-Modul hat. Nach dem Download kam ich dann auf die Idee, dass ich auch auf dieser Platine den PAM8403-Verstärker unterbringen könnte. Mit KiCad hab ich dann also diese Platine umgestaltet und sogar noch weitere Pin’s rausgelegt. (Dazu später) Mir war auch klar, dass ich mit dieser Platine nun KaRadio32 oder Edzelf nutzen kann, was ich im Grunde aber nicht brauche – ich nehme derzeit fast nur Edzelf. (wg. meiner eigenen Erweiterungen)

Platine mit drunterliegendem VS1053-Modul und PAM8403 auf der Oberseite.

Ich verwende nun aus Platzgründen kein Entwicklerboard mit ESP32, sondern löte hier den ESP32S selbst auf – was erstaunlich gut funktioniert und doch recht einfach ist. Im Bild rechts oben sieht man die Anschlussleisten (v.o.n.u : RXTX-Prog., ADC-Pins, IR-Pin, Encoder-pins.) Das Flachbandkabel führt noch zu den i2c Pins für ein Display.

An der Unterseite der Platine ist zudem noch Platz für ein DC/DC-Buck Modul, was ich bisher aber immer extern betrieben habe.

Hier nochmal ein anderer Winkel mit Display. Zudem sieht man auch die Buchse für den Lautsprecher, die von der originalen Platine ‚geklaut‘ wurde.
Hier eine Version – direkt als Sandwich gelötet. Dafür müssen ein paar Teile vom VS1053 entfernt werden.

Nun zu den ADC-pins. Um mittels normalen Drehwiderständen die Lautstärke und Senderwahl durchführen zu können, werden adc-fähige Pins benötigt. Hierfür eignen sich am besten ADC0-Pins, wobei ich mich für 36 und 39 entschieden habe. Der Voltpegel 0..3.3V wird also in eine entsprechende Lautstärke umgerechnet – genau wie es bei der Senderwahl erfolgen kann. Hierfür waren kleine Anpassungen der Edzelf-Software notwendig, da im Original alles nur mittels Drehencoder bedient wird. – Ich wollte aber die originale Handhabung des Radios möglichst erhalten.

Auch das 128×32 OLED hat ein paar Anpassungen benötigt. Inzwischen kann meine Edzelf-Version auch ein HT1621-Display sowie eine TM1637-7-Segement-Anzeige (als Zusatzdisplays) bedienen. Das hat sich ergeben, weil ich bei anderen Radios die vorhandenen originalen LCD-Glass-Anzeigen weiter nutzen wollte (siehe Beitrag Denver-Tr36).

Nun aber weiter … Als Erstes schau ich mir also die vorhandene Platine an, wo eventuell Spannungen abgegriffen werden können. Oft lege ich im Nachgang die nicht notwendigen Teile auf der Platine lahm – damit sie nicht unnötig stören können oder Strom verbrauchen.

Bei diesem Radio ist der untere Poti (Lautstärke) nicht im 0..3V3-Bereich, so dass ich ihn von der Aussenwelt getrennt habe und den Zugang mit 3.3Volt belegen konnte. Sehr viel mehr Umbauten sind hier nicht notwendig gewesen.

Oft findet man bei solch einfachen Radios Drehkondensator zur Sendereinstellung. Diese ersetze ich dann durch einen einfachen Encoder (ohne Button). Im Edzelf-Code habe ich wahlweise vorgesehen, dass der Encoder direct den Sender ohne weitere Bestätigung umschaltet. (auch dass nur nebenbei 🙂 )

Der Kondensator (mit den Kleberesten) war ursprünglich auf der Unterseite der Platine. Um Platz für das Display zu haben, musste er auf die Oberseite wechseln. Das dünne gelbe Kabel (rechts) ist die Zufuhr von 3.3Volt für das Lautstärkepoti.

Für das SSD1306-Display mit 128×32 musste ein Loch ins Gehäuse geschnitten werden. Die Fixierung mit Heißklebe sieht etwas wild aus – aber es ging. Im Grunde braucht man keine Anzeige, ich fand es aber schöner, wenn man auch mal den gespielten Titel sieht.

Und so ist es dann fertig. Das ausgeschnittene Fenster kann beim nächsten Mal etwas besser werden 🙂 .

Sollte Bedarf an der Platine bestehen … hier die Gerber-files ( Gerber-ESP32radio-V7.zip ).

per default wird das PAM im Mono-Betrieb benutzt. Für stereo muss eine Bahn an der rot markierten Stelle getrennt werden.
G-L-R (oben rechts) sind die Zugänge vom VS1053 Audio-Jack.

Sonstiges / Bestückung / Vorgehensweise …

Die Platine ist bereits mit den einzusetzenden Werten beschriftet. Ich beginne oft mit dem ESP32-Chip. Dafür nutze ich eine Klammer (thingiverse 1718197), die den chip gut auf einer Position hält. Nach dem fixieren mit 3 Pins, kann die Klammer weg und die restlichen Pins werden angelötet. Als nächstes folgen der 10kΩ-Widerstand und der 1nF-Kondensator auf der Oberseite (rechts-oben). Da ich mir die Microtaster sparen will, löte ich nun eine Brücke (abgeschnittener Anschluss eines Elko) über die beiden ‚prog‘-Pads. Als nächstes benötigen wir den AMS1117-3.3V auf der Unterseite der Platine.

Nun können wir schonmal initial programmieren. Dazu nutze ich die Pin-leiste ‚TX-RX-Gnd-5V‘ und einen üblichen USB-TTL-Adapter (FT232RL). Es reicht, wenn man die 4 Enden per Stiftleiste (1reihig) mit dem Daumen fixiert, so dass Kontakt besteht (Achte auf Verpolung – 5V sitzt außen!). Nun den USB-Adapter einstecken und mit der Arduino-Oberfläche programmieren. Durch unsere Brücke über die prog-Pads wird der ESP nicht starten, aber bei Power sofort in der Programmiermodus gehen. Nach der Programmierung : abstecken, prog-Brücke entfernen und den Rest bestücken.

Wenn kein PAM-Modul benutzt werden soll, können auf der Oberseite (oben links) folgende Komponenten weggelasen werden: 100nF, 2x 100kΩ, 47µF.

Für stereo-Betrieb muss eine Bahn getrennt werden. (Die beiden Pads daneben sind dann für den eventuellen Rückbau auf Mono gedacht).

Auf der Unterseite der Platine muss ein 470Ω Widerstand eingelötet werden, wenn man die LED einsetzen möchte. Als Powermodul (Unterseite) wurde dieses eingeplant (DC/DC-Buck) , welches mittels Lötbrücke fest auf 5V gestellt werden kann.

Einstellungen (Beispiel):

flag_00 = autoplay = true # start playing if STOP detected
flag_01 = adc_vol_reverse = false
flag_02 = enc_direct_switch = true # no click for channel change
# more possible flags :
# dsp_brightness = 1..15
# rotate_screen = true/false # for OLED
# dsp_show_ip = true/false # show ip on oled/tm1637 at boot
# adc_delog_vol = true/false # little bit more linear
# oled_128x32 = true/false # only 4 line ssd1306
#
pin_ir = -1 # GPIO Pin number for IR receiver VS1838B
pin_enc_clk = 16 # fx2-pcb : rotary encoder „CLK“
pin_enc_dt = 17 # fx2-pcb : rotary encoder „DT“
pin_enc_sw = 5 # fx2-pcb : rotary encoder „SW“
#
pin_tft_scl = -1 # Pin for TFT „SCL“ fx2-pcb : 14
pin_tft_sda = -1 # Pin for TFT „SDA“ fx2-pcb : 13
#
pin_sd_cs = -1 # Pin for SD card „CS“
#
pin_vs_cs = 32 # fx2-pcb : Pin for VS1053 „CS“
pin_vs_dcs = 33 # fx2-pcb : Pin for VS1053 „DCS“
pin_vs_dreq = 34 # fx2-pcb : Pin for VS1053 „DREQ“
pin_shutdownx = 4 # fx2-pcb : LED
pin_fixed_12 = 1 # fx2-pcb : RST-pin need HIGH
#
pin_tm1637_clk = -1
pin_tm1637_dio = -1

Zum Schluss noch einmal meinen Dank an die Vorversion von gvoigtlaender(github) und die nützlichen Hinweise von saarfranzose (radio-bastler.de)