今回の記事を担当するエンジニアの榎本です。
これまでの記事
・電子ロッカー開発始めます → 電子ロッカー開発に至った経緯など
・ラズパイ で電子ロッカーを作る!(物理構成編)→ 機器や配線など物理的な構成に関する記事
ここからは Raspberry Pi上で動くプログラムについて書いていきます。
今回Raspberry Pi側で採用したプログラム言語について
Node-REDというビジュアルプログラミングツールを採用しました。Node-REDとは何かというと。。。
Node-REDはハードウェアデバイス、APIおよびオンラインサービスを新しく興味深い方法で接続するためのツールです。ブラウザベースのエディタによってパレットに並ぶ多種多様なノードを結びつけて用意にフローを作成でき、さらにシングルクリックで実行環境にデプロイすることができます。
Node-RED日本ユーザー会トップページより引用
とのこと。
つまり、ブラウザからノードと呼ばれるブロックを線でつなげて思い通りにデバイスを動かせる素敵な言語になります。名前から推察できる様に、Node.js上で構築されてますので、必要に応じて Javascriptでのコーディングまでできるので、編集が容易かつ柔軟性が高い言語となっています。

画面上で「再起動」などと書かれているかボックスがノードとなります。各処理をつなげてやりたいことを実現できます。
電子ロッカーを構成する各種ノードの紹介
Injectノード
上記コードエディタ左側の「timestamp」と書かれているノードです。時間を指定して処理を起動することができます。

Execノード
上記コードエディタで「再起動」と書かれているノードです。このノードでコマンドの実行を行うことができます。この場合は下記のコマンドを実行することで再起動を実現しています。
sudo shutdown -r now

つまり上述2つのノードの組み合わせで、「毎朝7時に再起動をする」という命令が組み立てられます。非常に分かりやすくて便利ですね。
MQTTノード
今回の電子ロッカーは
ECサイトからの命令をAWS IoT CoreのMQTTへPublish
↓
ラズパイ 側で該当のTopicをSubscribeしメッセージの受信をきっかけに鍵を操作
することで解錠・施錠の実行を実現しています。Node-REDはMQTT処理に必要なノードが用意されているので非常に簡単にこの処理を実行することができます。
入力側のmqttが Subscribeで 出力側がPublishになります。
ノードには MQTT Broker となるサーバの情報・トピック・QOS(=Quality Of Service)を設定することで簡単にPublish/Subscribeを実現できます。(見落としがちですが、QOSはPublish側と合わせる様にしましょう!私はここの数値が食い違っていたために数時間ハマりました。。。)



余談ですがMQTT Brokerは AWS IoT Coreを SORACOM Beam経由で使っています。AWS IoT Coreの認証を肩代わりしてくれるので ラズパイ 側に証明書などを持つ必要がないことがメリットになります。(これはまた後日記事にします)
PCA9685ノード

こちらは標準のノードではないので、パレットの管理から自分で追加する必要があります。Node-REDのホームページにサンプルを含め説明が載っています。


基本的には
1. PCA9685 Deviceで対象のデバイスを選択(デバイスの設定方法は下記に記述)
2. Channelはターゲットになる PCA 9685 の チャネルを選択 (直接指定でも良いし、msg.channel という変数に設定した数値でも良い)
3. Unitはサーボモータを動かしたいときは、「microseconds」 LEDを点灯させたりしたいときは「Percent」を選択しましょう。

PCA9685を指定する画面です。ラズパイ 側で下記の通りになっていれば特に変更する必要はありません。
※Addressは下記の画面で 0x40(=64)であることが確認できます。

例) 15個の扉の解錠を行い、操作がされた時にLEDを点滅させるためのフローは下記の様になります。
1. open_1_all へのメッセージの Publishをトリガーにしてフローが起動
2-1. サーボモータを動かす
2-1-1. サーボモータを140度回転した位置にするためmsg.payloadに値を設定
2-1-2. PCA9685 ノードを経由して1〜15チャネルに命令を出す
2-2. LEDを点滅させる
2-2-1. 0番のチャネルに接続されたLEDを点滅させる
2-3. MQTTメッセージを受け取ったことを送信元のプログラムへ返却するため、受け取ったランダムな文字列をそのまま返却用のMQTTトピックにPublishする

他に大きなポイントとして、ラズパイ の死活監視に使っているlwm2ノードがあるのですが、これは監視についての記事で触れたいと思います。
次回は電子ロッカーのネットワークや、利用しているSORACOMのサービスについて触れていきたいと思います!