Python Raspberry Pi Pico WOKWi プログラム 回路 電子工作 高専3年生

【Raspberry Pi Pico入門⑥】SPI通信【RFID-RC522】

前回は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)
SCKGP6SPIクロック
MOSIGP7データ送信
MISOGP4データ受信
RSTGP22リセット信号
GNDGNDグランド
3.3V3.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)

次回はこちら

Follow me!

-Python, Raspberry Pi Pico, WOKWi, プログラム, 回路, 電子工作, 高専3年生
-, , , , ,

PAGE TOP