Raspberry Pi 電子工作 05:Felica

今回は、USB接続で動作する「Felica」のリーダー・ライターの接続確認です。 

Felica」はソニー社が開発した「非接触ICカード」です。

非常に様々なところで使用され、現代の生活には欠かせないものとなっているでしょう。

 

使用するのは手元にあった古い端末ですが、おそらくは新しい端末でも同様に使用できると思います。

今回の目的は、USB接続し、カードやスマホをスキャン、IDを取得するまでです。

 

 

1. 使用する端末

  手元にあるのは、この端末です。

  古いものですが、今回の目的を達成することはできます。

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

SONY 非接触ICカードリーダー/ライター PASORI RC-S310/ED4C
価格:3096円(税込、送料別) (2021/1/12時点)

楽天で購入

 

 

2. 接続確認

  接続方法はUSB端子に指すだけです。

  正しく認識しているかは、以下のコマンドにて。

  認識されていれば、「Sony Corp. FeliCa S310 [PaSoRi]」と表示されます。

 lsusb 

 

3. ライブラリなどのインストール

  外部ライブラリをインストール、Pythonから使えるようにセットアップします。

    1. まずは、任意のフォルダに新しいフォルダを作成します。(例として、「pasori」とします)
    2. 「LXTerminal」を開き、作成されたフォルダに移動します。(「cd」コマンド)
    3. 以下のコマンドを実行し、ライブラリなどをインストールします。(「libusb」と「libpafe」)
sudo apt-get install libusb-dev
git clone https://github.com/rfujita/libpafe.git
cd libpafe
./configur
make
sudo make install

 

4. 動作確認

  うまくインストールできたか確認します。

  「LXTerminal」で「pasori」の下の「libpafe」フォルダの下、「tests」フォルダに移動し、以下コマンドで実行します。

  動作できていれば、何行か表示され、「sucess」と表示されます。

  これで、「sudo」(管理者権限)で実行できることが確認できます。

sudo ./pasori_test

 

5. 動作確認(非管理者権限)

  プログラムを管理者権限で動作させるのは不便ですので、非管理者権限でも動作できるように設定します。

  以下の内容でできますが、内容としては設定ファイルを作って、設定を書き込み再起動です。

    1. 「60-libpafe.rules」を新規作成する

sudo nano /lib/udev/rules.d/60-libpafe.rules

    2. 作成した「60-libpafe.rules」を編集する。
     ("054c"は、「lsusb」コマンドで確認できる「ID」の":"の前の値、
      "006C"は、同じく「lsusb」コマンドで確認できる「ID」の":"の後ろの値です。)

ACTION!="add", GOTO="pasori_rules_end"
SUBSYSTEM=="usb_device", GOTO="pasori_rules_start"
SUBSYSTEM!="usb", GOTO="pasori_rules_end"
LABEL="pasori_rules_start"

ATTRS{idVendor}=="054c", ATTRS{idProduct}=="006c", MODE="0664", GROUP="plugdev"

LABEL="pasori_rules_end"

    3. 再起動する。

    4. 先ほどの動作確認と同様、「LXTerminal」で「pasori」の下の「libpafe」フォルダの下、「tests」フォルダに移動し、以下コマンドで実行します。

     「sudo」は不要です。

     うまくいっていれば、先ほどの「sudo」を付けた結果と同じになります。

./pasori_test

 

6. Pythonプログラミング

   準備ができましたので、Pythonで組んだプログラムでIDを読込んでみましょう。

  VisualStudioCodeでリモート接続して実行可能です。

  スマホなどをリーダーにかざして実行すると、16進数の16桁の番号がターミナルに表示されます。

  違うカードやスマホに変えると表示される値が変わり、何も乗せないと「0000000000000000」と表示されるかと思います。

  

# -*- coding: utf-8 -*-
# 日本語コメントをエラーとしないように、UTF-8で保存

# 使用するライブラリのインポート
from ctypes import *

# 定数
FELICA_POLLING_ANY = 0xffff

# ライブラリの読込
libpafe = cdll.LoadLibrary("/usr/local/lib/libpafe.so")

# 初期化
libpafe.pasori_open.restype = c_void_p
pasori = libpafe.pasori_open()

libpafe.pasori_init(pasori)

libpafe.felica_polling.restype = c_void_p
felica = libpafe.felica_polling(pasori, FELICA_POLLING_ANY, 0, 0)

# 読込
idm = c_ulonglong()
libpafe.felica_get_idm.restype = c_void_p
libpafe.felica_get_idm(felica, byref(idm))

# 16進表記で表示
print("%016X" % idm.value)

# 後始末
libpafe.free(felica)
libpafe.pasori_close(pasori)