もくじ
こんにちはタッキーです。
勉強をかねた電子工作が、趣味と言っていいレベルにまで成長しました。
RGB LEDを使用し、スマホに来た通知を視覚的にお知らせするもの。
ほぼテレワークのため家族に通話中かどうかを知らせる信号機。
他にも小さなものを含めるとありますが、今回ご紹介するのはスマホで操作可能なIoTリモコン
IoT
IoTとは、Internet of Thingsの略で、モノをインターネットでつなぐ技術です。
昨今、様々な製品があります。
スマホで家の鍵を開ける製品なんかは有名ですし、エアコンやライトの遠隔操作を可能とする製品があります。
自作した理由は勉強をかねていましたが楽しく勉強したいという思いと、作ってみたいというDIY好きな性格がありました。
シングルボードコンピューターが敷居を低くする
有名なArduino、Raspberry Piといった製品が、電子工作の敷居を低くしてくれました。
それぞれ色々な派生がありますが、逆に多すぎて悩むほどです。
両者とも知名度も高い代表的な製品であり、特にArduinoは解説書付き入門キットが多く販売されているのもあって電子工作入門にピッタリかと思います。
キットの各組み合わせで色々なものが作れます。
例えば超音波ソナーをモーターで回転させ、得たデータを加工しディスプレイに表示するとレーダーみたいでカッコいいです!スピーカーなら車のコーナーセンサー!
Arduino
ワンボードマイコン。
ワンボードマイコンは、シンプルなコンピューターで電子回路と密接に連携し、特定のタスクを効率的にこなすことに長けています。
C言語系のため、とにかく処理速度が速いです。
オープンソースハードウェアでハードの設計資料が公開されているため、自作Arduinoも可能です!
いつかオリジナルArduinoを作りたいです!
Arduinoは単体ではWi-FiやBluetoothをサポートしていませんが、モジュールを接続することで通信もおこなえます。
Raspberry Pi
シングルボードコンピュータ。
雑な言い方だと小さなパソコンです。
汎用性が高く、様々なことができます。
Raspberry Piは大きくわけて、
・スタンダードなRaspberry Piシリーズ(最新は5)
・小型なzeroシリーズ(最新は2)
・Arduinoに近いpico
スタンダード/zeroはDebian系OSのRaspberry Pi OSを載せることができWi-Fi/Bluetoothもつながるため、IoTに向いています。
自作IoTリモコンの制作 ver.1
ver.1の構成は以下です。
- Raspberry Pi zero(初代)
- 自作Androidアプリ(kotlin)
- Google社のFirebase Realtime Database(以下、FRD)
Raspberry Pi zeroに送信用の赤外線LED、その送信する赤外線を学習するための受信モジュールを搭載し送受信はPython、Node.jsでFRDを稼働。
スマホアプリは専用のアプリをkotlinで制作。
FRDの設計は、データを単発の使い捨て/保存しておきたい値を分け設計。
流れとしては、スマホアプリからFRDにデータ送信。
FRDの値が変化するとRaspberry Pi zeroに通知が来るため、変化した値をもとに学習していた赤外線データを送信。
初めての制作のため動いたときの感動は忘れられないです!
以下のデメリットが強く、次第にモヤモヤしていきました。
- Raspberry Pi zeroの処理速度が遅く、スマホで入力後2~3秒くらいして赤外線が飛ぶ。
- Raspberry Pi zeroの単価が3000円ちょい+その他部品で、部屋ごとに増やすと自作なのに微妙な値段
自作IoTリモコンの制作 ver.2
ver.2の構成は以下です。
- ESP32
- 自作Androidアプリ(kotlin)
- Beebotte
ver.1で1番のデメリットは処理速度の遅さでした。
押すごとに2~3秒というのは、外出時にエアコンの操作といった場面では良いのですが、室内でテレビの音量操作にはレスポンスが悪いです。
そこでRaspberry Piを使わない方法を考え、調べた末に出てきたのが単価半額以下のESP32です。
ESP32は雑な説明をすると小型なArduino+Wi-Fi+Bluetoothのようなもの。
Arduinoの感覚でプログラムを書け、また、ライブラリも豊富で開発速度を高めます。
BeebotteはIoT向けであるMQTTプロトコルのサーバーサービスです。
ESP32で使用するにあたり、軽量でパブリッシュ/サブスクライブ(Pub/Sub)が適しています。
流れとしては、
スマホアプリからBeebotteにデータ送信。
ESP32がBeebotteをサブスクライブしており、受信データをもとに赤外線データを送信。
流れとしてはver.1と同じですが、ESP32はWEBサーバーとして指示待ちもされているため屋内時はスマホからローカルネットワーク経由で直接指示が受け取れます。
Bluetoothは接続が切れたら意味ないので使いません。
屋外からの速度は2秒かからないくらいまで短縮された記憶があります。
屋内では本物のリモコンと遜色ない実行速度まで改善されました!
むしろ連打時は本物のリモコンを凌駕します!
しかし人間、欲が出ます。
・スマホアプリは完全無知から初めて作成したのもありUIがひどく、動くものができただけでもヨシしたもの。
・実行時の失敗等で通知をスマホに送信したい。
・エアコンは本物のリモコンだと1時間単位での予約しかできない点にモヤモヤ。(朝6:00に起動したいのに現在時刻が21:30とかだと微妙)
自作IoTリモコンの制作 ver.3
ver.3の構成
現在稼働中のver.3の構成は以下です。
- Raspberry Pi zero2
- ESP32
- 自作Androidアプリ(Flutter)
- Google社のFirebase Realtime Database(以下FRD)、Firebase Cloud Messaging(以下FCM)
- 基板はオリジナル設計品
流れとしてはver.1と2の合体のようです。
外部接続はRaspberry Pi zero2が担当、ESP32は外部と切り離した
Raspberry Piを再導入した理由としては大きく2点
- 各機器の役割分離
- Linuxサーバーがほしい(機能追加用)
vre.2では部屋毎にあるESP32が外部(Beebotte)と、内部(スマホアプリ)の通信待ち状態でした。
ver.3ではRaspberry Pi zero2が外部(FRD、FCM)と、部屋毎にあるESP32の橋渡し役をします。
ESP32は外部と接続せず、内部(スマホアプリとRaspberry Pi zero2)の通信待ち状態のみとなりました。
Raspberry Pi zeroが2へと進化したのは、Firebaseと接続するにあたり1だと公式Node.jsがサポートされなくなったためです。
Raspberry Pi zeroはNode11までしか公式対応してないのですが、Firebaseは12以上が必要みたいです。
ちなみにRaspberry Pi zero2にFirebaseいれる際、512MBしかないメモリでヒープエラー。
SDカードにOS入れてますが、一時的にswap拡張して対応しました。
そのうちSSDに変更する予定です。
また、エアコンのタイマーも〇〇時〇〇分のような指定を可能とさせるため、”at”コマンドを採用。
BeebotteからFRDに戻した
理由として、以下があります。
- スマホアプリはFlutterで再作成
- FRDを再導入した
- Andoroidスマホ用の通知にFCMを使う
- Flutter、FRD、FCMはGoogle社提供であり公式ドキュメントが豊富
- なんか親和性が高そうかも!
AWSでも試行はしましたが、Flutterが決め手となっております。
全部1箇所にしたおかげで管理面でも楽になります。
なお、FRDを選択している理由としては小規模でシンプルなデータであり非常に高いリアルタイム性がIoT向きでFRDの場合は有利に働きます。
大規模なシステムで大量のデータや複雑な構造のデータであればFirestoreが適していると思いますが、今回ご紹介しているIoTでは、赤外線データを送る程度の指示出しのためFRDが向いているのではないでしょうか。
温度や湿度などのデータを元に何かをする場合は、クエリ機能が強力で複雑なデータの検索が容易のためFirestoreが良いかもしれません。
専門的な意見ではなく、公式ドキュメントをあさった私なりの結論でFRDを選択しました。
スマホアプリの言語をFlutterにした
1番は勉強目的です。
クロスプラットフォーム開発ができるため、メインPCのWindowsでも使おうと思いましたが途中でやめました。
やめた理由としてはPCでわざわざリモコンを操作する頻度は少ないこと、またPC向けのレイアウト等を考えるのも使用頻度が少ないことを考えると費用対効果が低いためです。
状態管理はBlocを採用しています。
これも勉強のため。
Flutterに進化したスマホアプリではモヤモヤ解消のため以下を実施
- デザインはシンプルながら操作性を重視したレイアウトに
- ログインしたGoolgleアカウントにより操作可能なリモコン種類やメニュー等を変更
- 現在のネットワークが家のWi-Fiであれば直接対象のESP32へ送信
- 移動通信(4G/5G等)はFRDを経由
- なんらかのエラー時には内容や実行経路等によりtoast/FCMでの通知/ローカル通知などで結果表示
- 操作時、バイブレーションでのフィードバック(フィードバック無し、振動時間1ms~1000msで変更可能な設定メニューも作成)
コツを掴むとわりとスラスラ書けるFlutterは私のお気に入りになりました!
感想としては直感的に書きやすい。
パフォーマスを重視するようなアプリを作成するには専門的なKotlinやSwiftのようにはいかないですが、シンプルなUIなら十分です。
余談ですが、同じマルチプラットフォームのReactも勉強したいですね。
TypeScriptが好きです。
各部品等を実装する基板の設計
ver.2まではユニバーサル基板での実装をしていましたが、Youtubeでの動画をきっかけに挑戦してみました。
設計の知識なんて皆無です。
フリーソフトというのもあり「どんなものか?」とでソフトウェアをちょっと触る程度の”お試し”でインストールしてみました。
ソフト触る程度のつもりでしたが、3時間後くらいには設計完了してました!
ハマるとのめり込む、、、
ものは試しにと発注です。
結果はピン間隔のミスでESP32が刺さらず失敗。
くやしくて再挑戦。
ついでに絵も入れたりしつつ、祈るように発注。
なんと基板に各部品がしっかりのります!
テスターで導通も確認できてはいたので即はんだ付けし、いきなり実機テスト。
自作基板で動いた時は興奮しましたね!
ただ基板の設計は奥深く、同じ部品なのに配置等でパフォーマンスに影響があるそうです。
初挑戦でしたので、そこまで余裕がありませんでした、、、
ver.2でのモヤモヤ解消
Flutter、FRD、FCM、Raspberry Pi zero2、ESP32の組み合わせは成功し、ver.2でのモヤモヤは全て解消しました!
これも全て公式ドキュメントのおかげです。
Flutterでデバックとリリースのビルドで挙動が変わった時は泣きそうになりました、、、
最適化の影響らしいのですが、細かいことは確認できていないので課題です。
タイマーも苦戦しました。
Flutterのタイマー系パッケージや、Raspberry Pi zero2のlinux系コマンドやなど色々な方法を試し、最終的にatコマンドで落ち着くまで2週間くらいテストに追われました。
自作基板にしたおかげで、基板実装も簡単です。
消費電力
IoT機器は稼働し続けます。
膨大な電力を消費し、家計に負担がかかるようであれば、たやすく【便利 < お金】になります。
全て5Vの製品というのもあり、USB電流チェッカーで計測したことがあります。
うろ覚えですが、待機状態ではRaspberry Pi zero2/ESP32共に0.1Aを下回り、どちらかの瞬間最大でも0.1A程度だったはずです。
ESP32は確か待機状態で0.06Aとかだったので、5V × 0.06A = 0.3W
たぶん年100円いかないくらいかと思います。
そんなESP32は今や見ない5V1AのUSB充電器で何も不具合なく稼働中。
Raspberry Pi zero2は電圧降下でめっちゃ不安定になるので、良いAC/DCアダプター使っています。
ほぼ省エネを意識していないため、共に微々たるものかもしれませんが下げる余地があります。
と言っても常時稼働のためDeepSleep的なことがしにくい。
あとがき
私は完全畑違いのPCすら触らない異業種の出身です。
コンデンサーや3端子レギュレーター、むしろ基本の抵抗すらもよくわからずオームの法則くらいは知ってます程度からのスタートです。
偉大なる先人の方々が共有してくださっている知識を拝見しつつ、電気は怖いのでしっかり情報の裏取りをしながら鈍足での開発でした。
(火災報知器を専用に用意して稼働実機の真横に置いていたくらいビビってました)
本IoT作成において、記事内掲載の内容で有していた知識はC言語のみ。
そんな私でもここまでできました。
電子工作と難しく捉えず、挑戦してみませんか?
自作がゆえに機能追加でかゆい所に手が届くというのが製品版には無い良い所です。
細かな実装部品やソース例を載せておらず申し訳ないです。
そのうちご紹介できたらと思います。
ありがたいことに社内でも作ってみたいという声があり、社内イベントを実施したいところです!
今回は自作IoT歴史編のなぐり書きでした。
知識が足りなく何が正解なのかがわからないため、まだ改良の余地があると疑っています。
必ずver.4が登場すると思います。
アイ○ンマンのトニー・ス○ークはエンジニアの頂点のようで、とても憧れてます!