部室メーリスを学生証と連動させる(3)

前回のあらすじ

前回の記事ではハードウェアをあらかた完成まで持っていきました.
今回はソフトウェアを実装し,動作させてみた様子をまとめます.

ソフトウェア

液晶

開発初期の間は外付けモニタを用意してHDMIでつなぎます.しかし,実際に使用するときはaitendo液晶に画面を出すことになります.そこで,今のうちに液晶の設定をしておきます.
今回使用した液晶のコントローラICはili9328ですが,これはili9325のフルコンパチとのことです.したがって,FBTFTのITDB02-2.8と同様の設定をするだけで液晶が使えるようになります.

Home · notro/fbtft Wiki

GPIO読み取り

いろいろと方法があることが分かりました.今回はライブラリを使わず,Sysfsを使ってスイッチの状態を読み込もうと思います.

/sys/class/gpio/ 以下を操作すれば良いそうです.ただし管理者権限でないと初期設定に関する操作ができませんでした.それ以外の,状態の取得や出力電圧の変更などは一般ユーザでもできるみたいです.
GUIアプリケーションを管理者権限で動かすことは避けたいので,GPIO周りの初期設定だけシェルスクリプトにまとめて,アプリケーションを分離することにしました.

NFC読み取り

NFCのリーダは,前回同様RC-S620/Sを使います.しかし公式で用意されているドライバはArduino用のみ…….困っていたら良い記事が見つかりました.

Raspberry Pi に FeliCa リーダー・ライター RC-S620/S を接続する - Qiita

Wiring PiというArduinoライクなRaspberryPiのライブラリがあります.これを使うことで,Arduino用RC-S620/SドライバをRaspberryPiでも使えるようにしよう,という内容でした.ありがたく使わせていただきます.

部員名簿の同期

サークルでは,毎年新しい部員が増えて,老害が消えていきます.時々ポツンと新しい人が入ってきたり,いつの間にか消えていることもあります.いちいちRaspberryPiに接続して名簿を更新するというのも面倒くさいので,GoogleDriveを使ってブラウザから名簿の更新ができるようにしました.更新作業は次のようにします.

  • 登録
    1. GoogleDrive上のファイルに登録したい人の名前を記入
    2. pisystemのメニューから名簿の更新を実行
    3. GoogleDriveから名簿をダウンロードし,カード未登録の部員を順番に登録していく
    4. GoogleDriveに登録済みの名簿をアップロード
  • 削除
    1. GoogleDrive上のファイルから削除したい人を消去
    2. pisystemのメニューから名簿の更新を実行

pisystemの起動時と名簿の更新作業時に,GoogleDriveと同期させています.名簿は,部員の名前とカードのIDをcsv形式で保存しているので,ブラウザからも容易に編集が出来ます.

RaspberryPiからGoogleDriveは,次のアプリケーションを使っています.

prasmussen/gdrive: Google Drive CLI Client

コマンドラインからGoogleDriveにアクセスでき,様々な操作ができるので大変便利です.使い方が少しむずかしいので予め自分のドライブでコマンドを叩き,感覚を掴んでおくことをオススメします.
今回のアプリケーションでは,名簿のファイル名を予め設定しておきました.gdriveを利用して,まずファイル名から名簿ファイルの固有IDを調べ,この固有IDを使うことでファイルのダウンロードや削除操作ができるようになります.

メールの送信

メールを送信します.今回はGmailのアカウントを使って,msmtpで送信しました.
msmtpはsendmailと完全互換のあるSMTPクライアントです.Gmailのアカウントなどを設定することでお手軽にメールを送信できます.

msmtp - ArchWiki

Gmailの認証についてですが,上記Wikiには”Less Secure Apps”を許可することでGoogleアカウントが利用できるようになるとありましたが,僕の環境ではなぜか利用できなかったため,2段階認証のアプリパスワードを設定しました.
鍵の保存ですが,GNOME Keyringを使うことで容易にパスワード管理ができます.

Slackへ投稿

サークル内でSlackに移行しようという動きがあったので,メールに加えてSlackにも投稿できるようにしました.

SlackにはSlack APIというAPIがあります.背景が電子工作っぽくて可愛い.
APIの詳しい説明は省きますが,今回はメッセージを送信するだけの簡単なお仕事なので,WEB APIを使います.

トークンを発行すれば,あとはlibcurlを使ってHTTPのPOSTメソッドを投げるだけで,予め設定したチャンネルにメッセージを送信することが出来ました.

GUI

ユーザーインターフェースを良くしたいので,GUI画面を作ります.今回は使い慣れているQtを使おうと思います.Qtでウインドウを作るにはいくつか方法があります.

  1. QtCreatorで直感的にデザインする
  2. QtCreatorを使わずに直書きする
  3. QtQuickでQMLを編集してデザインする

3番のQtQuickについては過去記事を参照してください.
今回は複雑な画面を作らないということで,2番の方法で進めました.詳しく書くと長くなるので今回は省略します.

GUIソフトのデバッグですが,リモートで実行する方法を知らなかったのでメモっておきます.SSH接続する際に

1
ssh -YC pi@raspberrypi

とオプションを付けることで,クライアントからアプリケーションを実行するとクライアントの画面に表示されるようになります.

ところで別の問題が発生しました.
GUIアプリケーションをコマンドラインから実行すると問題ないのに,ファイラーからダブルクリックで実行できませんでした.

ごめんなさい,原因がはっきりとわかっていませんが,次のようにすることで起動できるようになりました.

1
lxterminal -e /home/pi/git/pisystem/pisystem/run.sh

今回はラズパイの起動時に自動的にこのアプリケーションを実行させるため,cronを使いました.cronの設定も上記と同じように,

1
@reboot lxterminal -e /home/pi/git/pisystem/pisystem/run.sh

という風にしました.

動作確認

とりあえず動くようになりました!
(実は超不安定とか口が裂けても言えない)

動画は一人分のカードのデモです.まだ画面も開発段階のものなのでパッとしません.

次の動画は,カードの追加から複数ユーザーの操作,Slackへの送信までを一通り行ったデモです.

まとめ

無事にソフトウェアが完成しました.
果たしてpisystemは面倒くさがりのMice部員に利用してもらえるのか!?
次回に続く予定