ソフトウェアエンジニアのためのIoT自由研究・・・スマートホーム準備編

0. はじめに

三菱総研DCSデジタル企画推進部にてビジネス開発を担当しております田口です。普段はAI動画像認識技術に関わるビジネス推進に携わっており、特にAI-OCRに重点的に取り組んでおります。

さて、今回のDCS blogではIoTについて書いてみたいと思います。題して「ソフトウェアエンジニアのためのIoT自由研究・・・スマートホーム準備編」。
ビジネス開発という仕事柄、どうすればAI技術を使ったプロダクト、サービスを世の中に広げることができるのだろう、と考えることが多くあります。そういう意味では、AIとセットで使われることの多いIoT技術は無視できませんし、AIをもっとも身近に感じるテーマであるスマートホームは研究対象として最適なわけです。

というわけで、自宅にAIやIoTを適用してナウでヤングなエンジニアライフを送ることを目指し、まずは準備編と称し、どんなモノや技術を使って実装していくのか、ご紹介していこうと思います。
ただし題名が「・・・(略)・・・自由研究」とありますので、開発効率は完全に無視することとし、手作り的要素を重視し、またところどころにオッサン的なこだわりを香ばしくまぶしていきたいと思います。

    目次
  1. 全体像はどんな感じ?
  2. 登場人物(モノ、技術)
  3. おわりに

1. 全体像はどんな感じ?

スマートホームと言ってもいろいろなタイプがあるわけですが、まずは典型的な、センサーデバイスの設置と、そこから得られた情報を集積し参照できるシステム、の構成でいこうと思います。
「なんだ、超ありきたりじゃん・・・」と思われるでしょうが、細かいところで、マイナーな方向に飛んでいきますので、そこを楽しんでいただきたいです。ググれば山ほどヒットする内容についてはこのブログに書かずにスルーいたします。
さて、システムの全体像ですが、自宅内の複数個所に設置されたセンサー(BME280)付きの小型デバイスを複数設置し、そこから得られたセンサーデータをいったん別の小型デバイス(便宜上データプロキシと呼ぶ)に送信し、データプロキシからSaaS上で動作しているAPIサーバにデータを送信し、情報蓄積します。
最後にSaaS上に蓄積されたセンサーデータを閲覧、出力するための仕組みが必要ですが、ベーシックなものとしてWebシステムを設置し、さらにAmazon Echoなどにも対応させます。

2. 登場人物(モノ、技術)

2.1. HW

まずIoTデバイスとして何を選択するのかですが、おおざっぱに言えば、Arduino等のマイコンボードか、Raspberry Pi(ラズパイ)等のワンボードコンピュータかのどちらかになります。
Arduino等は直接アプリプログラムを書き込んで動かすのに対して、ラズパイはLinux OSが動くLinuxマシンですので、使い勝手が全く異なります。特にラズパイの場合はOSをインストールさえしてしまえば、実質、普通のパソコンとして使えますので、ソフトウェアエンジニアであれば特別なスキルはいらない、と言えます。さらにラズパイの中でも、Raspberry Pi Zeroであれば、小型で低価格なうえに、必要とする電力も少なく済みます。

[Raspberry Pi Zero WH]

では何でもラズパイで作ればいいではないか、といいたくなるところですが、そうとも言い切れません。ラズパイの省電力にも限界がありますので、たとえば電池で長期間動かし続けるのは無理です。またZeroはラズパイの評価版的な存在で、生産自体が意図的に絞られていたり、公式には個人で一人一つまで、などの購入数量制限をしているため、入手性に課題があったりします。数か月間、国内から在庫が無くなっていたこともありました。
また価格的にもラズパイだと低価格を追求することはできません。

[Espressif Systems社のESP-WROOM-32]

ということで、今回は、末端のIoTデバイスとしてはESP32シリーズのチップを使用した自作デバイスを採用します。ESP32はWiFiやBluetoothなどの通信モジュールですが、今回使用するESP-WROOM-32は、なんとデュアルコア32bit CPUを搭載しており、機能満載で非常に使い勝手が良いにもかかわらず、わずか数百円で入手可能なすぐれものです(ただし消費電力は多め)。しかも面白いことに、FreeRTOSという、オープンソースのリアルタイムOSが動きますので、ますます興味が掻き立てられますね!
ESP32を使用する場合、周辺回路が全て実装されている開発キットがお手軽ですが、それですと価格的にも内容的にもRaspberry Pi Zeroとたいして変わらず面白みに欠けますので、チップ単体で購入し、自分で周辺回路を組んでいきます。非効率ではありますが、自由研究なのですから、いぃ~んです!
一方でデータプロキシは電源コンセントに接続して常時稼働状態にしますので、Raspberry Pi Zero W(通信機能内蔵のZero)を採用します。こちらはIoT用のホームサーバとしての役割です。
APIサーバ、WebサーバはAWS上に構築します。Amazon Echoには画面付きのEcho Spotを使います。この辺りは、特別なものは何もありません。

2.2. SW

ソフトウェア技術として必要なものですが、まずESP32の開発ですが、世の中的にはESP32用のAruduino IDEやPythonを使う例が多いですが、ESP32の能力をフルに使いきれるネイティブ開発環境はEspressif Systems社のESP-IDF上でのC言語プログラミングですから、これを採用します。
データプロキシ(Raspberry Pi Zero)側は何でもいいのですが、Bluetooth(BLE)を通信手段として使う場合は、Linux標準のBluetoothプロトコルスタックであるBlueZを使いますので、PythonかC/C++による開発になってくるでしょう。今回はC++で行います。
このC/C++によるBlueZアプリ開発は、ガイド的な公開ドキュメントが基本的に存在せず、ググってもまとまった記事がほとんど無い、という点で面白いので、開発方法をブログでも紹介していきます。BlueZに関係ないところは、RubyとかBashシェルスクリプトでサクッと作ります。
APIサーバ、WebサーバはRuby on Railsで(慣れているので)。
AWSがらみでは、IoTコアによるMQTTの利用と、Amazon Alexa開発くらいでしょうか。
まぁまぁいろんな技術が登場してきて楽しいですね。

3. おわりに

今回は準備編と称して、全体像についてお話しました。なんとなく雰囲気がつかめたでしょうか?
私は生粋のソフトウェアエンジニアでして、電子工学、電気工学などの専門教育を受けたことは一切ありません。でもIoTとなると、ソフトウェアだけでは限界があるのです。ハードの知識も必要です。もちろんプロフェッショナルな領域はどうにもならないのですが、アマチュア領域であれば、多少の真似事は可能です。(いわゆる「電子工作」というやつです)
この「自由研究」を通して、ソフトウェアエンジニアが将来求められる(かもしれない)知識範囲について、思いを巡らせていただけるのではないかと思います。

今後の連載では、回路作成についても紹介してまいりますので、ぜひ楽しみにしていてください!