カードリーダを使って動作制御する案件があるかもしれない・・・ということで、
さきに遊んでおこう、と後先考えず、買ってしまいました。
- 動作電源:3.3V、動作電流:13-26mA、動作周波数:13.56mHz
- 眠り電流 :< 80uA ,ピーク電流:<30mA , 動作周波数:13.56MHz
- 対応可能なカードタイプ:mifare1 S50、mifare1 S70、Mifare UltraLight、Mifare Pro、mifare DESFire
ほかにも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進数は文字列でわかりやすいです。計算には使えませんけど。
以上、今回は勉強が多かったですが、なんとか一区切りできました。
追記予定