ESP32 NodeMCU / Devkit C mit SD_MMC und PN5180 als RFID-Leser

Bilder



Hinweis

Passend für NodeMCU ESP32 / Devkit C mit 38 Pins. Achtung: Es gibt auch welche mit weniger Pins diese werden NICHT unterstützt. Am besten du schaust dir die Bilder oben genau an und vergleichst die Pinbeschriftungen: Das muss 100% passen.

Warum dieser PCB?

Die klassischen NodeMCU-Develboards, die via Amazon insbesondere vom Händer AZ-Delivery vertrieben werden, sind oft der Einstieg für viele Leute, die in das Thema ESP32 einsteigen. Aus diesem Grunde habe ich mich dessen angenommen und einen PCB erstellt, den jeder für sich selbst bestellen kann.

Der Nachteil gegenüber den genannten Lolin-Boards ist, dass kein Akku-Anschluss und keine Ladeelektronik für einen solchen integriert ist. Dies würde jedoch auch gar nicht so arg viel Sinn machen, da das Board mehrere mA Strom frisst im Standby. Kurzum: Wer dieses Board dennoch mit Akku betreiben will, der muss das, wie oft im Tonuino-Forum propagiert, über 5 V via USB machen - eine Powerbank bietet sich dafür z.B. an. Eine Messung der Akkuspannung sieht das hier vorgestellte Board daher natürlich nicht vor, ich habe jedoch den GPIO 33, da dieser hier nicht gebraucht wird, zur „freien Verwendung“ über einen Pinheader (inkl. 3.3 V und GND) nach außen geführt. Also kurzum: Aus meiner Sicht sind die Wemos-Plattformen (Lolin D32 und D32 pro) für ESPuino besser geeignet, aber wenn der NodeMCU ESP32 schon mal da ist, wird er Ein- oder Andere diesen vermutlich auch nutzen wollen. Und genau an diese Leute richtet sich mein Angebot.

Konfiguration

  • Es gibt für diesen PCB ein eigenes Configfile settings-azdelivery_sdmmc.h und auch einen eigenen HAL, der via az-delivery-devkit-v4 in Platformio aufrufbar ist. Dort ist bereits alles vorkonfiguriert. Plug’n’Play!

  • Es gibt auch Gerber-Files, so dass sich jeder die PCBs selbst bestellen kann (z.B. bei jlcpcb.com). Ansonsten kontaktiert mich gerne, wenn euch das zu aufwändig ist und ihr einfach auch generell das Projekt unterstützen wollt :+1:.

  • Über die Widerstände R1 und R2 kann man man die Verstärkung steuern. Ich persönlich verwende immer 3dB, da ich den MAX98357a im unteren Lautstärkebereich sonst so laut finde (meine Kinder nutzen den ESPuino halt gerne zum Einschlafen). Aber was hier benötigt wird, hängt auch von den eigenen Vorlieben und nicht zuletzt auch vom verwendeten Lautsprecher ab (4 oder 8 Ohm). Je nach gewünschter Konfiguration wird entweder gar kein Widerstand für R1/R2 eingelötet, nur einer der beiden (100k Ohm) oder nur eine Drahtbrücke (0 Ohm). Damit das nicht vergessen geht, steht es auf dem PCB auch drauf. D.h. es müssen und sollen NIE BEIDE Widerstände gleichzeitig eingelötet sein und schon gar nicht zwei Drahtbrücken (Kurzschluss!). Hier eine Tabelle dazu aus dem Datasheet:
    Gain Selection

  • Für RFID habe ich einen JST-PH-Stecker mit 10 Pins vorgesehen, da dieser für den RFID-Reader PN5180 benötigt wird. Hierbei werden, das nochmal als Hinweis, sowohl der 5V- als auch der 3.3V-Anschluss am PN5180 mit 3.3 V beschaltet. Grundsätzlich spricht nichts dagegen, anstelle des PN5180 einen RC522 zu verwenden. Nur es bleiben dann halt manche Anschlüsse des JST-Anschlusses unbelegt, da der RC522 weniger Pins zum Anschließen benötigt. Es ist dann ausreichend nur SDA (wird an CS angeschlossen), SCK, MOSI, MISO, 3.3V und GND anzuschließen (RST und IRQ werden von ESPuino aktuell nicht ausgewertet/verwendet beim RC522).

  • Für den PN5180 gibt es mit PN5180_ENABLE_LPCD das Feature, den ESPuino aus dem Schlaf per RFID-Karte aufzuwachen. Das würde normalerweise nicht funktionieren, denn die Peripherie wird über die beiden Mosfets spannungslos geschaltet, wenn der ESPuino im Deepsleep ist. Damit dies also klappt, muss der PN5180 auch in diesem Falle mit 3.3V versorgt werden, damit er auch dann in Betrieb ist, wenn der ESPuino eigentlich schläft (was aber auch etwas mehr Stromverbrauch im Deepsleep nach sich zieht). Um dies zu konfigurieren habe ich einen Jumper vorgesehen, der mit „LPCD“ und „no LPCD“ beschriftet ist. D.h. bei „no LPCD“ erfolgt im Deepsleep keine PN5180-Versorgung mit 3.3V - und umgekehrt. Achte drauf, dass der Jumper auf JP1 auf jeden Fall gesteckt ist, da ansonsten das RFID-Modul nicht mit Spannung versorgt wird! In den FAQs habe ich das Thema LPCD mal kurz aufgegriffen - einfach dort mal danach suchen.

Features

  • Passend für NodeMCU ESP32 / Devkit C mit 38 Pins. Achtung: Es gibt auch welche mit weniger Pins - diese werden NICHT unterstützt. Am besten du schaust dir die Bilder oben genau an und vergleichst die Pinbeschriftungen: Das muss 100% passen.
  • Die Außenmaße sind 61 x 88mm
  • Maximal drei Buttons werden unterstützt, dazu ein Drehencoder.
  • Es werden JST-PH 2.0-Konnektoren für Taster, Drehencoder, Neopixel, RFID und Resetanschluss verwendet. Wichtig: Es handelt sich hier um 2mm-Abstand und NICHT das klassische 2,54mm-Lochraster!
  • Die Anschlüsse für MAX98357a und das µSD-Board besitzen dagegen einen normalen Lochrasterabstand, so dass das Ganze zu den beiden Breadboards passt. Achte drauf, die Pinleisten auf die richtige Seite zu löten, so dass Pin-Kompatibilität gewährt ist.
  • Um Strom zu sparen schaltet ein Mosfet-Schaltkreis die Spannung von MAX98357a, Kopfhörerplatine (optional), RFID, Neopixel und µSD-Board ab, wenn der ESP32 im Deepsleep ist.
  • Sämtliche Peripherie wird mit 3.3 V betrieben! Bedenke das bei der Auswahl des µSD-Boards. Den Neopixel betreibt man damit streng genommen außerhalb seiner Spezifikation, aber er funktioniert dennoch.
  • Falls die Kopfhörerplatine #1 oder Kopfhörerplatine #2 oder Kopfhörerplatine #3 verwendet wird, so wird der MAX98357a auf lautlos gestellt, wenn ein Kopfhörer eingesteckt ist und umgekehrt. Die ersten beiden Kopfhörerplatine kannst du direkt von mir fertig gelötet bekommen.
  • Falls HEADPHONE_ADJUST_ENABLE einkompiliert wurde, erkennt der ESPuino das Einstecken und kann, sofern über die WebGUI entsprechend konfiguriert, die Lautstärke begrenzen. Dies macht deshalb Sinn, da der als Verstärker auf der Kopfhörerplatine verwendete TDA1308 die Musik auf dem Kopfhörer recht laut machen kann.
  • PN5180 kann, sofern er mit einer neuen FW-Version (4.1) verwendet wird, den ESPuino auch aufwecken (LPCD, siehe Beschreibung oben). Hierfür muss PN5180_ENABLE_LPCD aktiviert sein. WICHTIG: Vergesst nicht, den o.g. diesen Jumper zu stecken!
  • Üblicherweise haben die PN5180, wenn sie aus China kommen, die FW-Version 3.5 aufgespielt. Um 4.1 drauf zu bringen, muss man sie flashen. Wie das geht steht hier.
  • 2Pin-Header für Reset (EN/GND) - hier kann man z.B. einen Mikroschalter anlöten und halb-versteckt außen am ESPuino-Gehäuse platzieren. Optional.
  • 3Pin-Header für seriellen Anschluss (TX/RX/GND). Optional.
  • 3Pin-Header für GPIO33. Optional.

Vorraussetzungen

  • Ist keine Kopfhörerplatine #1 oder Kopfhörerplatine #2 angeschlossen, so sollte HEADPHONE_ADJUST_ENABLE deaktiviert werden.
  • Aktiviere SD_MMC_1BIT_MODE und deaktiviere SINGLE_SPI_ENABLE.
  • Aktiviere RFID_READER_TYPE_PN5180, sofern du den PN5180 verwendest. Für RC522 entsprechend RFID_READER_TYPE_MFRC522_SPI.
  • Wenn dein ESPuino auch aus dem Schlaf mittels Karte aufgeweckt werden soll, dann zusätzlich auch PN5180_ENABLE_LPCD. Das kann aber nur der PN5180 und auch nur wenn, wenn er eine Firmware >= 4.1 hat.
  • Achte beim verlinkten SD-Board darauf, dass der PullUp-Widerstand an GPIO 2 (MISO) entfernt wird, da der ESP32 sonst nicht mehr in den Flashmodus geht (siehe nachfolgendes Bild).

Pinout

  • Gleiche deine Konfiguration nun mit nachstehender Tabelle ab.
ESP32 (GPIO) Hardware Pin Kommentar
MFET 3.3V SD-Board 3.3V
GND SD-Board GND
xx SD-Board CS entfällt bei SD_MMC!
15 SD-Board MOSI
2 SD-Board MISO
14 SD-Board SCK
MFET 3.3V RFID-Leser 5V Ja, 3.3V muss an 5V angeschlossen werden
MFET 3.3V RFID-Leser 3.3V Obwohl 3.3V schon an 5V hängt, muss es hier auch dran
GND RFID-Leser GND
21 RFID-Leser NSS
23 RFID-Leser MOSI
19 RFID-Leser MISO
18 RFID-Leser SCK
22 RFID-Leser RST
16 RFID-Leser BUSY
39 (VN) RFID-Leser IRQ
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
MAX98357 GAIN PullUp mit 100k auf 3.3V bewirkt weniger Verstärkung
34 Drehencoder CLK Tausche CLK mit DT, wenn du die Drehrichtung anpassen möchstest
35 Drehencoder DT Tausche CLK mit DT, wenn du die Drehrichtung anpassen möchstes
32 Drehencoder BUTTON
3.3 V Drehencoder +
GND Drehencoder GND
13 Taster (next)
GND Taster (next)
36 (VP) Taster (previous)
GND Taster (previous)
5 Taster (pause/play)
GND Taster (pause/play)
MFET 3.3V Neopixel V
GND Neopixel G
12 Neopixel DI
17 N-channel Mosfet Gate
4 Kopfhörerbuchse Optional: wenn auf GND gezogen, dann wird Kopfhörerlautstärke aktiviert
33 xxx xxx Ist unbeschaltet und kann frei verwendet werden

Anmerkungen

  • Löte das ESP32-Modul nicht direkt auf den PCB auf, sondern verwende weibliche Konnektoren als Sockel. Die Kontaktierung funktioniert gut.
  • PN5180 scheint es fast ausschließlich in China zu geben. Kostet etwa 7€ und ist damit etwas teurer als der RC522.

Benötigte Teile

Herz dieses PCBs ist der ESP32 auf einem ESP32 NodeMCU. Wichtig: Bevor dieser genutzt werden kann, muss zuerst der passende Treiber installiert werden für den USB/seriell-Chip darauf.

Teileliste

  • 1x IRL3103 (N-channel MOSFET)
  • 1x NDP6020P (P-channel MOSFET)
  • 1x 1k Widerstand
  • 4x 100k Widerstand
  • 4x JST-PH2.0-Konnektor (2 Pins)
  • 1x JST-PH2.0-Konnektor (3 Pins)
  • 1x JST-PH2.0-Konnektor (5 Pins)
  • 1x JST-PH2.0-Konnektor (10 Pins)
  • Weibliche Verbinder zum Sockeln des Lolin32 (2,54 mm)
  • Männliche Pinheader für Jumper und seriellem Anschluss (2,54 mm)
  • 1x Jumper (2, 54mm)

Kann man da einen Kopfhörer anschließen?

Nein, aber mit der passenden Kopfhörerplatine dazu geht es:
Kopfhörerplatine basierend auf MS6324 und TDA1308.
Kopfhörerplatine basierend auf UDA1334 / PJ306b.

Probleme?

Ungeduldig? :slight_smile:

Melde dich gerne bei mir, wenn du einen solchen PCB möchtest. In der Regel habe ich auch so ziemlich alles, was in der Teileliste steht, noch da.

EDIT 9.11.2021:
Die neuen PCBs kamen die Tage an. Funktioniert jetzt.


Habe mich leider etwas mit der Beschriftung vertan.

  • Überall, wo 10k steht, kann 100k rein.
  • Rechts oben am Mosfet ist auch ein Widerstand mit 1k beschriftet - hier kommt auch 100k rein.

In den Gerberfiles, die hochgeladen sind, habe ich das korrigiert.

Habe den PCB gestern gelötet und er spielt seitdem hier neben mir. Das funktioniert ordentlich.

Eine Sache ist mir jedoch aufgefallen, die ich so noch nicht hatte: Wenn man eine Kopfhörerplatine im laufenden Betrieb ansteckt, dann stürzt der ESPuino normalerweise ab. Passiert hier nicht - ist ja erstmal positiv (wenn auch relativ egal, denn üblicherweise macht man das ja nicht). Steckt man nun einen Kopfhörer in die Buchse der Kopfhörerplatine, so erkennt der ESP32, dass was eingesteckt wurde und man hört auch Musik auf dem Kopfhörer. Es passiert also „was“. Allerdings geht die Musik auf dem Lautsprecher nicht aus. Ausgehen sollte die Musik, weil die Kopfhörerplatine dann, wenn ein Kopfhörer eingesteckt ist, MAX98357.SD auf GND zieht. Was passiert hier? Die Spannung zwischen MAX98357.SD und GND sinkt durch das Einstecken des Kopfhörers von etwa 3.3 V auf 0.7 V (statt 0 V). Entferne ich die Kopfhörerplatine und brücke SD gegen GND mit dem Multimeter, so fließt ein Strom von 60 uA und der Lautsprecher geht aus.

Ist keine Kopfhörerplatine eingesteckt, so spielt der MAX ganz normal. Ich erwähne das nur, weil Leute hier ja schon Probleme damit hatten, dass kein Ton aus dem MAX rauskam und man SD extern beschalten musste.

Warum das o.G. auftritt ist mir ehrlich gesagt unklar :woman_shrugging:. Die Lötstellen sehen ok aus und der 6polige IDC-Konnektor ist auch gleich belegt wie sonst. HP_DETECT des ESP32 ist verbunden mit MAX.SD und dem HP_DETECT-Pin des IDC-Konnektors.

EDIT 9.11.2021: Das funktioniert nun, nachdem ich einen neuen GPIO gewählt habe.

Wegen der Spannungen gab es schonmal was . Habe es aber wegen meiner neuen Hardware nie weiter erforscht . Vielleicht mal den Wert R2 auf der Kopfhörerplatine ändern , schließlich ist das im Zusammenhang mit dem Eingang SD des MAX98357 ein Spannungsteiler .

0,7V reichen halt nicht für SD des MAX, sihe dazu datasheet (Seite 16, Bild 4) der Anschluss kann ja mehr wie nur SD, sondern ist auch ein MODE Pin.

am besten wäre das wenn die Kopfhörer platine den SD „hart“ auf Masse zieht, dann wäre der auf jeden Fall aus…

Ja dessen bin ich mir schon bewusst. Ich frage mich nur, warum das vorher noch nie aufgetreten ist. Ich habe ja jetzt schon diverse PCBs getestet damit und das war nie ein Thema. Wobei ich zugeben muss, dass ich bisher immer nur Wemos-Develboards im Test hatte.

Ja aktuell geschieht das über einen 10k-Pulldown, wie man im Schaltplan sieht.

stimmt , aber das geht so nicht mehr und müßte ein Neudesign der Kopfhörerplatine mit einer anderen Buchse sein . Bei meinem Entwurf damals hatte ich keine vernünftigere Buchse als diese Cliff gefunden , die anderen bekannten waren mir nicht robust genug . Ich habe davon hunderte defekte während meines Berufslebens austauschen müssen und wollte halt was stabileres .
Heute würde ich die PJ306B nehmen . Habe die hier und macht einen guten Eindruck .

Arbeitet die PJ306B so, wie man es braucht? Also GND wenn eingesteckt und umgekehrt?

komisch das Ganze :slight_smile:

der hat ja intern 100k gegen Masse, jetzt kommen in dem Fall noch 10k gegen Masse dazu parallel

D.h. wenn bei 3,3V da 0,7V entstehen können, braucht es irgendwo einen 33k PULLUP, sonst wird das nix…

das das sont immer läuft spricht dafür das auf den DEV Boards was anders ist, was kannst du denn messen ven das EPP32 nicht steckt?

besser wäre es wenn die KH Platine über einen FET den Pin direkt nach Masse schaltet ohne R dazwischen, müsste man nur eine passende Scahltung davor basteln damit das mit dem Einstecken auch läuft…

Die Frage verstehe ich nicht :slight_smile:

wenn jetzt kein DEV/ESP Baord steckt, dann sollte die Funktion KH Platine stecken → MAX bekommt SD Signal doch trotzdem funktionieren?

oder gibt es von dem Pin keine Verbindung zum ESP? dann wäre die Frage hinfällig :smiley:

Wenn das Devboard nicht steckt, dann kann ich nix testen. Weil das versorgt ja auch den Rest mit Spannung.

Was übrigens zu deiner Rechnung noch dazu kommt: Wenn man in settings.h die Kopfhörerplatine aktiviert, dann wird der GPIO, der das erkennen soll, als Input konfiguriert. Ob das jetzt mit oder ohne PullUp zu geschehen hat, hatten wir (@compactflash hatte es ja verlinkt) bereits im Juni angesprochen. Ich wollte eben mal testen, wie es ohne die Option ist, aber aus welchem Grunde auch immer, wird das Develboard gerade nicht von meinem Mac erkannt.

Manchmal läuft’s einfach… :joy:.

dann müsste man mal extra 3,3V auf die Platine bringen, dann könnte man das mal testen…

irgendwo zieht das wer nach 3,3V, fragt sicht nur wer…

Ja, kann ich mal machen.

Auf jeden Fall auch der ESP32, wenn die Kopfhörererkennung aktiv ist:

Wie groß der interne PullUp ist, ist wohl nicht so ganz klar: GPIO internal pull-up and pull-down resistance value - ESP32 Forum

Was allerdings auffällt: Wenn ich den Kopfhörer einstecke und auch wenn ich den 6poligen Stecker einstecke, dann blinkt kurz eine LED auf.
Hier schreibt jmd. dazu:

Pin 13 cannot be used with INPUT_PULLUP, it is already connected to a resistor and a LED that are welded on the board. It can be used with an external pull-down resistor, but still the data would not be accurate, so I advise against its use

Und auch gefunden habe ich:
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/sd_pullup_requirements.html#pull-up-conflicts-on-gpio13

LED + Vorwiderstand an dem Pin könnte natürlich genau diese 0,7V verursachen

Daher könnte auch kommen das das pro Board unterschiedlich ist vom Verhalten her, je nach dem welcher Pin genutzt wird und wie der Pin auf dem Board verschaltet ist…

Vlt lieber mit einem Pin tausche der nicht so „empfindlich“ ist?

Ja, werde ich dann wohl machen müssen.

So, ich habe eben einen neuen PCB bestellt. Dabei habe ich Button-Next nun mit Headphone getauscht (4 gegen 13). Habe die Leiterbahn mal auf meinem PCB zu 13 getrennt und dann war das Problem weg mit dem Max, der nicht abschaltet.

Oben habe ich noch einen Mosfet gedreht und unten den SD-Reader (beides kosmetische Sachen).

In zwei Wochen weiß ich dann mehr :grin:.

1 „Gefällt mir“

Ich bin seit einiger Zeit dabei mir um das DevkitC mit WROVER-E eine Platine zu bauen. Jedoch löte ich alles auf Lochraster auf. Ich möchte meine Herangehensweise zum Akkubetrieb hier einmal kurz darstellen. Vielleicht inspiriert meine Lösung ja eine weitere Platine. Außerdem ließe sich damit auch diese Platine betreiben.

Voraussetzung war für mich als Stromversorgung einen „sicheren“ LiFePo4 zu verwenden. Als weiteren Vorteil kann man diesen direkt an den ESP32 anschließen, da er die passenden 3.3V mit ausreichend geringer Abweichung liefert. Ich hoffe damit den hohen Stromverbrauch des DevkitC zu umgehen, da dieser hauptsächlich durch den Spannungsregler entsteht.

Als Ladeelektronik habe ich ein fertiges TP5000 Lademodul verwendet.

Problem zweier Spannungsquellen

Laut Spezifikation darf das Board immer nur mit einer Spannungsquelle gleichzeitig betrieben werden. Also entweder betreibt man das Board mit 5V oder mit den 3.3V vom Akku. Das ist unpraktisch, da man für die serielle Schnittstelle die 5V benötigt.
Man hat nun also folgende Möglichkeiten das zu handhaben:

  • Die 5V von USB (zum Laden) am ESP32 vorbei direkt zum Lademodul zu führen. Der ESP32 wird nur mit 3.3V betrieben. Für eine Datenverbindung müsste man den Akku abklemmen.
  • Bei anliegenden 5V mittels Mosfet den Akku vom ESP32 trennen.

Ich habe mich für Variante 2 entschieden, da die Schaltung nicht kompliziert ist und man immer über USB Updates einspielen kann. Jedoch ist unklar wie viel Strom man gefahrlos über den (eigentlich Eingangs) 5V-Pin ziehen kann. Da ich ohnehin einen zusätzlichen USB-C Port einbauen will ist das aber kein Problem für mich. Dann muss das DevBoard an USB-C und zusätzlich die 5V vom USB-C als Akku-Ladespannung angeschlossen werden.

Das ganze ließe sich natürlich ohne Develboard wesentlich eleganter lösen, z.B. wie die Ladeelektronik bei anderen Develboards. Man bräuchte z.B. keinen extra USB.

RX als GPIO

Außerdem habe ich, da mir ohne Port-expander ein Pin gefehlt hat, damit experimentiert RX als Input zu verwenden. Für z.B. einen Button funktioniert das problemlos, solange dieser nicht während dem flashen auf GND gezogen wird. Dazu muss nicht einmal die serielle Schnittstelle deaktiviert werden. Nur weil es hier gerade Diskussion zu Pins gibt, aber mit port expander sollte das ja eigentlich nicht nötig sein.

Mich würden eure Meinungen zu meiner Lösung interessieren. Bei Interesse teile ich auch gerne meinen Schaltplan dazu.