UIFlow ＋ M5Stack Core2 を試す（ファーム： Beta2-core2）【準備編＋α】

こちらは、[M5Stackシリーズ](https://m5stack.com/collections/m5-core)の新デバイス「[M5Stack Core2](https://m5stack.com/collections/m5-core/products/m5stack-core2-esp32-iot-development-kit)」に関する記事です。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">近所のコンビニで、<a href="https://twitter.com/hashtag/M5Stack?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack</a> Core2 をゲット！ <a href="https://t.co/HMH5d7Cb9b">pic.twitter.com/HMH5d7Cb9b</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1301361403589046275?ref_src=twsrc%5Etfw">September 3, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

M5Stackシリーズ用のビジュアルプログラミング環境である「[UIFlow](https://m5stack.github.io/UIFlow_doc/ja/)」で、M5Stack Core2用のプログラムを作ってみようとして調査した、という内容が主です。

なお、2020/9/12時点では、M5Stack Core2用のファームウェアはベータ版（※ Beta2-core2）となっており、まだ正式版はリリースされていません。

## 補足情報

### M5Stack について
IoT系のコミュニティ等で話題にのぼるので聞いたことがある方もいらっしゃると思いますが、以下で「スイッチサイエンス マガジン」に記載された説明を引用します。

> M5StackはEspressifのESP32と、SDカードスロット、ボタン、USBやGroveのコネクタを5cm四方の基板に搭載し、ディスプレイや電源までを樹脂のケースに詰め込んであるモジュールです。
M5StackはArduinoのシールドのように、センサー等の載った拡張基板をメインモジュール（CORE）に積み重ねることができ、それぞれのモジュールが約5cm四方のケースに入っているところが特徴の1つです。
>
> 引用： 「[M5Stackであそぼう – スイッチサイエンス マガジン](https://mag.switch-science.com/2018/02/28/getting-started-with-m5stack/)」より

無線内蔵でボタンやディスプレイなどもついているので、IoTな工作にはピッタリなデバイスです。

### M5Stack Core2 について
[公式ページ](https://m5stack.com/collections/m5-core/products/m5stack-core2-esp32-iot-development-kit)の説明では以下のように書かれており、シリーズの第2世代目のデバイスと説明されています。

> M5Core2 is the second generation core device in the M5Stack development kit series, which further enhances the functions of the original generation of cores.

過去のシリーズと大きく異なるのは、静電容量タッチスクリーンが追加された点です。また、過去の類似形状のシリーズと比べると、新たに振動モーターやRTCモジュールが内蔵されています。

### UIFlow について
[UIFlow](https://m5stack.github.io/UIFlow_doc/ja/) はブロックを使ったビジュアプルプログラミングで、M5Stackシリーズの開発が行える環境です。内蔵・外付けのモジュールを扱うための仕組みがあったり、IoT に便利な MQTT や HTTP の処理も扱えたりと、たくさんの機能を実装することができます。詳細は、[公式ページ](https://m5stack.github.io/UIFlow_doc/ja/) をご参照ください。

## UIFlow を使う下準備
UIFlow を用いたプログラミングを行うには、M5Stackシリーズのデバイスにファームウェアを書き込んだり、無線の設定を行ったりする必要があります（ブラウザ上で使える UIFlow を利用する場合）。

ちょうど、M5Stack Core2 ＋ UIFlow を使った開発を試したという記事があり、そこに準備の手順が丁寧に書かれているので、セットアップについてはその記事（下記）をご覧ください。

●創って学ぼうプログラミング(43) M5Stack Core 2でUIFlowを使ってみよう | マイナビニュース
　https://news.mynavi.jp/article/makeprogram-43/

なお、こちらの記事では、RTCを使ったタイマーを UIFlow で作った例が紹介されています。

## UIFlow上での Core向け・Core2向けとの違い
UIFlow上で Core向け・Core2向けに用意されたブロック等は共通の部分と異なる部分とがあります。
ここで、その違いがある部分をいくつか見ていこうと思います。

今回の比較では、Core用の「V1.6.3」と Core2用の「Beta2」とを比べています。

### ウィジェット関連
まず、UIFlow を開いた際の画面左上の部分の違い見てみます。
これは、画面に表示するテキスト等を設定するための仕組みに関わる部分ですが、Core2向けのほうはボタン・スイッチ・スライダー等といった、タッチスクリーン上で直接触って操作できそうな要素が並んでいます（以下の画像内で赤枠で囲まれた部分）。

![図1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/791e81f7-c3f6-9418-3474-6f8abe45d6e3.jpeg)

これらを画面に配置すると、以下の画像内の赤枠で囲んだ部分にブロックのカテゴリが追加されます。
例えば、Switch を配置すると、Switch向けのブロックが入ったカテゴリが追加される、という形です。

![M5Flow.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/50917762-5f06-7712-32f0-a84e284c6031.jpeg)

以下の画像は、Beta2-core2 で提供されている Switch向けのブロックです。
画面上の表示位置・色などを指定するブロックや、on/off のどちらかを指定して Switch の状態を変更したり、トグルでそれら 2つの状態を交互に切り替えるようなものがあったりします。

![M5Flow.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/df6d2ffd-aeaf-de62-61d2-5b7f16e1961b.jpeg)

~~画像内の下から2番目は、Switch が on/off になった時を検知して処理を行うブロックだと思って試したのですが、使い方が間違っているのかうまく動いてくれませんでした。~~
⇒ 【追記】 上の画像内の下から2番目のブロックは、Switch の状態変化を検知するのではなく、Switch がタッチされて on/off の状態変化が生じた時に処理が行われるものだったようです。

~~なお、元から画面上に用意されているソフトウェアボタン（過去のシリーズでは、ハードウェアボタンだったもの）を押したときに、on/off の状態を切り替える、といった処理は動作することを確認できています。以下のツイート内の動画の後半部分が、それを試した時の様子です。~~
⇒ 【追記】 こちら、意図通りに動かない・・・、と試行錯誤していた件は解決しました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/UIFlow?src=hash&amp;ref_src=twsrc%5Etfw">#UIFlow</a> でとりあえず試行錯誤して、<a href="https://twitter.com/hashtag/M5Stack_Core2?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack_Core2</a> の画面上でタッチした場所に応じて背景色が変わる処理とか、ボタンを押したら画面上のUIが表示されたり消えたりする、<br>みたいなのを作ってみた！<a href="https://twitter.com/hashtag/M5Stack?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack</a> Core2のファームはBeta1を使ってみてる！ <a href="https://t.co/A7ziEpQBsx">pic.twitter.com/A7ziEpQBsx</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1301528715239645186?ref_src=twsrc%5Etfw">September 3, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### タッチスクリーン関連
Core2 で新しく搭載されたタッチスクリーン用のブロックも用意されています。
Beta2-core2 では以下の画像のとおり、座標の取得などのための 4つのブロックを利用可能です。

![M5Flow.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/5adcfc7f-8d03-5948-6240-6faa4991783e.jpeg)

1つ前の項目にのせたツイート動画の前半部分が、このタッチスクリーン用のブロックを試した処理になっています。
動画で、Core2 の画面左上に小さく数字が出ていますが、これがタッチされた箇所の x座標の値を示しています。動画の前半の内容では、タッチされた座標がある特定の値以上となる場合に画面の背景の色を変更する、という処理を実装しています。

## ウィジェットまわりの試行錯誤
**【追記】 ↓解決しました**
~~上記の「Switch が on/off になった時を検知して処理を行うブロックと思われるものが動いてないかもしれない」という話は、別のウィジェットでも見られるように思いました（※ 自分のブロックの使い方が違っている可能性等もあるかもしれません）。~~
~~そのあたりは試行錯誤してみて、まだ未解決の状態です。~~

<blockquote class="twitter-tweet" data-conversation="none"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/UIFlow?src=hash&amp;ref_src=twsrc%5Etfw">#UIFlow</a> の Beta2-core2 を試していて、<br>Checkbox widgets の「checkbox0.unchecked(checkbox0_unchecked)」の処理のブロックとか、Button の「touch_button0.pressed(touch_button0_pressed)」とかが意図通り動かないな・・・。<br><br>使い方が違ってるのかな・・・。<a href="https://twitter.com/hashtag/M5Stack_Core2?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack_Core2</a> <a href="https://twitter.com/hashtag/M5Stack?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack</a> <a href="https://t.co/DITIoAT6uK">pic.twitter.com/DITIoAT6uK</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1304667767312773120?ref_src=twsrc%5Etfw">September 12, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-conversation="none"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/UIFlow?src=hash&amp;ref_src=twsrc%5Etfw">#UIFlow</a> の Beta2-core2 、<br>ウィジェットの状態変化や押下イベントの処理は、まだ使えないのかな・・・。<br>（比較検証のプログラムで、あれこれ試行錯誤中）<a href="https://twitter.com/hashtag/M5Stack_Core2?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack_Core2</a> <a href="https://twitter.com/hashtag/M5Stack?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack</a> <a href="https://t.co/IJzPa25sVG">pic.twitter.com/IJzPa25sVG</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1304669649255108609?ref_src=twsrc%5Etfw">September 12, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### 【追記】 ウィジェット関連のブロックの話（上記の内容が解決した話）
Twitter で「意図した通りに動かない・・・」という話をツイートしていたら、以下のコメントをいただきました。

<blockquote class="twitter-tweet" data-conversation="none"><p lang="ja" dir="ltr">ウチの環境だと2つのNGは上はOKで，下はNGでした。下はスイッチを直接タッチすればOKなので，間接的な状態変更は取れないみたいですね。 <a href="https://twitter.com/hashtag/M5Stack_Core2?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack_Core2</a> <a href="https://twitter.com/hashtag/UIFlow?src=hash&amp;ref_src=twsrc%5Etfw">#UIFlow</a></p>&mdash; さいとてつや (@saitotetsuya) <a href="https://twitter.com/saitotetsuya/status/1304795856734842880?ref_src=twsrc%5Etfw">September 12, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

そして、Switch はタッチされた時の状態変化に連動して処理が実行される前提で考え、Button のほうは単にボタンをタッチした際にうまく反応させられてないと捉えて、プログラムを少し組み直して作ってみて再度挑戦。
その結果、画面のタッチのしかたを試行錯誤したら Switch・Button を反応させることができ、以下の動画のように無事に動かすことができました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/UIFlow?src=hash&amp;ref_src=twsrc%5Etfw">#UIFlow</a> の Beta2-core2 を試していて、意図通りに動いてなさそうとツイートしていた件は、 <a href="https://twitter.com/saitotetsuya?ref_src=twsrc%5Etfw">@saitotetsuya</a> さんにコメントをいただき、無事に解決しました！<a href="https://twitter.com/hashtag/M5Stack_Core2?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack_Core2</a> <a href="https://twitter.com/hashtag/M5Stack?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack</a> <a href="https://t.co/32e8yDXI3Y">https://t.co/32e8yDXI3Y</a> <a href="https://t.co/OWn1OSVJox">pic.twitter.com/OWn1OSVJox</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1304804750475448322?ref_src=twsrc%5Etfw">September 12, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### 【追記2】 タッチスクリーンを使ったお試し
せっかく新機能としてタッチスクリーンが搭載されたので、それを使ったものも試しに作ってみました。
そして、せっかく 2台あるのでそれも活用してみました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/UIFlow?src=hash&amp;ref_src=twsrc%5Etfw">#UIFlow</a> の Beta2-core2 のお試しを引き続き。<a href="https://twitter.com/hashtag/M5Stack_Core2?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack_Core2</a> が2台あるので、それらを連動させるようなものも作ってみたよ。<a href="https://twitter.com/hashtag/M5Stack?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack</a> <a href="https://t.co/xG18c6eJX4">pic.twitter.com/xG18c6eJX4</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1305143009667768320?ref_src=twsrc%5Etfw">September 13, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

端末間の通信に ESP-NOW を使って、一方のタッチイベントで得た座標を他方に送り、受信した側で座標データを用いた画面上での円の描画を行っています。

## まとめ
今回、Beta2-core2 のファームウェアを使って UIFlow ＋ M5Stack Core2 を試したり、UIFlow上のブロックを調べてみたりしました。
~~まだ試行錯誤をしている部分が残っていますが、引き続き、あれこれ試してみようと思います。~~
⇒ 意図通りに動いてくれない・・・、と試行錯誤していた件は、Twitter でコメントをいただいて問題が解決！

Core2用のファームウェアは「Alpha-core2 ⇒ Beta1-core2 ⇒ Beta2-core2」とリリースされているのですが、バージョンが変わるごとに利用できるブロックが着実に増えているので、今後も UIFlow で実装できる内容が増えていきそうで、この後のバージョンアップ・正式版のリリースを楽しみにしています！

## 【追記】 ついに正式版がリリースされたようです！
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おお！<a href="https://twitter.com/hashtag/UIFlow?src=hash&amp;ref_src=twsrc%5Etfw">#UIFlow</a> のファーム、 <a href="https://twitter.com/hashtag/M5Stack_Core2?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack_Core2</a> 用のものがベータから正式版になってる！？<a href="https://twitter.com/hashtag/M5Stack?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack</a> <a href="https://t.co/95cvmWn39P">pic.twitter.com/95cvmWn39P</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1319276840339435524?ref_src=twsrc%5Etfw">October 22, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>