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

Ok. Vier Stück sind es auf jeden Fall, weil an der Stelle ein Array mit vier Elementen durchlaufen wird. Ist auf jeden Fall ein Event.

Ich habe eben mal ein Commit gemacht.

Lasse das bei dir mal laufen und setze das println-Statement über die if-Zeile, die ich markiert habe. Wenn das Event nun angezeigt wird (nur noch einfach, weil nicht mehr in der for-Schleife) und sich der ESPuino jedoch nicht verhält, als ob eine neue Karte aufgelegt wird, dann greift mein Fix. Wenn das nicht klappt, dann versuche mal, die 300 bis auf 500 oder so zu verlängern.
Ich kann es hier halt nicht nachstellen - sonst würde ich es selbst machen :slight_smile:

Nachtrag: Ich habe eben nochmal einen Commit gemacht. Die Subtraktion aus o.g. Code-Fragment war natürlich falsch rum :clown_face:.

Hallo Torsten,

danke für die Updates. Leider klappt es noch nicht. Das IF wird nicht betreten (ich habe die Schwelle auf 1000 ms erhöht), jedoch startet die Playlist dennoch von vorne (der State geht auf 4 == RFID_PN5180_NFC15693_STATE_RESET).

           } else {
                // Reset to dummy-value if no card is there
                // Necessary to differentiate between "card is still applied" and "card is re-applied again after removal"
                // lastTimeDetected14443 is used to prevent "new card detection with old card" with single events where no card was detected
                Serial.print("*** No card detected! *** at time ");
                Serial.println(millis());
                Serial.print("*** Last seen at time ");
                Serial.println(lastTimeDetected14443);
                if (!lastTimeDetected14443 || (millis() - lastTimeDetected14443 >= 1000)) {
                    Serial.println("*** No card detected timeout exeeded *** at time ");
                    Serial.println(millis());
                    lastTimeDetected14443 = 0;
                    for (uint8_t i=0; i<cardIdSize; i++) {
                        lastCardId[i] = 0;
                    }
                }

gibt folgende Ausgabe (mit der Ausgabe des States am Anfang von Rfid_Read):

*** In Rfid_Read with state 3
*** In Rfid_Read with state 1
*** In Rfid_Read with state 2
*** In Rfid_Read with state 3
*** In Rfid_Read with state 1
*** In Rfid_Read with state 2
*** In Rfid_Read with state 3
*** In Rfid_Read with state 1
*** In Rfid_Read with state 2
*** In Rfid_Read with state 3
*** No card detected! *** at time 71221
*** Last seen at time 70884
*** In Rfid_Read with state 4
*** In Rfid_Read with state 5
*** In Rfid_Read with state 6
*** In Rfid_Read with state 7
*** In Rfid_Read with state 1
*** In Rfid_Read with state 2
*** In Rfid_Read with state 3
RFID-Karte erkannt: 15-b3-33-28
RFID-Karte empfangen: 021179051040
Playlist-Generierung: cached
Freier Speicher: 65532
Gebe Speicher der alten Playlist frei.
Freier Speicher nach Aufräumen: 67876
Anzahl gültiger Files: 21

Kein Stress - ich kann das auch später mal selbst debuggen. Gibt es da eigentlich in Visual Studio Code eine bessere Möglichkeit als Serial.print?

Grüße
Johannes

Grundsätzlich geht das mit dem Debuggen via jtag schon. Das Problem ist halt nur, dass man dafür gpios braucht. Und die sind halt nicht frei.

Zum Code: Vielleicht muss man, wenn man den ersten Event „keine Karte“ bekommt, die State-Machine wieder auf 3 setzen.

Nachtrag: Ich denke das Problem liegt darin, dass wenn einmal „No card“ kommt, die State-Machine dann runter in die NFC15693-Behandlung geht. Und dort wird dann, weil keine Karte erkannt wird, lastCardId auf einen Dummy-Wert gesetzt. Anschließend kommt dann wieder NFC14443 und dort wird die Karte wieder erkannt. Da die NFC15693-Behandlung jedoch vorher den Dummy-Wert gesetzt hat, unterscheiden sich die IDs und es wird damit eine neue Karte erkannt. Kurzum: Denke mein Ansatz war schon gut, wird jedoch ausgehebelt. Glaube meine Vermutung ist nicht so schlecht, dass man im ersten Event „keine Karte“ die State-Machine nochmal zurücksetzt. Vielleicht (aus der Hüfte geschossen!) so:

            if (!lastTimeDetected14443 || (millis() - lastTimeDetected14443 >= 400)) {
                lastTimeDetected14443 = 0;
                for (uint8_t i=0; i<cardIdSize; i++) {
                    lastCardId[i] = 0;
                }
            } else {
                stateMachine = RFID_PN5180_NFC14443_STATE_ACTIVE;
            }

Je kürzer man die Zeit (anstelle 400) machen kann, desto besser.

1 „Gefällt mir“

Top, das Neusetzen der state machine im else-Zweig hatte noch gefehlt. Jetzt läuft es wie erwartet durch. Und kurzes Wegnehmen und Neuauflegen startet das Album neu.

Die deltas liegen bei mir zw. 290 und 320 ms, so dass ich bei den 400 ms bleibe.

Vielen Dank und viele Grüße
Johannes

1 „Gefällt mir“

Ok, danke für deine Rückmeldung.
Habe das eben eingecheckt.

Hallo,

mit den ISO-14443 Karten klappt es nun ja hervorragend. Diese Karten setze ich hier normalerweise ein.

Jetzt habe ich es mal mit einer ISO-15693 Karte getestet. Beim Liegenlassen der Karte (mit einem zwei Tage alten Software-Stand, refactoring branch) startete das Album immer wieder von vorne:

*** Rfid_Read *** in state 1
*** Rfid_Read *** in state 2
*** Rfid_Read *** in state 3
*** Rfid_Read *** in state 4
*** Rfid_Read *** in state 5
*** Rfid_Read *** in state 6
*** Rfid_Read *** in state 7
RFID-Karte erkannt: 53-75-32-0a
RFID-Karte empfangen: 083117050010
Playlist-Generierung: cached
Freier Speicher: 64268
Gebe Speicher der alten Playlist frei.
Freier Speicher nach Aufräumen: 66464
Anzahl gültiger Files: 26
Modus: Hoerspiel
*** Rfid_Read *** in state 4
Neue Playlist empfangen mit 26 Titel(n)
Free heap: 65824
info        : buffers freed, free Heap: 89164 bytes
info        : Reading file: "/Audiobooks/artist/album/01_Track_01.mp3"
MQTT-Nachricht empfangen: [Topic: Cmnd/ESPuino/LedBrightness] [Command: 0]
info        : MP3Decoder has been initialized, free Heap: 67160 bytes
*** Rfid_Read *** in state 5
MQTT-Nachricht empfangen: [Topic: Cmnd/ESPuino/LedBrightness] [Command: 16]
*** Rfid_Read *** in state 6
*** Rfid_Read *** in state 7
'/Audiobooks/artist/album/01_Track_01.mp3' wird abgespielt (1 von 26)
info        : stream ready
...
info        : BitRate: 128000
*** Rfid_Read *** in state 1
*** Rfid_Read *** in state 2
*** Rfid_Read *** in state 3
*** Rfid_Read *** in state 4
*** Rfid_Read *** in state 5
*** Rfid_Read *** in state 6
*** Rfid_Read *** in state 7
RFID-Karte erkannt: 53-75-32-0a
RFID-Karte empfangen: 083117050010
Playlist-Generierung: cached
Freier Speicher: 64148
Gebe Speicher der alten Playlist frei.
Freier Speicher nach Aufräumen: 66340
Anzahl gültiger Files: 26
Modus: Hoerspiel
*** Rfid_Read *** in state 4
Neue Playlist empfangen mit 26 Titel(n)
Free heap: 65704
info        : buffers freed, free Heap: 89044 bytes
info        : Reading file: "/Audiobooks/artist/album/01_Track_01.mp3"
MQTT-Nachricht empfangen: [Topic: Cmnd/ESPuino/LedBrightness] [Command: 0]
info        : MP3Decoder has been initialized, free Heap: 67036 bytes
*** Rfid_Read *** in state 5
MQTT-Nachricht empfangen: [Topic: Cmnd/ESPuino/LedBrightness] [Command: 16]
*** Rfid_Read *** in state 6
*** Rfid_Read *** in state 7
'/Audiobooks/artist/album/01_Track_01.mp3' wird abgespielt (1 von 26)
info        : stream ready
...
info        : BitRate: 128000
*** Rfid_Read *** in state 1
*** Rfid_Read *** in state 2
*** Rfid_Read *** in state 3
*** Rfid_Read *** in state 4
*** Rfid_Read *** in state 5
*** Rfid_Read *** in state 6
*** Rfid_Read *** in state 7
RFID-Karte erkannt: 53-75-32-0a

Heute nach git pull startet der ESP beim Auflegen der Karte ständig neu. (Kann aber auch unabhängig von der Kartenart sein und daran liegen, dass es ein Hörbuch ist und bei Track 5 gestartet werden soll. Über die Weboberfläche lasst sich der Track allerdings abspielen):

*** Rfid_Read *** in state 6
*** Rfid_Read *** in state 7
'/Audiobooks/artist/album/05_Track_05.mp3' wird abgespielt (5 von 26)
*** Rfid_Read *** in state 1
info        : stream ready
info        : Content-Length: 1523430
info        : file has no mp3 tag, skip metadata
info        : Audio-Length: 1523430
info        : syncword found at pos 1
info        : syncword found at pos 0
info        : MP3 decode error -6 : INVALID_FRAMEHEADER
info        : syncword found at pos 0
info        : MP3 decode error -6 : INVALID_FRAMEHEADER
info        : syncword found at pos 52
info        : syncword found at pos 0
info        : MP3 decode error -6 : INVALID_FRAMEHEADER
info        : syncword found at pos 43
info        : syncword found at pos 0
info        : MP3 decode error -6 : INVALID_FRAMEHEADER
info        : syncword found at pos 13
info        : syncword found at pos 0
info        : MP3 decode error -9 : INVALID_HUFFCODES
info        : syncword found at pos 94
info        : syncword found at pos 0
info        : MP3 decode error -9 : INVALID_HUFFCODES
info        : syncword found at pos 141
info        : syncword found at pos 0
E (108739) I2S: clkmdiv is too large

info        : Channels: 0
info        : SampleRate: 0
info        : BitsPerSample: 16
info        : BitRate: N/A
Guru Meditation Error: Core  1 panic'ed (IntegerDivideByZero). Exception was unhandled.
Core 1 register dump:
PC      : 0x400e6e57  PS      : 0x00060d30  A0      : 0x800e71b8  A1      : 0x3ffdc0f0  
A2      : 0x3ffc4c94  A3      : 0x3ffc7094  A4      : 0x000001f8  A5      : 0x00000000  
A6      : 0x3ffc5094  A7      : 0x3ffc7194  A8      : 0x800e6e54  A9      : 0x3ffdc0d0  
A10     : 0x00000000  A11     : 0x3ffc5094  A12     : 0x400d45a0  A13     : 0x00000000  
A14     : 0x3ffc5094  A15     : 0x00000000  SAR     : 0x00000004  EXCCAUSE: 0x00000006  
EXCVADDR: 0x00000000  LBEG    : 0x400014fd  LEND    : 0x4000150d  LCOUNT  : 0xffffffff  

ELF file SHA256: 0000000000000000

Backtrace: 0x400e6e57:0x3ffdc0f0 0x400e71b5:0x3ffdc130 0x400ea0d9:0x3ffdc160 0x400d3f09:0x3ffdc180 0x40092cfa:0x3ffdc2c0

Rebooting...

Irgendwelche Ideen, woran das liegen kann?

Edit: Das Problem mit dem Neustart lag wohl an der im NVS gespeicherten Abspielposition. Diese habe ich recht umständlich zurückgesetzt, indem ich hier:

den Wert für gPlayProperties.startAtFilePos im Code auf 0 gesetzt habe. Nach einmen erneuten Nutzen der Karte mit ordentlichem Beenden (zum Abspeichern einer neuen Position) war die Karte wieder zu nutzen. Gibt es da eine elegantere Variante, einen defekten Wert loszuwerden, ohne Codeänderung und neu flashen? (Der Import einer korrigierten Version der Backup.txt hat nicht funktioniert, da glaube ich bestehende Einträge nicht angefasst werden.)

Grüße
Johannes

Also was mir irgendwie auffällt ist, dass die Statemachine offenbar immer wieder bei 1 anfängt. Das ist für ISO-14443 ok, aber für ISO-15693 nicht. Hintergrund ist, dass ich, wenn ISO-14443 aktiv ist, nur die zugehörigen States durchlaufen will und nicht die für ISO-15693. Und umgekehrt gilt natürlich das Gleiche. Ergo dürften, wenn ISO-15693 aktiv ist, auch nur die States 4 bis 7 durchlaufen werden.

Ich vermute mal, dass der Grund dafür Folgendes ist:

if (memcmp((const void *)cardId, (const void *)lastCardId, sizeof(cardId)) == 0) {
                // reset state machine
                stateMachine = RFID_PN5180_NFC14443_STATE_RESET;
                return;
}

Vielleicht klappt es, wenn man das durch

if (memcmp((const void *)cardId, (const void *)lastCardId, sizeof(cardId)) == 0) {
	if (stateMachine == RFID_PN5180_NFC14443_STATE_ACTIVE) {
		stateMachine = RFID_PN5180_NFC14443_STATE_RESET;
		return;
	} else if (stateMachine == RFID_PN5180_NFC15693_STATE_ACTIVE) {
		stateMachine = RFID_PN5180_NFC15693_STATE_RESET;
		return;
	}
}

ersetzt. Ist aber gut möglich, dass das noch nicht reicht. Müsste ich mich tiefer reindenken und es am besten auch testen.

Ich muss gerade mal blöd fragen: Hast du eine Toniefigur verwendet oder wird bei den PN5180 auch direkt ein NFC15693 mitgeliefert? Hab’s noch nie getestet wenn ich ehrlich bin. Sind ja immer zwei dabei in der Packung (Karte und Schlüsselanhänger). Weil ich hätte sonst gar keinen NFC dafür hier.

Refactoring ist auf jeden Fall gut. Am Master-Branch habe ich schon lange keine Änderungen mehr diesbzgl. durchgeführt.

Ich habe meine dem Reader beiliegenden Tags mal am Handy mit der TagInfo App gecheckt, es wurden mir alle als ISO14443 gezeigt. Konnte daher auch nur mit einer Toniefigur testen :confused: Er kommt bei mir allerdings auch nie über RFID_PN5180_NFC15693_STATE_GETINVENTORY hinaus (meldet immer rc = -1).

In deinem Code solltest du die if Statements noch von = auf == ändern.

Hast du da ein Beispiel?

In deinem Snippet oben machst du ein Assignment ( = stateMachine) statt einer Evaluation ( == stateMachine).

            if (memcmp((const void *)cardId, (const void *)lastCardId, sizeof(cardId)) == 0) {
                // reset state machine
                if (RFID_PN5180_NFC14443_STATE_ACTIVE == stateMachine) {
                    stateMachine = RFID_PN5180_NFC14443_STATE_RESET;
                    return;
                } else if (RFID_PN5180_NFC15693_STATE_ACTIVE == stateMachine) {
                    stateMachine = RFID_PN5180_NFC15693_STATE_RESET;
                    return;
                }
            }
2 „Gefällt mir“

Danke. Was wäre ich nur ohne die Compilerwarnungen?! :joy:
Glaub ich muss mir mal ne Toniefigur ausleihen. Sonst komme ich da nicht weiter. Oder @tueddy muss ran :slight_smile:

Die Figuren gibt es u.a. in einigen Bibliotheken. Ich habe bisher leider den Debug-Modus der angepassten PN5180 Library von @tueddy nicht zum Laufen bekommen. Der Linker scheitert mit collect2.exe: error: ld returned 1 exit status und diversen undefined reference Notices).

Ich glaube aber inzwischen fast, dass mein Reader defekt ist. Wird sich zeigen, wenn ich den espuino auf Platine umbaue :see_no_evil:

Im PN5180 Paket liegt eine Karte und ein Schlüsselanhänger bei, beides sind ISO-15693 Tags.
Man erkennt das an der besseren Reichweite und in der Debug-Ausgabe. Man kann mit diesen Tags gut testen.

Ein Tonie ist ein ISO-15693 Tag der sich aber zunächst totstellt (Privacy-Mode). Erst wenn er mit dem privacy Kennwort entsperrt ist kann man die UID auslesen. Das Kennwort hat jemand herausgeschnüffelt, ein entsprechender Link ist im Quelltext vermerkt. Also ein Geheimnis welches keines ist. Wer Tonies auf dem ESPuino verwenden möchte wurschtelt sich einmal durch den IFixit-Thread, dort steht es drin.
Habe leider gerade aus Zeitgründen keine Möglichkeit das refactoring zu testen, sollte aber mit der beiliegenden Karte ohne Probleme möglich sein.

Schöne Grüße
tueddy

Danke für die Infos @tueddy!

@ ckaotik Komisch das das bei Dir nicht kompiliert.
Vielleicht schaust Du einmal ob ein sich ein einfaches Demo aus der PN5180 Bibliothek kompilieren und starten lässt?

Also das funktioniert auf jeden Fall so mit ISO-15963. Habe das eben mal kurz getestet, nachdem ich tatsächlich eine passende Karte gefunden habe.
@tueddy Habe drei PN5180 hier, die noch original verpackt waren. Nur einer der sechs (3x2) RFID-tags war ISO-15963.

Das mit der Reichweite war mir vorher gar nicht so klar. Habe das vorhin mal gemessen: Im offenen Aufbau wurde die Karte ab einer Entfernung von etwa 12/13cm erkannt.

… und mit @ckaotik s Variante, die Konstante auf die linke Seite zu ziehen, wäre es sogar ein Compilerfehler geworden :wink: Das ist in Deinem Code ja auch oft so gemacht; hier in der Datei könnte man das noch an zwei Stellen nachziehen:

Die Anpassungen haben mein Problem gelöst, vielen Dank.

Bei meinen zwei PN5180-Readern waren auch nur ISO 14443 Karten / Schlüsselanhänger dabei. Allerdings hatte ich hier noch alte Skipässe, bei den TagInfo sagt, es seien ISO/IEC 15693 kompatible Karten. Die wollte ich jetzt mal am ESPuino nutzen. (Eine alte Hotel-Zugangskarte liefert am ESPuino auch eine konstante ID zurück im 15693-Zweig, TagInfo am Handy kann die allerdings nicht lesen sondern spricht von „serious errors communicating with the tag“.)