ArduinoでRFID-RC522を使用するにはどうすればよいですか?


11

私は地元のメーカースペースのプロジェクトに取り組んでいます。予算が限られているため、eBayでRFID-RC522 el'cheap'o RFID / NFCリーダーを使用することを望んでいましたが、SPIベースのボードをいくつか受け取りましたが、それらは機能しますが、それらのコード例は限られています。

私はいくつかの異なるライブラリを見つけ、これに落ち着きました:https : //github.com/ljos/MFRC522

問題は、オンラインで入手可能なすべてのコードが、人々が翻訳してArduinoライブラリにハッキングした一部の中国人のPythonコードから生成されたように見えることです。

コードは機能しますが、Mifareカードは4、7、または10バイトのUIDを持つことを目的としており、サンプル/ライブラリは5バイトのシリアル番号を返します。

ドキュメントはなく、NXPデータシートは理解不能です...さらに、ほとんどのカードで動作するようですが、ISO 14443標準に準拠するMastercard PayWaveカードでは動作しません。MFRC500をベースにしたより高価なRDM880リーダーは問題なく動作し、優れたライブラリを備えていますが、コストがかかるため実装は不可能です。

だから、誰かがこのNXP MFRC522ベースのユニットがすべてのISO 14443カードからUIDを読み取るのを手伝ってくれる?

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

#define RFID_SS  10
#define RFID_RST 5

MFRC522 rfid( RFID_SS, RFID_RST );

void setup() {
  SPI.begin();
  Serial.begin(115200);
  rfid.begin();
}

void loop() {
  byte data[MAX_LEN];
  byte uid[5];

  if ( rfid.requestTag( MF1_REQIDL, data ) == MI_OK ) {
    if ( rfid.antiCollision( data ) == MI_OK ) {
      memcpy( uid, data, 5 );
      for ( int i = 0; i < 5; i++ ) {
        Serial.print( uid[i], HEX );
        Serial.print( ' ' );
      }
      Serial.println();
    }
  }
}

これはおそらく問題ではありませんが、uid配列の長さは5です。10バイトの結果が必要なので、より大きな配列を使用してみましたか?
asheeshr 2014

はい、そうしましたが、助けにはなりませんでした。実際、他のリーダーは4バイトの数値しか返さないようで、まともなサンプルコードを使用した別のmakeであり、非常に混乱しています。
unknowndomain

回答:


6

申し訳ありませんが、あなたの「NXPデータシートは理解不能」に同意する必要があります。MFRC522データシートの最初のページから:

「備考:MFRC522は、MIFARE Mini、MIFARE 1K、MIFARE 4K、MIFARE Ultralight、MIFARE DESFire EV1、MIFARE Plus RF識別プロトコルのすべてのバリアントをサポートしています」

ここでは、MFRC522はISO / IEC 14443の一部のみをカバーしていると述べています。NXPRC522には次のものがありません。

* MIFARE DESFire EV1(AES暗号化を含む)

MIFARE DESFire EV2(MIsmartApp、Transaction MAC、無制限アプリケーションを含むMIFARE ClassicのMIFARE Plusドロップイン代替品、認定セキュリティレベル(AES 128ベース))

MIFARE SAM AV2(暗号化キーと暗号化機能の安全なストレージを提供する安全なアクセスモジュール)*

これらはおそらく銀行カードで使用されるものです。ここでも、MFRC500データシートの最初のページから:

「ISO / IEC 14443 Aのすべてのプロトコル層がサポートされています。」

さまざまなタイプのMIFARE / ISO / IEC 14443仕様をすべて調べて、さまざまなタイプのIDバイトの数を調べる必要があります(異なるタイプが返すバイト数は異なると思います)。

だから、基本的に、あなたはねじ込まれています。高価なMFRC500ベースのリーダーにとっては春です。私は、より高いコストで、高級なAPI、ドキュメント、例、または(うっとり!)テクニカルサポートを受けることもできると思います。

乾杯


1
あなたはMFRC522がこれをサポートしていないことは正しいですが、MFRC500がソリューションであり、デバイスがMIFAREクラシック、MIFARE 1K(S50)、およびMIFARE 4K(S70)カードのみをサポートすることは間違っています。
unknowndomain '22

1
また、MFRC522モジュールは3ポンド未満、MFRC500は30ポンドです。
unknowndomain '22

1

MFRC522 :: requestTag()は、2番目のパラメーター(上記の例のデータ)の最初の2バイトでカードタイプを返します。この値を見て、カードの種類を判別する必要があります。この情報を使用して、必要なIDのNバイトを出力します。

ピンチで、完全な16バイト(MAX_LEN)をダンプし、さまざまなカードタイプでそれらをテストして、どのバイトが確定的に変化しているかを確認し、IDの正しい長さを判別できるようにします。

また、ライブラリのセルフテスト関数getFirmwareVersion()とdigitalSelfTestPass();を呼び出すと、時間を節約できる場合があります。MFRC522 :: begin()を再度呼び出す必要があります。そうしないと、RFID IDを読み取ることができません(もちろん、書き込み時)。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.