D1 Mini ESP8266 mit RFID mfrc522

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
pali
User
Beiträge: 7
Registriert: Montag 14. Januar 2019, 22:32

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!!!
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Dafür ist ja `stat` da, um bei einem Lesefehler das ganze zu wiederholen.
pali
User
Beiträge: 7
Registriert: Montag 14. Januar 2019, 22:32

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.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

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)
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
pali
User
Beiträge: 7
Registriert: Montag 14. Januar 2019, 22:32

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
pali
User
Beiträge: 7
Registriert: Montag 14. Januar 2019, 22:32

@__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
pali
User
Beiträge: 7
Registriert: Montag 14. Januar 2019, 22:32

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...
Antworten