6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

nfcpy と PaSoRi RC-S380/P をセットアップ

Last updated at Posted at 2022-03-07

(Felica/Mifare/NFC チャレンジシリーズ) その他の記事はこちら 「Felica/Mifare/NFC でいろいろ実験」
https://qiita.com/nanbuwks/items/1f416d6e45a87250ee0a


nfcpy は Python で NFC を使うための モジュール。

Sonyの以下のPaSoRiカードリーダーに対応している。

  • RC-S330
  • RC-S360
  • RC-S370
  • RC-S380/S
  • RC-S380/P

このほか、NXPの以下のNFCチップを使ったカードリーダーにも対応しているらしい(インターフェースやバージョンの確認が必要)。

  • PN531, PN532, PN533

を使ったカードリーダーにも対応しているらしい。

なお、 SONY RC-S300 や RC-S300/S、 RC-S350は使えないっぽい?

今回は、RC-S380/Pを使って試してみた。

環境

  • Sony PaSoRi RC-S380/P
    image.png

  • Ubuntu 20.04 LTS AMD64

  • Python 3.8.10

  • 1.0.3 version of nfcpy

(2022/03/16追記)
RaspberryPi でも同様に確認できました。

  • Raspberry Pi Model B+ V1.2
  • Raspberry Pi OS Lite armhf-2020-12-04
  • Python 3.7.3

インストール


$ sudo apt install libusb-dev python3-usb
$ sudo pip3 install nfcpy

いろいろと設定

まずは動かしてみると


$ python3 -m nfc

This is the 1.0.3 version of nfcpy run in Python 3.8.10
on Linux-5.11.0-43-generic-x86_64-with-glibc2.29
I'm now searching your system for contactless devices
** found usb:054c:06c3 at usb:003:029 but access is denied
-- the device is owned by 'root' but you are 'nanbuwks'
-- 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 のアクセスに権限が必要ということなので、とりあえず sudo を使って回避してみる。
Ubuntu 20.04 の場合は、以下のようなメッセージが出ました。


$  sudo python3 -m nfc
This is the 1.0.3 version of nfcpy run in Python 3.8.10
on Linux-5.11.0-43-generic-x86_64-with-glibc2.29
I'm now searching your system for contactless devices
** found usb:054c:06c3 at usb:003:004 but it's already used
-- scan sysfs entry at '/sys/bus/usb/devices/3-1.2:1.0/'
-- the device is used by the 'port100' kernel driver
-- this kernel driver belongs to the linux nfc subsystem
-- you can remove it to free the device for this session
   sudo modprobe -r port100
-- and blacklist the driver to prevent loading next time
   sudo sh -c 'echo blacklist port100 >> /etc/modprobe.d/blacklist-nfc.conf'
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

と出たので、指示通り以下の作業を行う。なお、RaspberryPiではこの作業は必要ありませんでした。


$ sudo modprobe -r port100

これについては、ドキュメント

によると PaSoRi RC-S380/P が NFC チップとして Port100 とある。これは何かな?
image.png
RC-S380/P 内部は NXP OM5570 と STM32F103TBU6 が入っていて、 STM32F103TBU6 の USB 機能を使っていました。
このような構成でのドライバが Port100 かな? おそらく Sony の RC-S380/S と RC-S380/P を使うときにこの作業が必要ぽいです。

Port100 は linux-nfc-subsystem でサポートされているらしく自動でドライバモジュールがロードされます。しかし nfcpy は Linux NFC Subsystem を使わないのでドライバモジュールを削除する必要があるらしいです。

以下はカードリーダーつなげていない状態。

$ sudo python3 -m nfc
This is the 1.0.3 version of nfcpy run in Python 3.8.10
on Linux-5.11.0-43-generic-x86_64-with-glibc2.29
I'm now searching your system for contactless devices
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


エラーは消えているみたいなのでカードリーダーつなげて再度実行。


$ sudo python3 -m nfc
This is the 1.0.3 version of nfcpy run in Python 3.8.10
on Linux-5.11.0-43-generic-x86_64-with-glibc2.29
I'm now searching your system for contactless devices
** found SONY RC-S380/P NFC Port-100 v1.11 at usb:003:008
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

カードリーダーが認識されています。

さて、先に出ていたサジェスチョンの通り設定をし直してみます。


$ sudo adduser pi plugdev 
$ 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 

sudo adduser pi の pi のユーザ名は適宜変更、また、Ubuntu20.04の場合は以下も作業が必要かな。

$ sudo sh -c 'echo blacklist port100 >> /etc/modprobe.d/blacklist-nfc.conf'

これで適宜再起動や PaSoRi RC-S380/Pを繋ぎ直しなどを行い、再度テストします。
以下は RaspberryPi の場合。


$ python3 -m nfc
This is the 1.0.3 version of nfcpy run in Python 3.7.3
on Linux-5.10.63+-armv6l-with-debian-10.11
I'm now searching your system for contactless devices
** found SONY RC-S380/P NFC Port-100 v1.11 at usb:001:007
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

うまく認識できています。

サンプルプログラムを実行する

以下にある、examples/tagtool.py を使ってみます。

手持ちのタグを近づけると反応しました。
image.png


$ sudo python3 examples/tagtool.py
[nfc.clf] searching for reader on path usb
[nfc.clf] using SONY RC-S380/P NFC Port-100 v1.11 at usb:003:075
** waiting for a tag **
Type2Tag ID=038B4F03

以下はRaspberryPi上で、nanaco カードをかざしてみた挙動です。


$ 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:007
** waiting for a tag **
[nfc.clf] [Errno 19] No such device
$ 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:010
** waiting for a tag **
Type3Tag 'FeliCa Standard (RC-S960)' ID=0114B4276B115A23 PMM=0F0D23042F7783FF SYS=8B61
$ 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:011
** waiting for a tag **
Type3Tag 'FeliCa Standard (RC-S960)' ID=0114B4276B115A23 PMM=0F0D23042F7783FF SYS=8B61
$ 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:018
** waiting for a tag **
[nfc.clf.transport] USBErrorPipe()
[nfc.clf] [Errno 5] Input/output error
[nfc.clf.transport] USBErrorPipe()
$ 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:024
** waiting for a tag **
Type2Tag ID=F26B7B3E

5回試して成功が2回でした。ちょっと不安定ぽいです。

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?