見出し画像

M5StickC Plus とUIFlowでプログラミング(6) - 分岐

 最後は、「分岐」処理です。プログラムにおいて(4)や(5)でやった「順次」「反復」に加えて「分岐」の3要素が基本になります。この3要素で世の中にある全てのプログラムが実現できます。

(2024/3/23)ブロックを変更して似た記事を上げました。以下にリンクします。この記事の代わりにこちらの記事でも構いません。この記事だけM5StickC Plus2を使用していますが、M5StickC Plusでも同じブロックがあります。

充電状態の表示

「Power」の中に、 「Get charge state」というブロックがあります。

現在、このブロックは「充電状態」というブロックに翻訳されていて、「Power」は「電源」になっています。
(2024/03/20)

画像1

これが充電状態を取得するブロックです。早速、このブロックを表示してみましょう。

(2024/3/20追記ここから)======================

M5SticKC Plus2ではどうかな、と思って確かめたところ、M5SticKC Plus2のUIFlow1.0には、このブロックはありません。
USB Type-Cの抜き差しで、多少の電圧の変動があるので、この記事と同じことをしようとしたら「バッテリー」の中の、Get device battery voltage(V)が使用できると思います。

バッテリ電圧を表示させ、抜き差しで変動する値を確認して、

後述の「論理」の②のブロック、「数学」の数字ブロックと組み合わせる

「Get charge state」のブロックの部分を、代わりにこのブロックの組み合わせに入れ替えることで、似た動作ができますが、充電状態でしきい値が変わり、満充電付近だと4.05近辺?ですが、電圧が低下しているともっと低い値がしきい値になるようなので、これで代わりのブロックにするには、ちょっと無理がある気がします。素直に、冒頭の代替記事を参照してもらったほうがよいかもしれません。M5SticKC Plus2の人は、以降の文章は、「そんなもんかー」と思ってもらえればよいと思います。

(追記ここまで)======================

(5)のプログラムを流用します。

画像2

上のように、変更することで、充電状態を表示することができます。また、前回は「10秒停止」でしたが、10秒では長すぎるので、2秒程度にしておくとよいでしょう。(別に10秒でも構いません)

 すると、USBケーブルを抜き差しする度に、「True」と「False」が表示されると思います。

画像3

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

充電状態を分岐の条件とする

画像4

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

条件・処理


②、 が条件用のブロックです。

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

画像16

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

画像6

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

画像7

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

画像8

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

画像9

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

画像16

 「もし」ブロックの種類を変えて、「if - else if」のタイプのブロックにしたもので、上のプログラムと同等に書くと、このようになります。
もちろん、「そうでなくもし」の条件は「≠ true」のパターンも考えられます。そして、これらは書き方は違いますが、プログラム的には(ほぼ)等価です。

画像12

さらに、「if - else」タイプでも同じ動作は実現できます。

画像13

ちょっと高度な話

 もっというと、そもそも、「もし」ブロックは(条件)がtrueだったら(処理)をするというブロックです。この(条件)に「Get charge state = true」を当てはめました。つまり「Get charge state = true」全体が「もし」ブロックに対して「True」を返します。「Get charge state」は充電状態なら「True」、非充電状態なら「False」を返すので、条件に直接「Get charge state」を当てはめても同じことになります。

画像14

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

 どの書き方でもよいので、プログラムを転送すると、USBで充電されているときにはLEDが点灯し、USBのプラグが抜かれて充電状態でなくなるとLEDが消灯すると思います。

 あ、そうそう。充電が完了して100%になるとM5StickC Plusのバッテリ管理用IC(PMIC)がバッテリ保護のために充電をやめて、充電状態ではなくなります。USBケーブルを指していても「False」を返すようになりますので、「あれ?ケーブルを指してるのにFalseだぞ?」となりかねないので、注意してください。


この記事が気に入ったらサポートをしてみませんか?