0

I wanted to connect 2 RC522 to my Raspberry Pi. I Followed the instructions from here. But then I got the error message:

/usr/local/lib/python3.9/dist-packages/mfrc522/MFRC522.py:151: RuntimeWarning: This channel is already in use, continuing anyway.  Use GPIO.setwarnings(False) to disable warnings.
  GPIO.setup(pin_rst, GPIO.OUT)
Traceback (most recent call last):
  File "/home/pi/Desktop/rfid.py", line 63, in <module>
    data = nfc.read("reader1")
  File "/home/pi/Desktop/rfid.py", line 39, in read
    if not self.selectBoard(rid):
  File "/home/pi/Desktop/rfid.py", line 35, in selectBoard
    GPIO.output(self.boards[loop_id], loop_id == rid)
RuntimeError: The GPIO channel has not been set up as an OUTPUT

Can someone help me what I am doing wrong?

Dougie
  • 5,381
  • 11
  • 22
  • 30
Martin
  • 9
  • 3

1 Answers1

0

after a long search I found a working answer for the error: "RuntimeError: The GPIO channel has not been set up as an OUTPUT":

The problem really is as it says. The used GPIO Pins (here 5 and 6) are not set as an output. To do that at the beginnig of the script you have to add:

GPIO.setmode(GPIO.BCM)               
GPIO.setup(5, GPIO.OUT)
GPIO.setup(6, GPIO.OUT)

So the whole script would look like(for two RC522 readers):

import RPi.GPIO as GPIO
from mfrc522 import SimpleMFRC522
import spidev

GPIO.setmode(GPIO.BCM)
GPIO.setup(5, GPIO.OUT) GPIO.setup(6, GPIO.OUT)

class NFC(): def init(self, bus=0, device=0, spd=1000000): self.reader = SimpleMFRC522() self.close() self.bus self.boards = {}

    self.bus = bus
    self.device = device
    self.spd = spd

def reinit(self):
    self.reader.READER.spi = spidev.SpiDev()
    self.reader.READER.spi.open(self.bus, self.device)
    self.reader.READER.spi.max_speed_hz = self.spd
    self.reader.READER.MFRC522_Init()

def close(self):
    self.reader.READER.spi.close()

def addBoard(self, rid, pin):
    self.boards[rid] = pin

def selectBoard(self, rid):
    if not rid in self.boards:
        print(&quot;readerid &quot; + rid + &quot; not found&quot;)
        return False

    for loop_id in self.boards:
        GPIO.output(self.boards[loop_id], loop_id == rid)
    return True

def read(self, rid):
    if not self.selectBoard(rid):
        return None

    self.reinit()
    cid, val = self.reader.read_no_block()
    self.close()

    return val

def write(self, rid, value):
    if not self.selectBoard(rid):
        return False

    self.reinit()
    self.reader.write_no_block(value)
    self.close()
    return True


if name == "main": nfc = NFC() nfc.addBoard("reader1",5) nfc.addBoard("reader2",6)

data = nfc.read(&quot;reader1&quot;)
nfc.write(&quot;reader2&quot;,data)

I hope this will help others :)

Martin
  • 9
  • 3