カードリーダを使って動作制御する案件があるかもしれない・・・ということで、

さきに遊んでおこう、と後先考えず、買ってしまいました。

  • 動作電源:3.3V、動作電流:13-26mA、動作周波数:13.56mHz 
  • 眠り電流 :< 80uA ,ピーク電流:<30mA , 動作周波数:13.56MHz 
  • 対応可能なカードタイプ:mifare1 S50、mifare1 S70、Mifare UltraLight、Mifare Pro、mifare DESFire
↑Amazonで3セット888円、ブランクカード、タグも付いてますが、ヘッダピンは自分ではんだ付けになります。
Myfare用で、Felicaは使えません(240130動作確認済)。
ほかにもMFRC522というモジュールが多々出ており、コード含む使用例も
ネット上に多々でています。
出典:

↑ここにはPythonとCの両方での使い方が記載されています。

解読はこれからですが、とにかく「使ってみる」はできそうな感じです。

他の出典も探しておきます。

出典2:

両方の使用例はSPI接続のようです。

 

 

現物はこんな感じです。

肉眼ではあっ自分で実装するランドが残ってるんだ・・・と思ったのですが、

写真撮ってみると1005ぐらいのサイズでチップが実装されていました。

 

 

裏面はこんな感じ。ベタです。制御チップの真裏にベタランドがありますが、

気にしないことにします。

右端面の下半分ぐらいにガラス繊維が出ていますが、ま、値段どおりということで。

左側の白縦線やその外側のホールの意味はわかりません。

水晶振動子は手はんだでしょうか、フラックスが残っていて、それが擦れたような後が見えますが、これも値段どおりということで。

 

ヘッダピンはストレートとL型の両方が付属しています。

今回はブレッドボードに指しやすいL型を使います。

 

さて、まずははんだ付けから・・・

倒れてます!

が、これがちょーーーどよい角度になりました。

少しだけ傾斜がついているので操作しやすいです。

 

いや、はんだが溢れていて二度と戻らんし!

 

■結線

出典2から、


3.3VおよびGNDを結線するとカードの赤ランプが点灯しました。

通電LEDが付いてるんだ!

SPIなのでたぶんSDA、SCKは結線不要ということで無視・・・

(2401282315追記:いや無視したらあきません!
 SPIのクロックとチップイネーブルが繋がっとらんですがな!
 そりゃ動きませんわ。。。)

さて、RSTのBOARD番号が22、ここはGPIO25ですが、なぜそこへつなぐ?

GPIO専用のピンは他にも多々ある。

ということで、なぜ?を調べ始めましたが、やはりソースがポイントでした。

出典3:

ここにライブラリのソースがあり、下記のようになっています。
 

このライブラリはRPi_GPIOを使っています。

では、Pin_modeはどうなっているか?

少し拡大して、

151行目でpin_rstをGPIO.OUTにセットしていますから、pin_rstはピン番号。

行を遡りますと・・・141行目でGPIOモードのpin_modeをセットしていますから、それに先立ってpin_modeをセットしているはず。

再び行を遡りますと・・・

128行目にpin_modeのデフォルトを10としており、

予めセットされたpin_modeがあればそれを使う。

145行〜149行でpin_modeが11ならpin_rstは15、そうでなければpin_rstは22

・・・

PIN番号表を見ますと・・・

モードちがいで15と22となる同じpinはBOARDの15番だけ。

なるほど!!!

そして、

 pin_mode=10とはGPIO.BCM、

 pin_mode=11はGPIO.BOARD

なんですね!

出典4:

明記されていませんが、↑ここにGPIO.BCMと11が対応している結果が見られました。

・・・

あれっ?逆か???

 

わかりません!!!

ソフト実装後に両方やってみましたが、両方とも動かんし!笑

もうちょっと時間かかりそうです。

ーーー>2401282315追記

 いやいや〜、結線の解釈がちゃいまんがな!
 I2C用のSDA、SCLじゃなくて、SPI-SDASPI-SCLK、SPI-CE0を繋がなくっちゃ、
 チップが反応しませんわな!

 後日、結線追加して出直しです。すみません。

ーーー>240130追記

出典3には、結線も書かれています。英文ですが。

この結線はライブラリのソースから得たpinの関係と完全に合致しています。

このとおりに結線して、動作しました!!!

なんのこっちゃ。最初からここに従ってればOKってことでした。

 

 

■ソフト実装・・・出典2から、MFRC522-pythonmを使う方法

 

1:ライブラリインストール(spidevもインストールされました!)

sudo pip3 install mfrc522

 

2:サンプルコード
#!/usr/bin/env python3
import RPi.GPIO as GPIO
from mfrc522 import SimpleMFRC522
reader = SimpleMFRC522()
try:
        id, text = reader.read()
        print(id)
        print(text)
finally:
        GPIO.cleanup()
 

■結果

動作しました!といっても、idが10進整数で表示されるだけですが・・・

付属していたカード3枚とタグ3個のidは下記でした。(一部消しています)

cardのid
770888***354
700270***846
566843***540
tag1のid
287908***611
565342***686
1045170***011

なぜ10進整数かというと、ライブラリSimpleMFRC522の中で読みだした4バイトコード16進数から10進数に変換して返しているからです。

↑ソースから抜粋。idのブロックを読むところ。戻り値をuidではなくuid_to_num(uid)で返しています。

↑で、uid_to_numがuidを10進数化しています。

EXCELで16進に戻すとこんな値です。

ふつうに特定の場所で使うのであれば、NUID(非ユニーク)になってしまったMyfare4バイトidでも十分「個別認識用」で使えます。

idとして使うなら10進数、16進数関係どちらでもよいと思いますが、

16進数は文字列でわかりやすいです。計算には使えませんけど。

 

以上、今回は勉強が多かったですが、なんとか一区切りできました。

追記予定