ESPuino-miniD32(pro): Lolin D32/D32 pro mit SD_MMC und Port-Expander (SMD)

Hinweis

Diese Platine hat nun (01/2023) einen Nachfolger, der hier beschrieben wird: ESPuino-mini 4Layer. Die Unterschiede (Stand 01/2023) zwischen beiden Platinen findest du hier.
Natürlich gebe ich dennoch weiterhin auch Support für die hier beschriebene Platine.

Kompatibilität

Dieser PCB eignet sich für folgende Develboards:

Beide Boards sind vollständig pinkompatibel mit dem Unterschied, dass beim D32 pro IO16 und IO17 nicht existieren. An dieser Stelle ist am Develboard (und beim ESPuino-mini) entsprechend nichts angeschlossen, so dass das keinen Unterschied macht.

Einstellungen auf die Schnelle / Kurzfehlersuche

Weiter unten sind alle Einstellungen im Detail beschrieben, aber hier in einer Kurzzusammenfassung alle Einstellungen, die mindestens vorgenommen werden müssen, um diese Platine erfolgreich in Betrieb zu nehmen:

  1. Als Profil muss lolin_d32_pro_sdmmc_pe gewählt werden in Platformio.
  2. In der settings.h muss PORT_EXPANDER_ENABLE aktiviert werden: hier.
  3. In settings-lolin_d32_pro_sdmmc_pe.h muss INVERT_POWER aktiviert werden: hier.
  4. Schaue auf die Unterseite deiner mini-Platine und dort speziell auf JP5. Ist dort 2+3 gebrückt, so musst du POWER von 32 auf 115 ändern: hier. Für 1+2 bleibt 32 dort stehen - keine Änderungen also. Ist dort nichts gelötet/gebrückt, dann musst du das nachholen (und auch die restlichen JPs kontrollieren und nach der Beschreibung weiter unten konfigurieren!) und dich dabei für eine der beiden Varianten entscheiden.

Ist von den beschriebenen Einstellungen auch nur eine falsch konfiguriert, so wirst du in der seriellen Konsole eine solche Meldung kriegen:

[E][SD_MMC.cpp:85] begin(): Failed to initialize the card (263). Make sure SD card lines have pull-up resistors in place.

Bilder

Zum Größenvergleich habe ich eine RFID-Karte unter den PCB gelegt. Button 4 und Button 5 habe ich nicht bestückt. Rechts ist ein 100µF-Kondensator im Ext-Konnektor eingelötet, um die Spannung zu stabilisieren. Unten zwischen dem SD-Modul und dem MAX98357a sieht man den Spannungsteiler für MAX.SD, damit die Audioausgabe in stereo erfolgt.

Aktuelle Revision (2.3) mit onboard SD-Slot und JST-Konnektor zur Kopfhörerplatine

Ältere Revision mit Breadboard-SD und IDC-Konnektor zur Kopfhörerplatine

Revision fertig gelötet von oben und unten:

Und hier mal eine Erklärung, was die einzelnen Elemente eigentlich sind:

  1. Button Next (JST ph 2fach)
  2. Button Pause/Play (JST ph 2fach)
  3. Button Prev (JST ph 2fach)
  4. Button 4 (JST ph 2fach)
  5. Button 5 (JST ph 2fach)
  6. Anschluss Neopixel (JST ph 3fach)
  7. Stützkondensator 100 µF
  8. P-Mosfet IRLML6401
  9. Port-Expander PCA9555
  10. SD-Modul (ab rev. 2.3 ist der SD-Slot direkt als SMD-Teil aufgelötet)
  11. MAX98357a
  12. Reset-Button (JST ph 2fach)
  13. Anschluss Drehencoder (JST ph 5fach)
  14. Anschluss RFID-Reader (JST ph 10fach)
  15. Anschluss i2c extern (JST ph 4fach)
  16. Anschluss Kopfhörerplatine (IDC-Konnektor)
  17. Integrierter Reset-Button
  18. EXT-Konnektor (doppelreihig 2,54 mm)
  19. Beschreibung EXT-Konnektor
  20. Beschreibung JP-Konfiguration (JP1 bis JP5)
  21. Pinsocket zum Sockeln des D32 pro/D32
  22. Pinsocket zum Sockeln des D32 pro/D32

Schaltplan

Schematics_Espuino mini_D32pro_rev2.2.pdf (178,6 KB)

Einleitung:

Vor einer Weile habe ich Lolin D32 pro mit SD_MMC, PN5180, max. fünf Buttons und Port-Expander (SMD) ins Leben gerufen. Diesen PCB habe ich im Laufe der Zeit in mehreren Revisionen weiterentwickelt. Es wurden nachgelagert jedoch auch Dinge diskutiert, die noch verbessert werden konnten. Nicht zuletzt vor dem Hintergrund, dass ich für eigene Zwecke einen PCB gebraucht habe, der etwas kürzer ist, habe ich ESPuino-miniD32(pro) entwickelt. Weil es wird namentlich sonst einfach zu unübersichtlich.

Features

  • Die Außenmaße sind 81x51 mm.
  • Passend einerseits für Lolin D32 pro oder D32 pro FePo. Achte darauf, einen Lolin D32 pro mit 16 MB Flash zu kaufen, da du sonst das OTA-Feature nicht nutzen kannst. Flash-Speicher bitte nicht verwechseln mit PSRAM; hier sind die üblichen 4 MB mehr als ausreichend.
  • Passend andererseits für Wemos Lolin D32. Diesen gibt es ausschließlich mit 4 MB Flash-Speicher. IO16 und IO17 werden vom hier vorgestellten PCB jedoch nicht verwendet.
  • Die Peripherie (MAX98357a, SD, Neopixel und (optional) RFID) wird per Mosfet-Schaltung zum Stromsparen im Deepsleep spannungslos geschaltet. Aufgrund von Querströmen der restlichen Verdrahtung ist sie auch dann nicht 0 V sondern liegt bei etwa 1 V.
  • RFID: orientiert sich primär an den Bedürfnissen für PN5180 via JST-PH 10fach, aber kann für RC522 ebenfalls verwendet werden. Für RC522 werden weniger Pins benötigt, so dass manche Pins ungenutzt bleiben.
  • Port-Expander PCA9555 mit zwei Kanälen à acht Ein/Ausgängen; angebunden per I2C.
  • Maximal fünf Taster, die allesamt über JST-PH 2fach angeschlossen werden und am Port-Expander hängen. Wieviele man verwendet und welche davon, das kann man sich aussuchen.
  • Drehencoder wird über JST-PH 5fach angeschlossen. Dessen Button hängt immer am Port-Expander. DT und CLK optional auch, aber das unterstützt ESPuino (Stand 05/2022) nicht.
  • Die GPIs, die für DT und CLK des Drehencoders verwendet werden, werden auch auf den doppelreihigen Pinheader (EXT) geführt. D.h. wird kein Drehencoder verwendet oder DT und/oder CLK auf den Port-Expander geroutet, so stehen diese GPI(s) anderweitig zur freien Verfügung.
  • Die GPIOs 0 und 5 werden ebenfalls auf den Pinheader geführt. Sie sind unbeschaltet und können grundsätzlich frei verwendet werden. Weitere Infos hier: 📗 Die GPIOs des ESP32: Welche eignen sich für was?.
  • PN5180 kann, sofern er mit einer Firmware-Version >=4.1 verwendet wird, den ESPuino auch aufwecken (LPCD, siehe Beschreibung oben). Wie man 4.1 auf den PN5180 kriegt, steht hier. Spoiler: Ist schon ein bisschen Arbeit :slight_smile:.
  • GPIO32 ist ebenfalls auf den externen Pinheader geführt und dann anderweitig nutzbar, wenn die Mosfet-Ansteuerung über den Port-Expander geschieht (siehe JP5).
  • Alle Buttons (und RFID.IRQ), die am Port-Expander angeschlossen sind, können den ESPuino aufwecken. Hinweis: Nur alle oder keiner. Selektiv (z.B. nur ein Button) funktioniert (zumindest ohne Programmieraufwand) nicht.
  • Alle Pins des Port-Expanders, die nicht benötigt werden, sind ebenfalls auf den doppelreihigen Pinheader rausgeführt. Dort befinden sich auch mehrere GND-Anschlüsse, 3.3V-Anschlüsse und geschaltete 3.3V (~0.8 V bis ~1 V im Deepsleep).
  • Ein JST-PH 4fach führt I2C nach außen. Perspektivisch könnte hier z.B. ein I2C-Display angeschlossen werden, was ESPuino jedoch bisher nicht unterstützt.
  • Ein Reset-Button kann via JST-PH 2fach optional angeschlossen werden. Sollte es mal zu einem unerwarteten Softwarefehler kommen, der dazu führt, dass der ESPuino nicht mehr bedienbar ist, ist man damit auch mit Gehäuse + Akkubetrieb noch handlungsfähig.
  • Falls die Kopfhörerplatine #1 oder Kopfhörerplatine #2 verwendet wird, so wird der MAX98357a auf lautlos gestellt wenn ein Kopfhörer eingesteckt ist und umgekehrt. Das Aus- und Einschalten des MAX98357a übernimmt hierbei der Port-Expander über PA_EN. Der Port-Expander erkennt via HP_DETECT, ob ein Kopfhörer eingesteckt ist.
  • Über die Widerstände R7 und R8 kann der GAIN des MAX98357a gesteuert werden (nicht verwechseln mit der Lautstärkeregelung 0 bis 21 im Betrieb). Vielleicht für den Anfang beide mal weglassen und bei Bedarf entsprechend nachlöten. Deren Bedeutung ist auf dem PCB aufgedruckt. 0R bedeutet: Brücke. (Ich persönlich arbeite mit 3dB, da mir der ESPuino im unteren Bereich sonst nicht leise genug einstellbar ist an einem 4 Ohm-Lautsprecher. Hierfür braucht man für R8 einen Wert von 100 k).

Hardware

  • Der Kern der Platine ist in SMD-Technik aufgebaut, die Peripherie in THT-Technik. Tipps zum Löten gibt es hier: 📗 (SMD-)Löten. Sölltest du dir selbst nicht zutrauen zu löten, so kontaktiere mich. Ich kann dir Teile (z.B. nur SMD) oder auch alles löten.
  • (Ab rev 2.3 nicht mehr notwendig, da SD-Slot onboard!) Achte beim verlinkten SD-Board darauf, dass der SMD-PullUp-Widerstand (siehe Bild) an GPIO 2 (MISO) entfernt wird, da der ESP32 sonst nicht mehr in den Flashmodus geht (siehe nachfolgendes Bild). Über OTA ist er jedoch weiterhin flashbar.

Hardware-Konfiguration

  • Auf Unterseite der Platine befinden sich mehrere Lötbrücken (JP1 bis JP6), die konfiguriert werden müssen. Sie werden im Folgenden beschrieben. Kursiv markiert ist die Konfiguration, die aus meiner Sicht „standard“ ist:
  • JP1: Schließe 1+2, wenn du kein LPCD benötigst (Normalzustand). Schließe 2+3, wenn du LPCD benötigst. Auswirkung: Für LPCD wird das RFID-Modul dauerhaft mit Spannung versorgt, so dass eine erhöhte Stromaufnahme im Deepsleep anfällt. Vergisst du JP1 komplett, so wird dein RFID-Reader nicht funktionieren, da er (egal wann) keine Versorgungsspannung erhält. Hinweis: Willst du dieses Feature nutzen, dann musst du auch die Brücke von JP4 schließen. Sollte dir unklar sein, was LPCD bedeutet, so wirf am besten einen Blick in die FAQs, dort ist es u.a. beschrieben.
    Pflicht!
  • JP2: Schließe 1+2, wenn DT des Drehencoders auf GPIO39 geroutet werden soll. Schließe 2+3, wenn GPIO39 frei sein soll und DT stattdessen auf dem Port-Expander (109) landen soll. Stand jetzt (01/2022) macht nur GPIO Sinn, da ESPuino hier den Port-Expander noch nicht unterstützt. Vergisst du JP2 komplett, so funktioniert die Drehbewegung deines Drehencoders nicht (sofern du diesen verwendest).
    Pflicht wenn ein Drehencoder verwendet wird!
  • JP3: Schließe 1+2, wenn CLK des Drehencoders auf GPIO34 geroutet werden soll. Schließe 2+3, wenn GPIO34 frei sein soll und DT stattdessen auf dem Port-Expander (110) landen soll. Stand jetzt (01/2022) macht nur GPIO Sinn, da ESPuino hier den Port-Expander noch nicht unterstützt. Vergisst du JP3 komplett, so funktioniert die Drehbewegung deines Drehencoders nicht (sofern du diesen verwendest).
    Pflicht wenn ein Drehencoder verwendet wird
  • JP4: Schließe diese Brücke, wenn du LPCD verwenden möchtest (beachte dafür unbedingt auch JP1!) oder wenn du aus anderen Gründen RFID.IRQ auf dem Port-Expander (106) brauchst. Hinweis: Der PN5180 wirft im normalen Betrieb recht viele Interrupts, weswegen ich eher davon absehen würde, JP4 zu schließen, wenn LPCD nicht benötigt wird.
    Optional!
  • JP5: Schließe 1+2, wenn die Ansteuerung des Mosfets (Power) durch GPIO32 erfolgen soll. Schließe 2+3, wenn stattdessen der Pin 115 des Port-Expanders verwendet werden soll. Vergisst du JP5 komplett, so wird ESPuino nicht starten, da die Mosfet-Anschaltung nicht angesteuert wird und dann insbesondere das SD-Modul keine Versorgungsspannung hat. Weiterhin sind auch Neopixel und MAX98357a spannungslos.
  • JP6: (ab rev2.2) Schließe 1+2, wenn der 3.3 V-Pin am externen I2C-Konnektor dauerhaft mit Spannung versorgt werden soll. Schließe 2+3, wenn er im Deepsleep des ESP32 spannungslos geschaltet werden soll. Da so gut wie niemand bisher externe I2C-Devices anschließt, hat ein Vergessen der Brücke erstmal keine Auswirkungen. Hintergrund der Anpassung ist hier beschrieben.
  • Über den Spannungsteiler R9/R10 wird die Spannung an MAX.SD eingestellt. Für Stereoausgabe sollte hier (an MAX.SD) eine Spannung zwischen 0,17 V und 0,77 V anliegen, wenn keine Kopfhörerplatine verwendet wird oder wenn eine verwendet wird, jedoch kein Kopfhörer angeschlossen ist. Ist eine Kopfhörerplatine angeschlossen und ein Kopfhörer eingesteckt, so sollte die Spannung <0,17 V liegen und damit der MAX in Standby geschaltet werden. Ist das bei dir nicht der Fall, so musst du dir den Spannungsteiler anpassen. Infos zur Berechnung gibt es hier. 51 k / 10 k funktionieren bei mir perfekt und führen zu 0,538 V, wenn kein Kopfhörer eingesteckt ist.

Anmerkungen

  • Der JST-PH-Stecker für den RFID-Reader ist 10 Pins breit. Alle Drähte werden für den PN5180 benötigt, für den RC522 jedoch nicht. Da sich kein kleinerer Stecker auflöten lässt, bleiben einige Drähte dann eben unbeschaltet. Achte drauf, dass die Drahtenden nicht frei herumliegen und mache etwas z.B. Isolierband darüber! BSY, RST, 5 V und IRQ benötigst du beim RC522 nicht. CS mappt beim RC522 auf SDA.
  • Löte das ESP32-Modul nicht direkt auf den PCB auf, sondern verwende weibliche Konnektoren als Sockel. Die Kontaktierung funktioniert gut. Dagegen sollten MAX98357a und das SD-Modul ohne Sockel aufgelötet werden, da die Kontaktierung ansonsten möglicherweise nicht dauerhaft fehlerfrei funktioniert.

Software-Konfiguration

  • Ggf. musst du Treiber für den USB/seriell-Chip (CH340) auf dem Lolin D32 pro installieren. Bei aktuellen Versionen von Mac OS, Linux oder Windows muss man dies (soweit ich weiß) nicht tun. Weitere Infos dazu gibt es bei Wemos (siehe Links weiter oben).
  • Auf deinem Rechner benötigst du Visual Studio Code als Programmierumgebung (IDE) mit PlatformIO als Plugin. Hier ein paar Tipps zur Einrichtung: 📗 Einrichtung von Visual Studio Code mit Platformio.
  • Lade dir ESPuino aus meinem GitHub-Repository herunter. Wie das geht steht hier: 📗 ESPuino in Platformio anlegen und mit git aktuell halten. Dort erfährst du auch, wie du die Software aktuell halten kannst.
  • Wähle nun das passende Profil aus. Für den D32 pro: lolin_d32_pro_sdmmc_pe und für den D32: lolin_d32_sdmmc_pe . Wie das geht steht hier: Projekt- und Profilwechsel in Visual Studio Code.
  • Nun müssen src/settings.h und settings-lolin_d32_pro_sdmmc_pe.h bzw. settings-lolin_d32_sdmmc_pe.h` editiert werden. Alternativ sei an dieser Stelle für Profis noch das hier beschrieben: 📗 Override: Eigene Settings und Boards verwenden. Dessen sollte man sich jedoch IMMER bewusst sein, wenn man sich dazu entscheidet, es zu verwenden.
  • settings.h: Zwingend müssen hier PORT_EXPANDER_ENABLE und SD_MMC_1BIT_MODE aktiviert werden. Benutzt du einen PN5180 (anstelle eines RC522), so musst du RFID_READER_TYPE_MFRC522_SPI auskommentieren und RFID_READER_TYPE_PN5180 aktivieren. Weiterhin wird PLAY_MONO_SPEAKER auskommentiert, damit die Musikausgabe in stereo erfolgt. Ich würde empfehlen HEADPHONE_ADJUST_ENABLE ebenfalls zu aktivieren, auch wenn keine Kopfhöreplatine angeschlossen ist. Warum? Weil es nicht stört :slight_smile:.
  • settings-lolin_d32_pro_sdmmc_pe.h / settings-lolin_d32_sdmmc_pe.h: Aktiviere INVERT_POWER. Solltest du für die Power-Ansteuerung den Port-Expander verwenden wollen (JP5 beachten!), so trage hier 115 anstelle von 32 ein. INVERT_POWER` benötigst du aber dennoch zwingend!
  • Möchtest du die Drehrichtung deines Drehencoders umkehren, so aktiviere REVERSE_ROTARY.
  • Schließe deinen ESPuino mit einstecktem Lolin D32 (pro) per USB an deinen Rechner an und klicke auf Upload and Monitor. Wenn alles klappt, wird nun die Firmware kompiliert und anschließend auf deinen ESP32 geladen.
  • Hat alles funktioniert, dann startet dein ESPuino und es geht hiermit weiter: 📗 Der erste Start deines ESPuino. Ansonsten (allgemein): Anleitungen - ESPuino :: Rfid-controlled musicplayer.

Probleme?

Dafür gibt es dieses Forum hier. Schreib’ uns einfach! :slight_smile:
Ggf. hilft auch das: Lolin D32 Pro Upload - Timeout. Startet der D32 (pro) aus dem Deepsleep nicht mehr, so könnte dies an einem fehlenden Kondensator liegen.

Pinout

Zur Referenz sei nachfolgend das Pinout beschrieben. Es ist in settings-lolin_d32_pro_sdmmc_pe.h bzw. settings-lolin_d32_sdmmc_pe.h bereits alles entsprechend voreingestellt (bis auf INVERT_POWER). GPIO-Werte zwischen 0 und 39 sind GPIOs des ESP32, solche zwischen 100 und 115 zeigen, dass der Anschluss über den Port-Expander PCA9555 erfolgt. Der Port-Expander besitzt zwei Kanäle mit je 8 Pins, die per Software wahlweise beliebig zu Ein- und Ausgängen konfiguriert werden können. Der erste Kanal besitzt bei ESPuino die Nummern 100 bis 107 und der zweite 108 bis 115. Die nicht benutzten Pins sind auf den zweireihigen Pinheader Ext. rausgeführt. Deren Nutzen ist aktuell (Stand 02/2022) sehr begrenzt, aber möglicherweise für künftige Anwendungen noch sinnvoll. Gleiches gilt für den I2C-Anschluss. Deaktiviert werden Pins mittels der Nummer 99.

ESP32 (GPIO) Hardware Pin Kommentar
MFET 3.3V SD-Board/Slot 3.3V
GND SD-Board/Slot GND
xx SD-Board/Slot CS entfällt bei SD_MMC!
15 SD-Board/Slot MOSI
2 SD-Board/Slot MISO
14 SD-Board/Slot SCK
MFET 3.3V / 3.3V RFID-Leser 5V Ja, 3.3V muss an 5V angeschlossen werden.
MFET 3.3V / 3.3V RFID-Leser 3.3V Obwohl 3.3V schon an 5V hängt, muss es hier auch dran.
GND RFID-Leser GND
16 XXX XXX Nur bei D32 verfügbar. Wird von diesem PCB nicht genutzt.
17 XXX XXX Nur bei D32 verfügbar. Wird von diesem PCB nicht genutzt.
21 (CS) RFID-Leser NSS Bei RC522 an SDA anschließen
23 RFID-Leser MOSI
19 RFID-Leser MISO
18 RFID-Leser SCK
22 RFID-Leser RST Bei RC522 nicht benötigt.
33 RFID-Leser BUSY Bei RC522 nicht benötigt.
106 RFID-Leser IRQ Dafür muss die Lötbrücke JP4 geschlossen werden. Bei RC522 nicht benötigt.
MFET 3.3V MAX98357 VIN
GND MAX98357 GND
25 MAX98357 DIN
27 MAX98357 BCLK
26 MAX98357 LRC
MAX98357 SD Info: liegt hier GND an so schaltet MAX auf lautlos. Für Lautsprecherbetrieb ist der Spannungsteiler R9/R10 wichtig, wenn Stereoausgabe erfolgen soll.
MAX98357 GAIN Verstärkung über R7 / R8 einstellbar.
34 Drehencoder CLK Wird konfiguriert über JP3. Aktiviere REVERSE_ROTARY, um die Drehrichtung des Drehencoders umzukehren.
39 Drehencoder DT Wird konfiguriert über JP2. Aktiviere REVERSE_ROTARY, um die Drehrichtung des Drehencoders umzukehren.
103 Drehencoder BUTTON
3.3 V Drehencoder +
GND Drehencoder GND
102 Taster (next)
GND Taster (next)
100 Taster (previous)
GND Taster (previous)
101 Taster (pause/play)
GND Taster (pause/play)
104 Taster 4
GND Taster 4
105 Taster 5
GND Taster 5
MFET 3.3V Neopixel V
GND Neopixel G
12 Neopixel DI
32 P-channel Mosfet Gate Steuert Mosfet-Schaltung an, wird konfiguriert über JP5. Alternativ kann auch 115 diese Ansteuerung übernehmen.
107 Kopfhörerbuchse Optional. Wenn auf GND gezogen, dann wird eingesteckter Kopfhörer erkannt (HP_DETECT).
36 PCA_Interrupt xxx Löst Interrupts ausgehend vom Port-Expander aus und weckt ESPuino auf.
4 I2C_SCL xxx I2C-SCL (wird verwendet von Port-Expander und ist verfügbar über JST-PH 4fach)
13 I2C_SDA xxx I2C-SDA (wird verwendet von Port-Expander und ist verfügbar über JST-PH 4fach)
109 EXT.1 xxx CLK des Drehencoders wenn über JP2 aktiviert (gelötet).
SW 3.3 V EXT.2 xxx Geschaltete 3.3 V zur freien Verwendung.
110 EXT.3 xxx DT des Drehencoders wenn über JP3 aktiviert (gelötet).
SW 3.3 V EXT.4 xxx Geschaltete 3.3 V zur freien Verwendung.
111 EXT.5 xxx Port-Expander: Ist unbeschaltet und kann frei verwendet werden.
3.3 V EXT.6 xxx 3.3 V zur freien Verwendung.
112 EXT.7 xxx Port-Expander: Ist unbeschaltet und kann frei verwendet werden.
3.3 V EXT.8 xxx 3.3 V zur freien Verwendung. Empfehlung: Kondensator (+) einlöten.
113 EXT.9 xxx Port-Expander: Ist unbeschaltet und kann frei verwendet werden.
GND EXT.10 xxx GND zur freien Verwendung. Empfehlung: Kondensator (-) einlöten.
114 EXT.11 xxx Port-Expander: Ist unbeschaltet und kann frei verwendet werden.
GND EXT.12 xxx GND zur freien Verwendung.
32 EXT.13 xxx GPIO 32 zur freien Verwendung, wenn anstelle von 32 der PE 115 zum Ansteuern des Mosfets verwendet wird.
GND EXT.14 xxx GND zur freien Verwendung.
5 EXT.15 xxx GPIO 5 zur freien Verwendung. Achtung: Da hängt eine LED mit drauf, die ggf. zu unvorhergesehenen Effekten führt!
0 EXT.16 xxx GPIO 0 zur freien Verwendung. Achtung: GPIO 0 ist ein Bootstrap-GPIO und darf beim Einschalten des ESP32 nicht LOW sein. Ist er LOW, so geht der ESP32 in den Programmiermodus und verweilt in diesem, bis man ihn spannungslos macht. Hier kann ein 4.7k-PullUp-Widerstand helfen, wie man z.B. hier lesen kann.
115 P-channel Mosfet Gate Steuert (alternativ zu GPIO32) die Mosfet-Schaltung an und wird konfiguriert über JP5. Wird 115 hierfür verwendet, so steht GPIO32 zur anderweitigen Benutzung über EXT.13 zur Verfügung.

Benötigte Teile / Vorschläge

Herz dieses PCBs ist der Mikrocontroller ESP32. Beim D32 pro als ESP32-WROVER. Beim D32 als ESP32-WROOM. Die nachfolgende Liste spiegelt nur Vorschläge wieder. Bestelle die Sachen wo immer du willst. Sollte ein Link kaputt sein, so teile mir das bitte mit.

Sonstige Teileliste

  • 1x IRML2244 oder IRLML6401 (P-channel MOSFET) (SMD SOT23)
  • 1x Port-Expander PCA9555PW (SMD TSSOP24)
  • 1x 1k Widerstand (SMD 0805)
  • 2x 4.7k Widerstand (SMD 0805)
  • 2x 10k Widerstand (SMD 0805)
  • 1x 51k Widerstand (SMD 0805)
  • 2x 100k Widerstand (SMD 0805)
  • 6x JST-PH2.0-Konnektor (2 Pins) (ggf. auch weniger, wenn keine fünf Buttons und/oder kein Reset)
  • 1x JST-PH2.0-Konnektor (3 Pins) (für Neopixel)
  • 1x JST-PH2.0-Konnektor (4 Pins) (kann weggelassen werden, wenn kein externer I2C-Anschluss gebraucht wird)
  • 1x JST-PH2.0-Konnektor (5 Pins) (für Drehencoder; kann weggelassen werden, wenn kein Drehencoder benutzt wird)
  • 1x JST-PH2.0-Konnektor (10 Pins) (für RFID)
  • Weibliche Verbinder zum Sockeln des Lolin D32 (pro) (2,54 mm)
  • (optional) Männliche Pinheader (doppelreihig) für unbelegte Port-Expander-Pins (2,54 mm)
  • 1x Kondensator 100 uF (Spannungsstabilisierung)

Interesse?

Falls du Interesse an einem solchen PCB hast, dann melde dich bei mir. Sachen wie MAX98357a, SMD-Bauteile, Pinsocket, Kondensator, JST-Konnektoren, Kondensator und Develboards für LiPo oder FePo kann ich üblicherweise mitschicken, so dass du nicht bei zehn Händlern Ware bestellen musst. Was grundsätzlich jeder jedoch selbst besorgen muss, das sind RFID-Reader, Neopixel, Drehencoder, Lautsprecher und die Buttons. Optional löte ich auch die SMD-Teile auf oder löte gleich die ganze Platine (inkl. Funktionstest).

Kann man da einen Kopfhörer anschließen?

Nicht direkt, aber mit der passenden Kopfhörerplatine geht es: Kopfhörerplatine basierend auf UDA1334 / PJ306b oder Kopfhörerplatine basierend auf MS6324 und TDA1308 bzw. LM4808M. Sie wird einfach per IDC-Konnektor angeschlossen - Plug’n’Play! Melde dich bei mir, wenn du eine solche benötigst - egal ob in fertig gelötet oder als Bausatz zum Selbstlöten. IDC-Konnektoren habe ich üblicherweise auch hier.

8 „Gefällt mir“

Wie mir leider eben erst aufgefallen ist, sind die Develboards Wemos Lolin D32 und Wemos Lolin D32 pro komplett pinkompatibel. Sie unterscheiden sich lediglich dadurch, dass GPIO16 und GPIO17 beim D32 pro nicht existieren und an den jeweiligen Pins am Develboard entsprechend nichts angeschlossen ist. War Anderen vermutlich total klar - mir bisher nicht :woman_shrugging:.

Das heißt im Umkehrschluss, dass das hier beschriebene Board auch für den D32 verwendet werden kann. Ich habe es auch schon getestet: Es funktioniert! Das finde ich sehr sehr cool, weil dann muss dafür kein extra Board entwickelt werden :+1:.

Ich habe dazu eben einen neuen HAL hochgeladen:

Für den o.g. PCB muss dann also das passende Profil ausgewählt werden:
D32 pro: lolin_d32_pro_sdmmc_pe
D32: lolin_d32_sdmmc_pe

Der D32 hat ein eigenes Configfile, das mit dem des D32 pro nahezu identisch ist. Ich habe lediglich INVERT_POWER direkt aktiviert und den Power-Pin auf 115 gesetzt (anstelle 32). Aus Gründen der Abwärtskompatibilität habe ich das beim D32 pro bisher gelassen.

An der Stelle noch einen Hinweis: Wer vom bisherigen D32-Board auf dieses Board hier wechseln möchte, muss UNBEDINGT(!!!) die Anschlüsse von 3.3 V und GND für den Neopixel tauschen/kontrollieren. Weil das habe ich blöderweise vertauscht. Gleiches gilt auch für den Drehencoder. Sorry an dieser Stelle, dass ich das nicht einheitlich gemacht habe.

Vergisst man die beiden Pins zu tauschen, so gibt es einen Kurzschluss, wodurch der Festspannungsregler abraucht. Im besten Fall kommt hinten keine/zu wenig Spannung raus. Läuft es kacke, sind es 5 V und der ESP32 nimmt Schaden.

BESSER IMMER SCHÖN DAS PINOUT KONTROLLIEREN!
@biologist Das gilt auch für dich! :rofl:

Die erste Fuhre ist Mitte letzter Woche übrigens eingetroffen. Also wer noch ein Zuhause für seinen D32 oder D32 pro sucht… :smiley:.

Sollte noch wer Lust haben, einen ESPuino mit miniD32(pro) zu bauen, jedoch nicht auf einen D32 pro warten wollen: Aktuell habe ich noch zwei originalverpackte D32 pro hier liegen, die ich abgeben könnte. PCBs habe ich auch noch da. Nur Neopixel, Drehencoder, Lautsprecher und RFID-Reader musst du selbst besorgen.

Wer zuerst kommt mahlt zuerst.

Ich wechsle meinen Post vom falschen Board hierhin.
Gemäss VSC Git Source Control habe ich folgende Änderungen vorgenommen:

File ‚settings-lolin_d32_pro_sdmmc_pe.h‘

  • //#define INVERT_POWER → #define INVERT_POWER im Code
  • #define POWER 32 → #define POWER 115 im Code, da JP5 auf 2+3 ist.
    @biologist in der Anleitung sprichst du von JP4, im meinem Post im falschen Board von JP5. Was ist nun korrekt?
    Mit 32 habe ich es auch versucht

File ‚settings.h‘

  • //#define PORT_EXPANDER_ENABLE → #define PORT_EXPANDER_ENABLE im Code
  • #define PLAY_MONO_SPEAKER → //#define PLAY_MONO_SPEAKER im Code
  • #define RFID_READER_TYPE_MFRC522_SPI → //#define RFID_READER_TYPE_MFRC522_SPI im Code
  • //#define RFID_READER_TYPE_PN5180 → #define RFID_READER_TYPE_PN5180 im Code
    den RFID Leser habe ich noch nicht angeschlossen
  • #define SD_MMC_1BIT_MODE gemäss Anleitung war bereits aktiv
  • #define HEADPHONE_ADJUST_ENABLE gemäss Anleitung war bereits aktiv

Upload and Monitor:
Processing lolin_d32_pro_sdmmc_pe (board: lolin_d32_pro; platform: espressif32; framework: arduino) ausgewählt
image
Jedoch gibt es einige Kompilierungsfehler. Ich kann leider nicht abschätzen, ob das etwas mit meinem Error zu tun hat.
Upload_and_Monitor.txt (16,1 KB)
Error:

E (1154) sdmmc_common: sdmmc_init_ocr: send_op_cond (1) returned 0x107
[E][SD_MMC.cpp:85] begin(): Failed to initialize the card (263). Make sure SD card lines have pull-up resistors in place.

Das war tatsächlich ein Typo. Also 5 ist korrekt.
1+2 => Ansteuerung per GPIO32
2+3 => Ansteuerung per PE1.7 (115)

Dann musst du es auf 1+2 umlöten. Sonst hat das keine Aussicht auf Erfolg. Aber kannst ja mal machen.

Nein, das sind Warnungen. Bei Fehler(n) würde es abbrechen.

Also gemäß dem Log, das du mitgeschickt hast, passt das ausgewählte Profil. Geflasht wird der ESP32 auch. Was mich so ein bisschen stutzig macht ist die Tatsache, dass der Port-Expander nicht erkannt wird. Weil der hängt immer an 3.3 V und wird nicht geschaltet.

a) Miss mal zwischen 3.3V und GND direkt aufm Develboard, ob da auch wirklich 3.3V rauskommen.
b) Bist du sicher, dass du das Develboard nicht mit Versatz in den Sockel gesteckt hast? Weil das hatte ich bei einem User auch schon.
c) Sind die Lötstellen auf deinem Develboard sauber?

Was mir ansonsten noch einfällt: Es kann vorkommen beim ESP32, dass man etwas flasht und dieses durch ein erneutes Flashen nicht überschrieben wird. Dann flasht man munter weiter und es wird immer wieder das alte Image hergenommen.
Es gibt (bisschen unterhalb von Upload und Monitor) „Erase Flash“. Das kannst mal ausführen und dann erneut flashen. Ist eigentlich eher ein Problem beim Flashen mit OTA, aber ich glaube wir hatten das in ganz seltenen Fällen auch schon ohne OTA.

Wenn es das alles nicht ist, dann poste am besten mal beide Configfiles komplett.

Ich habe mir dein Bild gerade nochmal angeschaut. Sag’ mal kann es sein, dass du das Develboard gar nicht gelötet sondern die Pinheader nur gesteckt hast? Ich sehe da irgendwie kein Lötzinn.
Das würde den Fehler komplett erklären.

Hallo @biologist
Du hat natürlich recht! Ich dachte ich könnte ESP und das PCB beide einfach stecken bis alles läuft.
Es funktioniert alles einwandfrei inkl. Neopixel und Kopfhörer. Bin die ersten Songs am raufladen.
Anmerkung: für mich war es nicht ganz klar mit den Neopixel. Hier steht bei dir MFET 3.3V, GND,12. Auf dem Anschluss (3pin) steht jedoch -,+,DI. Für ein Laie nicht klar, für dich schon. Musste mich hier noch durchkämpfen.
Vielen Dank für deine Hilfe! Mein 1.5 jähriger Sohn zeigte immer wieder auf die Komponenten, dass Papi vorwärts machen soll mit seiner Musikbox. :slight_smile:

Na das klingt doch gut.

Dazu steht aber auch was in der Doku oben:
Bildschirmfoto 2022-03-26 um 19.50.07
Im Endeffekt ist es halt so, dass die Neopixels nicht immer gleich beschriftet sind.

Hehe, meiner (der ist aber schon fast 7) fragt auch die ganze Zeit, wann er endlich seinen neuen ESPuino kriegt. Brauchen tut er den eigentllich auch nicht, weil er hat einen. Aber ich hatte es versprochen :woman_shrugging:.

Inzwischen gibt es eine neue Revision der Platine.
Hier mal ein Bild, das die rev2 (links) mit der rev1 (rechts) vergleicht:

Folgende Modifikationen wurden vorgenommen:
a) Im oberen Bereich wurde das Kupfer noch ein bisschen mehr ausgepart wegen der WLAN-Antenne.
b) Unterhalb der Kupfer-Aussparung gibt es nun zwei weitere „Löcher“. Hier kann man den Stützkondensator, der zuvor in Ext gelötet wurde, liegend unter dem D32 (pro) montieren. Er ist damit näher an der Stromquelle und es wird auch kein Platz in Ext weggenommen.
c) Unten gibt es nun links (von oben gesehen) einen Anschluss für einen auflötbaren Reset-Taster (siehe nachfolgende Bilder), den ich gerne kostenlos dazu gebe. Diesen muss man nicht verwenden, es gibt auch weiterhin die Möglichkeit, einen Reset-Taster per JST-PH anzuschließen, so dass man mit dem Gehäusedesign flexibler ist. Ist einfach nur eine alternative Möglichkeit.
d) Das Routing wurde etwas optimiert und zwecks besserer GND-Konnektivität sind diverse Vias dazugekommen.

Blöderweise ist mir im Bestückungsdruck ein Fehler mit der JP-Nummerierung unterlaufen.
JP5 ist eigentlich JP1
JP1 ist eigentlich JP4
JP4 ist eigentlich JP5
JP2 und JP3 sind vertauscht. Wobei das relativ egal ist, weil die würde man (wenn) eh nur paarweise ändern.
Also die Beschreibung rechts unten ist korrekt und auch die Schaltung ist korrekt. Was halt lediglich falsch ist, das ist die Beschriftung an den Lötbrücken selbst. Ich denke es ist nicht dramatisch, aber ich will es auch nicht verheimlichen :slight_smile:

Hier mal zwei Bilder vom neuen Reset-Taster. Den gebe ich übrigens kostenlos dazu und löte ihn auch kostenlos ein. Außer es schreibt mir jmd,. dass er explizit NICHT gewollt ist.


Von der alten Variante habe ich noch zwei Stück hier. Wer explizit davon eine möchte sollte sich beeilen :slight_smile:. Ansonsten steht nun wie gesagt die rev2 in den Startlöchern. Ich würde, wenn Bedarf bestünde, auch nen Euro abziehen für den Fehler im Beschriftungsdruck :slight_smile:

1 „Gefällt mir“

ich habe alles nach der Anleitung zusammengesetzt und auch die Solder-Jumper entsprechend gelötet. Die Software, also die settings.h und die lolin_d32_pro_sdmmc_pe.h habe ich auch entsprechend der Anleitung konfiguriert.

Das Flachen der Software funktioniert wunderbar aber wenn das abgeschlossen ist und ich den ESPuino starten möchte bekomme ich im Serial Monitor folgende Fehlermeldung angezeigt:

--- Available filters and text transformations: colorize, debug, default, direct, esp32_exception_decoder, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at https://bit.ly/pio-monitor-filters
--- Miniterm on /dev/cu.wchusbserial1420  115200,8,N,1 ---
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
Maximale Inaktivitätszeit wurde aus NVS geladen: 10
Exception in thread rx:
Traceback (most recent call last):
  File "/Users/Bobby/.platformio/penv/lib/python3.9/site-packages/serial/serialposix.py", line 575, in read
    buf = os.read(self.fd, size - len(read))
OSError: [Errno 6] Device not configured

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/Bobby/.platformio/python3/lib/python3.9/threading.py", line 954, in _bootstrap_inner
    self.run()
  File "/Users/Bobby/.platformio/python3/lib/python3.9/threading.py", line 892, in run
    self._target(*self._args, **self._kwargs)
  File "/Users/Bobby/.platformio/penv/lib/python3.9/site-packages/serial/tools/miniterm.py", line 499, in reader
    data = self.serial.read(self.serial.in_waiting or 1)
  File "/Users/Bobby/.platformio/penv/lib/python3.9/site-packages/serial/serialposix.py", line 581, in read
    raise SerialException('read failed: {}'.format(e))
serial.serialutil.SerialException: read failed: [Errno 6] Device not configured

--- exit ---

der Neopixel Ring dreht für einige zeit grün und blinkt anschließend rot. dann geht das ganze Setup vermute ich mal in Deepsleep.

ich stehe gerade mächtig auf dem Schlauch, was ich noch ändern soll…
Danke schon mal

Hmm, also das finde ich etwas seltsam. Wenn man den ESPuino einschaltet, dann leuchtet jeder zweite LED ja orange. Hat man keine SD-Karte eingelegt oder das SD-Modul hat keine Spannung, dann blinkt es kurz darauf rot. Und dann geht er auch in Deepsleep.
Kann von der SD gelesen werden, dann leuchten im Anschluss vier langsam zirkulierende LEDs in
weiß => Betrieb mit WLAN
grün => Betrieb ohne WLAN
blau => Betrieb mit Bluetooth

a) Hast du INVERT_POWER aktiviert?
b) Hast du POWER passend gemäß der Konfiguration von JP5 konfiguriert?
c) Hast du den Kondensator in Ext eingelötet?
d) Hast du an Ext mal zwischen 8 und 10 Spannung gemessen?
e) Ist der D32 pro auch nicht mit Versatz eingesteckt?

Vielen Dank für die schnelle Antwort… leider kam ich mal wieder nicht dazu es gleich umzusetzen…

sorry… mein Fehler. es kreiselte natürlich orange und blinkt dann rot. Hab’s auf die Schnelle vertauscht.

In der Zwischenzeit habe ich nochmal alles „gecleant“ und auch das Git Repo neu geklont
und alle Einstellungen von der oben stehenden Anleitung (Pull-Up am SD Reader entfernt, Hardware, Jumper und Software) nochmal komplett neu gemacht. Die Firmware kompiliert und lässt sich auch auf dem D32 pro flashen.

a) Hast du INVERT_POWER aktiviert?

Ja, das ist drin.

b) Hast du POWER passend gemäß der Konfiguration von JP5 konfiguriert?

bei JP5 ist 1+2 gedrückt und der Inder Firmware der PIN 32 definiert

c) Hast du den Kondensator in Ext eingelötet?

Ja, der ist drin… 8+ 10-

d) Hast du an Ext mal zwischen 8 und 10 Spannung gemessen?

zuverlässig und konstant 3,3V. Am SD Reader direkt habe ich 3.22V gemessen, natürlich nur solange der ESP D32 pro aktiv ist. Im Deepsleep liegen hier allerdings immer noch 1.23V an… ist das so OK?

e) Ist der D32 pro auch nicht mit Versatz eingesteckt?

Nein, das kann ich ausschließen

Habe auch zwei verschiedene SD Karten getestet… leider immer der gleiche Verlauf: Orange…rot… Deepsleep

Ich bin mit meinem Latein echt am Ende… hier nochmal zwei Fotos, vielleicht helfen die ja weiter.

Kann eigentlich der SD reader defekt sein?
Soll ich die SD Karten mal neu formatieren?

ich musste in der platformio.ini den upload_port und den monitor_port anpassen, damit der ESP D32 pro überhaupt gefunden wird.

[env:lolin_d32_pro_sdmmc_pe]
;https://docs.platformio.org/en/latest/boards/espressif32/lolin_d32_pro.html
board = lolin_d32_pro
;board_build.partitions = huge_app.csv
;board_build.partitions = custom_4mb_noota.csv
board_build.partitions = custom_16mb_ota.csv
upload_port = /dev/cu.wchusbserial1420
monitor_port = /dev/cu.wchusbserial1420
;monitor_filters = esp32_exception_decoder

darauf hin bekam ich folgende Fehlermeldung angezeigt:

Error: Multiple requests to rebuild the project "ESPuino-1" index have been received!
Automatic index rebuilding process has been terminated for 10 minutes. at A.value
(/Users/Bobby/.vscode/extensions/platformio.platformio-ide-
2.4.3/node_modules/platformio-node-helpers/dist/index.js:1:790605) at A.value (/Users/Bobby/.vscode/extensions/platformio.platformio-ide-
2.4.3/node_modules/platformio-node-helpers/dist/index.js:1:792714) at A.value (/Users/Bobby/.vscode/extensions/platformio.platformio-ide-
2.4.3/node_modules/platformio-node-helpers/dist/index.js:1:794550) at /Users/Bobby/.vscode/extensions/platformio.platformio-ide-
2.4.3/node_modules/platformio-node-helpers/dist/index.js:1:795342 ...

Ja, das ist normal. Wobei die Spannungs mit 1,2 V höher ist als das, was ich so kenne. Ich kenne das mit etwa 1 V ohne Kopfhörerplatine und 0,8x V mit. Der Punkt ist an der Stelle, dass über die restliche Verkabelung noch irgendwelche Querströme laufen. Also die Lösung ist nicht ganz perfekt mit dem Mosfet, aber mit ganz einfachen Mitteln erreicht man da schon viel. Also das passt erstmal.

Also im Prinzip fallen mir zwei Gründe ein, wenn sowas passiert:
a) SD hat keine Spannung, weil, aus welchem Grunde auch immer, der Mosfet nicht durchsteuert. Das ist bei dir ja offenbar nicht der Fall.
b) Irgendwas stimmt mit der SD-Karte nicht. Vielleicht formatierst du sie nochmal, aber achte auf jeden Fall drauf, dass sie FAT32-formatiert ist. Sind sind 32er-Karten aber eigentlich wenn man sie kauft. Anders sieht es bei 64er-Karten aus, die sind (soweit ich weiß) exFat-formatiert. Das macht dann Probleme.

Hast du mal irgendwelche Treiber installiert? Ich musste das auf meinem alten Mac auch und jeder hat mir immer gesagt, dass das doch einfach so ginge und sie meine Zeilen (exakt das, was du da jetzt hast) auskommentieren müssen. Seitdem ich meinen neuen Mac habe, geht das so.

Ggf. war er noch am Kompilieren und du hast einen neuen Compilevorgang angestoßen (ungewollt)!? Ist vermutlich nicht weiter wichtig.

Habe eben nochmal einen Blick auf deine Lötpunkte geworfen. Da ist die Menge an Lötzinn teilweise bisschen unterschiedlich und ich meine auch unterschiedliche Farbschattierungen am Lötzinn zu sehen. Also möglich, dass manche Stellen nicht lange genug gelötet wurde. Ich würde, OHNE(!) Zugabe von neuem Lötzinn, über alle Punkte mit dem Lötkolben nochmal drübergehen. Man muss bei den JST-Buchsen nur bissl aufpassen. Ich habe die Erfahrung gemacht, dass wenn man das zu lange macht, dann zieht es die Kontaktstifte ein Stück weit nach unten raus.

ich benutze ein uraltes Mac Book Pro (mid 2012), auf das ich vor Jahren mal die CH340 Treiber installiert habe. Die funktionieren auch… hatte kürzlich andere ESP8266, ESP32 und Arduino Projekte aus Platformio und der Arduino IDE programmiert und das gin immer problemlos…

Die Lötstellen sind nicht wirklich schön, das sehe ich genau so. Mir ist kürzlich das „gute alte“ Lötzinn ausgegangen und mit dem Bleifreien welches ich jetzt habe bin ich noch nicht so richtig warm geworden. ich gehe die alle mal durch und schau, ob hier vielleicht eine kalte, oder defekte Stelle dabei ist.

Danke nochmal für Deine Hilfe… ich werde berichten

Also meine Lötpaste ist auch bleifrei, aber beim Lötzinn bin ich letztlich doch wieder bei Blei hängengeblieben. Da kann ich dir Mechanic HX-T100 absolut empfehlen. Das hinterlässt wenig (und vor allem keine hässlichen) Rückstände und fließt super, ich löte das mit 350 Grad (300 ginge vermutlich genauso). Ich habe das in 0,4 und 0,5mm hier, wobei ich auf 0,4 eine kleine Präferenz habe. Ist das beste Lötzinn, das ich je hatte.