Hallo zusammen,
ich versuche seit über einem Monat, zwei MFRC522-RFID-Reader gleichzeitig mit meinem Raspberry Pi 3 Model B (Version 1.2) zu betreiben, leider ohne Erfolg.
Mein Ziel ist es, dass beide Reader parallel arbeiten und unabhängig voneinander Tags erkennen und auslesen können. Ich verwende Python mit dem
spidev
-Modul und habe jedem Reader eine eigene SPI-Schnittstelle zugewiesen:
- Reader 1: SPI0 (Bus 0, Device 0), RST auf GPIO25
- Reader 2: SPI1 (Bus 1, Device 0), RST auf GPIO17
Beide Reader sind korrekt verkabelt. SPI1 ist über Device Tree aktiviert, und ich verwende keine gemeinsamen CS-Pins. Ich habe eine eigene Klasse für MFRC522 geschrieben, um jeweils ein SPI-Device und einen RST-Pin zu verwenden. Hier ist der relevante Python-Code:
python
import spidev
import RPi.GPIO as GPIO
import time
class MFRC522:
def __init__(self, spi_bus, spi_device, rst_pin):
self.spi = spidev.SpiDev()
self.spi.open(spi_bus, spi_device)
self.spi.max_speed_hz = 1000000
self.spi.mode = 0
self.rst = rst_pin
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(self.rst, GPIO.OUT)
GPIO.output(self.rst, 1)
self.reset()
def reset(self):
GPIO.output(self.rst, 0)
time.sleep(0.1)
GPIO.output(self.rst, 1)
time.sleep(0.1)
def send(self, addr, val):
self.spi.xfer2([(addr << 1) & 0x7E, val])
def read(self, addr):
val = self.spi.xfer2([((addr << 1) & 0x7E) | 0x80, 0])
return val[1]
def scan_for_tag(self):
self.send(0x01, 0x0C) # PCD_TRANSCEIVE
self.send(0x0D, 0x87) # BitFramingReg
self.send(0x0C, 0x26) # Request idle
time.sleep(0.01)
return self.read(0x0A) != 0 # FIFOLevelReg
def get_uid(self):
self.send(0x0D, 0x87)
self.spi.xfer2([0x93, 0x20]) # Anticollision
time.sleep(0.01)
resp = self.spi.xfer2([0x93, 0x20] + [0]*5)
uid = resp[2:6]
return ':'.join([hex(x)[2:].upper().zfill(2) for x in uid])
def cleanup(self):
self.spi.close()
GPIO.cleanup(self.rst)
# Konfiguration der Reader
reader1 = MFRC522(spi_bus=0, spi_device=0, rst_pin=25) # SPI0
reader2 = MFRC522(spi_bus=1, spi_device=0, rst_pin=17) # SPI1
try:
print("Starte RFID-Scanner (STRG+C zum Beenden)")
while True:
if reader1.scan_for_tag():
uid1 = reader1.get_uid()
print(f"Reader 1 UID: {uid1}")
if reader2.scan_for_tag():
uid2 = reader2.get_uid()
print(f"Reader 2 UID: {uid2}")
time.sleep(0.5)
except KeyboardInterrupt:
print("\nBeende...")
finally:
reader1.cleanup()
reader2.cleanup()
Das Problem: Keiner der beiden Reader erkennt zuverlässig Tags. Der zweite reagiert manchmal, oft aber gar nicht oder liefert keine UID. Ich habe bereits unterschiedliche Polling-Intervalle, Resets und sogar die Versorgungsspannung überprüft, aber ohne Erfolg.
so habe ich meine MFRC522 Reader angeschlossen:
Hat jemand Erfahrung damit oder Ideen, wie ich beide MFRC522 zuverlässig gleichzeitig betreiben kann? Gibt es vielleicht Timing-Probleme, Konflikte zwischen den SPI-Bussen oder brauche ich spezielle Initialisierung?
Ich bin für jede Hilfe dankbar!