前回はI2C通信を学びました。

今回はSPI通信とRFIDについて学んでゆきます。
SPI(エス・ピー・アイ)とは
SPI(Serial Peripheral Interface)通信は、主にマイコンと外部デバイス(センサ、メモリ、RFIDなど)を高速にやりとりするための通信方式です。
特徴
項目 | 説明 |
---|---|
通信方式 | シリアル(1ビットずつ送る) |
通信方向 | 双方向(同時に送受信可能) |
接続方法 | マスター1台 + スレーブ複数可能(通常1対1) |
転送速度 | I2Cより高速(数MHzまで) |
使用ピン数 | 最低4本(後述) |
SPI通信の4本の基本線
信号線名 | 略称 | 説明 |
---|---|---|
クロック線 | SCK | データの転送タイミングを作る |
マスター出力 / スレーブ入力 | MOSI | マスターからスレーブへデータを送る |
マスター入力 / スレーブ出力 | MISO | スレーブからマスターへデータを返す |
スレーブ選択 | CS(またはSS) | 通信相手を選ぶ(LOWで選択) |
RFIDとは
RFID(Radio Frequency IDentification)は、電波を使ってタグの情報を非接触で読み取る技術です。
RC522は、安価で扱いやすい13.56MHzの近距離RFIDリーダーモジュールで、SPI通信を使ってマイコンとやり取りします。
RFIDの用途(現実世界)
- ICカード(交通系カード、学生証、社員証など)
- 電子キー、出席管理、鍵認証、在庫管理 など
RC522とPico Wの接続ピン(SPI使用)
RC522 ピン | Pico GPIOピン | 説明 |
---|---|---|
SDA(=SS) | GP5 | スレーブ選択(CS) |
SCK | GP6 | SPIクロック |
MOSI | GP7 | データ送信 |
MISO | GP4 | データ受信 |
RST | GP22 | リセット信号 |
GND | GND | グランド |
3.3V | 3.3V | 電源(※5V不可) |
ライブラリのインストール
GitHubに公開してある、Raspberry pi W用ライブラリにアクセスし、ダウンロードします。
https://github.com/kevinmcaleer/pico-rfid/blob/main/mfrc522.py
Thonnyで開き、mfrc5cc.pyという名前でRaspberry Pi Pico Wに保存します。

例題1
読み取ったRFIDのIDを表示するプログラムは以下の通りです。
from mfrc522 import MFRC522
from machine import Pin
import utime
# RC522 初期化(Pico W の GPIO に合わせる)
reader = MFRC522(
sck=6, # SPI Clock
mosi=7, # SPI MOSI
miso=4, # SPI MISO
rst=22, # Reset
cs=5 # Chip Select
)
print("RC522 RFIDリーダー起動中...")
print("カードをかざしてください")
while True:
reader.init()
(status, tag_type) = reader.request(reader.REQIDL)
if status == reader.OK:
(status, uid) = reader.SelectTagSN()
if status == reader.OK:
print("カードが検出されました! UID:", reader.tohexstring(uid))
utime.sleep(1)
処理 | 内容 |
---|---|
reader.init() | RC522の初期化(毎回必要) |
reader.request() | カードがあるか確認 |
reader.SelectTagSN() | UID(カード固有ID)を取得 |
reader.tohexstring(uid) | UIDを16進表記の文字列に変換して表示 |

例題2
登録したカードのIDと一致した場合のみビルドインLEDが光るプログラムは以下の通りです。
from mfrc522 import MFRC522
from machine import Pin
import utime
# RC522 初期化(SPI0、GPIO番号)
reader = MFRC522(sck=6, mosi=7, miso=4, rst=22, cs=5)
# Pico W のオンボードLED("LED" という名前で定義されている)
led = Pin("LED", Pin.OUT)
# 目標UID(10進数)
target_uid = [0x33, 0x59, 0x14, 0x25]
print("カードをかざしてください...")
while True:
reader.init()
(status, tag_type) = reader.request(reader.REQIDL)
if status == reader.OK:
(status, uid) = reader.SelectTagSN()
if status == reader.OK:
print("UID:", uid)
if uid == target_uid:
print("✅ 認証成功!LED点灯")
led.value(1)
utime.sleep(1)
led.value(0)
else:
print("❌ 認証失敗:UID不一致")
utime.sleep_ms(300)
項目 | 説明 |
---|---|
Pin("LED", Pin.OUT) | Pico W のビルドインLEDを使う方法(公式にサポート) |
target_uid = [0x33, 0x59, 0x14, 0x25] | 登録したID |
utime.sleep(1) | 認証成功時、LEDを1秒点灯する |

課題12
Raspberry Pi Pico W と RC522 RFID モジュールを使って、以下のような簡易アクセス認証システムを作りなさい:
- ICカードをRC522にかざすと、カードのUID(識別番号)を読み取る。
- UIDがあらかじめ登録されたカードと一致する場合のみLEDを点灯させる。
- 一致しない場合はブザーや赤色LEDなどでエラーを伝える。
- UIDはシリアルモニタに常に表示すること。
解答例はこちら
from mfrc522 import MFRC522
from machine import Pin, PWM
import utime
# RC522 初期化(GPIOピン設定)
reader = MFRC522(sck=6, mosi=7, miso=4, rst=22, cs=5)
# LED(オンボード)
led = Pin("LED", Pin.OUT)
# ブザー(GP15 に接続、PWM制御)
buzzer = PWM(Pin(15))
buzzer.duty_u16(0) # 初期状態OFF
buzzer.freq(2000) # 2kHz の音(好みで調整)
# 登録済みUID(10進表記)
target_uid = [51, 89, 20, 37] # = 0x33, 0x59, 0x14, 0x25
print("カードをかざしてください...")
while True:
reader.init()
(status, tag_type) = reader.request(reader.REQIDL)
if status == reader.OK:
(status, uid) = reader.SelectTagSN()
if status == reader.OK:
print("UID:", uid)
if uid == target_uid:
print("✅ 認証成功:LED点灯")
led.value(1)
buzzer.duty_u16(0) # ブザーは鳴らさない
utime.sleep(1)
led.value(0)
else:
print("❌ 認証失敗:ブザー警告")
# ブザーを短く鳴らす
buzzer.duty_u16(1000) # 音量設定(0〜65535)
utime.sleep(0.5)
buzzer.duty_u16(0)
utime.sleep(0.3)
次回はこちら