電子工作RaspberryPiでNFCタグを使ってみる久しぶりにいろいろと思うところがあって、RaspberryPiでNFCのタグを使ってみることにしました。基本的には過去エントリー見てもらえればいいのですが、その頃からRaspbianのバージョンもベースが変わっているのでちょっと変わったようです。いうか楽になっただけなので大したことはないです。uepon.hatenadiary.com使用したタグはサンワサプライさんのシールタイプになります。一枚あたり100円を切っているので、前よりも安くなってきていますね。今回のOS情報も念の為。Pi2を使用してます。(stretch)となっています。基本的には以前のエントリーと同様にUSBを挿すだけで認識は行われます。``nfcpy```からは認識出来ないようです。自分も何回か試してみましたがだめでした。nfcpy側では対応デバイスになっていますが、情報から察するにその他ライブラリなどの依存関係も疑われるのではないかと思います。(wheezy)に変わったあたりか使えなくなっているのではないかと推測しています。USBケーブルで接続すると以下のようになります。hub特に問題ありません。2つ接続しても問題なく認識されています。hubnfcpyモジュールのインストール前回とは異なり、pipに登録されていました。気になる点としてはpython2系にしかまだ対応していない点でしょうか。ドキュメント通りインストールすれば問題はありません。-Uスイッチをつけて置かないとエラーがでるようです。pyserial-3.4インストールは終わりましたが、テスト用のコマンドなどはインストールされていませんので、Githubから以下のサイトからcloneします。testsnfcpyの実行を行うインストール準備がおわったので続いてはnfcpyモジュールのチェックを行います。以下のコマンドで行います。インストール直後はsudoをつけないと以下のようなエラーメッセージが表示されます。(sudoをつければ実行は問題はありません。)今回はRaspberryPiに2つのリーダーを接続しているのでエラーも2つ表示されています。deviceこのメッセージの内容は、「使用するデバイスをplugdevグループに入れて続くコマンドをいれるとsudoなしで実行できるようになります。」とのことでした、ベンダIDなどもセットされた形でメッセージが表示されるので、コピペして以下のように実行します。-Rリーダーが複数ある場合はエラーメッセージにある分だけ実行します。実行が終わったら、念の為RaspberryPiを再起動し、改めてチェック行ってみます。devsこれでsudoをつけなくてもエラーメッセージは表示されないようになります。デバイスも正しく認識されているようです。続いてはGithubで落としてきたテスト用のコマンドを使用して交通系ICカードを読み込ませてみます。exampleディレクトリ内のtagtool.pyがテスト用のコマンドです。実行すると読み込み待ちになります。**ここで交通系ICカードをタッチすると読み込んだデータの一部が表示されます。SYS=0003このコマンドでは使用するリーダーを指定して起動することになります。(指定しない場合には最初に見つかったリーダーが使用される)では、改めて今回準備したNFCタグを読み込ませてみます。うまく読み込めたようです。購入時は何も書き込まれていないので以下のような表示になります。(この商品は144Byteのデータ書き込みができるようですが、実際には137byteの書き込みになってしまうようです。bytepythonからタグを操作するタグ情報をreadするon_ほげほげみたいな感じのイベントハンドラーのメソッドを作成して、usb接続のデバイスに登録することで読み込むことができます。今回の例ではon_connectが読み込みに当たりますが、今後の例もこの部分を編集して実装しています。})clf.close()このプログラム例ではタグ情報をダンプしていますが、初期状態ではタグの内容は空になってます。''無事にフォーマットされていることがわかります。World!"という文字列を書き込んでみます。World!'無事に書き込まれているようです。先程のフォーマットをすれば初期化も問題なくできます。''複数のリーダーを使用した読み込み(スレッド+interruptシグナル対応)今回は複数のリーダーを接続してそれぞれでタグを読み込ませたいと思っていたのでそれを実装してみます。各デバイスごとにスレッドを生成し、且つデーモン化してCtrl+Cでの終了にも対応させています。各デバイスの読み込みをスレッド化しているので以下のようにデバイスの設定をできるようにしています。バス番号とデバイス番号を指定ここでいうデバイスが接続したリーダーの設定になります。引数として与える情報としてはlsusbコマンドで認識されたBusとDeviceIDを与えることになります。上記のような表示が行われた場合には以下のように引数で与えれることになります。USBの接続状態によって毎回変わる可能性のある情報なので注意が必要となります。threading.Thread(target=readNFCThread,name="readNFC2",args=('usb:001:005',))このプログラムではThread化しているのでCtrl+Cを押してinterruptを発生させても、Threadが終了しない状態になります。そのため、以下のようにしてDeamonの設定をしています。World!の書き込まれたタグを別のリーダーに読み込ませると以下のような表示になります。World!'-----------------一応はできていますが、なんとなく処理が遅いです。それぞれのリーダーでポーリングをしているということもあるので、少し待ち時間があるようです。(別のターミナルで別々のreadNFC.pyを動作させたほうが早いかもw)このままの仕組みで高速化するのであれば、もっと別の方法での工夫がいるかなと思います。終わりにraspbianなどのバージョンも変わると設定方法もいい感じで簡単になってきているのでいいですね。月別アーカイブ参加グループはてなブログをはじめよう!ueponxさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。