【お手軽IoT】UIFlow の「リモコン＋（Remote+）」をシンプルな構成で試す： M5Stack のデバイスからスマホにデータを送るのみ

## はじめに
この記事のトピックは、M5Stack社が提供している開発環境の、とある機能の話です。

具体的には、M5Stack社のデバイスをビジュアルプログラミングで開発できる「UIFlow」の中の、「[リモコン＋（Remote+）](https://docs.m5stack.com/ja/uiflow/iotservice/remote+)」という機能に関するものです。
![公式ドキュメント](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/48fb3778-139b-f17a-3969-82aa3a5488e1.png)

#### 何ができる？
この「リモコン＋」を使うと、自分でサーバー側を用意しなくても、「M5Stack社のデバイス」と「スマホや PC（のブラウザで開いた Webページ）」との間での、インターネット経由のやりとりを実現できます。
その一例として、今回試したような「デバイス側のセンサーの値を、スマホや PC側で表示させる」というようなことができます。
![構成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/2f4d12e2-abb6-c14c-5403-c9413c76258d.png)

これを活用すると、お手軽に IoT ができそう！

#### 余談
余談ですが「リモコン＋（Remote+）」という仕組み、かなり前に知ってずっと気になりつつも、手を出していなかったものでした。そして今回ようやく手をつけてみました。
※ 「リモコン＋」を既に使っている方もいらっしゃるので、ネット上の投稿などを探すと、「リモコン＋」を使った事例を見ることができます

## 「リモコン＋」を試す
### UIFlow の使い方
「リモコン＋」を使う話の前提として、M5Stack社のデバイスの開発を UIFlow で行うという部分があります。

この部分については、「UIFlow用のファームウェアの書き込み手順など、UIFlow での開発を始める方法」を書いた記事が、既にいろいろ公開されています。そのため、「UIFlow 使い方」などのキーワードで検索して記事を探して、その内容をご参照ください。

### UIFlow上で「リモコン＋」を使う
#### 前提となる話など
ここからの話は、UIFlow上での開発が行える状態になっていることが前提になります。

それでは、UIFlow上での話に入っていきます。
UIFlow で開発を行う際に「リモコン＋」を使うには、UIFlow上のメニューで「リモコン＋」を選びます。
![リモコン＋の場所](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/230504d1-e017-a47a-b8fb-cb2ab7140fc4.png)
そうすると、上記の画面が表示されます。この画面の右のほうに表示されているところで、Webページの UI を作ります。冒頭の説明で、「スマホや PC（のブラウザで開いた Webページ）」と書いていた側で使うものです。
それと合わせて、UIFlow のブロックを使って、デバイス側の実装も行っていく形です。

#### 今回の UIFlow側の実装
今回作ったものの手順の詳細を書いていく前に、先に完成したものの紹介をします。

今回試した内容はとてもシンプルで、「M5Stack のデバイス（今回使うのは、M5Stack Core2）のセンサーで得られたピッチ角の値」を、「M5Stack社が用意してくれているサーバーを介して、スマホのブラウザで開いた Webページ上に表示する」という内容です。

そして、今回のお試しで利用するセンサーの値は 1つだけです。

以下が、UIFlow上で実装した内容の完成版です（補足などは、またこの後で）。
![シンプルな構成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/a1cd0ae3-8342-ddf6-52cc-d24ff58f8bf0.jpeg)

次に、今回の仕組みが動いている様子の動画も掲載します。

以下の動画の画面内の左のほうに M5Stack のデバイス（M5Stack Core2）があり、「M5Stack のデバイスのセンサーの値が、デバイス内蔵のディスプレイ上に表示されます（※ 2.5秒間隔で、表示する値を更新）。
そして、そのセンサーの値が、定期的に（3秒間隔で）スマホのページ上（動画の画面内の右のほう）に表示されます。

動画： [#UIFlow の「リモコン＋」を使った #M5Stack Core2 からスマホへのデータのやりとり（シンプルな構成で試す） - YouTube](https://www.youtube.com/watch?v=xSlsKKpaN6E)
<iframe width="560" height="315" src="https://www.youtube.com/embed/xSlsKKpaN6E" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

スマホ側で、センサーの値の取得・表示を 3秒間隔と比較的長い時間にしているのは、今回使ったリモコン＋の機能の仕様によるものです。その仕様で、最短の時間間隔が 3秒となっていて、その最小の時間間隔を設定しています。

#### Webページ側の実装
それでは、実装の詳細について書いていきます。まずは、Webページ側です。

UIFlow のメニューの「リモコン＋」を選び、以下の「123」と書かれたアイコンを、ドラッグアンドドロップで以下の赤矢印で示したように動かします。
![画面上にパーツを配置](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/bec9a1a3-3ffc-9be2-931c-eaadc668ab6f.png)

そして、配置したパーツをクリックすると、以下のように設定画面が表示されます。
![設定の一覧が表示された状態](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/79891471-8b9e-80ff-6365-272317ff87a8.png)
設定はこのまま変更を加えなくても、今回の内容は試せるます。しかし、設定を変えて結果も見てみたくて、以下のような変更を加えました。

- 設定を変えた項目と内容
   - Name ⇒ SensorValue
   - Show Title ⇒ True
   - Font Size ⇒ Large

また、上記の操作を行うと、以下のブロックが配置された状態になります。
![Webページ側に値を表示する処理のブロック](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/57f0c2a0-957a-6ff1-83e9-0af12a5b72cf.png)

この続きで、デバイス側の実装も行って行きます。

#### デバイス側の実装
デバイス側の実装で、大きく 2つの実装を行います。

実装の 1つ目は、デバイス内蔵ディスプレイに、センサーの値を表示する部分を作ります。
UIFlow の左上の部分で、以下の「Label」のアイコンを操作します。アイコンをドラッグアンドドロップで以下の赤矢印で示したように動かします。
![デバイス上にラベルを配置](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/a7ddb82f-2d6e-07a2-0fcc-4f9252136ede.png)

その配置を行った後の状態が、以下です。「label0」という表示がされていれば OK です。
![ラベルの配置後](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/54b91fb8-2ebc-75bc-9cce-2a7b219ae883.png)

実装の 2つ目は、以下の固まりの部分の「Setup」で始まっているほうを作ります（※ 以下は、上で完成形として示していたもの）。
![デバイス側の実装](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/a627d886-55a2-fa43-d98d-184fd68398b4.png)

具体的には、UIFlowで以下のメニュー・ブロックを選択して、配置していきます。

- 追加するブロック
   1. イベント ＞ ずっと
   1. 変数 ＞ rp_label1_data を にする
   1. ハードウェア ＞ 加速度＆ジャイロ ＞ ピッチ角
   1. UI ＞ ラベル ＞ ラベル label0 に Hello M5 を表示
   1. 変数 ＞ rp_label1_data
   1. タイマー ＞ 1 [秒]停止

上記の「2 と 3」および「4 と 5」のブロックは、それぞれ組み合わせて使います。
さらにその下に、上記「6」のタイマーのブロックをつなげます（※ 時間は 1秒から、2.5秒に変更しました）。

そして、それらが上記の「1」の「ずっと」のブロックの中に、入れ子になって入る形です。

これで、ブロックの実装は完了です。あとは、UIFlow の画面右下にある「Ruｎ」ボタンを押すことで、デバイスへのプログラムの書きこみと処理の実行が行えます。
![Runボタン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/21773536-f501-4744-18df-a309bdd80ed8.png)

処理を実行した後に、デバイス内蔵ディスプレイの画面上で数字が表示され、それが一定間隔で変化していれば OK です（※ このとき、デバイスを傾けるなどして、センサーの値が変わるようにして確かめてください）。

#### スマホで Webページを表示する方法
あとは、M5Stack のデバイス上で表示されていた値を、スマホ側でも表示させてみます。そのために、Webページにブラウザでアクセスします。

その際にアクセス先となる URL は、UIFlow上で取得することができます。
以下の赤矢印で示した部分をクリックすると、QRコードと「Copy Url」と書かれたボタンが表示されます。
![WebページのURLの表示方法](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/1f3a9f42-52b8-7dcd-ee8b-959c0a7b186d.png)

このボタンを押すと、クリップボードに URL がコピーされます。そのコピーされた URL をスマホ側に送ってブラウザで開いても良いですし、表示された QRコードをスマホで読み取ってアクセスするやり方でもかまいません。

そのようにして、スマホで Webページを開きます。そして、スマホのブラウザ上の画面で、数字が表示された部分が一定間隔で変化しているのを確認してみてください（※ このとき、M5Stack のデバイスを傾けるなどして、センサーの値が変わるようにして確かめてください）。

## おわりに
UIFlow の「リモコン＋（Remote+）」をシンプルな構成で試してみました。そして、自前でサーバーを用意することなく、M5Stack のデバイスからスマホへと、センサーのデータを送ることができました。

今回試した内容は、「リモコン＋」の UIパーツの 1つを使ったのみで、「リモコン＋」には他にも様々な UIパーツがあります（例えば、M5Stack のデバイス側を遠隔で操作することもできる「ボタン」や「スライダー」、「ジョイスティック」といったもの）。
さらに、[EzData という、M5Stack社が提供しているクラウド上のデータストレージサービス](https://docs.m5stack.com/ja/uiflow/iotservice/ezdata)と組み合わせて、データのグラフ表示を行うことも可能です。

まだ自分自身、「リモコン＋」で試せてない内容が多いので、引き続きお試しをやっていければと思います。

### IoTLT というイベントで発表してみました
この記事に書いた話は、8/22 に開催された「IoTLT vol.102」で発表しました。

以下は、その際の登壇スライドです。
<script defer class="speakerdeck-embed" data-id="d0b447459f1b4d62a9d18028c4c66041" data-ratio="1.77613320999075" src="//speakerdeck.com/assets/embed.js"></script>

[⇒ こちらは、動画アーカイブで自分が登壇部分へのリンクです](https://www.youtube.com/live/0_nyiMMphf0?feature=share&t=1397)