RC522 RFID-reader am ESP8266

Hallo,

nach dem ich jetzt allerhand recherchiert habe und damit noch nicht weitergekommen bin frage ich hier:

Ich probiere gerade an einem ESP8266 (WeMos D1 mini) einen RFID-Reader Typ RC522 in Betrieb zu nehmen.
Das klappt aber bisher nicht. Ich bekomme vom Beispielsketch DumpInfo folgende Meldung angezeigt:

⸮Dt⸮tAhlE⸮⸮`CI⸮⸮Firmware Version: 0x0 = (unknown)
WARNING: Communication failure, is the MFRC522 properly connected?
Scan PICC to see UID, SAK, type, and data blocks...

Es gibt eine library MFRC522.h die ich über den library-manager installiert habe .
link zu github GitHub - miguelbalboa/rfid: Arduino RFID Library for MFRC522

Ich habe zwei RFID-Reader von Christians-shop gekauft link RFID RC-522 Kartenleser Transponder Modul für Arduino, Raspberry Pi,

Der Beispielsketch DumpInfo lässt sich kompilieren.
Bei der Initialisierung des RC522-Objektes werden nur zwei Pins angegeben.

MFRC522 mfrc522(SS_PIN, RST_PIN);  // Create MFRC522 instance

In dem Beispielsketch DumpInfo ist in den Kommentaren eine PIN-Belegung für Arduino-Uno drin.
Darin sind die SPI-pins mit SS_PIN beginnend aufsteigend. Daraus vermute ich die IO-Pins müssen
mit SS beginnend aufsteigend - in der in der Library angegebenen Reihenfolge angeschlossen werden.
Ich habe allerdings im Internet ganz unterschiedliche Belegungen im Zusammenspiel mit dem ESP8266 gefunden.
Auch welche die eine nicht aufsteigende Reihenfolge der IO-Pins haben.

Ich habe das gelötete Verbindungskabel durchgepiepst Verbindungsleitungen sind IO.
Ich habe die RFID-Tags mit dem Handy getestet kann sie auslesen.

Ich bekomme aber schon gar keine Kommunikation mit dem RFID-Reader via SPI zustande.

Deshalb habe ich jetzt mehrere Fragen:

Frage 1:
Ist die MFRC522.h-library so intelligent einfach alle IO-Pins abzuklappern um zu sehen wo die MISO/MOSI/SCK-pins sind? Glaube ich ja eher nicht. Und habe dann als SPI-Pins folgende Belegung genommen:

SS GPIO12
MOSI GPIO 13
MISO GPIO 14
SCK GPIO 15

Frage 2:
macht die MFRC522.h-library eine software-SPI oder will die die die hardware-seitig vorhandene SPI benutzen? Die hat auf dem ESP8266 nämlich wieder eine andere Belegung.

Frage 3:
Ich habe ein Zweikanal 100 MHz-Speicher-Oszilloskop. Wie könnte ich mit dem Oszilloskop identifizieren ob

  • der RC522-reader vernünftige SPI-Kommunikation probiert?

bzw. ob das Wemos D1-mini passende SPI-Bus-Signale generiert?

Die im Set mitgelieferten RFID-Tags kann ich mit dem Handy ohne Probleme auslesen.

Frage 4:
Mit MOSI / MISO ist das ja so eine Sache. Wer ist jetzt in dieser Anwendung der SPI-Master und aus welcher Sicht
wird dann MOSI/MISO bestimmt?

Ihr seht es gibt noch eine Menge Variablen die ich durchchecken muss um das Problem einzugrenzen.
Ich habe mit zwei WeMos D1 minis und mit zwei RC522-readern getestet. Immer communication-failure.

viele Grüße

Stefan

Hier noch der Sketch mit dem ich getestet habe:

/*
 * --------------------------------------------------------------------------------------------------------------------
 * Example sketch/program showing how to read data from a PICC to serial.
 * --------------------------------------------------------------------------------------------------------------------
 * This is a MFRC522 library example; for further details and other examples see: https://github.com/miguelbalboa/rfid
 * 
 * Example sketch/program showing how to read data from a PICC (that is: a RFID Tag or Card) using a MFRC522 based RFID
 * Reader on the Arduino SPI interface.
 * 
 * When the Arduino and the MFRC522 module are connected (see the pin layout below), load this sketch into Arduino IDE
 * then verify/compile and upload it. To see the output: use Tools, Serial Monitor of the IDE (hit Ctrl+Shft+M). When
 * you present a PICC (that is: a RFID Tag or Card) at reading distance of the MFRC522 Reader/PCD, the serial output
 * will show the ID/UID, type and any data blocks it can read. Note: you may see "Timeout in communication" messages
 * when removing the PICC from reading distance too early.
 * 
 * If your reader supports it, this sketch/program will read all the PICCs presented (that is: multiple tag reading).
 * So if you stack two or more PICCs on top of each other and present them to the reader, it will first output all
 * details of the first and then the next PICC. Note that this may take some time as all data blocks are dumped, so
 * keep the PICCs at reading distance until complete.
 * 
 * @license Released into the public domain.
 * 
 * Typical pin layout used:
 * -----------------------------------------------------------------------------------------
 *             MFRC522      Arduino       Arduino   Arduino    Arduino          Arduino
 *             Reader/PCD   Uno/101       Mega      Nano v3    Leonardo/Micro   Pro Micro
 * Signal      Pin          Pin           Pin       Pin        Pin              Pin
 * -----------------------------------------------------------------------------------------
 * RST/Reset   RST          9             5         D9         RESET/ICSP-5     RST
 * SPI SS      SDA(SS)      10            53        D10        10               10
 * SPI MOSI    MOSI         11 / ICSP-4   51        D11        ICSP-4           16
 * SPI MISO    MISO         12 / ICSP-1   50        D12        ICSP-1           14
 * SPI SCK     SCK          13 / ICSP-3   52        D13        ICSP-3           15
 */

#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN         16          // Configurable, see typical pin layout above
#define SS_PIN          12         // Configurable, see typical pin layout above

MFRC522 mfrc522(SS_PIN, RST_PIN);  // Create MFRC522 instance

void setup() {
	Serial.begin(9600);		// Initialize serial communications with the PC
	while (!Serial);		// Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
	SPI.begin();			// Init SPI bus
	mfrc522.PCD_Init();		// Init MFRC522
	delay(1000);				// Optional delay. Some board do need more time after init to be ready, see Readme
	mfrc522.PCD_DumpVersionToSerial();	// Show details of PCD - MFRC522 Card Reader details
	Serial.println(F("Scan PICC to see UID, SAK, type, and data blocks..."));
}

void loop() {
	// Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
	if ( ! mfrc522.PICC_IsNewCardPresent()) {
		return;
	}

	// Select one of the cards
	if ( ! mfrc522.PICC_ReadCardSerial()) {
		return;
	}

	// Dump debug info about the card; PICC_HaltA() is automatically called
	mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
}

Auf der Website der MFRC522 Library, die du erwähnst - GitHub - miguelbalboa/rfid: Arduino RFID Library for MFRC522 - steht ja folgendes unter Pin Layout:

ESP8266, Wemos D1 mini
Signal        Pin
------------------------------
RST/Reset     D3
SPI SS (SDA)  D8
SPI MOSI      D7
SPI MISO      D6
SPI SCK       D5

Nun gibt es bei diesen Boards (WeMos, NodeMCU) ja mehrere Varianten die Pins zu benennen. Das führt immer wieder zu Verwirrungen. :slight_smile:
Auf meinem ESP8266-Board (ein NodeMCU) sind die Pins mit D0, D1, D2 etc. bezeichnet, deshalb verwende ich lieber diese Bezeichnungen. Bei WeMos sind meist auch solche Bezeichnungen aufgedruckt.

Ich habe das mal nachgebaut.
Habe die von dir erwähnte Library heruntergeladen, ein RC522 Modul wie oben angegeben mit meinem ESP-Board verbunden.
Im Sketch von oben habe ich allerdings folgende Veränderung vorgenommen und die Pins so benannt wie auf github angegeben:

#define RST_PIN  D3
#define SS_PIN  D8

Hochgeladen und funktioniert wie gewünscht.

Serielle Ausgabe:

Firmware Version: 0x92 = v2.0
Scan PICC to see UID, SAK, type, and data blocks...
Card UID: 85 86 12 02
Card SAK: 08
PICC type: MIFARE 1KB
Sector Block   0  1  2  3   4  5  6  7   8  9 10 11  12 13 14 15  AccessBits
  15     63   00 00 00 00  00 00 FF 07  80 69 FF FF  FF FF FF FF  [ 0 0 1 ] 
         62   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         61   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         60   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
  14     59   00 00 00 00  00 00 FF 07  80 69 FF FF  FF FF FF FF  [ 0 0 1 ] 
         58   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
...

Bei dir ist der RFID-Reader (RC522) höchstwahrscheinlich nicht richtig mit dem ESP verbunden.
Versuche die Verbindungen richtig hinzubekommen.

Ein paar Hinweise:
Du kannst dir die SPI Pins nicht aussuchen - zumindest nicht MISO, MOSI, SCK.
CS (wird auch bezeichnet mit SS, SDA) ist kein fixer Pin.
Der ESP ist der Master der RFID-Reader ist der Slave.
Es wird immer MISO mit MISO verbunden, ebenso MOSI mit MOSI und SCK mit SCK.

Hallo Uxomm,

Hurra ich habe es mit der Konfiguration die du angegeben hast hinbekommen. :smiley: ;D :grinning: :grin:
Zuerst habe ich es auf einem NodeMCU-Board getestet und es hat funktioniert.
Dann habe ich es am WeMos D1 mini getestet funktioschnuggelt auch.
Ein Reader ist defekt. Entweder er war es von Anfang an oder ich habe was gehimmelt.
Der gibt nur noch die Firmware aus aber macht sonst nix.
Mit dem zweiten Reader funktoniert es.

Aus der Tatsache, dass man auf ESP8266-boards SCK auf D5=GPIO14, MOSI=D7=GPIO13, MISO=D6=GPIO12 so verwenden muss schlussfolgere ich, dass die SPI-library den hardwaremäßig vorhandenen SPI benutzt.

Dann war ich neugierig darauf ob man für RST=Reset auch einen anderen IO-PIN verwenden kann.
Bei D0=GPIO16 hat es zunächst nicht funktioniert. Dann habe ich noch einmal auf meine WeMos D1-mini-Pinout geschaut und gesehen, dass D3=GPIO0 einen onboard-10k-pullup-Widerstand hat.
Dann habe ich auf D0=GPIO16 mit 10k-Pullup-Widerstand getestet und siehe da mit 10k-Pullup-Widerstand funktioniert es auch mit RTS an D0=GPIO16. D0 ist auf dem WeMos D1 mini in der gleichen Reihe direkt hinter D5
Deshalb möchte ich D0 verwenden. Dann brauche ich zum Anschluss nur eine PIN-Leiste

Jetzt gibt es noch einen Schönheitsfehler:
Wenn das Testprogramm den Speicher ausliest und sectorweise ausliest passiert mittendrin ein Soft WDT reset

Hier die serielle Ausgabe:

Card UID: XX XX XX XX
Card SAK: 08
PICC type: MIFARE 1KB
Sector Block   0  1  2  3   4  5  6  7   8  9 10 11  12 13 14 15  AccessBits
  15     63   00 00 00 00  00 00 FF 07  80 69 FF FF  FF FF FF FF  [ 0 0 1 ] 
         62   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         61   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         60   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
  14     59   00 00 00 00  00 00 FF 07  80 69 FF FF  FF FF FF FF  [ 0 0 1 ] 
         58   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         57   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         56   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
  13     55   00 00 00 00  00 00 FF 07  80 69 FF FF  FF FF FF FF  [ 0 0 1 ] 
         54   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         53   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         52   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
  12     51   00 00 00 00  00 00 FF 07  80 69 FF FF  FF FF FF FF  [ 0 0 1 ] 
         50   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         49   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         48   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
  11     47   00 00 00 00  00 00 FF 07  80 69 FF FF  FF FF FF FF  [ 0 0 1 ] 
         46   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         45   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         44   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
  10     43   00 00 00 00  00 00 FF 07  80 69 FF FF  FF FF FF FF  [ 0 0 1 ] 
         42   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         41   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         40   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
   9     39   00 00 00 00  00 00 FF 07  80 69 FF FF  FF FF FF FF  [ 0 0 1 ] 
         38   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         37   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         36   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
   8     35   00 00 00 00  00 00 FF 07  80 69 FF FF  FF FF FF FF  [ 0 0 1 ] 
         34   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         33   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         32   00 00 0
Soft WDT reset

>>>stack>>>

ctx: cont
sp: 3ffffc60 end: 3fffffc0 offset: 01b0
3ffffe10:  3ffffe90 00000000 302017ac 402040cd  
3ffffe20:  3ffffe90 4023b1b8 00000000 402029fc  
3ffffe30:  00000002 4023b1b8 00000000 3ffee354  
3ffffe40:  402029f0 3ffee354 3ffffe8f 402029fc  
3ffffe50:  402029f0 3ffee354 3ffffe8f 40202bed  
3ffffe60:  00000030 00000010 3ffffe8e 40202d25  
3ffffe70:  00000000 00000001 00000000 00000001  
3ffffe80:  00000760 00000000 00000000 302017ac  
3ffffe90:  3ffe8600 00000001 0000000c 00000008  
3ffffea0:  00000009 3fffff06 3ffffef0 40201c1a  
3ffffeb0:  3fffff06 00000000 00000000 00000008  
3ffffec0:  3ffffef2 00000002 00000002 40202dbe  
3ffffed0:  00000000 00000001 3ffee354 40202dd4  
3ffffee0:  3ffffef2 00000002 00000002 40202585  
3ffffef0:  00000000 00000000 00000000 00000000  
3fffff00:  00004937 00120100 3ffee318 3fffff80  
3fffff10:  00000000 00000000 00000020 00000004  
3fffff20:  00000000 00000000 3ffee318 3ffee31c  
3fffff30:  3fffff80 0000004c 3ffee354 40202c8c  
3fffff40:  3ffee31c 00000010 3ffee354 3fffff80  
3fffff50:  3ffee31c 00000008 3ffee318 402027c4  
3fffff60:  00000000 00000000 3ffee318 3ffee3bc  
3fffff70:  3ffee354 3ffee31c 3ffee318 4020295c  
3fffff80:  ffffffff 0000ffff 3ffee318 40204c0c  
3fffff90:  3fffdad0 00000000 3ffee318 402010bd  
3fffffa0:  feefeffe 00000000 3ffee37c 402033bc  
3fffffb0:  feefeffe feefeffe 3ffe84e4 40100c39  
<<<stack<<<
R2⸮⸮)⸮⸮⸮⸮n⸮Firmware Version: 0x92 = v2.0
Scan PICC to see UID, SAK, type, and data blocks...

Ich habe dann die serielle Baudrate auf 115200 hochgesetzt.
Damit kann man dann die erste Ausgabe die die Firmware ausgibt nicht mehr lesen
aber die DumpToSerial-Ausgabe ist dann schnell genug, dass alles auf die serielle Schnittstelle
ausgegeben werden kann ohne dass ein WDT-reset auftritt.

So dann muss ich mich mal in die sonstigen Lese/Schreibfunktionen einlesen...
Vielen Dank Uxomm.
viele Grüße

Stefan

oh P.S.: Wie hast du den Quellcode mit

#define RST_PIN D3          // Configurable, see typical pin layout above
#define SS_PIN  D8         // Configurable, see typical pin layout above

Zum compilieren gebracht? Bei mir hat da der compiler gemeckert das er "D3" "D8" nicht kennt.
Liegt das an der Board-Auswahl? Ich benutze generic ESP8266

Super, dass es jetzt funktioniert!

Man kann nicht alle Pins für "alles" und "jederzeit" verwenden. Manche müssen zu "bestimmten Zeiten" bestimmte Pegel haben. Z.B. bei Start oder Reset.
Das ist von Board zu Board verschieden - mach dich schlau! :slight_smile:
Weil ich nicht so oft mit ESPs arbeite, muss mich da auch immer (wieder neu) einlesen.

StefanL38:
oh P.S.: Wie hast du den Quellcode mit

#define RST_PIN D3          // Configurable, see typical pin layout above

#define SS_PIN  D8        // Configurable, see typical pin layout above



Zum compilieren gebracht? Bei mir hat da der compiler gemeckert das er "D3" "D8" nicht kennt.
Liegt das an der Board-Auswahl? Ich benutze generic ESP8266

Ja genau, ob das "funktioniert" (=compiliert) hängt von der Auswahl des Boards ab.
Bei manchen Boards sind diese Bezeichnungen "bekannt", bei anderen nicht,
zum Beispiel bei "generic ESP8266" nicht, aber bei "WeMos" und "NodeMCU" schon. :slight_smile:

Deshalb sollte man bei den ESP-Boards sicherheitshalber die GPIO-Bezeichnungen verwenden, denn die sind unabhängig vom Hersteller.

Gruß Tommy

Tommy56:
Deshalb sollte man bei den ESP-Boards sicherheitshalber die GPIO-Bezeichnungen verwenden, denn die sind unabhängig vom Hersteller.

Oh je, dann ist ja der "Arduino-Komfort" ade... :wink:

Also in der Verwendung von D1 anstelle von 5 sehe ich nicht wirklich einen Komfort.

Gruß Tommy