Empfindlichkeit RFID Reader anpassen

Wie viele Andere von Euch auch, habe ich mal wieder festgestellt, dass die Leseempfindlichkeit des RFID Readers exemplarabhängig sehr unterschiedlich sein kann. Mir ist das jetzt besonders aufgefallen, als ich RFID-Tags zum Aufkleben verwenden wollte. Bei einigen Readern musste ich diese direkt auf die Oberfläche der Readerplatine legen, dass sie überhaupt erkannt bzw gelesen wurden. Es gibt wohl die Möglichkeit die Leseempfindlichkeit zu erhöhen, indem ein zusätzlicher Eintrag in der Bibliothek im Abschnitt Initialisierung gemacht wird. Das hat aber den Nachteil, dass bei aktualisierung der Bibliothek diese Änderung nicht mehr vorhanden ist und neu gemacht werden muss. Hat jemand eine Idee, wie man diese Erhöhung der Leseempfindlichkeit direkt aus der TonuinoSoftware realisieren kann.
Es müsste praktisch ein Register im RFID gesetzt werden.

In diesem Link ist die Änderung direkt in der Bibliothek beschrieben.
https://www.heise.de/developer/artikel/Arduino-spricht-RFID-3464780.html

1 „Gefällt mir“

Ich habe momentan keine Arduino IDE zur Hand, aber müsste es nicht mit dem Befehl PCD_SetAntennaGain möglich sein, die Antennenleistung über die Tonuinosoftware direkt zu ändern?

Dort findet man folgenden Satz:

Increase the antenna gain per firmware: mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max);

Aus der Lib void PCD_SetAntennaGain(byte mask);

	// MFRC522 RxGain[2:0] masks, defines the receiver's signal voltage gain factor (on the PCD).
	// Described in 9.3.3.6 / table 98 of the datasheet at http://www.nxp.com/documents/data_sheet/MFRC522.pdf
	enum PCD_RxGain : byte {
		RxGain_18dB				= 0x00 << 4,	// 000b - 18 dB, minimum
		RxGain_23dB				= 0x01 << 4,	// 001b - 23 dB
		RxGain_18dB_2			= 0x02 << 4,	// 010b - 18 dB, it seems 010b is a duplicate for 000b
		RxGain_23dB_2			= 0x03 << 4,	// 011b - 23 dB, it seems 011b is a duplicate for 001b
		RxGain_33dB				= 0x04 << 4,	// 100b - 33 dB, average, and typical default
		RxGain_38dB				= 0x05 << 4,	// 101b - 38 dB
		RxGain_43dB				= 0x06 << 4,	// 110b - 43 dB
		RxGain_48dB				= 0x07 << 4,	// 111b - 48 dB, maximum
		RxGain_min				= 0x00 << 4,	// 000b - 18 dB, minimum, convenience for RxGain_18dB
		RxGain_avg				= 0x04 << 4,	// 100b - 33 dB, average, convenience for RxGain_33dB
		RxGain_max				= 0x07 << 4		// 111b - 48 dB, maximum, convenience for RxGain_48dB
	};

Ich habe jetzt mal folgendes probiert.
// ************* NFC Leser initialisieren *****************************

      SPI.begin();                        // Init SPI bus
      mfrc522.PCD_Init();                 // Init MFRC522
      mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max);
      //mfrc522.PCD_SetRegisterBitMask
      //(mfrc522.RFCfgReg, (0x07<<4));      // Enhance the MFRC522 Receiver Gain to maximum value of some 48 dB
     
      /*RxGain [2:0]
      defines the receiver's signal voltage gain factor:
      000 18 dB HEX = 0x00
      001 23 dB HEX = 0x01
      010 18 dB HEX = 0x02  
      011 23 dB HEX = 0x03
      100 33 dB HEX = 0x04
      101 38 dB HEX = 0x05
      110 43 dB HEX = 0x06
      111 48 dB HEX = 0x07
      3 to 0 reserved - reserved for future use
    */

          mfrc522.PCD_DumpVersionToSerial();  // Show details of PCD - MFRC522 Card Reader
          for (byte i = 0; i < 6; i++) 
          {
            key.keyByte[i] = 0xFF;
          }

Beide Möglichkeiten die aktive und die auskommentierte funktionieren.
Bei den Mifare Karten sind die Unterschiede markant. Bei set auf min: Reichweite ca 1,5 cm
Bei set auf max: Reichweite ca 5 cm.
Bei den blauen Plastiktags min 1cm, max 3,5 cm
bei den Tag-Aufklebern
min-keine Erkennung, max ca 2 cm

Das sind ja deutliche Wertebereiche.
Gibt es denn Probleme, wenn man die Karten dann direkt auf den Leser legt (bei max. Gain)?

Hab ich jetzt nicht probiert. Ich habe ca 0,5 cm Holz dazwischen, da gibt es keine Probleme. Problematisch wegen des Abstandes ist ja das Schreiben. Das wird durch diese Einstellung aber nicht beeinflusst.

Ich habe den Code noch mal überarbeitet und die Möglichkeit hinzugefügt die Lesempfindlichkeit am Anfang des Scetches über die #define einzustellen.

Bei den defines am Anfang folgendes einfügen

#define NFCgaine_max          // RFID-Reader wird auf max Empfindlichkeit eingestellt     
  #ifndef NFCgaine_max        // Wenn keine Max Empfindlichkeit gewünscht, vorhergehende Zeile auskommentieren 
    #define NFCgaine_avg      // Empfindlichkeit auf Mittel        
     #ifndef NFCgaine_avg     // wenn minimale Empfindlichkeit gewünscht, vorhergehende Zeile zusätzlich auskommentieren
       #define NFCgaine_min   // Minimale Empfindlichkeit  
     #endif
   #endif      

dann hinter

static const uint32_t cardCookie = 322417479;

folgendes einfügen

#ifdef NFCgaine_min
uint8_t nfcRxGain = 1;
#endif
#ifdef NFCgaine_avg
uint8_t nfcRxGain = 2;
#endif
#ifdef NFCgaine_max
uint8_t nfcRxGain = 3;
#endif

Dann im Setup das folgende für die Initialisierung des RFID readers ersetzen

 SPI.begin();                        // Init SPI bus
  mfrc522.PCD_Init();                 // Init MFRC522
  //uint8_t nfcRxGain = 3;

  if (nfcRxGain == 1)
  {
  mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_min);
  Serial.println(F("=== mfrc522-> RxGain_min === "));
  }
  if (nfcRxGain == 2)
  {
  mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_avg);
  Serial.println(F("=== mfrc522-> RxGain_avg === "));
  }
  if (nfcRxGain == 3)
  {
  mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max);
  Serial.println(F("=== mfrc522-> RxGain_max === "));
  }
  
 /* MFRC522 RxGain[2:0] masks, defines the receiver's signal voltage gain factor (on the PCD).
   Described in 9.3.3.6 / table 98 of the datasheet at http://www.nxp.com/documents/data_sheet/MFRC522.pdf
  
    RxGain_18dB       = 0x00 << 4,  // 000b - 18 dB, minimum
    RxGain_23dB       = 0x01 << 4,  // 001b - 23 dB
    RxGain_18dB_2     = 0x02 << 4,  // 010b - 18 dB, it seems 010b is a duplicate for 000b
    RxGain_23dB_2     = 0x03 << 4,  // 011b - 23 dB, it seems 011b is a duplicate for 001b
    RxGain_33dB       = 0x04 << 4,  // 100b - 33 dB, average, and typical default
    RxGain_38dB       = 0x05 << 4,  // 101b - 38 dB
    RxGain_43dB       = 0x06 << 4,  // 110b - 43 dB
    RxGain_48dB       = 0x07 << 4,  // 111b - 48 dB, maximum
    RxGain_min        = 0x00 << 4,  // 000b - 18 dB, minimum, convenience for RxGain_18dB
    RxGain_avg        = 0x04 << 4,  // 100b - 33 dB, average, convenience for RxGain_33dB
    RxGain_max        = 0x07 << 4   // 111b - 48 dB, maximum, convenience for RxGain_48dB
 
*/

  mfrc522.PCD_DumpVersionToSerial();  // Show details of PCD - MFRC522 Card Reader
  for (byte i = 0; i < 6; i++) 
  {
    key.keyByte[i] = 0xFF;
  }

Die Voreinstellung hier ist auf Maximale Empfindlichkeit. Wenn eine andere Empfindlichkeit gewünscht wird entsprechend den Anweisungen im Define Bereich auskommentieren bzw kommentieren.

Im Monitor kann man in der Zeile vor der Firmwareversion kontrollieren welche Empfindlichkeit eingestellt wurde

23:00:54.605 -> 
23:00:54.605 ->  _____         _____ _____ _____ _____
23:00:54.605 -> |_   _|___ ___|  |  |     |   | |     |
23:00:54.605 ->   | | | . |   |  |  |-   -| | | |  |  |
23:00:54.605 ->   |_| |___|_|_|_____|_____|_|___|_____|
23:00:54.652 -> 
23:00:54.652 -> TonUINO Version 2.1
23:00:54.652 -> created by Thorsten Voß and licensed under GNU/GPL.
23:00:54.652 -> Information and contribution at https://tonuino.de.
23:00:54.652 -> 
23:00:54.652 -> *****************************************************
23:00:54.652 -> **** VERSION THOMAS LEHNERT ** Stand 2020-07-06 *****
23:00:54.652 -> === loadSettingsFromFlash()
23:00:54.652 -> Version: 2
23:00:54.652 -> Maximal Volume: 25
23:00:54.652 -> Minimal Volume: 3
23:00:54.652 -> Initial Volume: 15
23:00:54.652 -> EQ: 1
23:00:54.652 -> Sleep Timer: 5
23:00:54.652 -> Inverted Volume Buttons: 0
23:00:54.652 -> Admin Menu locked: 1
23:00:54.699 -> Admin Menu Pin: 2123
23:00:54.699 -> === setstandbyTimer()
23:00:54.699 -> 300056
23:00:56.808 -> === mfrc522-> RxGain_max === 
23:00:56.808 -> Firmware Version: 0x92 = v2.0
23:00:58.824 -> Kopfhörer angeschlossen! Lautsprecher wird ausgeschaltet!
23:00:58.824 -> === playShortCut()
23:00:58.824 -> 3
23:00:58.824 -> == playFolder()
23:00:58.824 -> === disablestandby()
23:00:58.824 -> 17 Dateien in Ordner 1
23:00:58.824 -> Spezialmodus Von-Bis: Hörspiel -> zufälligen Track wiedergeben
23:00:58.871 -> 2 bis 2
23:00:58.871 -> 2
23:00:58.871 -> === disablestandby()
23:01:05.199 -> Track beendet2
23:01:05.292 -> 2
23:01:05.292 -> === nextTrack()
23:01:05.292 -> Hörspielmodus ist aktiv -> keinen neuen Track spielen
23:01:05.339 -> === setstandbyTimer()
23:01:05.339 -> 310698
23:01:06.323 -> Track beendet2
23:01:06.417 -> 2
2 „Gefällt mir“

Warum gehst du hier über die Variable nfcRxGain? Du kannst doch die drei Blocks direkt von den defines abhängig machen. Vorteil wäre sogar noch, daß Programmspeicher gespart wird, weil nicht zutreffende Blöcke gar nicht erst übersetzt werden.

Anfang:

#define NFCgain_max   // Maximale Empfindlichkeit
//#define NFCgain_avg   // Mittlere Empfindlichkeit
//#define NFCgain_min   // Minimale Empfindlichkeit 

In Setup:

#ifdef NFCgain_min
  mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_min);
  Serial.println(F("=== mfrc522-> RxGain_min === "));
#endif
#ifdef NFCgain_avg
  mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_avg);
  Serial.println(F("=== mfrc522-> RxGain_avg === "));
#endif
#ifdef NFCgain_max
  mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max);
  Serial.println(F("=== mfrc522-> RxGain_max === "));
#endif

PS: Gain schreibt man ohne „e“. :wink:

3 „Gefällt mir“

Danke, diese Variante ist natürlich noch besser. Das mit dem e bei gain(e) war mir gar nicht aufgefallen. Brauche vielleicht mal eine neue Brille. :grinning:

Die kleine Anpassung hat tatsächlich eine positive Auswirkung an meiner Box.
Ich hatte eine Karte die nicht gut erkannt wurde, das ist jetzt viel besser geworden
Danke dafür.

Achtung!
Die Erhöhung auf „RxGain_max“ ist leider nicht bei allen Modulen (selbst baugleichen!) vom Vorteil. Ich hatte früher einmal 20 Stück von den „klassischen Blauen“ getestet und bei der Hälfte von denen kam es zu ziemlichen Problemen, wobei die Reichweite/Erkennung nachher weitaus schlechter bis unbrauchbar war. (VCC war natürlich stabil!)
Also: Beide Werte mit verschiedenen Tags im fertigen Player testen und den stabileren Wert nehmen (RxGain_avg oder RxGain_max).
Ich habe auch ein 1-2Platinen unter Verdacht, dass diese anfangs mit RxGain_max gut funktionierten, jedoch nach einem halben Jahr nur noch mit RxGain_avg zuverlässig arbeiteten.
Ergänzung: Diese Probleme betrafen NTAG216 Aufkleber, da ich ausschließlich solche verwende.

LG
Matthias

Auch aus genau diesem Grund besteht ja die Möglichkeit in den Defines die Empfindlichkeit nach den gegebenen Erfordernissen anzupassen. Ein generelles Setzen auf max Empfindlichkeit ist also nicht immer erforderlich.

:+1:

Und man ändert die Empfindlichkeit ja auch nur, wenn es Probleme bei der Erfassung gibt…

If it ain’t broken, don’t fix it.

1 „Gefällt mir“

Meinst du dass die Reader irgendwie verschleißen, wenn sie mit max Empfindlichkeit betrieben werden. Das kann ich mir ehrlich gesagt, technisch kaum vorstellen. Für den Empfang werden doch keine Schaltungsteile benutzt, die Leistung umsetzen müssen. Könnte das nicht auch an den Tags liegen? dass diese mit der Zeit verschleißen?

@Thomas:
Die Tags hatte ich anfangs auch im Verdacht, dem war aber nicht so. (Da ich - quasi - einen ähnlichen Player in Klein(st)serie anfertige, hab ich genug Material um verschiedene Szenarien zu testen), bei zwei trat dieses Phänomen auf, sodass ich diese von den „Kunden“ zurück bekam. Kann auch gut sein, dass es sich um kalte Lötstellen auf der Platine handelte, die mit der Zeit korrodierten - auf alle Fälle funktionierten diese mit „max“ gar nicht mehr. (Hab aber gleich die ganze Platine gewechselt und die alten entsorgt)

Mir hat das jetzt keine Ruhe gelassen und ich habe folgendes Testaufbau gemacht:
2-3 von diesen Standard blauen RFID Modulen.
Bluepill (STM32F103C8) als „Arduino“
Testsketch: „minimal Interrupt“ von der MFRC522 Library
Tags: NTAG 214/216 (runde Sticker)
Resultat:
mit RxGain_avg (33dB, = 0x04 << 4): sobald TAG in Reichweite fehlerloses auslesen der TAG ID.
mit RxGain_max (RxGain_48dB = 0x07 << 4): erkennt den TAG 1-2 cm weiter entfernt, aber: TAG ID wird in diesem zusätzlichen Abstand nicht erkannt und auch darunter, wo RxGain_avg sofort erkennt, wird die ID nicht korrekt ausgelesen - erst darunter und da auch nicht stabil (erst nach mehreren Versuchen).)
Dieses Phänomen konnte ich mit 3 RFID Platinen wiederholen. Selbst mit „RxGain_43dB“ waren die Ergebnisse schlechter. Als Spannungsquelle (3.3V) diente ein Labornetzteil, also konstant.
Mein Verdacht ist, dass wenn die Leistung erhöht wird, es - layouttechnisch(?) - zu Indifferenzen der Antenne mit diesen blauen Platinen kommt. Es gibt Modifikationen, wo C8 mit 100pf verwendet werden soll (statt 220) - aber das dient dazu um spezielle Karten erkennbar zu machen, die Reichweite sinkt jedoch.
Es wäre spannend, wenn jemand meinen Test verifizieren könnte (auch mit klassischem AVR Arduino bzw. anderen RFID Platinen bzw. RFID Tags).

Schaut euch das zweite Posting in diesem Thread an. Da habe ich einen Beitrag aus Dezember 2018 (ja, so lange ist das „Problem“ hier bekannt :wink:) verlinkt. Auf vielen der China Module ist L1 und L2 nicht richtig dimensioniert. Das findest du auch an vielen anderen Stellen im Netz, z.B. hier, Zitat:

I’m sharing information how to get more rf power from china made rc522 board.
My project uses MFRC522 board and Mifare Ultralight C cards.
This board can not produce enough RF energy to get Ultralight C card up and running MFRC522 datasheet says that max TX current is 150mA, but measured current was only 7mA.
I have a very good RF design experience so I started to measure whole RF part and make full tuning.
And what I found, antenna is tuned, not perfectly but usable, so was matching cirquit. But used 2.2uH inductors does not meet with required parameters.
Solution: Replace inductors L1 and L2 with same inductance (2.2uH) but higher operating current. like this one: http://www.tme.eu/en/details/cw1008-220 … ferrocore/
Now RC522 can read Ultralight C cards with no problem, also NTAG203 card reading distance is ~70mm

Das ist, soweit mir bekannt, eigentlich der Kern des Problems…

NTAG 214/216 sind auch generell schwerer zu erkennen, so zumindest meine Erfahrung. Am besten gehen eigentlich die mifare classic Karten… bei mir - bisher - eigentlich auch immer ohne jegliche Modifikation.

Die RXGain einstellung dient ja der Erhöhung oder Veringerung der Leseempfindlichkeit des Empfängers vom RFID Modul. Das heißt intern ist eine Softwaremäßig einstellbare Regelung für die Verstärkung des Empfängerteils implementiert. Ich denke, dass wenn die Normale (avg) Stufe eingestellt ist, das Optimum der Verstärkung vorhanden ist. Die Antwortsignale der RFID-Chips werden sauber gelesen. Ist die RXgain einstellung auf max gesetzt, und der RFID-Reader ist technisch in den Parametern korrekt, kann es sein, dass der Empfänger durch die Antwortsignale der RFID chips übersteuert wird, was zu Verzerrungen im Signal führt und die korrekte Erkennung erschwert bzw sogar verhindert. Dein Test bestätigt diese Vermutung. Wahrscheinlich ist die Hardware-Lösung, Tausch der 2,2uH Drosseln die effektivste Methode schwache RFID Reader auf Trab zu bringen. Das ist für smd-Löt-unerfahrene aber eben nicht so einfach. So dass hier die Softwarelösung eine Alternative ist.

Ich hab auch ein paar Gotchas bei den RFID Readern, Karten, und Stickern feststellen können:

Es gibt definitv Unterschiede zwischen meinem „China Modell“ (Elegoo Mega Starter Pack) und den AZDelivery Readern welche im TonUINO Starter Pack enthalten sind. Zudem scheint es einen Unterschied zu machen ob man den Arduino und somit den Rest des Schaltkreises über USB (Powerbank, Netzteil, oder PC; macht keinen Unterschied AFAIK) oder über +5V versorgt. VIN hab ich noch nicht versucht.

Was ich nach einigen Tests festgestellt habe:

Das China Modell

Dieses funktioniert bei mir am Besten mit mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max);, wobei die Stromversorgung egal ist.

Lustige Notiz am Rande: Die mitgelieferten Karten (auch die von den AZDelivery Readern) funktionieren mit RxGain_avg super, aber die zusätzlich gekauften Sticker und Karten (auch von AZDelivery; bzw die im TonUINO Starterpaket beigelegten) nur sehr unzuverlässig bzw. muss ich alles direkt auf die Platine legen.

Das AZDelivery Modell

Dieses funktioniert bei mir sehr gut mit mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max); und USB Stromversorgung.

Bei Versorgung über den +5V Pin funktioniert der AZDelivery Reader bei mir nur wenn RxGain_avg gesetzt ist (gleich gut wie der China Reader mit RxGain_max so weit ich das subjektiv bewerten kann). Mit USB Stromversorgung und RXGain_max scheint der AZ Reader die Karten/Sticker zwar lesen zu wollen (die LEDs am Arduino lassen das vermuten), aber er erkennt sie einfach nicht.

Also vielleicht hilft das dem ein oder anderen auch weiter (vor allem wenn man alles vorher mit USB Stromversorgung testet und dann mit +5V Pin Versorgung nichts mehr funktioniert ;)).

Hallo Stefan, wenn ich micht nicht völlig täusche wird der MFRC522 via 3.3V versorgt.