RC522 RFID und Raspberry Pi

Begonnen von kblc, 01 Mai 2015, 15:12:48

Vorheriges Thema - Nächstes Thema

kblc

Hallo Ihr lieben.

Ich habe da wieder mal eine Frage. Es geht um ein RFID und zwar RC522. Ich wollte das zusammen mit FHEM laufen lassen. Wenn ich die Karte/den Anhänger ranhalte, soll ein Licht angehen. Später kann ma ja auch noch eine Zugangskontrolle draus bauen. Aber erst mal würde ich das mit einem LED testen wollen. LED ist in FHEM angemeldet und funktioniert. Aber wo fange ich an, damit FHEM den RC522 erkennt und die Karten bzw. Anhänger auslesen kann.
Wäre toll, wenn mit jemand einen Tipp geben könnte.

http://www.nikolaus-lueneburg.de/2014/06/rfid-rc522-modul-mit-spi-schnittstelle/
Soweit bin ich schon.
Das funktioniert auch wunderbar.

Vielen Dank und leibe Grüße aus dem schönen Oberfranken
Kai
SPS, Arduino, Controllino, Sensortechnik, Elektronik

loskrachos

Hallo zusammen,

ich würde mich der Frage gerne anschließen und dem Thema damit ein wenig den Staub aus den Ritzen pusten. Evtl. findet sich ja doch jemand, der schon mal ähnliches realisiert hat.

Gruß aus dem mindestens genauso schönen Mittelfranken  ;)
Frank

NewRasPi

Oberfranken, Mittelfranken, da fehlt doch noch Unterfranken :-)
Hallo FHEM Gemeinde
gibt es den jetzt mitlerweile was neues um die RFID RF522 in FHEM einzubauen?
Die Anleitungen haben mich bisher noch nicht zu einem Ergebnis gebracht.
Was man letztendlich damit "steuert" ist ja jedem selbst überlassen. (um den Sicherheitsbedenken vorzubeugen)
Ich wäre für jeden zweckmässigen Rat dankbar.
Schöne Grüße aus Unterfranken.
Raspberry Pi 2 Mod B + Raspberry Pi 3 + Raspberry Pi4; HM Lan Adapter; 8 Kanal Relaiskarte; ca. 15x 1wire Temperatur Sensor DS18B20; 10x HC-SR501 Bewegungsmelder; 9x HM Rauchmelder HM-Sec-SD; HM Funk Fenstersensoren; HM Strommess-Zwischenstecker;

Stefan M.

Hallo zusammen
da mich das Thema zur Zeit auch interessiert würde ich gerne in kleines Projekt dazu starten und würde mich über Unterstützung freuen.

Punkte:
1.) Auswahl der Plattform Arduino oder RaspberryPi mit Beispiel für beide Plattformen
2.) Auswahl der Zusatzhardware bzw. Boards 
3.) Auswahl der Kommunikation mit FHEM mit möglichen Beispielen.
4.) Entscheidung ob ein Modul für FHEM erstellt bzw. benötigt wird.

Wer hat Lust etwas dazu beizutragen ?

LG
Stefan
FHEM auf 3 x RaspberryPi, 1 x Fritzbox,1 x Win. FS20 über CUL, HomeMatic über HMLan, 6 x  HM_CC_RT_DN,2 x HM_LC_BL1_FM,3 x HM_SEC_KEY,2 x HM_RC_Key4_2,7 x HM_SEC_SC,1 x HM_SEC_WDS,1 x HM_Sen_RD_O, 1x HM_Sen_Wa_Od,2 x HM_RC_Key4_2, 5 x HM-ES-PMSw1-Pl,1 x HM_LC_SW4_WM,1 x HM_SCI_3_FM

Stefan M.

#4
Hallo zusammen
habe jetzt mal aus folgenden Teilen einen Prototypen zusammen gebaut :

1 x Raspberry Pi B
1 x RFID RC522
1 x BerryClip für LED und Buzzer Ausgabe
1 x WLan Stick TP-Link

In FHEM habe ich ein Dummy definiert das über URL gesteuert wird.

Den Code habe ich aus folgenden Quellen zusammen gesucht

BerryClip
http://www.raspberrypi-spy.co.uk/berryclip-6-led-add-on-board/berryclip-6-led-add-on-board-instructions/

Raspberry und RFID
http://www.elli-blog.de/?p=41
http://www.forum-raspberrypi.de/Thread-rfid-rc522-und-homematic


# RFID auslesen und bei definierter ID
# LED und Buzzer ansprechen
# URL zum FHEM aufrufen
# Codeteile von BerryClip , https://github.com/lthiery/SPI-Py , https://github.com/lthiery/SPI-Py
# Stefan Muehlbauer
# Version 1.5 vom 24.3.2016

import RPi.GPIO as GPIO
import spi
import signal
import time

status_1 = ""

def LED_Status_ON(rstatus):
if rstatus == "ON":
GPIO.output(11, True)
GPIO.output(15, False)
else:
GPIO.output(15, True)
GPIO.output(11, False)

def Buzzer(t):
GPIO.output(18, True)
time.sleep(t)
GPIO.output(18, False)

def SN_OK(SN, FHEMDevice):
Buzzer(0.4)     
   
import urllib

rURL = "http://stefan:12stefan34@192.168.0.44:8083/fhem?cmd=%7BValue%28%22" + FHEMDevice +"%22%29%7D&XHR=1"

print 'URL Aufruf : ' , rURL

response = urllib.urlopen(rURL)
 
rstatus = response.read().strip()
 
print 'bisheriger Status von FHEM gelesen : ', rstatus

LED_Status_ON(rstatus)

if rstatus == "ON":
status = "OFF"
else:
status = "ON"

print "neuer Status intern : " + status

GPIO.output(13, True)

sendURL("http://stefan:12stefan34@192.168.0.44:8083/fhem?cmd=set%20" + FHEMDevice +"%20SN%20" + Serialnumber)

print "SN gesendet!"

#myurl = "http://stefan:12stefan34@192.168.0.44:8083/fhem?cmd=set%20" + FHEMDevice +"%20SN%20" + Serialnumber
#urllib.urlretrieve(myurl)

sendURL("http://stefan:12stefan34@192.168.0.44:8083/fhem?cmd=set%20" + FHEMDevice +"%20" + status)
print "neuen Status gesendet!"

#myURL_1 = "http://stefan:12stefan34@192.168.0.44:8083/fhem?cmd=set%20" + FHEMDevice +"%20" + status
#urllib.urlretrieve(myURL_1)

print 'URL Aufruf : ' , rURL

response = urllib.urlopen(rURL)
rstatus = response.read().strip()

GPIO.output(13, False)

LED_Status_ON(rstatus)

print 'neuer Status von FHEM gelesen : ', rstatus
 
Buzzer(0.1)
time.sleep(0.1)
Buzzer(0.1)
time.sleep(0.1)
Buzzer(0.1)

def sendURL(URL):
import urllib
myurl = URL
print 'URL Aufruf : ' , myurl
urllib.urlretrieve(myurl)

class MFRC522:
  NRSTPD = 22
 
  MAX_LEN = 16
 
  PCD_IDLE       = 0x00
  PCD_AUTHENT    = 0x0E
  PCD_RECEIVE    = 0x08
  PCD_TRANSMIT   = 0x04
  PCD_TRANSCEIVE = 0x0C
  PCD_RESETPHASE = 0x0F
  PCD_CALCCRC    = 0x03
 
  PICC_REQIDL    = 0x26
  PICC_REQALL    = 0x52
  PICC_ANTICOLL  = 0x93
  PICC_SElECTTAG = 0x93
  PICC_AUTHENT1A = 0x60
  PICC_AUTHENT1B = 0x61
  PICC_READ      = 0x30
  PICC_WRITE     = 0xA0
  PICC_DECREMENT = 0xC0
  PICC_INCREMENT = 0xC1
  PICC_RESTORE   = 0xC2
  PICC_TRANSFER  = 0xB0
  PICC_HALT      = 0x50
 
  MI_OK       = 0
  MI_NOTAGERR = 1
  MI_ERR      = 2
 
  Reserved00     = 0x00
  CommandReg     = 0x01
  CommIEnReg     = 0x02
  DivlEnReg      = 0x03
  CommIrqReg     = 0x04
  DivIrqReg      = 0x05
  ErrorReg       = 0x06
  Status1Reg     = 0x07
  Status2Reg     = 0x08
  FIFODataReg    = 0x09
  FIFOLevelReg   = 0x0A
  WaterLevelReg  = 0x0B
  ControlReg     = 0x0C
  BitFramingReg  = 0x0D
  CollReg        = 0x0E
  Reserved01     = 0x0F
 
  Reserved10     = 0x10
  ModeReg        = 0x11
  TxModeReg      = 0x12
  RxModeReg      = 0x13
  TxControlReg   = 0x14
  TxAutoReg      = 0x15
  TxSelReg       = 0x16
  RxSelReg       = 0x17
  RxThresholdReg = 0x18
  DemodReg       = 0x19
  Reserved11     = 0x1A
  Reserved12     = 0x1B
  MifareReg      = 0x1C
  Reserved13     = 0x1D
  Reserved14     = 0x1E
  SerialSpeedReg = 0x1F
 
  Reserved20        = 0x20 
  CRCResultRegM     = 0x21
  CRCResultRegL     = 0x22
  Reserved21        = 0x23
  ModWidthReg       = 0x24
  Reserved22        = 0x25
  RFCfgReg          = 0x26
  GsNReg            = 0x27
  CWGsPReg          = 0x28
  ModGsPReg         = 0x29
  TModeReg          = 0x2A
  TPrescalerReg     = 0x2B
  TReloadRegH       = 0x2C
  TReloadRegL       = 0x2D
  TCounterValueRegH = 0x2E
  TCounterValueRegL = 0x2F
 
  Reserved30      = 0x30
  TestSel1Reg     = 0x31
  TestSel2Reg     = 0x32
  TestPinEnReg    = 0x33
  TestPinValueReg = 0x34
  TestBusReg      = 0x35
  AutoTestReg     = 0x36
  VersionReg      = 0x37
  AnalogTestReg   = 0x38
  TestDAC1Reg     = 0x39
  TestDAC2Reg     = 0x3A
  TestADCReg      = 0x3B
  Reserved31      = 0x3C
  Reserved32      = 0x3D
  Reserved33      = 0x3E
  Reserved34      = 0x3F
   
  serNum = []
 
  def __init__(self,spd=1000000):
    spi.openSPI(speed=spd)
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(22, GPIO.OUT)
    GPIO.output(self.NRSTPD, 1)
    self.MFRC522_Init()
 
  def MFRC522_Reset(self):
    self.Write_MFRC522(self.CommandReg, self.PCD_RESETPHASE)
 
  def Write_MFRC522(self,addr,val):
    spi.transfer(((addr<<1)&0x7E,val))
 
  def Read_MFRC522(self,addr):
    val = spi.transfer((((addr<<1)&0x7E) | 0x80,0))
    return val[1]
 
  def SetBitMask(self, reg, mask):
    tmp = self.Read_MFRC522(reg)
    self.Write_MFRC522(reg, tmp | mask)
   
  def ClearBitMask(self, reg, mask):
    tmp = self.Read_MFRC522(reg);
    self.Write_MFRC522(reg, tmp & (~mask))
 
  def AntennaOn(self):
    temp = self.Read_MFRC522(self.TxControlReg)
    if(~(temp & 0x03)):
      self.SetBitMask(self.TxControlReg, 0x03)
 
  def AntennaOff(self):
    self.ClearBitMask(self.TxControlReg, 0x03)
 
  def MFRC522_ToCard(self,command,sendData):
    backData = []
    backLen = 0
    status = self.MI_ERR
    irqEn = 0x00
    waitIRq = 0x00
    lastBits = None
    n = 0
    i = 0
   
    if command == self.PCD_AUTHENT:
      irqEn = 0x12
      waitIRq = 0x10
    if command == self.PCD_TRANSCEIVE:
      irqEn = 0x77
      waitIRq = 0x30
   
    self.Write_MFRC522(self.CommIEnReg, irqEn|0x80)
    self.ClearBitMask(self.CommIrqReg, 0x80)
    self.SetBitMask(self.FIFOLevelReg, 0x80)
   
    self.Write_MFRC522(self.CommandReg, self.PCD_IDLE); 
   
    while(i<len(sendData)):
      self.Write_MFRC522(self.FIFODataReg, sendData[i])
      i = i+1
   
    self.Write_MFRC522(self.CommandReg, command)
     
    if command == self.PCD_TRANSCEIVE:
      self.SetBitMask(self.BitFramingReg, 0x80)
   
    i = 2000
    while True:
      n = self.Read_MFRC522(self.CommIrqReg)
      i = i - 1
      if ~((i!=0) and ~(n&0x01) and ~(n&waitIRq)):
        break
   
    self.ClearBitMask(self.BitFramingReg, 0x80)
 
    if i != 0:
      if (self.Read_MFRC522(self.ErrorReg) & 0x1B)==0x00:
        status = self.MI_OK

        if n & irqEn & 0x01:
          status = self.MI_NOTAGERR
     
        if command == self.PCD_TRANSCEIVE:
          n = self.Read_MFRC522(self.FIFOLevelReg)
          lastBits = self.Read_MFRC522(self.ControlReg) & 0x07
          if lastBits != 0:
            backLen = (n-1)*8 + lastBits
          else:
            backLen = n*8
         
          if n == 0:
            n = 1
          if n > self.MAX_LEN:
            n = self.MAX_LEN
   
          i = 0
          while i<n:
            backData.append(self.Read_MFRC522(self.FIFODataReg))
            i = i + 1;
      else:
        status = self.MI_ERR

    return (status,backData,backLen)
 
 
  def MFRC522_Request(self, reqMode):
    status = None
    backBits = None
    TagType = []
   
    self.Write_MFRC522(self.BitFramingReg, 0x07)
   
    TagType.append(reqMode);
    (status,backData,backBits) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, TagType)
 
    if ((status != self.MI_OK) | (backBits != 0x10)):
      status = self.MI_ERR
     
    return (status,backBits)
 
 
  def MFRC522_Anticoll(self):
    backData = []
    serNumCheck = 0
   
    serNum = []
 
    self.Write_MFRC522(self.BitFramingReg, 0x00)
   
    serNum.append(self.PICC_ANTICOLL)
    serNum.append(0x20)
   
    (status,backData,backBits) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE,serNum)
   
    if(status == self.MI_OK):
      i = 0
      if len(backData)==5:
        while i<4:
          serNumCheck = serNumCheck ^ backData[i]
          i = i + 1
        if serNumCheck != backData[i]:
          status = self.MI_ERR
      else:
        status = self.MI_ERR
 
    return (status,backData)
 
  def CalulateCRC(self, pIndata):
    self.ClearBitMask(self.DivIrqReg, 0x04)
    self.SetBitMask(self.FIFOLevelReg, 0x80);
    i = 0
    while i<len(pIndata):
      self.Write_MFRC522(self.FIFODataReg, pIndata[i])
      i = i + 1
    self.Write_MFRC522(self.CommandReg, self.PCD_CALCCRC)
    i = 0xFF
    while True:
      n = self.Read_MFRC522(self.DivIrqReg)
      i = i - 1
      if not ((i != 0) and not (n&0x04)):
        break
    pOutData = []
    pOutData.append(self.Read_MFRC522(self.CRCResultRegL))
    pOutData.append(self.Read_MFRC522(self.CRCResultRegM))
    return pOutData
 
  def MFRC522_SelectTag(self, serNum):
    backData = []
    buf = []
    buf.append(self.PICC_SElECTTAG)
    buf.append(0x70)
    i = 0
    while i<5:
      buf.append(serNum[i])
      i = i + 1
    pOut = self.CalulateCRC(buf)
    buf.append(pOut[0])
    buf.append(pOut[1])
    (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf)
   
    if (status == self.MI_OK) and (backLen == 0x18):
      print "Size: " + str(backData[0])
      return  backData[0]
    else:
      return 0
 
  def MFRC522_Auth(self, authMode, BlockAddr, Sectorkey, serNum):
    buff = []
    buff.append(authMode)
    buff.append(BlockAddr)
    i = 0
    while(i < len(Sectorkey)):
      buff.append(Sectorkey[i])
      i = i + 1
    i = 0
    while(i < len(serNum)):
      buff.append(serNum[i])
      i = i +1
    (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_AUTHENT,buff)
    if not(status == self.MI_OK):
      print "AUTH ERROR!!"
    if not (self.Read_MFRC522(self.Status2Reg) & 0x08) != 0:
      print "AUTH ERROR(status2reg & 0x08) != 0"

    return status
 
  def MFRC522_Read(self, blockAddr):
    recvData = []
    recvData.append(self.PICC_READ)
    recvData.append(blockAddr)
    pOut = self.CalulateCRC(recvData)
    recvData.append(pOut[0])
    recvData.append(pOut[1])
    (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, recvData)
    if not(status == self.MI_OK):
      print "Error while reading!"

    print "Got data size: "+str(backLen)
    i = 0
    if len(backData) == 16:
      print "Sector "+str(blockAddr)+" "+str(backData)
 
  def MFRC522_Write(self, blockAddr, writeData):
    buff = []
    buff.append(self.PICC_WRITE)
    buff.append(blockAddr)
    crc = self.CalulateCRC(buff)
    buff.append(crc[0])
    buff.append(crc[1])
    (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buff)
    if not(status == self.MI_OK) or not(backLen == 4) or not((backData[0] & 0x0F) == 0x0A):
      status = self.MI_ERR
   
    print str(backLen)+" backdata &0x0F == 0x0A "+str(backData[0]&0x0F)
    if status == self.MI_OK:
        i = 0
        buf = []
        while i < 16:
          buf.append(writeData[i])
          i = i + 1
        crc = self.CalulateCRC(buf)
        buf.append(crc[0])
        buf.append(crc[1])
        (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE,buf)
        if not(status == self.MI_OK) or not(backLen == 4) or not((backData[0] & 0x0F) == 0x0A):
          print "Error while writing"
        if status == self.MI_OK:
          print "Data writen"
 
 
  def MFRC522_Init(self):
    GPIO.output(self.NRSTPD, 1)
 
    self.MFRC522_Reset();
   
   
    self.Write_MFRC522(self.TModeReg, 0x8D)
    self.Write_MFRC522(self.TPrescalerReg, 0x3E)
    self.Write_MFRC522(self.TReloadRegL, 30)
    self.Write_MFRC522(self.TReloadRegH, 0)
   
    self.Write_MFRC522(self.TxAutoReg, 0x40)
    self.Write_MFRC522(self.ModeReg, 0x3D)
    self.AntennaOn()
 
continue_reading = True
# Capture SIGINT
def end_read(signal,frame):
global continue_reading
print "Ctrl+C captured, ending read."
continue_reading = False
GPIO.cleanup() # Suggested by Marjan Trutschl
 
signal.signal(signal.SIGINT, end_read)
 
MIFAREReader = MFRC522()

# List of LED GPIO numbers
LedSeq = [11,13,15,18]

# Set up the GPIO pins as outputs and set False
#print "Setup LED pins as outputs"

for x in range(4):
    GPIO.setup(LedSeq[x], GPIO.OUT)
    GPIO.output(LedSeq[x], False)

# Light all the leds
for x in range(4):
GPIO.output(LedSeq[x], True)
time.sleep(0.2)
# Light all the leds
for x in range(4):
GPIO.output(LedSeq[x], False)
time.sleep(0.2)

print "Willkommen bei RFID2FHEM"
print "Zum Abbrechen des Skripts STRG-C druecken."
 
while continue_reading:
(status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
 
if status == MIFAREReader.MI_OK:
print "Die Karte wurde erkannt!"

GPIO.output(15, True)

Buzzer(0.1)
time.sleep(0.1)
Buzzer(0.1)
time.sleep(0.2)

(status,backData) = MIFAREReader.MFRC522_Anticoll()

if status == MIFAREReader.MI_OK:
print "Ausgelesene Seriennummer: "+str(backData[0])+","+str(backData[1])+","+str(backData[2])+","+str(backData[3])+","+str(backData[4])
   
Serialnumber = str(backData[0])+str(backData[1])+str(backData[2])+str(backData[3])+str(backData[4])
   
print 'Seriennummer : ', Serialnumber

if Serialnumber == "24612817745234":

SN_OK(Serialnumber,"RFIDTest")

time.sleep(1)



wird noch ergänzt!



LG
Stefan
FHEM auf 3 x RaspberryPi, 1 x Fritzbox,1 x Win. FS20 über CUL, HomeMatic über HMLan, 6 x  HM_CC_RT_DN,2 x HM_LC_BL1_FM,3 x HM_SEC_KEY,2 x HM_RC_Key4_2,7 x HM_SEC_SC,1 x HM_SEC_WDS,1 x HM_Sen_RD_O, 1x HM_Sen_Wa_Od,2 x HM_RC_Key4_2, 5 x HM-ES-PMSw1-Pl,1 x HM_LC_SW4_WM,1 x HM_SCI_3_FM

Michi1978

Guten Morgen,

gibt es schon weitere fortschritte?

Deinjo

Hallo,

auch wenn der letzte Beitrag etwas länger her ist....

Ich verwenden nun:
1x Wemos D1 Mini mit ESPEasy
1x PN532 Modul

Das klappt wunderbar.

Gruß
Deinjo
rPi3, Jessie, FHEM 5.7
CUL, Homematic, WeMos, FritzDect, TableUI,...