Wie kann ich zwei MFRC522-RFID-Reader gleichzeitig mit einem Raspberry Pi 3 Model B verwenden?
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!
Funktioniert denn ein Reader alleine mit deinem Code?
fast nie , denke das ich einen neuen Code brauchen werde
1 Antwort
Häng den IRQ Pin an und lies dessen Level. Sofern ein Tag in der Nähe ist sollte der auf Low gehen. Versuch mal die Datenabfrage nur wenn IRQ Low ist.
Außerdem nimm mal einen Reader weg und machs mit einem mal stabil. Orientiere dich an bestehenden Libraries.