この記事は SORACOM Advent Calendar 2024 15日目の記事です。遅刻してすみませんでした…
さて、このブログも約半年ぶりの更新です
色々忙しくてなにかじっくりハードウェアと遊ぶ時間が取れなかったですが、久々に新しいハードウェアを触る機会がありました
先日SORACOM UG東海でSeeedさんが開発した新製品のマイコンボードの体験会がありました
その名も WioBG770A
こちらはSeeedさんが発売しているWioLTEの後継機的な立ち位置で、省電力が売りのセルラー通信ができるボードになっています
当日はこのボードで色々触って結構面白いボードだと感じました
で、その後懇親会で何を血迷ったのか(?)このボードを勢いで注文しましたw
というわけで今回はこのボードを使って遊んでみた話です
今回作るもの
今回は定期実行で天気APIを叩いて現在の気象情報表示する簡単なサイネージをWio BG770Aで実装してみることにしました(画像はイメージです)
システム構成はこんな感じです
AWSをベースにした構成になっており、EventBridge SchedulerでLambdaを定期的に実行しLambdaではOpenWeatherのAPIを使って現在の気候を取得し、そのデータをAWS IoT経由でSORACOM BeamからWio BG770Aに表示データを飛ばす仕組みになっています
事前準備
デバイス側
ハードウェア
以下のハードウェアを準備します
- Wio BG770A
- Grove - OLED Display 0.66" (SSD1306)
- SORACOM Air SIMカード plan-D(データ通信のみ/D-300MB)
ソフトウェア
Wio BG770A ユーザーマニュアルの「2-1. 開発環境を準備する」を参考に、開発環境をインストールします
BG770A用の環境をセットアップしたら、追加で以下のライブラリをセットアップします(すべてArduinoのIDE上のライブラリマネージャからインストールできます)
- ArduinoJson:ArudinoでJSONを扱うためのライブラリ
- PubSubClient:MQTTを使うためのライブラリ
- U8gs:OLEDディスプレイを操作するためのライブラリ
クラウド側
アカウント
開発環境
今回はAWSのリソースをSAMでデプロイするので、SAMの実行環境を用意します
また、コンテナを使ってアプリケーションのビルドをすることを想定しているのでDockerのセットアップも行います
デバイス側の構築
ハードウェアのセットアップ
SIMカードはWio BG770Aの基盤の裏側にあるカードスロットにカードの端子が基板側に向けて取り付けます
OLEDディスプレイはI2Cで接続するので、4つあるGrove端子の中の I2C
と書かれた端子に接続します
ソースコードの実装
Arduinoに以下のGistのコードを保存し、コンパイル、書き込みをします
執筆時点(2024/12/21時点)ではまだMQTTを使ったサンプルも事例が見当たらないので多分これが初の事例ですw
そういうこともあって、接続方法がわからず探り探りでMQTTのSubscribe方法を実装しましたが、デバイスのライブラリが無事にPubSubクライアントに対応してたおかげて思ってたより詰まることなくスムーズに実装できました(Seeedの松岡さん、フォローありがとうございます!)
いずれMQTTを切り抜いたサンプルはPR出そうと思います
また、省電力を売りにしているのでGroveの端子に接続してモジュールを操作したいときは setup()
関数には以下の1行を追加してGrove端子に対して電源を共有する設定を追加します
WioCellular.enableGrovePower();
クラウド側の構築
OpenWeatherのAPIキーを取得
OpenWeatherにログインしたら、画面右上のアカウントから My API Keys
を選択します
APIキーの設定画面が表示されたら任意のAPIキー名を入力して Generate
をクリックします
生成されたAPIキーはこの後の設定で必要なのでどこかにメモしておきます
AWS IoT、SORACOM Beamのセットアップ
以下のドキュメントのステップ1とステップ2を行い、SORACOM BeamをAWS IoTに接続するための設定を行います
パラメータのセットアップ
今回はLambda関数でOpenWeatherのAPIを叩くにあたり、APIキーをAWS Systems Managerのパラメータストアに格納しLambdaからSDK経由で呼び出すことにします。
AWS Systems Managerのコンソールを開いて、左のペインから「パラメータストア」を選択します
右上の「パラメータの作成」をクリックし、パラメータを作成します
パラメータ名は 、 /iot-signage/OPENWEATHER_API_KEY
にして、タイプは 安全な文字列
を選択します
その他の設定はデフォルトのままで「パラメータの作成」をクリックします
SAMのデプロイ
最後にSAMで今回のAWSで動かすアプリケーションをデプロイします
以下のコマンドでレポジトリをクローンします
git clone https://github.com/Miura55/iot-signage-event-batch
クローンしたレポジトリ内で以下のコマンドを実行することでアプリケーションがビルドされます
初回はコンテナイメージを取得するため、時間がかかります
sam build --use-container
ビルド後、ローカルで動作確認するときは以下のコマンドを実行するとローカルでLambda関数を実行できます(Lambdaで使用しているAWSのサービス(IoTとSystems Manager)のアクセス権がローカルでセットアップしたAWSの認証に付与されている必要があります)
sam local invoke PublishMessageFunction --event events/event-cloudwatch-event.json
AWSにデプロイするときは以下のコマンドを実行します
sam deploy
Lambda関数に関してはさほど複雑な処理をしているわけではないのでソースコードの解説は省略しますが、以下のリンクのコードが実行されるので、詳細が気になる方はコード内のコメントを追いながらご確認いただければと思います
また、デフォルトでは名古屋の現在の気象情報を取得するようになっていますが、検索対象の都市はレポジトリ内にある template.yaml
の以下の行でLambdaの環境変数として設定しています
そのため、この値を取得したい都市に変更してデプロイすると対象の都市の気象情報を取得することができます
Environment: Variables: TARGET_CITY: 'Nagoya,JP' // <- ここの都市を変更すると反映される
動作確認
それでは、実際に動作確認です
Wio BG770Aの電源を入れてSORACOM Beamが接続されている状態にしておきます
レポジトリにあるSAMテンプレートでは30分に1回(毎時0分と30分)Lambda関数を実行する設定 になっているため、時間になりLambda関数が実行されて以下の通りEventBridgeのイベントが実行された時間とOpenWeatherのAPIで取得された気象情報がディスプレイに表示されたら今回作ったシステムは無事に稼働してます
WioBG770AでOLEDを使ったサイネージ的やつ作ってみた
— KMiura (@k_miura_io) 2024年12月21日
パッと見簡素だが裏側はAWS使って画面更新する仕組みで結構作り込んでる(詳細は後ほど #WioBG770A #SORACOM #SORACOMUG pic.twitter.com/CvpyimzcW3
なぜAWSで画面更新をするのか?
今回の構成をやるぐらいならマイコン側で定期実行してもいいように思うかも知れません
ただ、遠隔地でこの装置を配置するとなったとして、その都度現場に出向いて更新作業するのは手間です
そこで、更新間隔のような頻繁に調整が必要な内容はデバイス側では無くAWSのようなクラウドで対応できるようにすることでメンテナンス製が上がるかも?という目論見で今回のようなシナリオを考えました
後は僕がハードウェアがそこまで強いわけでも無いというのもありますがねw
まとめ
今回はWio BG770AとAWSを使ってミニサイネージを作ってみました
個人的にセンサーでデータを飛ばすのもいいけどやっぱりクラウドから遠隔で操作できる方が魅力的だと思うタイプで、そこから今回のネタを思いつきました
遠隔操作といえばMQTTが思いつきますが、サンプルも事例もない中で地味に詰まるかと思いましたが、今までArduino触ってたときのカンがそのまま活かせてなんとか実装できて良かったです!(デバイスのライブラリのおかげでもあるけどw)
これでWio BGA770Aをまた一つ攻略できた気がします