記事の詳細
IoTを始めよう!ゼロワンシリーズでラズパイゼロの準備とNode-REDとMQTTのお話し
ラズパイゼロの準備とNode-REDとMQTTのお話し
単機能に特化しIoTデバイス製作を手助けするpHATサイズの拡張基板群 「ゼロワン」シリーズ。単機能に特化しIoTデバイス製作を手助けするpHATサイズの拡張基板群 「ゼロワン」シリーズ。
本シリーズは、インターネット経由でRaspberry Piどうしを通信させ、二つ以上の製品を組み合わせてシステムを構築、IoT的に活用することが出来ます。
今回、”Node-RED”システムと”MQTT”プロトコルを利用し、Raspberry Pi間の通信を行ってゼロワンシリーズを連携させてみます。
その前に、まずはNode-REDとMQTTのお話しをさせてください。
Node-RED/MQTTとは
Node-REDは、画面上に”ノード”と呼ばれる処理ブロックを配置し、ノードの間を結線しデータの流れ(フロー)を作成することで、簡単にデータ処理・マシン制御システムを構築できる開発環境です。
Raspberry Pi用のOSとして一般的な”Raspbian”にはプリインストールされており、ネットワーク経由で手元のパソコンからフローの作成、Raspberry Piと周辺機器の制御が可能です。
MQTTとは
MQTTとは、発信機器(パブリッシャ/Pub)と受信機器(サブスクライバ/Sub)、その間でデータを仲介するサーバー(ブローカ/broker)から成り立つ、インターネット経由で遠隔地間の情報をやり取りする通信プロトコルです。
特性、成り立ちから、主にセンサの情報を収集し、シンプルな機械を制御するといったIoTシステムの通信プロトコルとして広く利用されています。
Raspberry Pi Zeroの準備
Raspberry Pi Zeroシリーズ(v1.3,W,WH)は、現行のRaspberry Pi 3と搭載されているSoCのコアのバージョンが異なります。(Zero : ARMv6 / 3 : ARMv8)
そのため、Pi 3で作成した環境をそのままPi Zeroに移し替えると、ソフトウェアが正常に動作しない可能性が高いです。Raspbianのインストールや、後述のNode-REDの準備などは必ずRaspberry Pi Zero上で行ってください。
また、Raspberry Pi Zeroはmicro USB端子とmini HDMI端子が装備されています。通常規格のUSB、HDMIは非対応となるので、あらかじめminiHDMI-MDMI変換アダプタ、USB-OTGケーブル、USBハブを準備してください。
Raspbianのインストール
最初に、Raspberry Pi公式ダウンロードページより”NOOBS”をダウンロードします。NOOBSを用いることでRaspbianのインストールを簡単に行うことができます。
NOOBSのサイズは1.3GBと大きく、ダウンロードに時間がかかりますので、その間にSDカードをフォーマットします。
この時、Windows標準のフォーマットツールではなくSDアソシエーションの提供するSDカードフォーマッターを使用しましょう。ダウンロードし、PCにインストールしてください。
※用意するSDカードの容量は8GBをお勧めします。4GBではシステムが入りきらないことがあり、16GB以上はフォーマットに時間がかかったり、場合によっては相性によりRaspberry Piで使用できない可能性があります。
NOOBSのダウンロード、SDカードのフォーマットが終わったら、ダウンロードしたNOOBSのZipの中身を全てSDカードにコピーします。これもしばらく時間が掛かります。
コピーが終わったら、Raspberry Pi ZeroにSDカード、miniHDMIケーブル(もしくはアダプタ)、USBキーボード/マウスを接続し、電源を投入します。
しばらく待つと、インストールするOSを選択する画面が出てきます。Pi Zero W/WHで無線LANを利用する場合、ここで上の Wifi networks
よりSSIDを選択し、パスキーを入力してインターネットに接続してください。有線接続の場合は、USB-Ethernetアダプタを接続しLANケーブルを接続するだけで完了です。
Raspbianの設定
Raspbianをインストールしたら、各種インターフェースの有効化を行います。 ターミナルを起動し sudo raspi-config
より、 5 Interfacing Options
を選択して、SSH
とI2C
をEnable(有効化)します。
メニューを選択すると "would you like ~~~"
のダイアログと共にYes/Noの選択が出てくるので、Yesを選択してください。
これで、外部からのリモートログインとGPIOのI2C通信バスが利用できるようになります。
また、Raspbianのデスクトップ環境はCPUへの負荷が大きいため、無効化しコマンドラインのみの操作に切り替えることをお勧めします。
切り替えるにはraspi-configの 3 Boot Options
より B1 Desktop/CLI
と進み、 B1 Console
を選択します。
以上の設定が終わったら、EscキーでRaspi-configを終了します。
ここで ifconfig
コマンドでIPアドレスを確認します。ifconfigで見た時のIPアドレスは、"inet"
の後に続く4つの数字の組(xxx.xxx.xxx.xxx)で、基本的には192.168.x.y(x,yは1桁から3桁の数字)となります。
また、パソコンよりTera Term や MobaXterm といったリモートSSHクライアントを用いPi Zeroにログインすると、ディスプレイケーブルの繋ぎ変えやディスプレイの設定変更などを行わずPi Zeroを操作できます。
各ソフトの細かい操作法は割愛しますが、基本的にSSHの接続先設定にて
- “host”/”host name” : ifconfigで確認したIPアドレス
- “User name” : ”pi” (デフォルト)
- ”Password” : ”raspberry”(デフォルト)
と入力すればリモートログインが行えます。このユーザ名とパスワードは変更できるので、デフォルトではセキュリティ的に不安があるという方は変更し、設定を行ってください。
最後に、sudo apt-get update
と sudo apt-get upgrade
を行い、アプリのアップデートを行います。これも時間が掛かるので気長に待ちましょう。
ここまでの操作が終わったら、システムを再起動しゼロワンシリーズ拡張基板を取り付けます。
sudo halt
を入力し、基板上のLEDが点滅しなくなったら電源ケーブルを抜いてください。ここでゼロワンシリーズ拡張基板を取り付け、再度電源を接続し起動します。
Node-REDの準備
node.js / Node-REDのアップデート
Node-REDはRaspbianにプリインストールされていますが、バージョンが古いためアップデートします。
以下のコマンドを実行してください。
bash <(curl -sL https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-nodered)
※通常よく使われる update-nodejs-and-nodered
コマンドはRaspberry Pi Zeroの場合、前述のコアバージョンの違いから失敗する可能性があります。
※参考:Node-RED日本ユーザ会:Running on Raspberry Pi
これで最新の安定版Node.jsとNode-REDがインストールされます。
Node-REDの使い方
では、Node-REDにアクセスしてみましょう。Webブラウザを立ち上げ、アドレスバーに "http://(Pi ZeroのIPアドレス):1880"
を入力してください。
すると、画像のようなページに飛びます。これがNode-REDのコンソールとなります。
中央の”フロー”に左側から”ノード”を配置し、ノード同士を”ワイヤ”で接続することで処理の流れを作り、Raspberry Piやゼロワン拡張基板を制御します。
各ノードは全て左側が入力、右側が出力となっています。
まず最初に、ゼロワン制御基板に搭載されている動作確認用LEDを点滅させるフローを作ってみます。
左側から”inject”ノードを引っ張ってきます。配置したら、ダブルクリックで設定画面を開きます。
”繰り返し”を”指定した時間間隔”に設定し、時間間隔を2秒に設定し、”完了”をクリックします。
次に左側のパレットの”機能”グループより”trigger”ノードを配置し、ダブルクリックで設定画面を開きます。
”送信後の処理”の時間間隔を1秒に設定します。
最後に、左側のパレットの下のほうに”Raspberry Pi”グループがあるので、その中で2つある”rpi gpio” ノードの内、右側にRaspberry Piのロゴマークがある出力ノードを配置し、ダブルクリックで設定を開きます。
”端子”のチェックを”GPIO26 – 37”に入れ、”端子の状態を初期化”にチェックを入れて初期レベルを”Low(0)”にします。
ノードを配置したら結線をします。
injectノード – triggerノード – rpi-gpioノード の順番に結線してください。
結線が終わったら、右上の”デプロイ”をクリックしてください。これでフローの変更がRaspberry Piに反映され、ノードが動き出します。
ゼロワン拡張基板の”STATUS”ランプを確認してください。1秒ごとに点滅を繰り返していたら成功です。
同様にして、ゼロワン拡張基板上のシャットダウンスイッチを機能させるノードを作ってみます。
Raspberry Piグループより、左側にラズパイのロゴがある”rpi gpio”入力ノードを、”機能”グループより”exec”ノードを配置し、結線します。
gpio入力ノードの端子は”GPIO06 – 31”に設定します。
”exec”ノードは、任意のbashコマンドを実行できるノードです。
設定のコマンド”欄に”sudo halt”と入力します。
あとはデプロイをすれば、基板上のシャットダウンスイッチでラズパイZeroをシャットダウンできます。
MQTT brokerの準備(クラウドMQTTブローカーのアカウント作成)
今回はbrokerとして、クラウドのMQTT brokerサービスの”beebotte”を利用します。
beebotteホームページ
無料プランでは1アカウントにつき一日当たり5万メッセージまで処理でき、暗号化通信にも対応しています。
アカウントはメールアドレスと、設定したいユーザ名/パスワードを入力するだけで作成できます。
登録したメールアドレスにメールが届くので、メールのURLにアクセスすると認証が通りアカウント作成完了となります。この時点でログインが可能になります。
アカウントを作成しログインすると、画像のような画面が表示されます。
アカウントを作成して最初のログインの時点では”test”チャンネルのみが作成されているはずです。
チャンネル/リソースの作り方
beebotteでは、”チャンネル”の下に”リソース”が格納され、メッセージはリソースに格納されます。リソースは一つのチャンネルに複数作成できます。
Publisher/Subscriberはチャンネルごとに発行される”トークン”を目印にメッセージをやり取りするため、一つのシステムに一つのチャンネルを割り当てるとよいでしょう。
右上の”Create New”ボタンをクリックすると、新しいチャンネルを作成できます。
チャンネル/リソースの名前と説明を入力します。複数のリソースを用いる場合は”+ Resource”をクリックしてリソース欄を増やします。
必要な情報を入力したら、”Create channnel”をクリックしてチャンネルを作成します。
作成するとチャンネル一覧ページに飛び、新しいチャンネルが追加されていることがわかります。
チャンネル名をクリックし、詳細情報を見てみます。
このページにある”Channel Token”が、このチャンネルにアクセスするために必要な目印となります。
Node-REDからMQTT brokerへのアクセス(Node-REDにMQTT brokerの情報を登録する)
Node-REDにはMQTTにアクセスしデータをやり取りするノードが標準で装備されています。今回はこのノードに必要な情報をセットし、ブローカと通信します。
まずMQTTからのデータを受け付けるフローを作成します。
左側のパレットの”入力”グループより、”MQTT”ノードを配置しダブルクリックして設定画面を開きます。
”サーバ”欄の”新規に mqtt-brokerを追加”の右にあるボタンから、MQTTブローカの設定に入ります。
今回は以下のように設定します。
- サーバ:mqtt.beebotte.com
- ポート:8883
- SSL/TLS接続を使用:チェックする
また、”セキュリティ”タブを開き、”ユーザー名”の欄に
token:token_(ブローカのチャンネル設定で取得したトークン文字列)
の形式で入力します。
ここまで完了したら右上の”追加”ボタンをクリックし、ノードの設定画面に戻ります。トピック欄に (チャンネル名)/(リソース名)
の形式でデータの受信先を設定します。
以上で入力ノードの設定は終了です。ここでデプロイを行い、画像のようにノードの左下に緑色の四角と”接続済”の文字が見えれば、設定成功です。
次に出力ノードを配置します。右側のパレットの”出力”グループより”MQTT”ノードを配置してください。
この時、ブローカ関連の設定は共有され、既に設定済みとなっています。ダブルクリックし、トピック欄に入力ノードと同様にデータの出力先を設定すれば設定完了です。
データを通信してみる
では、MQTTを経由してデータをやり取りしてみます。MQTT出力ノードには、injectノードを接続しデータを送信します。injectノードは、デフォルトでは左側のトグルをクリックするとタイムスタンプ(’70年1月1日0時丁度からの累計ミリ秒時間)を送信するようになっています。
MQTT入力ノードからのデータは、”debug”ノードを使って観察します。左側のパレットの”出力”グループからdebugノードを配置してください。このノードには特別な設定は不要で、配置し結線してすぐに使えます。
以下のようなフローになります。
debugノードに流れ込んだデータは、フローの右側にある情報欄の”デバッグ”タブに出力されます。ここに、injectノードからのデータが表示されれば成功です。
デプロイを行い、injectノード左側のトグルをクリックしてください。
このように、クリックした回数分の出力がデバッグタブに表示されます。
実際にinjectノードの出力値を観察し、通信したデータが正しいか確認したいときは、injectノードからdebugノードへ直接結線します。
この状態でinjectノードのトグルを入れると、一回のクリックでデバッグ欄にデータが二つ現れます。データの表現方式が異なってきますが、中身の値は一緒であることがわかります。
いろいろなデータを流してみる
injectノードからは、様々な種類・内容のデータを発信することができます。
先ほど作成したフローを範囲選択とCtrl+Cでコピーし、Ctrl+Vで貼り付けて下さい。 貼り付けたフローのMQTT IN/OUTノードの設定を開き、トピック欄を (チャンネル名)/(リソース名その2)
としてください。リソースを1つしか作成していない場合は、beebotteのコンソールよりチャンネルを編集しリソースを追加しましょう。
リソースを編集したら、injectノードを編集します。injectノードをダブルクリックし、設定画面を開いてください。
“ペイロード”の欄をクリックし、”文字列”を選択してください。すると、右側の欄に任意の文字列を入力可能になります。ノードから出力させたい文字列を入力してください。
設定が終了したらデプロイを行い、文字列を設定したinjectノードのトグルを入れます。
設定した文字列が直接、MQTT経由の2通りで正しく通信されていることが確認できました。
以上がNode-RED/MQTTの基本的な使い方となります。MQTT入出力ノードは別々のRaspberry Piに配置されていても、ブローカ、チャンネルの設定をすることでRaspberry Pi間でデータをやり取りすることができます。
次回はNode-RED/MQTTとゼロワンシリーズ拡張基板を使い、クラウド経由で遠隔操作を行うシステムを構築してみます。お楽しみに!