Raspberry Pi – die besten Beiträge

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!

Bild zum Beitrag
Code, Programmiersprache, Python, RFID, RFID-Chip, Raspberry Pi, ChatGPT