M5StickCでUIFlow入門 その4 条件分岐

現時点の情報です。最新情報はM5StickC非公式日本語リファレンスを確認してみてください。

概要

前回はボタンを押したらLEDをつける制御をやりました。途中にでてきた条件分岐を今回説明したいと思います。

条件分岐とは?

一般的にはif文という名前で呼ばれている分岐です。

前回のブロックだと、この青い「もし」というブロックになります。条件に合致した場合に、特定の処理を行うという処理です。

条件分岐で重要なのは、すべての条件をもれなくもうらしているかと、その条件が同時に発生することがあるかを意識することです。

ちょっとむずかしいので、個別に説明をします。

条件にもれがないか?

このAボタンの状態は、pressedの押しているか、releasedの押していないの2種類です。前回はwasPressedとwasがついて4種類ありましたが簡易的な方を使っています。

pressedの条件のみにすると、releasedのときの処理がないことになります。もちろん、スタートボタンなどの用途だと押したことだけが重要で、離したことの検知が必要ない場合もあります。

このような場合に、考慮もれで条件が抜けているのか、必要ないから入れていないのかは一度考えてからプログラムを組むようにしてください。

また、この例だと「もし」を2つ並べて使っていましたが他の方法もあります。

「もし」の左にある設定ボタンを押すと、下に引き出しが表示されます。

「else if」のブロックを、右側にあるifの下にくっつけてみました。するともとのブロックが変化します。もう一度「もし」の左にある設定ボタンを押すと、吹き出しが消えます。

「そうでなくもし」という条件があったので、そこにAボタンが押されていない場合にはLEDを消すという処理を追加しました。

これで、最初と同じ動きのプログラムができました。「もし」を並べるのと、「そうでなくてもし」を使うので動きが同じであれば、どちらを使っても構いません。

上記は、さらに「else」というブロックを設定から追加しました。「そうでなければ」というのが増えて、「もし」と「そうでなくもし」に該当しない場合には、ここの処理が動きます。

この場合Aボタンを押している場合にはLEDがON、Aボタンを押していない場合にはLEDがOFF、それ以外の場合には画面の背景色を赤に設定するという動きになります。

Aボタンの状態は押しているか、押していないかの2種類ですので、画面が赤くなることはないと思います。

しかし、悲しいですがこのプログラムを実行して、ものすごくAボタンを連打すると赤くなります。

連打していると、Aボタンの状態が素早く変わります。「もし」の瞬間にはAボタンが押されていなく、「そうでなくもし」のときにAボタンが押している場合に、画面が赤くなります。

これを防ぐのには、上記のように「もし」とelseの「そうでなければ」の組み合わせにすることで、「もし」のAボタンが押されている場合以外はすべて、「そうでなければ」でLEDが消えます。

ただし、これを防ぐ必要のないプログラムもあると思います。たんにLEDをつけるか消すかだけであれば「もし」を複数並べていても、それほど問題にはならないです。

簡易的にプログラムをするのか、なるべく厳密にプログラムをするのかは意識して考えて選ぶ必要があると思います。最初はまずは動かして楽しみ、慣れてきたらより厳密に組んだほうがトラブルが少ないと思います。

条件の同時発生

こんどは、Aボタンを押すとLEDをつけて、Bボタンを押すとLEDが消えます。

動かしてみると、たしかに意図通りに動くと思います。さて、AボタンとBボタンを同時に押した場合にどうなるでしょうか?

試してみるとLEDが点滅します。

このように、スタートとストップが同時に動いた場合に、どのような処理が好ましいかは状況により異なります。一般的に点滅するってのは、好ましくない動きだと思います。

この場合の考え方としては、安全側に倒すという処理になります。この安全側というのは、どっちの状態がより安全かという意味です。一般的にはスタートとストップだとストップの優先順位を高くします。

最近の車などの場合にはアクセルとブレーキを同時に踏むと、ブレーキが優先されます。それでも暴走する車が多いのは、ブレーキと思ってアクセルを踏んでいるからみたいですね。

さて、常にストップを優先したほうがいいかというと違っていまして、警告灯のスタート、ストップの場合には、安全なのは警告灯がついている方です。赤信号と青信号どちらを表示すればいいか迷ったときには、とりあえず赤信号を表示したほうが安全だと思います。

今回はAボタンを優先した場合、対策したプログラムは上記になります。Aボタンが押しているとLEDがついて、Aボタンが押されていなくBボタンが押されている場合のみLEDがOFFになります。

これで、AボタンとBボタンを同時に押した場合でもLEDがONになります。

ちなみに、else ifの「そうでなくもし」は複数つなげることも可能です。

変数

UIFlowでは変数と呼ばれる数値や文字を保存しておく仕組みがあります。

変数を使うためには、最初に作る必要があります。メニューから変数を選び、一番上にある「変数の作成…」を選び変数名を入力します。

ここの画面では日本語が入力できますが、現在日本語の変数は利用できないので注意してください。ここでは「LED」という変数を作成しています。

上記がいきなり完成図ですが、変数を作ると作った変数を変更する「○○を■にする」ブロックと、変数を増やすブロックと、変数自体のブロックが追加されます。

Setupで最初にLEDという変数を0に設定しています。その後にAボタンが押されると「もし」ブロックの中で変数を比較するブロックで、LED=0の場合(LEDが0の場合)にはLEDをつけて、変数を1にしています。

Aボタンを押すたびにLEDの点灯状態が変わります。

上記のように0=LEDと逆にしても、動きます。

UIFlowの表記プログラムの表記条件
==同じ値の場合
!=違う値の場合
<右辺が大きい場合
<=, =<同じ値か右辺が大きい場合
>左辺が大きい場合
>=, =>同じ値か左辺が大きい場合

ここの条件は上記の設定があります。UIFlowは左側の表記を使っていますが、プログラムでは真ん中の表記を使うことが多いです。

プログラムの場合には、変数に数値を代入するときに=を利用します。LED=0と書いた場合には、等しいかを比べるのではなくLEDという変数に0を代入して、結果的にLEDと0が等しくなります。

そのため、変数と数値が等しいかを比べる場合にはLED==0などのように、他の記号を使っている場合が多いです。

さきほどは数値で判定していましたが、文字列でも構いません。上記は真理値や論理値と呼ばれるtrue(真)、false(偽)を使った例です。

論理値の場合には、「もし」の条件に直接置くことができます。trueのときには条件に合致していることになります。LED=trueと値を比べることもできます。

変数に入れる値は、数値でも文字列でも真理値でも構いません。ただし真理値はtrueとfalseの2つの状態しかありませんので注意してください。

おそらくは、文字列にしたほうが何をしようとしているプログラムなのかを把握するのにはいいと思います。

気をつけないといけないのは、値の初期化を忘れないことです。上記のプログラムの場合にはLEDをOFFで初期化していますが、この初期化を忘れても「そうでなければ」の処理に入り、値が正常に戻ります。

上記のようなコードの場合に初期化を忘れると、LEDの中身がONでもOFFでもないので画面が赤くなり、処理が動きません。

このようなプログラムが悪いかというと、初期化漏れがすぐにわかるのでちゃんと動作検証をする場合には好ましいと思います。

初期化していないおかしな状態でも、なんとなく安全と思われる動きをするプログラムでも、想定外のことが起きたらすぐにわかるようにして、動作はしないプログラムもどちらでも構いません。

そのときに作ろうとしているプログラムが、どのような動きの方が好ましいかを考えながら作ってみてください。

一般的に人命やお金に絡む処理に関しては、想定外のことが起こるとストップするか、安全な動きになるように作ることが多いです。

まとめ

もしのif文だけで終わってしまいました。たんに使い方を書いたUIlowの入門ではなく、UIFlowを使ったプログラム入門として、気をつけないといけないことはちょっと、くどくなりますが多めに書いてあります。

続編

コメント