
M5StickC Plus2 とUIFlowでプログラミング(6) - 分岐
この記事は、M5StickC Plus2で廃止された「充電状態」ブロックを使用しないでもとの記事と似たような内容を実現する記事です。
もとの記事はこちら。
最後は、「分岐」処理です。プログラムにおいて(4)や(5)でやった「順次」「反復」に加えて「分岐」の3要素が基本になります。この3要素で世の中にある全てのプログラムが実現できます。
「イベント」の中に、 「ボタンAがPressedである」というブロックがあります。

wasPressedと、pressedがありますが、「押された」か「押されている」の違いですので、厳密には違いますが、だいたい一緒です。
ひとまず、ここではpressedを使います。

ラベルを配置し、「ボタンAがPressedである」ブロックを表示させてみます。
すると、ボタンA(M5と書いてある一番大きなボタン)を押すと「True」、離すと「False」が表示されると思います。

「True」は「真」、「False」は「偽」を表し、ある条件に当てはまっているときは「True(真)」、当てはまっていないときは「False(偽)」になります。
この変化を利用して処理を分岐させてみましょう。
ボタンの押下を分岐の条件とする

「論理」の中に、分岐用のブロックがあります。①が基本のブロックです。
「もし(条件)であれば(処理)」の
「もし(条件)」の「(条件)」の部分に条件が入ります。
「であれば(処理)」の「(処理)」の部分にその「条件」を満たしたとき(Trueのとき)の処理が入ります。

②、 が条件用のブロックです。
右辺と左辺を比較して正しければ「True」を、違っていれば「 False」を返します。
例えば、今回の条件であれば、③ と組み合わせて、

のように使います。「ボタンAがPressedである」 と「true」を比較して同じ(「=」)のとき、「true」が返され、処理が行われます。
処理は、何でもよいのですが、ここでは「LED ON」ブロックを使ってみます。「LED」の中に「LED ON」ブロックがあります。これらを組み合わせてバッテリーが充電状態ならM5StickC Plusに内蔵されたLEDを点灯させるようにしてみましょう。
条件分岐と組み合わせて充電状態にあればLEDを点灯させるようにしたプログラムは次のとおりです。

これでプログラムを書き込んでみると、確かにボタンAを押せばLEDが点灯します。しかし、ボタンを離した場合は「False」と表示されるものの、LEDは点灯したままになってしまっています。これは、条件に「ボタンAがおされたときの場合」しかないためです。押された状態でなくなった場合にLEDを消灯するためには「押されていない場合」についても書かなくてはいけません。
一番簡単なのは、「もし~」ブロックをもう1つ作ることです。このパターンは2つ考えられ、1つは、1つ目の「もし」ブロックの条件が「=true」2つ目の「もし」ブロックの条件を「=false」にするパターンで、

もう1つのパターンは、2つ目の「もし」ブロックの条件を「≠ true」にするパターンです。「= false」と「≠true」では、多少論理的な意味は違いますが動作としては同じになります。

「≠」は、「ノットイコール」と呼ばれ、「同じではない」という条件です。「≠」は条件用ブロックの「=」の部分をクリックすることでリストから選べます。

また、「もし」ブロックの左の「歯車」マークを押すことで出るウインドウから、「もし」ブロックの種類を変えられます。標準は「もし」(if)ブロックのみですが、「でなければもし」(else if)、「そうでなければ」(else)と、1つの「もし」ブロックに複数条件を設定することができます。ちなみに、ここはなぜか日本語化されていません。

「もし」ブロックの種類を変えて、「if - else if」のタイプのブロックにしたもので、上のプログラムと同等に書くと、このようになります。

もちろん、「そうでなくもし」の条件は「≠ true」のパターンも考えられます。

そして、これらは書き方は違いますが、プログラム的には(ほぼ)等価です。
さらに、「if - else」タイプでも同じ動作は実現できます。

ちょっと高度な話
もっというと、そもそも、「もし」ブロックは(条件)がtrueだったら(処理)をするというブロックです。この(条件)に「ボタンAがpressedである = true」を当てはめました。つまり「ボタンAがpressedである= true」全体が「もし」ブロックに対して「True」を返します。「ボタンAがpressedである」は、ボタンAが押されていれば「True」、押されていなければ「False」を返すので、条件に直接「ボタンAがpressedである」を当てはめても同じことになります。

このように、同じ機能を実現するにしても、書き方はいろいろあります。したがって、動きが同じでも、プログラムを書く人によって書き方は違ってきたりします。「この書き方が妥当かなぁ」というのはあっても、「この書き方が正解!」というものはないのです。
ちなみに、個人的には一番最後のパターンがプログラム的にはすっきりしていてよいかなぁと思います。あくまで個人的には、ですが。
どの書き方でもよいので、プログラムを転送すると、ボタンAを押すとLEDが点灯し、離すとLEDが消灯すると思います。