以下の 自分用の #GWアドベントカレンダー 4/29 の分の記事も兼ねたメモです。
●2021年はマイペースに( @youtoy ) | GWアドベントカレンダー
https://gw-advent.9wick.com/calendars/2021/103
概要
今回の内容はタイトルの通り、obniz のブロックプログラムで 2台のデバイスを連動させる、というものです。今回の記事の中で用いたデバイスについて、 一方は obniz Board 1Y を使いましたが、もう一方は obnizOS が入った M5StickC を使ってやってみました。
先に、今回作った内容の動画を掲載してみます。
詳細
今回の内容の元になった記事があり、ここでその @wicket さんの記事を紹介します。
●ブロックプログラムで遠隔地IoTを行う - Qiita
https://qiita.com/wicket/items/0c69b308c8b582d1e086
ブロックプログラム上で obniz との接続を行うブロックを 2つ配置し、それらの ID を異なる 2台分のものにすると、それら別々のデバイスを制御するプログラムを 1箇所で書くことができる、というものです。
さらに、一方のデバイスにつながったセンサー等から得られる値をもとに、他方のデバイスの制御を行うようなことも容易に実現できる、というものでした。
そこで今回、「一方のデバイスの加速度センサーの値を元に、他方のデバイスにつないだサーボモーターの角度を変化させる」という内容にして、上記の仕組みを自分でも試してみました。
作ったプログラム
作ったプログラムは、以下のような内容です。
一部、内容を補足すると、以下のような対応を行っています。
- 角度は 0〜180 まで設定できるようだったので、それを45度ずつの 5つの範囲に分割
- M5StickC のディスプレイを真上にした状態からディスプレイが真横になる角度まで回転させた時、おおよそ -1〜1 の値をとったので、その区間を不均等に 5分割
- センサーの値の判定で小数が使えなかったので、センサーの値は 10倍にしてから変数で保持するようにした
- 上記の分割した範囲をプログラム中で紐付け
- 角度の変化の支持出しのタイミングを適当に 500ミリ秒間隔似設定
それと、動画を見ていただくと分かるのですが、自分が使ったサーボモーターが動く範囲が 180以上動くもので、ブロックプログラムで設定した値よりも大きな角度のところまで動いています(ブロック中の角度指定と、実際の角度が不一致)。もし、実際に動く角度が重要な作品を作る場合は、これらの値の違いをうまくマッピングして吸収してやる必要がありそうです。
まとめ
当初、2台の obniz を連携させる話を考えた時に、ちょっと前に書いた以下の記事の内容と、HTTPリクエスト(GET)のブロックを組み合わせる方法が思い浮かんだものの、それだと短い時間間隔で連動させるのは難しいな、と思っていました。
●#obniz のブロックプログラムで作った仕組みを外部からの Webhook をトリガーにして動かす(アプリのインストールを利用) - Qiita
https://qiita.com/youtoy/items/668ffd93f6dea3d7a2de
そして JavaScript でプログラムを書いてしまえば、とも思いつつ情報を調べていたら、上記の「概要」のところで書いた記事の内容に行き当たり、今回の記事で実装した仕組みを実現することができました。
自分が何かを作る話なら JavaScript で書いてしまえば良い話ではあったのですが、自分以外で作品を作りたいという方が JavaScript が得意でない等といった場合に、今回の方法を提示できたりして便利だったりするので、試せて良かったです。