
RFIDカードとタグはどこにでもあります!建物のアクセス制御に使用しています。プリンターやコピー機でもスタッフの識別に使用できます。家畜のタグやペットの識別タグも、RFIDの一種です。RFIDデバイスを読み取る技術は安価で、リーダーは約5ドル、Raspberry Pi Picoなら4ドルでカードやタグのIDを読み取ることができます。
このハウツーでは、MFRC522リーダーとRaspberry Pi Picoを使ってRFIDタグとカードを読み取る方法を学びます。目標は、架空のRFIDアクセス制御システムを構築し、ユーザーが建物に入ることを許可したり、警備員に退去を促したりすることです。そのためには、まずカード/タグのIDを識別する必要があります。このハウツーの最初のセクションでは、このIDを特定し、次に2つのLEDを制御するコードを挿入してロック機構をシミュレートします。
この方法に必要なのは
- MicroPython を実行する Raspberry Pi Pico
- MFRC522 RFIDリーダー
- 大型ブレッドボード
- 11 x オス-オスジャンパーワイヤー
- 緑色のLED
- 赤色LED
- 2 x 100 オーム抵抗器(茶 - 黒 - 茶 - 金)
ハードウェアの構築
ハードウェアの組み立ては2つのセクションに分かれています。まず、MFRC522 RFIDリーダーの配線です。リーダーはSPIを使用してRaspberry Pi Picoと通信するため、7本のピンが必要です。2本は電源(3.3VとGND)用、残りはSPI用です。
スワイプして水平にスクロールします
MFRC522 | ラズベリーパイ ピコ | 配線色 |
---|---|---|
SDA | GP1 | 青 |
SCK | GP2 | オレンジ |
モシ | GP3 | 紫 |
味噌 | GP4 | 青 |
GND | 任意のGND | 黒 |
RST | GP0 | 白 |
3.3 | 3V3 出力(物理ピン 36) | 赤 |
2つ目は出力です。正しいカードが挿入されているかどうかを確認するために、2つのLEDを追加する必要があります。正しくないRFIDカードの場合は赤、正しいカードの場合は緑です。LEDは、LEDのオン/オフを制御するGPIOピンと、100Ωの抵抗を介して任意のGNDピンに接続します。220Ωまたは330Ωの抵抗を使用できますが、たまたま机の上に100Ωの抵抗がいくつかありました。適切な抵抗を見つける必要がある場合は、ガイドをご用意しています。
スワイプして水平にスクロールします
ヘッダーセル - 列 0 | ラズベリーパイ ピコ | 配線色 |
---|---|---|
赤色LEDアノード(+) | GP14 | 赤 |
赤色LEDカソード(-) | 任意のGND | 黒 |
緑色LEDアノード(+) | GP15 | 緑 |
緑色LEDカソード(-) | 任意のGND | 黒 |
次に進む前に、配線が正しいことを確認してください。
RFIDリーダーソフトウェアのインストール
MFRC522はシンプルなRFIDリーダーです。さらにシンプルにするために、MicroPythonモジュールを使用しています。このモジュールを使うと、リーダーの操作が簡単になります。このpico-rfidモジュールは、Tom's Hardwareの友人であるKevin McAleer氏が作成したもので、 Danjperron氏の研究に基づいています。
1. Raspberry Pi Picoをコンピューターに接続し、Thonnyを起動します。Raspberry Pi Picoの設定方法は既にご存知かと思いますが、そうでない場合は、こちらの便利なガイドをご覧ください。
Tom's Hardware の最高のニュースと詳細なレビューをあなたの受信箱に直接お届けします。
2.新しい空のファイルを作成し、このリンクの内容をコピーします。そして、Raspberry Pi Picoにmfrc522.pyという名前で保存します。これは、コードがRFIDリーダーと通信できるようにするPythonモジュール/ライブラリです。
プロジェクトコードの作成
すべてのセットアップが完了したら、プロジェクトのコーディングに取り掛かります。ここでもThonnyを使用し、リーダーに提示されたRFIDカードのIDを確認するコードを作成します。この最初の部分では、IDをメモしておく必要があります。これは、後で条件付きテストで使用するためです。条件付きテストでは、IDがハードコードされた値と一致するかどうかをチェックし、一致しない場合はアクセスを許可します。一致しない場合は、ACCESS DENIEDメッセージが表示されます。
1. Thonny で新しい空のファイルを作成します。
2. MFRC522 RFID リーダーを使用するため、コードのペースを制御するため、および GPIO を使用するための 3 つのモジュール (ライブラリ) をインポートします。
from mfrc522 import MFRC522
import utime
from machine import Pin
3. RFID リーダーが接続されている場所をコードに伝えるオブジェクト reader を作成します。
reader = MFRC522(spi_id=0,sck=2,miso=4,mosi=3,cs=1,rst=0)
4.赤と緑の LED 用の 2 つのオブジェクトを作成し、コードに LED が接続されている場所と、それらが電流を送信する出力デバイスであることを指定します。
red = Pin(14, Pin.OUT)
green = Pin(15, Pin.OUT)
5.ユーザーへの短いメッセージを書き、カードをリーダーに提示するよう指示します。「\n」は、print()関数の末尾に改行を挿入するためのPython構文です。
print("Present the card to the reader\n")
6. 「PreviousCard」というリストを作成し、値0を格納します。このリストは後で現在のカードIDを格納するために使用します。
PreviousCard = [0]
7. while True ループを作成して、その中のコードを継続的に実行します。
while True:
8.リーダーを初期化して、使用できる状態にします。
reader.init()
9.リーダーのステータスと RFID タグ タイプを保存するタプルを作成します。
(stat, tag_type) = reader.request(reader.REQIDL)
10.リーダーの準備が整っている場合は、if条件文でカードの内容を読み取ります。その後、カードから取得した詳細情報でstatオブジェクトとuidオブジェクトを更新します。
if stat == reader.OK: (stat, uid) = reader.SelectTagSN()
11.カードのuidがPreviousCardオブジェクトに格納されている値と同じ場合、コードは続行されます。これは、同じカードがリーダーに繰り返し提示されたときに発生します。
if uid == PreviousCard: continue
12.カードの読み取りが正常であったかどうかを確認するための if 条件文を作成します。
if stat == reader.OK:
13.ユーザーにメッセージを出力し、カードのUIDを「card」というオブジェクトに保存します。その後、カードの詳細をPythonシェルに出力します。
print("The card details are as follows") card = reader.tohexstring(uid) print(card)
14.提示されたカードの uid を使用して PreviousCard オブジェクトを更新します。
PreviousCard = uid
15.カードが提示されていない場合に実行されるelse条件を作成します。PreviousCardオブジェクトを更新します。次に、メインループが繰り返される前に、コードに50ミリ秒の一時停止を追加します。
else: PreviousCard=[0] utime.sleep_ms(50)
16. Raspberry Pi Picoにコードをreader.pyとして保存し、「実行」>>「現在のスクリプトを実行」をクリックするか、緑色の再生ボタンを押します。指示に従って、RFIDカード/タグをリーダーにかざします。
17.カードの詳細をすべてコピーします。これはRFIDカードのUIDで、この手順の次の部分で必要になります。UIDは次のようになりますが、お使いのUIDは異なります。
[0x04, 0xBC, 0xA0, 0x9A, 0xB3, 0x43, 0x80]
完全なコードリスト
from mfrc522 import MFRC522
import utime
from machine import Pin reader = MFRC522(spi_id=0,sck=2,miso=4,mosi=3,cs=1,rst=0)
red = Pin(14, Pin.OUT)
green = Pin(15, Pin.OUT) print("Present the card to the reader\n")
PreviousCard = [0] while True: reader.init() (stat, tag_type) = reader.request(reader.REQIDL) if stat == reader.OK: (stat, uid) = reader.SelectTagSN() if uid == PreviousCard: continue if stat == reader.OK: print("The card details are as follows") card = reader.tohexstring(uid) print(card) PreviousCard = uid else: PreviousCard=[0] utime.sleep_ms(50)
コードを取得したら、プロジェクトコードに、そのコードを使ってアクセスを許可し、緑色のLEDを点灯させるように指示する必要があります。別のカード/タグがリーダーに提示されると、赤色のLEDが点灯します。
1.これら 2 行の間に、新しいコード行を作成します。
print(card)
NEWCODE GOES HERE PreviousCard = uid
2.カードのUIDを確認するif条件文を作成します。Pythonのリストのように見えますが、実際には文字列として保存されるため、値を“ “で囲む必要があります。[ ]括弧を忘れないでください。
if card == "[0x04, 0xBC, 0xA0, 0x9A, 0xB3, 0x43, 0x80]":
3.カード オブジェクトに格納されている値がハードコードされた値と一致する場合は、Python シェルに「ACCESS GRANTED」を出力します。
print("ACCESS GRANTED")
4.緑色のLEDのオン/オフを10回切り替えるforループを作成します。各状態の変化の間には0.1秒の間隔があります。forループの最後に緑色のLEDをオフにします。
for i in range(10): green.toggle() utime.sleep(0.1) green.off()
5.認識されないカード/タグがリーダーに提示された場合に、else条件を使用します。これにより、緑色のLEDと同様に赤色のLEDが点灯/消灯します。
else: print("ACCESS DENIED") for i in range(10): red.toggle() utime.sleep(0.1) red.off()
6 .コードを reader.py として Raspberry Pi Pico に保存します。「実行」>>「現在のスクリプトを実行」をクリックするか、緑色の再生ボタンを押します。指示に従って、RFID カードまたはタグをリーダーにかざします。カードが正しければ、緑色の LED が点滅し、Python シェルに「ACCESS GRANTED」と表示されます。別の RFID カードまたはタグを試すと、赤色の LED が点灯し、Python シェルに「ACCESS DENIED」と表示されます。
完全なコードリスト
from mfrc522 import MFRC522
import utime
from machine import Pin reader = MFRC522(spi_id=0,sck=2,miso=4,mosi=3,cs=1,rst=0)
red = Pin(14, Pin.OUT)
green = Pin(15, Pin.OUT) print("Present the card to the reader\n")
PreviousCard = [0] while True: reader.init() (stat, tag_type) = reader.request(reader.REQIDL) if stat == reader.OK: (stat, uid) = reader.SelectTagSN() if uid == PreviousCard: continue if stat == reader.OK: print("The card details are as follows") card = reader.tohexstring(uid) print(card) if card == "[0x04, 0xBC, 0xA0, 0x9A, 0xB3, 0x43, 0x80]": print("ACCESS GRANTED") for i in range(10): green.toggle() utime.sleep(0.1) green.off() else: print("ACCESS DENIED") for i in range(10): red.toggle() utime.sleep(0.1) red.off() PreviousCard = uid else: PreviousCard=[0] utime.sleep_ms(50)
レス・パウンダーは、トムズ・ハードウェアのアソシエイトエディターです。クリエイティブテクノロジストとして、7年間にわたり、老若男女を問わず、教育と啓発のためのプロジェクトを手がけてきました。Raspberry Pi Foundationと協力し、教師向けトレーニングプログラム「Picademy」の執筆・提供にも携わっています。