micro:bit+温度センサー+ラズパイZeroでAmbientにグラフ描画してみる

私は現在フリーランスエンジニアとして客先常駐で案件に携わっていますが、今後どうしてもIoT関連の案件に携わってみたいという希望がありました。
ただ、常々そう思っているものの、黙っていてもなかなかIoT案件に関われるチャンスは巡ってきません。

それならば自分で小規模でもIoTの仕組みを作りながら勉強してみようと思い、とりあえず今回試行錯誤してみたことをブログで紹介しようと思います。

やってみたいこと

まず、やりたいことを簡単に説明すると、「温度センサーで取得したデータをインターネット上に蓄積しグラフ化する」というものです。

調べたところ、micro:bitRaspberry PiAmbientという組み合わせで上記を実現している事例を見つけました。micro:bitやRaspberry Piは少し触ったことがあるので、この事例を参考にしてみたいと思います。

簡単ではありますが、今回やってみたいことを図に示したものが以下となります。

まず、温度を計測するセンサー部分は、micro:bitと専用の温度センサーモジュールを利用し、計測したデータをmicro:bitよりBLE(Bluetooth Low Energy)で送信します。

次に、Raspberry Pi Zero WHをゲートウェイとして用意し、micro:bitからBLEで受信した温度データをAmbientというIoTデータ可視化サービスに送信します。

AmbientはIoTデータの受信、蓄積、可視化(グラフ化)を簡単に行えるサービスで、無料で利用できます。IoT化したいアイデアのプロトタイプを構築するのに非常に便利なサービスとなっています。

用意したものを紹介

以下に、今回の仕組みを実現するために購入したもの、用意したものをご紹介します。

Raspberry Pi Zero WH(ラズパイZero)

上の写真はラズパイZero専用ケースに収納した状態ですが、非常にコンパクトです。無線LANを搭載しているので、IoTのゲートウェイとして使用するのに最適だと思います。

BBC micro:bit

イギリスのテレビ局BBCが開発した非常に安価な小型コンピュータです。
以下の記事でも紹介しているので、こちらも参照願います。

プログラミング教育必修化に一抹の不安? 2020年度から、日本の小学校でもプログラミング教育が始まります。ただ、十分な準備ができてい...

micro:bit用温度センサー(コネクタータイプ)

micro:bitに接続して温度の計測が行えるセンサーです。

micro:bit本体にも温度センサーが搭載されているのですが、メインCPUのチップの温度を利用しているため、実際の温度とは異なります。私が使用した限りでは、実際の温度+2度くらいの誤差が出ます。

こちらの温度センサーを使うと、部屋に備え付けのアナログ温度計ともほぼ誤差がなく計測が出来ています。
以下のサイトで税込み770円。安いです。

micro:bitで使える温度センサーです。

micro:bit用ワークショップモジュール

micro:bitにセンサー等を合計4つまで接続可能な拡張モジュールです。
今回は、micro:bitと温度センサーを接続するためにこちらのワークショップモジュールを購入しました。

Ambient(IoTデータ可視化サービス)

マイコンなどから送られるセンサーデーターを受信し、蓄積し、可視化(グラフ化)することが可能な、IoTデーターの可視化サービスです。
このようなサービスが無料で利用できることが驚きです。

チュートリアルやサンプルも大変充実していて、今回やりたいことのアイデアもこちらのサイトが大変参考になりました。
特に以下のチュートリアルは非常に参考になりました。
この場を借りてAmbientさんに感謝いたします。

microSDカード

家電量販店に行けばどこでも買えるやつです。
今回は、16GBのカードを購入しました。
Raspbian OSは最低8GB無いとインストールできないらしいので、16GBあたりを購入するのが妥当かと思います。

PCモニター、USBキーボード、マウス

こちらはご自宅にあるもので十分です。
私の場合は、今年在宅ワークのために新調したモニターを使用しました。
ちなみに、ラズパイZeroはminiHDMI端子なので、モニター側がHDMI端子の場合、変換コネクタが必要となるのでご注意ください。

USBキーボード、マウスは今やどこのITエンジニアのご家庭にも有るものかと思われますが、ない場合は購入しましょう。安っすいやつで構いません。
ちなみに、私は以前ヤマダ電機で1,000円以下のUSBキーボードを買ったことがあります。探せば安いものはいくらでもありますよ。

温度計測システムの構築手順(ざっくり)

今回の温度計測システムの構築手順ですが、本記事では目次レベルでの概要紹介となることを予めご了承ください。1つ1つの手順を詳細まで説明し尽そうとするとものすごく長い記事になってしまうので。。。

だいたい以下の手順となります。

  1. ラズパイZeroのセットアップ
  2. ラズパイZeroにPythonインストール
  3. 各種ライブラリのインストール
  4. Ambientのユーザー登録(無料)
  5. Pythonプログラム作成(サンプルソースの改修)
  6. 作成したプログラムをラズパイZeroに配置
  7. プログラムの実行、Ambientでグラフの確認

1.ラズパイZeroのセットアップ

以下の手順でラズパイZeroのセットアップを行います。今回は目次のみのご紹介となりますが、今後別の記事でラズパイZeroのセットアップについて詳細をご説明したいと思います。

  • OSインストーラーNOOBSの入手
  • microSDにNOOBSをコピー
  • ラズパイZeroに電源、キーボード、マウス、ディスプレイを接続
  • microSDカードをラズパイにセット
  • ラズパイZeroの電源オン
  • OSのインストール(RaspbianOS)
  • OSのアップデート
  • 固定IPの設定
  • piユーザーと別のユーザーを作成
  • piユーザーの無効化
  • 別ユーザーでのsshログイン確認

2.ラズパイZeroにPythonのインストール

元々、RaspbianOSにはPython2がインストールされておりますが、現在はPython3系が主流ですので、バージョン3.7.5をインストールしてみました。

pyenvという、LinuxでPythonの実行環境を管理するツールを使用してインストールを行いましたが、だいたい1時間くらいかかりました。
十分な時間を確保してPythonインストールに取り掛かることをオススメします。

3.各種ライブラリのインストール

今回は以下のライブラリをインストールしました。

bluepy

pythonプログラムをBLEゲートウェイとして動作させるために必要なライブラリとなります。今回はこちらの使い方の理解がキモだと思います。

ambient

文字通り、Ambientへのデータ送信で必要なライブラリとなります。

4.Ambientのユーザー登録

Ambientのトップページから「ユーザー登録(無料)」ボタンを押下して進めます。メールアドレスとパスワードの入力のみで行えますので簡単です。

ユーザー登録が終わりましたら、ログイン後にチャネルを作成します。
pythonからambientにデータ送信をする際に、作成したチャネルIDライトキーが必要となります。

5.プログラム作成(サンプルソースを改修)

今回作成したプログラムは、全て以下の記事で紹介されたサンプルソースをもとに改修したものです。

micro:bit側プログラム作成

micro:bitのプログラミングを行うには、以下のMakeCodeエディターを使用します。今回はBLE通信を行う必要があるので、MakeCodeの拡張機能からBluetoothを選択する必要があります。

その後、上述のサンプルソースの記事で紹介されているmicro:bitプログラムをベースに改修します。サンプルでは5秒間に1回ブロードキャストしていますが、ちょっと多すぎるので私は5分に1回ブロードキャストするように改修しています。

A Blocks / JavaScript code editor for the micro:bit powered by Microsoft MakeCode.

Python側プログラム作成

Python側プログラムも、上述のサンプルソースの記事をもとに作成します。
Ambientチュートリアルの「BLE環境センサ・ゲートウェイ(Raspberry Pi編)」という別記事で紹介しているソースコードをベースに、ScanDelegateクラスのhandleDiscoveryメソッドのみmicro:bit用に置き換えています。

それと、チャネルIDとライトキーの値を自分で作成したものに置き換えることを忘れずに。

6.作成したプログラムを配置

上記5で作成したプログラムをそれぞれmicro:bit、ラズパイZero上に配置します。micro:bitはPCとUSB接続後にmicro:bitフォルダにプログラムをコピペするだけで完了します。

ラズパイZero側は、sshログイン後にPythonプログラムファイルを任意のディレクトリに配置するだけです。私はWinSCPを使ってプログラムを配置しました。

7.プログラムの実行~Ambientでグラフ確認

あとは作成したプログラムを実行するだけです。
micro:bitは電池をセットしたワークショップモジュールに差し込み、温度センサーを接続して電源スイッチをオンにします。これで5分おきにセンサーから取得した温度データが送信されます。

次に、ラズパイZeroに配置したPythonプログラムを起動すれば温度データの受信とAmbientへの送信が開始されます。
サンプルソースの記事に書かれている通り、以下のコマンドで実行してみます。

sudo python env2ambientBS.py

しかし、これでは何故か上手く動作しない。。。
bluepyライブラリが存在しないと判定されてしまいます。
古いバージョンのPythonが認識されているのではと疑い、以下でバージョンを確認します。

sudo python –version

何と2.7が表示されました。最新バージョンのPythonが認識されない。
ちなみに、sudoを付けずにバージョン確認すると、ちゃんと3.7.5と表示されます。sudoの時に古いバージョンを認識してしまうようです。

which pythonコマンドで、認識されるPythonの実体を確認すると、以下のように表示されます。

/home/(作成したユーザー)/.pyenv/shims/python

pyenvが関係しているようですが、とりあえず上述のコマンドでpythonのところをwhich pythonの結果で置換してみることに。

sudo /home/(作成したユーザー)/.pyenv/shims/python env2ambientBS.py

動きました!
これで室温の計測結果をAmbient上のグラフで確認できます。

実際に室温を計測してみた

上述のコマンドを実行し、無事5分おきにセンサーから取得した温度データがラズパイZero経由でAmbientに送信されて、グラフ描画されることが確認できました。

以下は、深夜0時頃から約24時間プログラムを実行し続けて得られた温度データの折れ線グラフです(2020/11/20計測)。

残念ながら、24℃と25℃を行ったり来たりのグラフとなってしまいました。
あまり面白味の無いグラフですね。。。

それでも、17時頃まではほぼ動きの無かったグラフが、17時以降は頻繫に24℃と25℃の間を動き続けています。平日なので、夕方に家族が帰宅しだして、夕食の準備や風呂などで微妙に室温が変動していたことが考えられます。

とりあえず、自宅で計測したセンサーデータをグラフ化して閲覧するという1つの目標は達成できました。今回は室内の温度のみでしたが、今後は湿度、明るさ、動きなど様々なセンサーで取得したデータの可視化をやってみたいですね。

例えば、玄関ドアや冷蔵庫のドアなど、普通に生活していれば毎日開閉する箇所に加速度センサーをセットして、その動きを日々Ambientに送信しておけば、高齢者の見守りサービスとして利用できそうですね。

どのようなデータを取得し蓄積することが日々の生活に役立つかを常に試行錯誤しながら今後も色々とトライしてみたいと思います。