Seite 1 von 1

D1 Mini ESP8266 mit RFID mfrc522

Verfasst: Montag 14. Januar 2019, 22:53
von pali
Hallo zusammen,

ich habe das nachfolgende Problem beim Lesen von RFID Karten und finde leider dafür keine Lösung :-(


Zur Erkennung von RFID Karten/Chips, nutze ich den D1 Mini und MFRC522. Als Software verwende ich micropython (was anderes kann ich nicht ;-) )

Im Prinzip war die Schaltung einfach vollzogen, und als Python Funktionen benutze ich diese hier (mfrc522.py):

https://github.com/wendlers/micropython-mfrc522


Zum Lesen der Karte wird dann diese Datei aufgerufen:


Code: Alles auswählen

import mfrc522
from os import uname
import time

global rdr

if uname()[0] == 'WiPy':
    rdr = mfrc522.MFRC522("GP14", "GP16", "GP15", "GP22", "GP17")
elif uname()[0] == 'esp8266':
    rdr = mfrc522.MFRC522(0, 2, 4, 5, 14)
else:
    raise RuntimeError("Unsupported platform")

print("")
print("Place card before reader to read from address 0x08")
print("")




def uid(raw_uid):
    return "0x%02x%02x%02x%02x" % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])

def readCard():
    (stat, tag_type) = rdr.request(rdr.REQIDL)

    if stat == rdr.OK:
        (stat, raw_uid) = rdr.anticoll()
        # print(stat, raw_uid)

        if stat == rdr.OK:
            # print("New card detected")
            print('----------------')
            print(raw_uid)
            print(uid(raw_uid))
            print("")
        else:
            print('rdr.anticoll XXXX')

    else:
        print('rdr.OK XXXX')


def do_read():
    try:
        i=0
        while True:
            i=i+1
            print(i)
            readCard()



    except KeyboardInterrupt:
        print("Bye")

Der Code funktioniert, zumindest fast...

Der Ergebnis soll sein, dass bei einer erkannten Karte die UID ausgegeben wird und bei einer nicht erkannten Karte XXXX... davor kommt jeweils eine laufende Zahl ...


Mein Problem besteht nun darin, dass, wenn ich eine Karte auf den Reader drauf lege, so würde ich vermuten, müsste dieser mir ständig die UID dieser Karte zurückgeben.

Leider macht er das nicht. Nur bei exakt jedem zweitem Rückgabewert erhalte ich die UID ansonsten XXXX (also ob kein Chip erkannt worden wäre).

Das selbe passiert mit unterschiedlichen Karten oder Chips.


Der Output in picocom sieht dann wie folgt aus:


>>>

>>> import read1


Place card before reader to read from address 0x08


>>> read1.do_read()

1

----------------

[101, 82, 139, 171, 23]

0x65528bab


2

rdr.OK XXXX

3

----------------

[101, 82, 139, 171, 23]

0x65528bab


4

rdr.OK XXXX

5

----------------

[101, 82, 139, 171, 23]

0x65528bab


6

rdr.OK XXXX

7

----------------

[101, 82, 139, 171, 23]

0x65528bab


8

rdr.OK XXXX

9

----------------

[101, 82, 139, 171, 23]

0x65528bab


10

rdr.OK XXXX

11

----------------

[101, 82, 139, 171, 23]

0x65528bab


12

rdr.OK XXXX




Für mich ist das eher nicht ganz zufriedenstellend ...o der ist das Verhalten des Readers normal? Habt Ihr ähnliche Erfahrungen gesammelt mit einem esp oder auch mit Raspi?


Vielen Dank für Eure Unterstützung!!!

Re: D1 Mini ESP8266 mit RFID mfrc522

Verfasst: Montag 14. Januar 2019, 23:33
von Sirius3
Dafür ist ja `stat` da, um bei einem Lesefehler das ganze zu wiederholen.

Re: D1 Mini ESP8266 mit RFID mfrc522

Verfasst: Dienstag 15. Januar 2019, 10:26
von pali
was meinst Du mit "wiederholen"?

ich habe die Funktion ein wenig umgeschrieben, um das Problem evtl. besser zu verdeutlichen:

Code: Alles auswählen

def readCard():
	(stat, tag_type) = rdr.request(rdr.REQIDL)

	print('A:\t', stat, rdr.OK, tag_type)

	if stat == rdr.OK:

		(stat, raw_uid) = rdr.anticoll()
		# print(stat, raw_uid)

		if stat == rdr.OK:
			print('B:\t', stat, rdr.OK)
			
			print(raw_uid)
			print(uid(raw_uid))
			print("")


def do_read():
	try:
		i=0
		# time.sleep(6)
		while True:
			i=i+1
			print(i)
			readCard()



	except KeyboardInterrupt:
		print("Bye")

Die Ausgabe sind dann so aus:
import read
>>> read.do_read()
1
A: 0 0 16
B: 0 0
[118, 20, 199, 147, 54]
0x7614c793

----------------
2
A: 2 0 0
----------------
3
A: 0 0 16
B: 0 0
[118, 20, 199, 147, 54]
0x7614c793

----------------
4
A: 2 0 0
----------------
5
A: 0 0 16
B: 0 0
[118, 20, 199, 147, 54]
0x7614c793

----------------
6
A: 2 0 0
----------------
7
A: 0 0 16
B: 0 0
[118, 20, 199, 147, 54]
0x7614c793

----------------


Hier sieht man, dass der Reader beim ersten Mal die Karte erkennt und beim zweiten Mal wieder nicht. D.h., das Programm spring nicht einmal in das zweite if hinein usw.
Der stat == 2, was offebbar auf einen ERR zurückgeht (Karte wohl nicht erkannt) aus der Datei mfrc522.py.

Re: D1 Mini ESP8266 mit RFID mfrc522

Verfasst: Dienstag 15. Januar 2019, 10:51
von Sirius3
Wiederholen meint, die Abfrage nochmal durchführen, bis der Fehler nicht mehr auftritt:

Code: Alles auswählen

def read_card(retries=4):
    for _ in range(retries):
        stat, tag_type = rdr.request(rdr.REQIDL)
        if stat == rdr.OK:
            stat, raw_uid = rdr.anticoll()
            if stat == rdr.OK:
                return uid(raw_uid)
    raise RuntimeError("read failed", stat)

while True:
    try:
        print(read_card())
    except RuntimeError:
        print("no card detected")
        time.sleep(1)

Re: D1 Mini ESP8266 mit RFID mfrc522

Verfasst: Dienstag 15. Januar 2019, 10:55
von __deets__
Da dein Code keinen Fehler im Sinne von "jedes zweite mal das falsche machen" enthaelt, und das MFRC522 Modul ist wie es ist, musst du halt um dein Verhalten herumprogrammieren. Ich verstehe auch ehrlich nicht gesagt, wo das Problem ist. Du liest die ganze Zeit vom Reader ein, dass es dabei zu fehlern kommt ist normal - so ist das halt mit RFID. Da kann die Verbindung mal kacke sein, und dann gibt es Datenmuell. Da du aber eine klare Rueckmeldung bekommst, wenn es geklappt hat, und die Daten dann sind, was sie sein sollen - was ist das Problem? Liest andauernd ein, und wenn du ein erfolgreiches Leseergebnis hast, verarbeite das weiter.

Re: D1 Mini ESP8266 mit RFID mfrc522

Verfasst: Dienstag 15. Januar 2019, 11:16
von pali
vielen Dank Euch beiden für die Antworten!!!

Eigentlich ging es mir tatsächlich um diese Aussage. Leider hatte ich bis dato keine Berührungspunkte mir RFID und wusste nicht, dass das Verhalten so "normal" ist.
Nachdem ich es weiß, ist es auch klarer. Denn derartiges Verhalten lässt ich eben einfach abfangen, etwa wie es Sirius3 vorgeschlagen hat.

Re: D1 Mini ESP8266 mit RFID mfrc522

Verfasst: Dienstag 15. Januar 2019, 12:41
von __blackjack__
@pali: Da das so regelmässig abwechselt, könnte man auch versuchen ob ein kleines `sleep()` zwischen den Abfragen hilft. Das System in so einer Dauerschleife wirklich 100% auszulasten macht ja sowieso wenig Sinn.

Re: D1 Mini ESP8266 mit RFID mfrc522

Verfasst: Dienstag 15. Januar 2019, 13:10
von pali
@__blackjack__
das hatte ich auch ursprünglich gemacht. Und auch hier ist die Regelmäßigkeit, zumindest für mich, irritierend

>>> read.do_read()
0:25:59
1
A: 0 0 16
B: 0 0
[118, 20, 199, 147, 54]
0x7614c793

----------------
0:26:8
2
A: 2 0 0
----------------
0:26:19
3
A: 0 0 16
B: 0 0
[118, 20, 199, 147, 54]
0x7614c793

----------------
0:26:28
4
A: 2 0 0
----------------
0:26:38
5
A: 0 0 16
B: 0 0
[118, 20, 199, 147, 54]
0x7614c793

----------------
0:26:47
6
A: 2 0 0
----------------
0:26:58
7
A: 0 0 16
B: 0 0
[118, 20, 199, 147, 54]
0x7614c793

----------------

D.h. mal wird die Karte erkannt dann sleep(10) dann wieder nicht.


Anschließend habe ich sogar mit sleep(30) versucht. Das Ergebnis war das selbe.

Irgendwie habe ich den Eindruck, es liegt an etwas anderem. Die Gleichmäßigkeit "stört" mich hier ein wenig ...
Hat evtl einer von Euch den RFID Reader an einem D1 angeschlossen gehabt? War das Verhalten dann bei Euch auch vergleichbar?

LG

Re: D1 Mini ESP8266 mit RFID mfrc522

Verfasst: Dienstag 22. Januar 2019, 22:44
von pali
https://github.com/Tasm-Devil/micropython-mfrc522-esp32

mit dieser Bibliothek und read.py funktioniert der RFID Reader so, wie ich es erhofft habe. Die Tags werden jedes Mal richtig erkannt.

Worin nun der Unterschied zwischen den Files besteht, habe ich nicht untersucht...