Lolin32 mit SD (SD_MMC) und PN5180 als RFID-Leser

Es geht um diesen PCB: Lolin32 + SD_MMC + PN5180


Fertig gelötet und mit blauem Finish sieht das dann inkl. MAX98357a + SD-Board so aus:

An der Stelle noch ein Hinweis: Der oberste der vier Widerstände (R3, 100 kOhm) wird benutzt, um die Verstärkung auf 3 dB herabzusetzen. Wem der ESPuino zu leise ist, der kann das auch weglassen. Ich habe es deswegen gemacht, weil meine Kinder zum Einschlafen gerne was hören und ich der Meinung bin, dass ohne diesen Widerstand im unteren Lautstärkebereich die Abstufung zu grob ist. Ansonsten mal einen Blick ins Datenblatt werfen (Seite 28, Gain Selection). Nachfolgend ein Auszug:
Gain Selection

Features

  • Passend für Wemos Lolin32 (Lolin D32, Lolin D32 pro oder Lolin32 lite passen nicht!)
  • Die Außenmaße sind 56 x 93mm (das Lochmaß ist identisch zu dem hier
  • Es werden JST-PH 2.0-Konnektoren für Taster, Drehencoder, Neopixel, RFID und Batterieanschluss 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.
  • Ein Mosfet-Schaltkreis schaltet die Spannung von MAX98357a, Kopfhörerplatine (optional), RFID, Neopixel und µSD-Board ab, um Strom zu sparen, wenn der ESP32 im Deepsleep ist.
  • Sämtliche Peripherie wird mit 3.3 V betrieben! Bedenke das bei der Auswahl des µSD-Baords. Den Neopixel betreibt man damit streng genommen außerhalb seiner Spezifikation, aber er funktioniert dennoch.
  • Falls die Kopfhörerplatine #1 oder Kopfhörerplatine #2 verwendet werden, so wird der MAX98357a auf lautlos gestellt, wenn ein Kopfhörer eingesteckt ist und umgekehrt.
  • 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 verwendete TDA1308 die Musik auf dem Kopfhörer recht laut machen kann.
  • PN5180 kann, sofern er mit einer neuen FW-Version (4.1) verwendet werden, den ESPuino auch aufwecken. Damit er das kann, braucht er einerseits einen weiteren Pin (IRQ) und andererseits dauerhaft Spannung. Ich habe die Platine jetzt so designed, dass man über einen 3Pin-Jumper einstellen kann, ob der PN5180 dauerhaft mit Spannung versorgt werden soll oder nicht. D.h. ist der obere Pin mit dem mittleren Pin gebrückt, so wird die Versorgungsspannung im Deepsleep ausgeschaltet. Ist der mittlere Pin mit dem unteren gebrückt, so ist auf dem PN5180 dauerhaft Spannung, was dann für LPCD notwendig ist. Hierfür muss PN5180_ENABLE_LPCD aktiviert sein. WICHTIG: Vergesst nicht diesen Jumper zu stecken!
  • Üblicherweise haben die PN5180, wenn sie aus China kommen, die FW-Version 3.5. 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
  • 3Pin-Header für seriellen Anschluss (TX/RX/GND).

Vorraussetzungen

  • Ist keine Kopfhörerplatine angeschlossen, so muss HEADPHONE_ADJUST_ENABLE deaktiviert werden.
  • Zum Messen der Batteriespannung muss MEASURE_BATTERY_VOLTAGE aktiviert sein. Zusätzlich ist ein Spannungsteiler notwendig, da die Spannung von max. 4,2 V für den ESP32 sonst zu hoch wäre. Ich habe zwei 130 kOhm-Widerstände benutzt, die das Multimeter mit jeweils 129 kOhm vermessen hat. Diese Werte werden in der Develboard-spezifischen Konfiguration settings-lolin32.h als Rdiv1 und und Rdiv2 konfiguriert. Sollte die gemessene Spannung systematisch falsch sein, so kann man sie mittels offsetVoltage korrigieren. Auch referenceVoltage lässt sich anpassen. Suuuuper genau ist es nicht, aber 0,1 V Genauigkeit ist aus meiner Sicht mehr als ausreichend.
  • In settings.hmuss HAL=1 gesetzt sein.
  • Aktiviere SD_MMC_1BIT_MODE und SINGLE_SPI_ENABLE.
  • Aktiviere RFID_READER_TYPE_PN5180. Wenn dein ESPuino auch aus dem Schlaf mittels Karte aufgeweckt werden soll, dann zusätzlich auch PN5180_ENABLE_LPCD.
  • Deaktiviere auf jeden Fall RFID-Reader-Optionen, die NICHT PN5180 sind.
  • Achte beim oben 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).

  • Gleiche deine Konfiguration nun mit nachstehender Tabelle ab. Spoiler: Hier und da hat sich ein GPIO geändert.
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
4 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
33 Spannungsteiler / BAT Optional: Spannungsteiler zur Batteriespannungsmessung
13 Kopfhörerbuchse Optional: wenn auf GND gezogen, dann wird Kopfhörerlautstärke aktiviert

Anmerkungen

  • Der JST-PH-Stecker für den PN5180 ist 10 Pins breit.
  • Im Unterschied zum Lolin D32 besitzt Lolin32 keinen integrierten Spannungsteiler zur Spannungsmessung. Am unteren Konnektor auf dem PCB wird der Akku angeschlossen. Auf dem PCB werden dann zwei Drähte aufgelötet, die mittels JST-PH in den Lolin32 gesteckt werden (siehe Bilder oben). Es ist dabei immer darauf zu achten, unabhängig von Farben, dass (+) immer links und (-) immer rechts ist!
  • Löte den Lolin32 nicht direkt auf den PCB auf, sondern verwende weibliche Konnektoren als Sockel. Die Kontaktierung funktioniert gut.
  • Falls du einen LiPo-Akku verwendest, dann stelle sicher, dass dieser einen integrierten Tiefeentladeschutz besitzt. Dies ist GANZ GANZ GANZ wichtig! Nutze z.B. einen Solchen.
  • PN5180 scheint es aktuell ausschließlich in China zu geben. Kostet etwa 5€ und ist damit etwas teurer als RC522.

Benötigte Teile

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

Teileliste

  • 1x IRL3103 (N-channel MOSFET) [anstelle von IRF530NPbF, da IRL3103 eine niedrigere Vgs besitzt]
  • 1x NDP6020P (P-channel MOSFET)
  • 1x 1k Widerstand
  • 2x 10k Widerstand
  • 2x 100k Widerstand
  • 2x 130k Widerstand (kann auch durch 2x100k ersetzt werden)
  • 5x 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)
  • 1x Kondensator 10µF (optional)

Wo bestellen?

  • Hab’s auch mal bei Aisler hochgeladen. Die fertigen in Deutschland.
  • Du möchtest gerne sofort loslegen und nicht warten, bis die PCBs produziert sind? Kein Problem! Schreibe mir eine private Nachricht - ich kann aushelfen :slight_smile:

Kann man da einen Kopfhörer anschließen?

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

Probleme?

Hier noch ein paar weitere Tipps: 📗 (SMD-)Löten.

2 „Gefällt mir“

Danke für die tolle und umfangreiche Anleitung.

Ich bin gerade dabei, die Teile zusammen zu stellen.

Leider ist das SD-Board nicht mehr verfügbar.
Ginge auch dieses hier: Micro SD Karten / SD Card Modul SPI für Breadboard / Arduino / Raspberry Pi | eBay

Ja, das passt. Was ich auch noch gefunden habe ist das hier (die passive Variante): SD Kartenleser AUSWAHL mikro SD TF Modul embedded Data Logging SPI Arduino RPi | eBay

Ich habe mir ja kürzlich solche Boards in China bestellt, 10 Stk. (1Pcs Micro SD Speicher Expansion Board Mini Micro SD TF Karte Memory Shield Modul Mit Pins für Arduino|Integrated Circuits| - AliExpress). Kamen gestern an, sieht auch ok aus. Problem ist nur, dass die tatsächlich den Pinheader schon aufgelötet haben. An für sich ja toll, nur ist er auf der falschen Seite und damit passen die Pins nicht mehr. Kann ich alle umlöten oder meine Platinen umdesignen. Kann auch sein, dass die in meinem ebay-Link von oben schon falsch rum aufgelötet sind.

Denke dran, den einen Widerstand dort auszulöten, sonst kriegst du den Lolin32 nicht mehr geflasht. Welcher das ist, steht hier lokal bei mir im Artikel.

Hallo @biologist
Du schreibst in der Readme PN5180 muss mit 3,3V und 5V versorgt werden . Ich habe mir gestern mal die Schaltung angesehen . Das Board sollte auch mit 3,3V gehen . Die 5V sind auf einen internen Spannungsregler geschaltet , welcher daraus dann 3,3V macht . Die meisten 3,3V Verbindungen sind nicht beschaltet ( siehe Foto eines PN5180 , die Brücken fehlen ), bis auf die zu VBAT und PVDD. Dort ist ein interner LDO der dann 1,8V macht . Laut Datenblatt von NXP arbeitet der Chip mit 3,3V . Hast du , oder jemand anderes , das mal ausprobiert ? Also entweder 3,3V oder 5 V nicht beides gleichzeitig beschalten. Wenn es nicht geht evtl. die Brücken R14 aus und R15 einlöten .

VG

Dann muss ich die Beschreibung wohl verständlicher anpassen. Also es war tatsächlich so gemeint, dass man die 3.3V an 5V UND 3.3V hängen muss. So macht es mein PCB auch.
Mich hat es auch irritiert muss ich zugeben. @tueddy hat das Ganze ja ins Laufen gebracht und mich mit dem PN5180 „bemustert“. Irgendwie lief es nicht und dann meinte er zu mir, dass man beide Pins mit 3.3V beschalten müsse.

Ja, das ist schon komisch . Es gibt ein Evaluation board von NXP , auch da ist der Jumper per default auf 3,3V , nix gleichzeitig . Der Ausgang des 3,3V LDO_OUT ist ja auch garnicht beschaltet , R10 fehlt . Für mich funktioniert das Board alleine mit 5V nicht , erst wenn man R10 beschaltet . Ich habe auch schon länger gegoogelt , finde aber nichts .

Evt. hilft der Schaltplan (R14/R15?):

Bei mir läuft der Leser komplett mit 3,3V. Der 5V Anschluss muss aber in jedem Fall auch mit Strom versorgt werden, Also Anschlüsse 3,3V & 5V beide an 3,3V

Schaltplan und Dokumentation zum PN5180 hier…

Also so wie ich schon geschrieben habe , Brücke R14 aus und R15 einlöten .

Ich habe in den letzten Tagen diese Platine bestückt und in Betrieb genommen. Leider gab es erst mal keine Tonausgabe, obwohl in der Debug-Ausgabe das Abspielen einer Sound-Datei angezeigt wurde. Ich habe keine Kopfhörer-Platine, die entsprechenden Kontakte auf dem PCB sind daher einfach offen.

Das Problem war letztendlich, dass am MAX98357 am Pin SD eine zu geringe Spannung anlag. Mein MAX98357 ist nicht von Adafruit [1], sondern von AliExpress. Gemessen habe ich an dem Pin eine Spannung von ca. 0,05 V, was laut [2] eben ein Shutdown des Amps bewirkt (" If SD is connected to ground directly (voltage is under 0.16V) then the amp is shut down"). Die Spannung sollte ja eigentlich höher sein, da auch auf diesem Breakout-Board ein 1 MOhm Widerstand nach VCC geht, und intern im Chip ein 100 kOhm Widerstand nach GND geht (SD_MODE Pulldown Resistor).

Ich habe dann mit verschiedenen Widerständen auf dem PCB-Board zwischen HP_Detect (ist mit SD des Amps verbunden) und 3,3 V am Ausgang für die Kopfhörer-Platine experimentiert, und ein 100 kOhm Widerstand hat die Spannung an SD auf 0,48 V gebracht (für den „(Left + Right)/2“ Modus). Damit kam dann endlich zuverlässig der Sound am Lautsprecher an. (Größere Widerstände, die nach der Berechnungsformel im Datenblatt eigentlich passender wären, haben nicht zuverlässig funktioniert).

@biologist : Evtl. sollte man den Hinweis oben („Info: liegt hier GND an so schaltet MAX auf lautlos“) und auf Github noch ergänzen, dass hier ein zusätzlicher Pull-Up-Widerstand erforderlich sein könnte, zumindest wenn es Probleme mit dem Sound gibt. Die Spannung muss > 0,355 V sein, sonst geht der Amps auf Shutdown.

Insgesamt ist dieser SD Pin ja schon recht merkwürdig. Vier Funktionen auf einen Anschluss zu legen - zu aktivieren mit festen Spannungsbereichen - führt sicherlich öfters mal zu Problemen.

[1] Overview | Adafruit MAX98357 I2S Class-D Mono Amp | Adafruit Learning System
[2] Pinouts | Adafruit MAX98357 I2S Class-D Mono Amp | Adafruit Learning System

1 „Gefällt mir“

Ich hatte das gleiche Problem, allerdings war es ausreichend einfach HEADPHONE_ADJUST_ENABLE zu aktivieren, damit HP_DETECT auf Input geschaltet wird, auch wenn man die Kopfhörer-Platine nicht verwendet.

1 „Gefällt mir“

Ui, das ist mir noch gar nicht aufgefallen.
Das nehme ich auf jeden Fall an verschiedenen Stellen auf.

Danke für den Hinweis.

Aha - danke für den Hinweis. Dann zieht der nicht initialisierte Port bei mir die Spannung so weit runter? (Ich hatte die Spannung tatsächlich nur auf dem PCB komplett aufgesteckt gemessen.)

Laut dem ESP32 Pin List Dokument ist GPIO13 nach dem Reset auf Input und Pulldown. Das erklärt auch das Verhalten. Mit dem HEADPHONE_ADJUST_ENABLE wird dann der Pulldown deaktiviert.

Wofür sind eigentlich diese 3 JP1 Löcher oben hinter dem ESP32? Ich finde JP1 sonst nur auf dem Schaltplan vom
pn5180. Muss da noch irgendwas rein?

Zitat von oben. Also den Jumper musst du auf jeden Fall setzen.
EDIT: Im einen Fall wird dauerhaft der PN5180 mit Spannung versorgt „3.3 V“ und im anderen Fall wird er durch die Mosfets abgeschaltet, wenn der ESP im Deepsleep ist „M_SW3.3“.

Ah super danke! Das hatte ich schon gesucht. Hast du mal gemessen was der PN5180 an Strom im standby zieht?

The PN5180 supports an external silicon system-power-on switch by using the energy
of the RF field generated by an NFC phone to switch on the system, like it is generated
during the NFC polling loop. This unique and new Zero-Power-Wake-up feature allows
designing systems with a power consumption close to zero during standby.
vom datasheet https://www.nxp.com/docs/en/data-sheet/PN5180A0XX-C1-C2.pdf

Finde leider kaum Informationen darüber.

Hänge leider beim Update fest. Habe die REQ mit dem next button verbunden und kann auch auslesen das ich die Firmware 3.5 am laufen habe.

#define PN5180_RST_PIN      22
#define PN5180_BUSY_PIN     16
#define PN5180_REQ_PIN      4
#define PN5180_NSS_PIN      21
#define STM32_MOSI_PIN      23
#define STM32_MISO_PIN      19
#define STM32_SCK_PIN       18

Habe es geschafft dieses NFC Cockpit zu installieren. Dafür musste man sich bei NXP anmelden und es ist erschreckend was die alles wissen wollen. Meine Unsinnsdaten hat das Ding aber geschluckt. Die Firmware findet sich dann unter nxp\NxpNfcCockpit_v5.9.0.0\firmware\PN5180_SFWU im Installationsverzeichnis.

Wo kommt dann das ganze Hex zeug hin? Die Anleitung sagt ich soll das in einem header speichern.

Edit: Okay ich bin blind. Das wird in #define PN5180_FIRMWARE in firmware.h deklariert. Man muss also doch nicht das ganze geraffel mit NXP machen.

Allerdings bekomme ich folgende Fehlermeldung beim compilen:

Arduino: 1.8.13 (Windows 10), Board: "WEMOS LOLIN32, 80MHz, Default, 240MHz (WiFi/BT), 921600"

FirmwareUpdate:24:1: error: 'PN5180_Firmware' does not name a type

 PN5180_Firmware Pn5180(PN5180_RST_PIN, PN5180_BUSY_PIN, PN5180_REQ_PIN, PN5180_NSS_PIN, STM32_MOSI_PIN, STM32_MISO_PIN, STM32_SCK_PIN);

 ^

C:\Users\Braindance\Documents\PN5180_Updater_ESP32-master\FirmwareUpdate\FirmwareUpdate.ino: In function 'void setup()':

FirmwareUpdate:30:3: error: 'Pn5180' was not declared in this scope

   Pn5180.Begin();

   ^

C:\Users\Braindance\Documents\PN5180_Updater_ESP32-master\FirmwareUpdate\FirmwareUpdate.ino: In function 'void loop()':

FirmwareUpdate:47:3: error: 'Pn5180' was not declared in this scope

   Pn5180.End();

   ^

exit status 1

'PN5180_Firmware' does not name a type

Ignorier die Anleitung. In den Github wurde das schon gemacht und die Firmware liegt schon im passenden Format vor. Du musst es nur aufspielen und die Boards passend angebunden haben.

@Jonas
Danke, das hatte ich zeitgleich aus herausgefunden, es spuckt jedoch noch Fehlermeldungen beim compilen.

Hast du die Dateien aus dem src-Ordner zur ino kopiert?