RFID und LED

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
TribbleX
User
Beiträge: 11
Registriert: Montag 20. März 2017, 20:14

Hallo,
ich bin unwissend :(

Ich möchte gerne, dass von einem RFID-Transponder die uid ausgelesen wird.
Je nach Transponder soll dann eine andere LED aufleuchten.
Bei dem LED-Code - der unabhängig - vom RFID-Code läuft, hängt sich der Code auf ... und ich weiss nicht, warum.
Vielleicht habt ihr ja einen Tipp für mich und könnt mit dem Fehler was anfangen:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf8 -*-
import RPi.GPIO as GPIO
import MFRC522
import signal
import sys
import time

# !/usr/bin/python
# -*- coding: utf-8 -*-

LED_1 = 20 #rot
LED_2 = 4  #gelb
LED_3 = 27 # gruen
DELAY = 1

continue_reading = True

# Capture SIGINT for cleanup when the script is aborted
def end_read(signal,frame):
    global continue_reading
    print "Ctrl+C captured, ending read."
    continue_reading = False
    GPIO.cleanup()

# Hook the SIGINT
signal.signal(signal.SIGINT, end_read)

# Create an object of the class MFRC522
MIFAREReader = MFRC522.MFRC522()

# Welcome message
print "Welcome to the MFRC522 data read example"
print "Press Ctrl-C to stop."

# This loop keeps checking for chips.
# #If one is near it will get the UID and authenticate
while continue_reading:

    # Scan for cards
    (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)

    # If a card is found
    if status == MIFAREReader.MI_OK:
        print "Card detected"
    
    # Get the UID of the card
    (status,uid) = MIFAREReader.MFRC522_Anticoll()

        # If we have the UID, continue
    if status == MIFAREReader.MI_OK:
        karten_id0 = "" + str(uid[0]) + ""
        karten_id1 = "" + str(uid[1]) + ""
        karten_id2 = "" + str(uid[2]) + ""
        karten_id3 = "" + str(uid[3]) + ""
        karten_gesamt = karten_id0 + karten_id1 + karten_id2 + karten_id3
        # ", str(uid[1]), str(uid[2]), str(uid[3])"
        # Print UID
        if karten_gesamt == "134194169187":
            print "hallo uid"

            if __name__ == '__main__':  # Programmstart
                GPIO.setmode(GPIO.BCM)  # GPIO-Nummer verwenden
                GPIO.setwarnings(False)  # Warnungen ausschalten
                GPIO.setup(LED_2, GPIO.OUT)  # Pin als Ausgang verwenden

                try:
                    while True:
                        GPIO.output(LED_2, GPIO.LOW)
                        time.sleep(1)
                        GPIO.output(LED_2, GPIO.HIGH)
                        time.sleep(DELAY)

                except KeyboardInterrupt:  # wenn 'CTRL-C' gedrückt, dann Ende
                    GPIO.cleanup()  # RESET, GPIO-Pins freigeben
                    sys.exit()
        else:
            print "das war nichts"

        # print "Card read UID: "+str(uid[0])+","+str(uid[1])+","+str(uid[2])+","+str(uid[3])
        #print karten_gesamt
        #print ""+str(uid[0])+""
        # This is the default key for authentication
        key = [0xFF,0xFF,0xFF,0xFF,0xFF,0xFF]

        # Select the scanned tag
        MIFAREReader.MFRC522_SelectTag(uid)

        # Authenticate
        status = MIFAREReader.MFRC522_Auth(MIFAREReader.PICC_AUTHENT1A, 8, key, uid)

        # Check if authenticated
        if status == MIFAREReader.MI_OK:

            MIFAREReader.MFRC522_Read(8)
            MIFAREReader.MFRC522_StopCrypto1()

        else:
            print "Authentication error"
Der Fehler ist in Zeile 63:
GPIO.setmode(GPIO.BCM)
ValueError: A different mode has already been set!
Zuletzt geändert von Anonymous am Mittwoch 24. Mai 2017, 11:18, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
noisefloor
User
Beiträge: 3829
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

irgendwo anders, vielleicht auch in einem importierten Modul, kommt wohl auch die Zeile `GPIO.setmode(...)`, nur das da nicht der `GPIO.BCM` Modus benutzt wird, sondern dann wohl `GPIO.BOARD`. Beides gleichzeitig geht nicht, daher der Fehler.

Den Fehler solltest du recht einfach eliminieren können, indem du deinen Modus auch auf `GPIO.BOARD` umstellst.
Was dann noch nicht behoben wäre ist das doppelte setzen des GPIO-Modus, was ja auch wenig Sinn macht.

Gruß, noisefloor
BlackJack

@TribbleX: Ergänzend zu noisfloor: Es reicht natürlich nicht nur den Modus nicht oder anders zu setzen, Du musst die Pinnummern im Code dann natürlich noch entsprechend anpassen.

So ganz grundsätzlich kann nicht einfach zwei Quelltexte zusammenkopieren und die Codeblöcke ein bisschen hin und her schieben, in der Hoffnung das da ein sinnvolles, funktionierendes Programm bei heraus kommt.

Das Beispielprogramm das Du vom `MFRC522`-Projekt übernommen hast, ist ausserdem zu umständlich was den Abbruch per `signal` angeht. Das hat offenbar ein C-Programmierer und kein Python-Programmierer geschrieben. Die ganze API sieht ziemlich gruselig aus, mit den ganzen MFRC522-Wiederholungen in den Namen, der einen Gott-Klasse, den Rückgabetupeln mit dem Statuswert und dem ignorieren vom Style Guide for Python Code was die Namensschreibweisen angeht.

Der Test auf die Karten-ID ist nicht robust. Du pappst da einfach die Dezimaldarstellungen der vier Komponenten aneinander und vergleichst die dann. Das funktioniert bei dieser Nummer nur zufällig weil alle vier Komponenten mindestens den Wert 100 haben. Das wird nicht mit beliebigen Karten-IDs eindeutig funktionieren.
TribbleX
User
Beiträge: 11
Registriert: Montag 20. März 2017, 20:14

Vielen Dank für das Feedback. Ich werde mich noch mal dran setzen und den Code entsprechend überarbeiten.
Antworten