ラズパイでPaSoRi(パソリ)を使ってNFCカード読み取り
Pythonでnfcpyパッケージを使えばラズパイでもNFCカードの読み取りができる。
前に挑戦した時はrootでしかも無理やりシステム側にnfcpyをインストールしてた。色々調べたら一般ユーザーでも使えるようになった。そのメモ書き。
使ったもの
- ラズベリーパイ3
- OSバージョンはTrixie
- Lite版でもどちらでも良い。
- ラズパイ4などでもできるはず
- ソニー パソリ RC-S380/P
- 他のパソリで動くか不明。
まずはPython仮想環境を構築
cd ~
python3 -m venv --system-site-packages ~/python-env
仮想環境に入ってnfcpyをpipでインストール
source python-env/bin/activate
pip install nfcpy
下記コマンドを実行してnfcpyからパソリが見えているか確認。
python3 -m nfc
実行結果。パソリにアクセスする権限がないので一般ユーザーでもアクセスできるようにudevのルールを追加しろとか言ってくる。
(python-env) tanakei@pi3:~ $ python3 -m nfc
This is the 1.0.4 version of nfcpy run in Python 3.13.5
on Linux-6.12.47+rpt-rpi-v8-aarch64-with-glibc2.41
I'm now searching your system for contactless devices
** found usb:054c:06c3 at usb:001:004 but access is denied
-- the device is owned by 'root' but you are 'tanakei'
-- also members of the 'root' group would be permitted
-- you could use 'sudo' but this is not recommended
-- better assign the device to the 'plugdev' group
sudo sh -c 'echo SUBSYSTEM==\"usb\", ACTION==\"add\", ATTRS{idVendor}==\"054c\", ATTRS{idProduct}==\"06c3\", GROUP=\"plugdev\" >> /etc/udev/rules.d/nfcdev.rules'
sudo udevadm control -R # then re-attach device
I'm not trying serial devices because you haven't told me
-- add the option '--search-tty' to have me looking
-- but beware that this may break other serial devs
Sorry, but I couldn't find any contactless device
自分の環境だと usb:054c:06c3とか usb001:004だけど、ユーザーごとに違うかも。
とりあえず指示のとおり下記コマンドを実行してルールのファイルを作成する。
※追記参照。後述のMODEを最初から入れます。
sudo sh -c 'echo SUBSYSTEM==\"usb\", ACTION==\"add\", ATTRS{idVendor}==\"054c\", ATTRS{idProduct}==\"06c3\", GROUP=\"plugdev\" >> /etc/udev/rules.d/nfcdev.rules'
/etc/udev/rules.d に nfcdev.ruleというファイルができる。中身はこうなってるはず。catコマンドを実行して確認。
(python-env) tanakei@pi3:~ $ cat /etc/udev/rules.d/nfcdev.rules
SUBSYSTEM=="usb", ACTION=="add", ATTRS{idVendor}=="054c", ATTRS{idProduct}=="06c3", GROUP="plugdev"
このファイルの中の末尾にMODE="0666"を追加する。
もし==や=の後の文字列がダブルクォーテーションで囲われてない場合は付ける。
編集するときはnanoを使う。別のエディタでも可。
sudo nano /etc/udev/rules.d/nfcdev.rules
編集結果
(python-env) tanakei@pi3:~ $ cat /etc/udev/rules.d/nfcdev.rules
SUBSYSTEM=="usb", ACTION=="add", ATTRS{idVendor}=="054c", ATTRS{idProduct}=="06c3", GROUP="plugdev", MODE="0666"
次はこのコマンドを実行。
その後パソリを抜き差しする。
sudo udevadm control -R
もう一度下記コマンドを実行してnfcpyからパソリが見えているか確認。
python3 -m nfc
実行結果。うまくできていればこうなる。
(python-env) tanakei@pi3:~ $ python3 -m nfc
This is the 1.0.4 version of nfcpy run in Python 3.13.5
on Linux-6.12.47+rpt-rpi-v8-aarch64-with-glibc2.41
I'm now searching your system for contactless devices
** found SONY RC-S380/P NFC Port-100 v1.11 at usb:001:004
I'm not trying serial devices because you haven't told me
-- add the option '--search-tty' to have me looking
-- but beware that this may break other serial devs
ここまでできればセットアップ完了です。
ちゃんと読み取れるか確認するならnfcpyのサンプルプログラムを実行すると良い。ホームディレクトリにsrcディレクトリを作り、githubからダウンロードしてくる。ダウンロードできたらサンプルコードのあるディレクトリに移動。
cd ~
mkdir src
cd src
git clone https://github.com/nfcpy/nfcpy.git
cd nfcpy/examples/
サンプルコードのtagtool.pyを実行。
NFCカードをかざすと読み取れる。動作確認用に This is a sample text. を書き込んだNFCカードをかざした結果はこうなった。
(python-env) tanakei@pi3:~/src/nfcpy/examples $ python3 tagtool.py
[nfc.clf] searching for reader on path usb
[nfc.clf] using SONY RC-S380/P NFC Port-100 v1.11 at usb:001:006
** waiting for a tag **
Type2Tag 'NXP NTAG215' ID=045B64DA216E81
NDEF Capabilities:
readable = yes
writeable = yes
capacity = 492 byte
message = 29 byte
NDEF Message:
record 1
type = 'urn:nfc:wkt:T'
name = ''
data = b'\x02enThis is a sample text.'
(python-env) tanakei@pi3:~/src/nfcpy/examples $
おわり
※追記
nanoでいちいち編集するより下記のコマンドで最初からmode="0666"を入れてしまうと手間が省ける。
sudo sh -c 'echo SUBSYSTEM==\"usb\", ACTION==\"add\", ATTRS{idVendor}==\"054c\", ATTRS{idProduct}==\"06c3\", GROUP=\"plugdev\", MODE=\"0666\" >> /etc/udev/rules.d/nfcdev.rules.old'




