【Python】PaSoRiでカードを読み取ったら音を鳴らす
目的
前回、PaSoRiの上にICカードを置いた状態からカードの中の情報を読み取る、というものをPythonで試しましたが、世の中のカード読み取りの感じを出すためにカードが置かれるまで待ち受けで、カードをかざすと読み取って音を鳴らすものを試しに作ってみたい。
音源
フリーで使用可能な効果音を提供してくださっている以下のサイトを利用させていただきました。
好みの効果音をダウンロードして、適当なフォルダに入れておきます。ファイル形式はmp3かwavが良いです。
音源再生用ライブラリ(pydub)
Pythonで音を再生するライブラリとしてPyAudioというものが有名みたいです。ただ、他にも調べてみるとpydubというライブラリもありました。このpydubですが、単に音を再生するだけなら非常に少ないコードで実装できます。
今回はpydubで音を鳴らすことにします。
2019/0906追記:pydubを使用する場合でもpyaudioをimportしていないと何故か怒られましたので、結局pyaudioもimportするコードにしました。
コード
カードの待ち受けと読み取りの肝となるnfcのメソッド関連はこちらのマニュアルを参考にして書きます。
https://buildmedia.readthedocs.org/media/pdf/nfcpy/latest/nfcpy.pdf
主要な部分としては以下です。
① nfc.ContactlessFrontend()
ローカルデバイスとの通信を管理するメソッドです。PaSoRiをusb接続している場合は引数に’usb’を入れておき、最初に呼び出しておけば良いようです。
②clf.sense(target)
カードを検知するためのメソッドです。ターゲットを検知した時にIDmを返します。optionで検知のiteration(繰り返し数)とinterval(間隔)などを設定できます。
それでは実際のコードです。
import nfc
import time
import pyaudio
from pydub import AudioSegment
from pydub.playback import play
# 効果音ファイルの読み込み
sound = AudioSegment.from_file("your_sound.mp3", "mp3")
def check_ic():
print('Waiting Now')
# usb接続のNFCリーダを定義
clf = nfc.ContactlessFrontend('usb')
target = clf.sense(nfc.clf.RemoteTarget("212F"), iterations=1, interval=1)
#カードが見つかったら読み取りに入る
if not target_res is None:
  tag = nfc.tag.activate(clf, target)
  tagdump=tag.dump()
  # 再生
  play(sound)
  #次の読み取りまで1秒待つ
  time.sleep(1)
clf.close()
while True:
check_ic()
結論
あまり手の込んだことはやれていませんが、とりあえず、カードをかざすと読み取って音が出る、という部分だけはできました。