はじめに
今回からは、これまでに用意したハードウェア(BLEと温度センサーのセット)をRaspberry Piを利用してクラウドまで接続する方法を解説します。これにより、温度センサーの情報をクラウドまで届けられるようにします。また一連の解説では、Raspberry Piやクラウドでで動作するアプリケーションを全てブラウザだけで作成します。
全体的なイメージは、次の図の通りです。
コンピューターそのもののハードウェアや仕組みはわかっていても、「いざクラウドで繋げてみようとするとどこから手をつけたら良いか考えるだけでうんざり」してしまうハードウェア寄りな方も、「Webやスマホのアプリは得意でもスマホじゃないセンサーデバイスには縁遠い」というソフトウェア寄りの方も、ぜひこの機会にセンサーデバイスからクラウドまで一通りつなぐという体験へ踏み込んで行きましょう。
なお、クラウドについては、クラウドの細かい準備まで手が回らない、あるいはどこから手をつけたら良いかわからない(あるいは面倒)という方のためのサービスとして「CANDY EGG™」を次回紹介します。
今回は最初のステップとして、温度センサーの情報をBLEデバイス経由でRaspberry Piから受信できるようにします。温度センサーの情報をRaspberry Pi側で受信して、その結果をブラウザで確認するまでが今回の目標です。
すでにこれまでの記事においてBLEとセンサーの準備はできているものとして話を進めますが、お手元にない場合は、以下の記事をご覧いただいて準備してください。
【ハードウェアのプロが教えるWebエンジニアのためのIoT講座】
Raspberry Pi側のソフトウェアは、Node-RED™ベースのツール「CANDY RED™」を利用し、ブラウザを使って作成します。Node-REDの詳細がわからなくても読み進められるようにしていますが、もし詳細を知りたい場合は、日本のNode-REDユーザーグループが出している緑の表紙の「はじめてのNode‐RED (I・O BOOKS)【改訂版】」(工学社刊)をオススメします(赤い表紙の書籍は旧版ですので緑の表紙の新版をお探しください)。
準備するもの
ハードウェア
今回利用するハードウェア等の備品は以下の通りです。次回使用する物品も含まれています。
- BLE nano(またはBLE nano2)
- 温度センサー(ADT7410)
- ブレッドボード
- 抵抗
- 電池ホルダー
- 電池
- ジャンパーワイヤ
準備方法は、下記記事を参照してください。
注意)BLE nano2をご利用の場合は、リンク先のソフトウェアをご利用ください。コンパイル方法などは上記記事に記載の方法でお試しください。
そのほかのRaspberry Piも利用可能ですが、本記事の手順ではLANケーブルを接続できる機種(Raspberry Pi Model B+、Raspberry Pi2 Model B、Raspberry Pi3 Model B+)を前提とした内容となります。
- CANDY Pi™ Lite+ D <次回以降使用します>
CANDY Pi Lite LTEやCANDY Pi Lite 3Gあるいは、CANDY Pi Lite+ Sでも可能です。それぞれ利用可能なSIMカードをご用意ください。
- nanoサイズのSIMカード <次回以降使用します>
キャリア各社またはMVNO各社の販売するSIMカードをご用意ください。
- 電源用USBケーブルまたは5V ACアダプター
5V ACアダプターをご利用の場合は、3A〜4Aの電流で、DCプラグ・ジャック(内径:φ2.1mm、外径:φ5.5mm、センタープラス)のものをご用意ください。
- microSDカード
耐用性や準備の時間短縮を考慮して、16GB以上で読み書きのデータ転送速度の速いもの(概ねUHSスピードクラス3以上)を推奨します。最低限8GBの容量の物をご利用ください。
- SDカードリーダー
作業用のパソコンからmicroSDカードを読み書きするために使用します。SDカードを差込めるパソコンの場合は、microSDカードを差し込めるアダプターをご用意ください。
- LANケーブル
Raspberry Pi本体と作業用のパソコンを接続するために使用します。
- Ethernet変換アダプター (必要な場合のみ)
LANケーブルを作業用のパソコンに直接差込める場合は不要です。
- 作業用パソコン
Windows、macOS、Linuxのいずれかを利用できるパソコンをご用意ください。LANケーブルを利用でき、インターネットに接続できる必要があります。
ソフトウェア
今回最初の準備に必要なソフトウェアは以下の通りです。あらかじめインストールをして利用できるような状態にしてください。
下記以外に使用するソフトウェアについては、実際のRaspberry Piの準備手順の中で紹介します。
SDカードへの書き込みを行うソフトウェアです。
作業用のパソコンで使用しますのであらかじめインストールをしてください。
Windows、macOS、Linuxで利用可能です。
- ブラウザ
Raspberry Piへの接続に使用します。
Chrome、Firefox、Safari、Edgeをご利用ください。
Internet Explorerは使用しないでください。
作業用のパソコンで使用します。
Raspberry Piの準備
それでは、最初にRaspberry Piの準備に取り掛かりましょう。
Raspberry Piに使用可能なOSはいくつかありますが、今回はRaspbian OSを使用します。通常は、Raspberry Pi財団のダウンロードサイトからOSイメージファイルをダウンロードしますが、今回は必要なソフトウェアが最初からすべて入っているCANDY Pi Liteシリーズ専用のOSイメージファイルをダウンロードします。
このOSイメージファイルは、CANDY LINEが用意しているもので、Raspbian Stretch LiteベースのOSイメージとなっています。Lite版をベースにしているため、初期状態でデスクトップ環境は入っていませんのでご注意ください。
Step 1 作業用のパソコンでOSイメージファイルをダウンロード
CANDY LINEのフォーラムサイトにあるOSイメージ一覧のページへブラウザでアクセスします。
この中の最もバージョンが大きい項目をクリックします。
「日本語版イメージファイルのダウンロード(472MB) 」または、「US英語版イメージファイルのダウンロード(472MB)」をクリックするとダウンロードが開始されます。
日本語版とUS版の違いは言語のほかキーボードレイアウトの設定やタイムゾーンの設定が異なります。
日本語版は、日本語キーボードレイアウトでJSTのタイムゾーン(日本標準時)が、US版はUSキーボードレイアウトでUTCのタイムゾーン(協定世界時。日本標準時より9時間前の時間)がそれぞれ設定されています。
Step 2 EtcherでmicroSDカードへイメージ書き込み
ダウンロードができたら、Etcherで書き込みを行います。先ほどダウンロードしたファイルを指定して、用意したmicroSDカードへ書き込みます。
まずはEtcherを作業用のパソコンで開きます。
先ほどダウンロードしたファイルを最初に選択します。ダウンロードしたファイルは、ZIPファイルのままでも、展開した後のファイルでもどちらでも指定可能です。
作業用のパソコンに、microSDカードを認識させます。USBのアダプターか、SDカードスロットがあるパソコンであれば、SDカードのアダプターなどを使って認識させることができます。
パソコンがmicroSDカードを認識すると、Etcherの画面でもmicroSDカードが選択されます。画面上に用意したmicroSDカードが認識されていることを確認してください。
これで準備ができましたので、右側のFlashをクリックして書き込みを開始します。管理者権限が必要な場合は、パスワードを聞かれることがありますので、その場合は適宜入力して対応してください。書き込みを終えたら、microSDカードを作業用のパソコンから取り外してください。
注意)今回はSSHを使用しませんが、後でSSHを使用したい場合は、作業用のパソコンにmicroSDカードを認識させてから、sshという名前の空のファイルをmicroSDカードのbootフォルダー(またはbootと書かれたドライブ)にコピーしてください。SSHを利用できるようになります。Etcherを利用した直後は、認識されていない場合があるので、microSDカードを入れ直してから作業を行なってください。こちらのRaspberry Pi財団の公式サイトの説明(英語)をご覧ください。
Step 3 CANDY Pi Lite+ Dの取り付け
今回はすぐに利用しませんが、次回以降使用しますので、Raspberry PiにCANDY Pi Lite+ Dを取り付けてください。
Step 4 LANケーブルの取り付け
Raspberry PiにLANケーブルを取り付けましょう。一方をRaspberry Piに、もう一方は、作業用のパソコンまたは、スイッチングハブなど、最終的に作業用のパソコンと通信できる状態に接続してください。
Step 5 microSDカードの取り付け
続いて、microSDカードをRaspberry Piに差し込みます。裏表に気をつけて差し込んでください。 このようになれば準備完了です。
Step 6 CANDY REDの確認
それでは、用意したOSイメージをRaspberry Piで動かしてみましょう。
電源用のUSBケーブルをRaspberry Piに差し込んでください。ACアダプターを利用される場合は、CANDY Pi Lite+ DのボードにあるDCジャックへアダプターを差し込んでください。
microSDカードを取り付けたあたりにRaspberry PiのステータスLEDがあります。そのLEDが赤く点灯し、緑も点滅し始めます。もし、赤いLEDが繰り返し点滅し続けている場合は、電圧が足りていませんので、USBケーブルを変更したり、ACアダプターを利用したりするなどの対応を行ってください。
続いて、作業用のパソコンでブラウザを開きます。ブラウザのURLには、以下のアドレスを入力してください。
すると以下のようなログイン画面が表示されます。もし、上記アドレスで表示できない場合は、固定IPを簡易に設定できますので、こちらの説明を参照して設定してください。
注意)上記の固定IPを設定する方法は、今回使用しているCANDY Pi Liteシリーズ専用のOSイメージを利用した場合にのみ適用可能です。通常のRaspbian OSイメージファイルでは利用できません。
UsernameとPasswordには、それぞれ「pi」と「raspberry」を指定します。これらは、標準のRaspbian OSで初期設定されるユーザーIDとパスワードです。
注意)今回はこのまま使用しますが、実際に使い続ける場合は、パスワードなどを変更するようにしてください。パスワードの変更方法はここでは記載しませんが、このOSイメージの場合は、raspi-configを使用した方法でパスワードを変更できます。
ログインすると以下のようなNode-REDの画面が現れます。通常のNode-REDと異なり、赤色を基調とした色合いになっています。また、左上のロゴには「CANDY RED」と出ます。
これでRaspberry Pi側の準備は完了です。続いてBLEデバイスの準備を行います。
BLEデバイスの準備
BLEデバイス側は、温度センサーやボタン電池など全て以前の記事(第1回、第5回)通りにブレッドボードに組み上げておきましょう。
プログラムの書き込みも完了させ、電源もこの段階で入れておきましょう。
BLE受信フローの作成
今回は、BLEデバイスに接続された温度センサー(ADT7410)の値を読み出して、ブラウザ上で値を表示してみましょう。フローと呼ばれるプログラムを使用して、BLEデバイスとRaspberry Piを操作し、ブラウザ上で温度センサーのデータ表示を行います。
まずはフローのエディター画面へ移りましょう。作業用のパソコンでCANDY REDにアクセスしてログインすると、以下のようにサンプルフローが現れます。
ここでは最初に新しいフローのワークスペース(フローを作成する場所)を追加します。エディターの右側上の方に「+」マークのタブがあるのでそれをクリックしましょう(上記図の (a) で示した部分)。すると下の図のように新しいワークスペースが追加されます。
続いて、左側の箱の一覧を見て見ましょう。これはノードパレットと呼ばれるもので、1つ1つの箱、つまりノードを種類ごとに列挙したものです。
今回はこのノードパレットの「input」カテゴリーから「Generic BLE」という名前のノードを探します。上記の図の (b) で示したノードです。
このノードをドラッグして以下のように追加したワークスペースに載せます。
注意)同じような見た目の「Generic BLE」ノードがノードパレットにもう1つ存在しますが、2つは別物です。今回使うものは「input」と書かれたグループにあるものを使用します。
さらに追加したノードをダブルクリックすると、そのノードの設定ができるようになります。それではやってみましょう。
このようなダイアログ画面が画面右側からスライドして出てきます。この画面では、BLEデバイスからのデータ出力をON/OFFしたり、出力するデータの書式を指定することができます。 が、ここではまず、どのBLEデバイスを使うかを設定します。上記 (c) の鉛筆アイコンをクリックしてBLEデバイスの設定を行いましょう。
鉛筆アイコンをクリックするとさらに次のようなダイアログ画面がスライドして出現します。この画面では、実際に接続するBLEデバイスを選択します。BLEデバイスの電源が入っていることを確認したら、(d) のチェックを入れてください。チェックを入れたらその上のプルダウンから「ADT7410 Temperature」を選択します。もし見えない場合は、以下の手順を行います。
- ダイアログ右上の「Cancel」をクリックする
- 一度BLEデバイスの電源を外し、再び電源を入れる
- (c) の鉛筆アイコンを再度クリックしてダイアログを出す
- (d) のチェックを入れる
- プルダウンのリストから「ADT7410 Temperature」を選ぶ
プルダウンから「ADT7410 Temperature」を選ぶと、(e)の下にあるボックスにそのBLEデバイスで利用可能なサービスのGATT Characteristics(GATT特性)が表示されます。
実際には、以下のように表示されます。
ここで、今回使用するBLEデバイスのソースコード「main.cpp」を見てみましょう。58行目付近から以下のような箇所があります。
//------------------------------------------------------------ |
このrx_uuidに当たる部分が今回読み取りに使用するGATT CharacteristicのUUIDとなります。上記の表現では配列表記になっているのですが、それぞれの値の16進数を文字列としてつなげたHEX文字列として表してみると以下のようになります。
713d0002503e4c75ba943148f18d941e |
この値が、先ほどのダイアログのところに出ていることを確認しましょう。
このように出ているのが見えます。UUIDの横にある「Notify」と「Read」と書かれたラベルは、このGATT Characteristicがサポートする操作を表します。「Notify」は定期的なデータ通知を、「Read」は読み取り実行操作をそれぞれ実施します。
さてこのようにBLEデバイスの指定ができたら、今度は設定を保存します。現在のダイアログの「Add」をクリックします。
さらに、まだダイアログが表示されていますから、今度は「Done」をクリックして保存します。
これで全てのダイアログが消えました。それではフローの作成の続きに移りましょう。
温度センサーの情報をBLEデバイスから取得するには、先ほど見たGATT Characteristicからデータを読み取る必要があります。これを行うには、先ほどエディターでドラッグして置いた「Generic BLE」ノードへ、とあるメッセージを届ける必要があります。「Generic BLE」ノードは、届いたメッセージをもとに情報の読み取りを行うようにできているためです。
「Generic BLE」ノードへ届けるメッセージは、以下のようなものです。
プロパティ名 | 説明 |
topic | 読み取りたいGATT CharacteristicのUUID |
payload | 使用しません(何か入っていても無視されます) |
Node-REDでは、ノードとノードとの間をメッセージが移動します。このメッセージとは、実体としてはJavascriptのオブジェクトですが、意味合いとしてはラベルと値の集合体となります。このラベルのことを、ここではJavascriptの用語に合わせてプロパティ名と表記しています。 |
ではこのようなメッセージはどうやって用意すればよいでしょうか。いくつか方法がありますが、今回は、「inject」ノードと呼ばれる機能を使います。このノードは、ブラウザからの操作や、あるいは一定時間ごとの起動(タイマー起動)により、特定のメッセージを発信させることができます。
それではノードパレットから「inject」ノードをドラッグして「Generic BLE」ノードの近くに置きましょう。
続いて、2つのノードをこのように線でつなげます。
「timestamp」と書かれているノードをダブルクリックして、「inject」ノードの設定をしましょう。このダイアログでは、以下のように先ほどのUUID「713d0002503e4c75ba943148f18d941e」をTopicに指定します。さらに、表示名を変更するためにNameに「温度読み取り」と入れます。それ以外の値はそのまま変更なしで大丈夫です。
入力したら右上の「Done」をクリックします。
さらに読み取った値を確認するためのノードも追加しておきます。ノードパレットから「debug」と書かれたノードをドラッグして「Generic BLE」ノードの右下あたりに置いてください。さらに「Generic BLE」ノードと「debug」ノードも線でつなげます。以下のようになればOKです。
続いて、不要なフローのワークスペースを削除します。「サンプルフロー」は今回使用しませんので、次の手順で取り除いてください。
「サンプルフロー」のタブをクリックしてサンプルフローを表示します。
右上の「三」のメニューから以下のように「Flows」「Delete」を選択してクリックします。
すると現在表示している「サンプルフロー」が削除されます。
BLE受信フローのデプロイ
フローを作成したので、これを実際に動かしてみましょう。フローを動かすには、「デプロイ」と呼ばれる操作を行います。デプロイとは、配備や配置といった用語に当たる言葉で、ソフトウェアを起動してサービスを開始できる状態にすることを指します。
デプロイを行わないと、変更・作成したフローは消えてしまいますので必ずデプロイを行うようにしてください。
デプロイは「Deploy」と書かれた右上のボタンで行います。デプロイが必要な場合は、自動的にエディターが以下のような色付きの表示になります(ピンクの枠は、こちらで強調のためにつけたものですのでピンクの枠は表示されません)。
この状態ではデプロイ可能なので、クリックしてデプロイを実施します。すると、以下のようにボタンの表示がグレーに変わります。この状態ではデプロイが不要なため、「Deploy」ボタンは押せないようになっています。それでは、動かした様子を見て見ましょう。
BLE受信フローの動作確認
エディター右側のタブから「debug」を選択します。するとデバッグ用の表示を閲覧できます。
すでに何か出ているときは、(f) の上にあるゴミ箱マークのアイコンをクリックします。すると、すでに出ている表示が削除されます。現在は、まだ何もしていないので表示を削除すると何も出てきません。
それでは、BLEデバイスから温度情報を取ってみましょう。BLEデバイスは電源を入れておいてください。
まずは、「温度読み取り」と書かれたノードの左側にあるペダルの部分をクリックしてみてください。すると、あらかじめ設定したメッセージが発信されます。
すると「debug」タブにはエラーのようなメッセージが表示され、「Generic BLE」ノードは「timeout」となりました。最初のリクエストは、BLEデバイスにつなぎに行くのですが、時間内に繋がらない場合はこのような状態になります。
その場合でも、10秒〜30秒ほど少し時間をおいてまたペダルをクリックしてみてください。
ただ、このままエラーが続くようであれば、Raspberry Piを再起動してください。
一方、うまく接続ができると以下のように「connected」状態と表示され、「debug」タブにはメッセージの内容が表示されます。
このメッセージの表示は、中身の構造を見ることができます。「characteristics」と書かれているあたりをクリックすると、展開表示することができます。さらに「buffer[2]」と書かれたところもクリックしてみると、中身のデータを見ることが可能です。
これで、温度センサーの値がBLEデバイス経由で取得できました。しかし、このままでは単なる数値のデータだけとなってしまいます。これでは摂氏温度ではなくわかりにくいので、フローを変更してこの数値データを温度の値に変換をしてみましょう。
BLE受信フローの変更
温度センサーの温度はどのような形式で流れてくるか、「第5回 温度センサーを使おう」の「温度計測のプログラム」の記事を確認してみましょう。すると、
さらに、ADT7410で取得した温度データを小数点以下まで表示させるために、データを整数部分と小数点以下の部分に分けます。
と記載がありますので、小数点付きの値を整数部と小数点部(小数点第二位まで)に分けて送信していることがわかります。このため、フローでは、上記とは逆に2つの数値データから小数点も含む温度の値を計算します。
では具体的に変更を行ってみましょう。今回は、メッセージの値を変更するため、「change」ノードを使用します。左側のノードパレットから「change」ノードをドラッグして「Generic BLE」ノードの右下に置いてください。
追加した「change」ノード(「set msg.payload」と書かれたノード)をダブルクリックして、設定ダイアログを表示させます。
Nameには「温度へ変換」と入力します。次に(g) のところにあるプルダウンボタンをクリックして「expression」と書かれた項目を選択しましょう。これは、JSONata(ジェイソナータ)と呼ばれるJSONオブジェクトを加工するための簡易言語です。JSONオブジェクトとは、今回は、ノードで送受信する「メッセージ」部分に当たります。この言語はデータを加工することだけが目的であるため、余計な文法がなく、Javascriptなどで書くよりも表記がより簡素になります。
さて、「expression」を選択したら、「to」のテキストボックスの右側に「...」の表示が現れるのでこのボタンをクリックします。
するとダイアログが切り替わり、JSONataの表記を編集するための画面に変わります。
ピンクの枠で囲ったところに数値データを計算する式を入力します。
今回は、以下のような表記を入力します。
payload.characteristics.'713d0002503e4c75ba943148f18d941e'.(
$lookup($, '0') + $lookup($, '1') / 100 ) |
この意味は、「メッセージにあるpayload」の「characteristics」プロパティの値について、その値の「713d0002503e4c75ba943148f18d941e」で示される値(すなわち、数値データ)の最初の値(「'0'」で表されています)と、その次の値(「'1'」で表されています)を100で割った値を足す、というものです。
入力したら、右上の「Done」をクリックして、JSONataダイアログを閉じ、さらにもう一度「Done」をクリックして「change」ノードのダイアログを閉じましょう。
最後にメッセージの経路を変更しましょう。「Generic BLE」ノードから「温度へ変換」と書かれたノードに線をつなぎ、「温度へ変換」と書かれたノードから「debug」ノードへ線をつなぐようにします。また、「Generic BLE」ノードから「debug」ノードへの線は削除します。
すると以下のようなフローになります。
最後に、デプロイを実施しましょう。このままでは変更が反映されないので必ずデプロイを行なってください。
変更したフローの動作確認
それでは、デプロイしたフローの動きを見てみます。先ほどと同様に、「温度読み取り」のペダルをクリックして、画面右側の「debug」タブの値を見てみましょう。
このように小数点第2位までの値が表示されていれば成功です!
まとめ
今回は、温度センサー(ADT7410)の値をBLEデバイスからRaspberry Piでデータを取得したり、温度センサーの値を加工したりするアプリケーションをNode-REDベースのフローエディター「CANDY RED」を利用してブラウザだけで作成しました。
作成したアプリケーションを動かすと、温度センサーの情報をRaspberry Piに接続したブラウザで見えるようになりました。たった数バイトデータの情報をJSONオブジェクトとして変換して扱うのは冗長と思われたかもしれませんが、その冗長さと引き換えに値の加工のしやすさや処理の作成しやすさ、あるいは変更しやすさといった利点がもたらされています。試行錯誤を重ねるなら、処理の作成や変更がしやすい方が助かりますね!
次回は、取得した温度センサーの値をクラウドで見えるようにするための設定を行います。Raspberry Pi側のフローの変更と、クラウドのセットアップ、それにクラウド側のアプリケーションの作成を行います。
クラウドアプリケーションの作成には、「CANDY RED」と同様にNode-REDベースのフローエディターを持つ「CANDY EGG」を使用します。ブラウザだけでクラウドアプリケーションを用意して動かしてみましょう。
本コンテンツは、株式会社CANDY LINEの協力により作成されました。