記事の詳細

Pocket

ラズパイゼロの準備とNode-REDとMQTTのお話し

zeroone_1

単機能に特化しIoTデバイス製作を手助けするpHATサイズの拡張基板群 「ゼロワン」シリーズ。単機能に特化しIoTデバイス製作を手助けするpHATサイズの拡張基板群 「ゼロワン」シリーズ。

本シリーズは、インターネット経由でRaspberry Piどうしを通信させ、二つ以上の製品を組み合わせてシステムを構築、IoT的に活用することが出来ます。
今回、”Node-RED”システムと”MQTT”プロトコルを利用し、Raspberry Pi間の通信を行ってゼロワンシリーズを連携させてみます。

その前に、まずはNode-REDとMQTTのお話しをさせてください。

Node-RED/MQTTとは

Node-REDは、画面上に”ノード”と呼ばれる処理ブロックを配置し、ノードの間を結線しデータの流れ(フロー)を作成することで、簡単にデータ処理・マシン制御システムを構築できる開発環境です。

0_0_NodeRED

 

Raspberry Pi用のOSとして一般的な”Raspbian”にはプリインストールされており、ネットワーク経由で手元のパソコンからフローの作成、Raspberry Piと周辺機器の制御が可能です。

 

MQTTとは

MQTTとは、発信機器(パブリッシャ/Pub)と受信機器(サブスクライバ/Sub)、その間でデータを仲介するサーバー(ブローカ/broker)から成り立つ、インターネット経由で遠隔地間の情報をやり取りする通信プロトコルです。

0_1_MQTT

特性、成り立ちから、主にセンサの情報を収集し、シンプルな機械を制御するといった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のインストールを簡単に行うことができます。

1_1_NOOBS

NOOBSのサイズは1.3GBと大きく、ダウンロードに時間がかかりますので、その間にSDカードをフォーマットします。
この時、Windows標準のフォーマットツールではなくSDアソシエーションの提供するSDカードフォーマッターを使用しましょう。ダウンロードし、PCにインストールしてください。

1_2_SDF

フォーマットオプションは、念のため上書きフォーマットを選択しましょう。

 

※用意するSDカードの容量は8GBをお勧めします。4GBではシステムが入りきらないことがあり、16GB以上はフォーマットに時間がかかったり、場合によっては相性によりRaspberry Piで使用できない可能性があります。

NOOBSのダウンロード、SDカードのフォーマットが終わったら、ダウンロードしたNOOBSのZipの中身を全てSDカードにコピーします。これもしばらく時間が掛かります。
コピーが終わったら、Raspberry Pi ZeroにSDカード、miniHDMIケーブル(もしくはアダプタ)、USBキーボード/マウスを接続し、電源を投入します。

1_3_connect

しばらく待つと、インストールするOSを選択する画面が出てきます。Pi Zero W/WHで無線LANを利用する場合、ここで上の Wifi networks よりSSIDを選択し、パスキーを入力してインターネットに接続してください。有線接続の場合は、USB-Ethernetアダプタを接続しLANケーブルを接続するだけで完了です。

Raspbianの設定

Raspbianをインストールしたら、各種インターフェースの有効化を行います。 ターミナルを起動し sudo raspi-config より、 5 Interfacing Options を選択して、SSHI2CをEnable(有効化)します。

メニューを選択すると "would you like ~~~" のダイアログと共にYes/Noの選択が出てくるので、Yesを選択してください。

1_4_Y_N

 

これで、外部からのリモートログインと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桁の数字)となります。

1_5_ifconfig

このアドレスはNode-REDにアクセスするために必要になります。メモ帳などに保存しておきましょう。

 

また、パソコンより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のコンソールとなります。

2_0_Node-RED

中央の”フロー”に左側から”ノード”を配置し、ノード同士を”ワイヤ”で接続することで処理の流れを作り、Raspberry Piやゼロワン拡張基板を制御します。
各ノードは全て左側が入力、右側が出力となっています。

まず最初に、ゼロワン制御基板に搭載されている動作確認用LEDを点滅させるフローを作ってみます。

左側から”inject”ノードを引っ張ってきます。配置したら、ダブルクリックで設定画面を開きます。

2_1_inject

”繰り返し”を”指定した時間間隔”に設定し、時間間隔を2秒に設定し、”完了”をクリックします。

次に左側のパレットの”機能”グループより”trigger”ノードを配置し、ダブルクリックで設定画面を開きます。

2_2_trigger

”送信後の処理”の時間間隔を1秒に設定します。

最後に、左側のパレットの下のほうに”Raspberry Pi”グループがあるので、その中で2つある”rpi gpio” ノードの内、右側にRaspberry Piのロゴマークがある出力ノードを配置し、ダブルクリックで設定を開きます。

2_3_GPIOout

”端子”のチェックを”GPIO26 – 37”に入れ、”端子の状態を初期化”にチェックを入れて初期レベルを”Low(0)”にします。

ノードを配置したら結線をします。
injectノード – triggerノード – rpi-gpioノード の順番に結線してください。

2_4_wired

結線が終わったら、右上の”デプロイ”をクリックしてください。これでフローの変更がRaspberry Piに反映され、ノードが動き出します。
ゼロワン拡張基板の”STATUS”ランプを確認してください。1秒ごとに点滅を繰り返していたら成功です。

同様にして、ゼロワン拡張基板上のシャットダウンスイッチを機能させるノードを作ってみます。
Raspberry Piグループより、左側にラズパイのロゴがある”rpi gpio”入力ノードを、”機能”グループより”exec”ノードを配置し、結線します。

2_7_wired2

 

gpio入力ノードの端子は”GPIO06 – 31”に設定します。

2_5_gpioin

”exec”ノードは、任意のbashコマンドを実行できるノードです。

2_6_sudohalt

 

設定のコマンド”欄に”sudo halt”と入力します。
あとはデプロイをすれば、基板上のシャットダウンスイッチでラズパイZeroをシャットダウンできます。

MQTT brokerの準備(クラウドMQTTブローカーのアカウント作成)

今回はbrokerとして、クラウドのMQTT brokerサービスの”beebotte”を利用します。
beebotteホームページ

無料プランでは1アカウントにつき一日当たり5万メッセージまで処理でき、暗号化通信にも対応しています。
アカウントはメールアドレスと、設定したいユーザ名/パスワードを入力するだけで作成できます。

3_0_beeeeeeee

 

登録したメールアドレスにメールが届くので、メールのURLにアクセスすると認証が通りアカウント作成完了となります。この時点でログインが可能になります。
アカウントを作成しログインすると、画像のような画面が表示されます。

3_1_be_home

アカウントを作成して最初のログインの時点では”test”チャンネルのみが作成されているはずです。

チャンネル/リソースの作り方

beebotteでは、”チャンネル”の下に”リソース”が格納され、メッセージはリソースに格納されます。リソースは一つのチャンネルに複数作成できます。
Publisher/Subscriberはチャンネルごとに発行される”トークン”を目印にメッセージをやり取りするため、一つのシステムに一つのチャンネルを割り当てるとよいでしょう。

右上の”Create New”ボタンをクリックすると、新しいチャンネルを作成できます。

3_2_ch_create

チャンネル/リソースの名前と説明を入力します。複数のリソースを用いる場合は”+ Resource”をクリックしてリソース欄を増やします。

3_3_ch_created

必要な情報を入力したら、”Create channnel”をクリックしてチャンネルを作成します。
作成するとチャンネル一覧ページに飛び、新しいチャンネルが追加されていることがわかります。

3_4_be_home_new

チャンネル名をクリックし、詳細情報を見てみます。

3_5_ch_page

このページにある”Channel Token”が、このチャンネルにアクセスするために必要な目印となります。

Node-REDからMQTT brokerへのアクセス(Node-REDにMQTT brokerの情報を登録する)

Node-REDにはMQTTにアクセスしデータをやり取りするノードが標準で装備されています。今回はこのノードに必要な情報をセットし、ブローカと通信します。

まずMQTTからのデータを受け付けるフローを作成します。
左側のパレットの”入力”グループより、”MQTT”ノードを配置しダブルクリックして設定画面を開きます。

4_0_mqttin

 

”サーバ”欄の”新規に mqtt-brokerを追加”の右にあるボタンから、MQTTブローカの設定に入ります。

4_1_mqtt_in

 

今回は以下のように設定します。

  • サーバ:mqtt.beebotte.com
  • ポート:8883
  • SSL/TLS接続を使用:チェックする

また、”セキュリティ”タブを開き、”ユーザー名”の欄に

token:token_(ブローカのチャンネル設定で取得したトークン文字列)

の形式で入力します。

4_2_mqtt_in

ここまで完了したら右上の”追加”ボタンをクリックし、ノードの設定画面に戻ります。トピック欄に (チャンネル名)/(リソース名) の形式でデータの受信先を設定します。

4_3_mqtt_in

以上で入力ノードの設定は終了です。ここでデプロイを行い、画像のようにノードの左下に緑色の四角と”接続済”の文字が見えれば、設定成功です。

4_4_mqtt_in

次に出力ノードを配置します。右側のパレットの”出力”グループより”MQTT”ノードを配置してください。
この時、ブローカ関連の設定は共有され、既に設定済みとなっています。ダブルクリックし、トピック欄に入力ノードと同様にデータの出力先を設定すれば設定完了です。4_5_mqtt_pair_1

データを通信してみる

では、MQTTを経由してデータをやり取りしてみます。MQTT出力ノードには、injectノードを接続しデータを送信します。injectノードは、デフォルトでは左側のトグルをクリックするとタイムスタンプ(’70年1月1日0時丁度からの累計ミリ秒時間)を送信するようになっています。
MQTT入力ノードからのデータは、”debug”ノードを使って観察します。左側のパレットの”出力”グループからdebugノードを配置してください。このノードには特別な設定は不要で、配置し結線してすぐに使えます。
以下のようなフローになります。

4_6_mqtt_pair_2

debugノードに流れ込んだデータは、フローの右側にある情報欄の”デバッグ”タブに出力されます。ここに、injectノードからのデータが表示されれば成功です。
デプロイを行い、injectノード左側のトグルをクリックしてください。

4_7_mqtt_pair_3

このように、クリックした回数分の出力がデバッグタブに表示されます。
実際にinjectノードの出力値を観察し、通信したデータが正しいか確認したいときは、injectノードからdebugノードへ直接結線します。

4_8_mqtt_pair_4

この状態でinjectノードのトグルを入れると、一回のクリックでデバッグ欄にデータが二つ現れます。データの表現方式が異なってきますが、中身の値は一緒であることがわかります。

いろいろなデータを流してみる

injectノードからは、様々な種類・内容のデータを発信することができます。
先ほど作成したフローを範囲選択とCtrl+Cでコピーし、Ctrl+Vで貼り付けて下さい。 貼り付けたフローのMQTT IN/OUTノードの設定を開き、トピック欄を (チャンネル名)/(リソース名その2) としてください。リソースを1つしか作成していない場合は、beebotteのコンソールよりチャンネルを編集しリソースを追加しましょう。

リソースを編集したら、injectノードを編集します。injectノードをダブルクリックし、設定画面を開いてください。

4_10_inject_set

 

“ペイロード”の欄をクリックし、”文字列”を選択してください。すると、右側の欄に任意の文字列を入力可能になります。ノードから出力させたい文字列を入力してください。

設定が終了したらデプロイを行い、文字列を設定したinjectノードのトグルを入れます。

4_9_mqtt_pair_5

設定した文字列が直接、MQTT経由の2通りで正しく通信されていることが確認できました。

以上がNode-RED/MQTTの基本的な使い方となります。MQTT入出力ノードは別々のRaspberry Piに配置されていても、ブローカ、チャンネルの設定をすることでRaspberry Pi間でデータをやり取りすることができます。
次回はNode-RED/MQTTとゼロワンシリーズ拡張基板を使い、クラウド経由で遠隔操作を行うシステムを構築してみます。お楽しみに!

 

IoTを始めよう!  ゼロワンシリーズを使ってブービートラップを作ってみた。

IoTを始めよう!ゼロワンシリーズで遠隔地と連絡!「テレビ電話呼び出しボタン」を作成!

関連記事

ページ上部へ戻る