先日は、
にて変数について書きました。
このように実際には二値で動いている物の場合、数字のように決まった状態ではありませんから、任意の数値を格納できる状態にして置かなければならないわけですが、この時に使用するのが変数になります。
■ 定数 : アラビア数字
■ 変数 : アルファベット
を用いて記述を行います。これは 【 項 】 と言う処理を一つにまとめた構造物を使う時に使用するのですが、この形にすると 【 数式を加算の状態に出来る 】 ので、プログラミング言語の順次と同じ状態に出来ます。つまり、アルゴリズムを用意して現在の状態に追加していくような形に出来るので、【 加工を行うときの工程表 】 のような形で4季を整形できるようになっています。
中学校で登場する方程式や関数はこの形になっているのですが、この構造を簡素な形にする時に因数分解を行うことになります。
項のカリキュラムは、【 工程表を数式で示す方法 】 になりますが、この時に
■ 確定した値
■ 任意の値を代入できるもの
を使う事になりますが、関数のように 【 変数に任意の値を代入して解を求めることが出来るもの 】 を扱う際には、便宜上、任意の値を代入できる変数を用意して処理をすることになります。
変数を使う
MakeCodeもScratchと同様に変数を作ることが出来るので、新規変数を作成した後に、
■ 変数の初期化
■ 変数の実装
を行うことが出来ます。プログラミング言語には
■ 変数の宣言
■ 変数の初期化
の2つが存在するのですが、宣言は名称と型を指定してそれを使えるようにする処理で、初期化は、プログラムを実行した際に常にその値でスタートできるように予め値を指定しておく処理になります。
初期化については、始点と終点が決まっていて、その間を移動する様な処理を実装する際に必要になりますが、初期化をせずに移動だけ実装した場合には、
のメニューの変数をクリックすると、
が表示されるで、【 変数を追加する... 】 をクリックします。すると、
のようなダイアログが出るので、名前をつけて 【 OK 】 ボタンをクリックします。今回は、
のような感じにしてみました。まず、
が初期化なので、最初だけ変数を0にしています。コレを行うことで、プログラムが実行されたときには常に変数は0の状態からスタートします。そして、処理を行うメインループの部分ですが、
のようにしています。これが値を増やすブロックと値自体を使用するブロックになりますが、最初に、数値を増やしてその後表示をするようになっています。そのままだとものすごおい勢いで数値が変わるので、一時停止を入れてタイミングを調整しています。こうすることで、特定のタイミングで数値が増えて更新されるので、100MSごとに数値が書き換わるようになります。
先程のコードは自動処理になりますが、ボタンの入力に対応させて数値を変化させることも出来ます。
のようなコードにした場合、
の部分で初期化をして、
の部分で表示をするので、そのまま実行すると0が表示されるのですが、
のようにボタンの動作でのイベントで数値を変えるようにすると、変数が書き換わるので、表示を変更することが出来ます。実行すると、
の状態になり、何もしないとその状態が維持されます。そして、
のようにボタンを押すと
のように数値が増えます。この状態で、Bボタンを押すと
のようになり、数値が変わります。
このプログラムでは、メインループで常に値を更新しているわけではないので、値が固定された状態になっており、ボタンを押したイベントによって数値が変わるようになっています。そして、表示は変更後の値を表示できるので、押した回数で
のように値を変更することが出来ます。このプログラムでは左で増えて右で減ると言う状態にしていますが、数直線の構造を考えると、右で増えて左で減るほうが自然な気がしますから、操作を考える場合には、そうした部分にも気を配ることになります。
回路と構造
機械を作る場合、最も簡単な構造は、
■ 電源
■ スイッチ
■ 電球
になりますが、プログラミングも同様の構造にすることが出来ます。micro:bitはハードウェアなのでスイッチと表示が可能なので、この構造と同じ考え方で処理を実装することができます。
ボタンでの処理ですが、変数を使うと入力を行った結果を数値で制御できるようになるので、
のような形で使用する変数を用意しておきます。makecodeでは、
のように初期化とメインループで使用するブロックが用意されているので、【 最初だけ 】のブロックに初期化を行う設定を導入しておいて、処理自体はメインループに包含するので 【 ずっと 】 のブロックに追加していくことになります。
初期化ですが、
のようにすると用意した変数は常に0になるわけですが、表示もリセットしたい場合には、
のように 【 表示を消す 】 も追加します。こうすることで何も表示されていない状態を作ることが出来ます。この状態に対して変数の変化などを加えてアプリケーションを作ることになりますが、その記述をメインループに実装します。
のような感じにすると、変数が順番に入れ替わるわけですが、この状態だと初期化された値の表示なので、常に0が表示されます。
このように定数と表示だけだと何も変化が生じませんから、この状態は豆電球と電池を使用して閉回路を作ったのと同じですから、常に通電後の結果が発生している状態になります。
これが、定数で指定したものを表示した際の挙動になりますが、変数を使うと変化を実装できるので、この状態を変更することが出来ます。
スイッチの実装
プログラミング言語でスイッチに該当するのは条件分岐になりますが、実際には、
■ スイッチ : イベントハンドラ
■ トランジスタ : 条件分岐(ifなど)
になります。高校の物理では、トランジスタが登場しますが、このパーツは電流によって使用する回路を切り替えることができるので、実施素敵にスイッチの役割をしているわけですが、この処理は回路内での電圧の変化やコンパレーターに寄る判定で制御が出来るものですから、内部処理になります。そして、中学校の理科でも登場するスイッチは操作をするものなので、これは、内部処理ではなく、操作のみで条件が変わるパーツになります。プログラミング言語を使用してアプリケーションを作る場合にも
■ 入 力 : イベントハンドラ
■ 内部処理 : 条件分岐(ifなど)
を使う分けることになるので、バッファで文字列を記憶しておく入力待ちも含めて操作を必要とする処理になりますが、この判定を行うのは内部処理なので条件分岐を使用することになります。スイッチだけで動くものだとスイッチに直結した処理が実行されているわけですが、この入力に判定を入れる場合には、論理ゲートなどを追加することになります。
micro:bitの場合、物理的なスイッチが実装されているので、イベントハンドラでコレを使用できるのですが、この場合、
のようにブロックを使うことでボタンの判定を取得することが出来ます。今回は 【 一致 】 の判定を使うので、
のようにボタンで変数の値を変更するようにしておきました。
挙動の実装
イベントハンドラを実装したので、この状態で異なる条件になる要素を作ったのですが、実際に動くものを用意して動かすことにします。通常だと、このイベントハンドラに実装するのですが、今回は、別のパーツを動かす様な作り方をします。
イベントハンドラに処理を実装するとその構造が一つのモジュールになってしまうのですが、今回はイベントハンドラはスイッチで、処理は別のモジュールと言う考え方で作ります。この場合、処理を関数で独立させることになりますが、MakeCodeでも関数を実装できるので、関数を作ることにします。
のような形で、関数歩ブロックを作ると関数名をしていするだけでなく、関数で使用する引数の指定も出来るようになっています。
今回は引数なしなのでこのまま作りますが関数を作ると、
のように処理の実装用と実行用のブロックが生成されます。戻るは戻り値になりますが、関数内の変数はブロックスコープがかかるので、外部参照が出来ません。その為、演算結果を変数に格納した場合にそれを関数外に出力することができませんから、戻り値として出力することで、関数の実行時の値を得ることが出来ます。この戻り値を変数に代入して使用することで、関数外のコードで関数で引数使用した演算結果を使用することができるようになっています。
今回は、
のような4つの関数を作り、
のように異なる表示をするような作りにしてみました。表示はラグを入れないとすぐに消えてしまうので、遅延をリれることになりますが、この処理はScratchで文字や数字をふきだしで表示する際にも使用します。
判定の実装
これまでの作業で、
■ イベントハンドラで変数の値を取得する
■ 実行する処理の実装
を行いました。ただし、この状態では、
■ 入力
■ 出力
は存在しますが、判定部分が存在しません。そこで、変数の値で動作する判定を実装することになります。
この場合、内部処理になるので 【 条件分岐 】 を使用しますが、電気工作だとこの部分がコントローラーの仕事になります。なので、マイコン制御もこうした入出力が存在する場合に、どういった判定をすればいいのか?を実装することになります。
今回は判定の条件が4つあるので、
の様な形にして、ここに
のように比較演算子で一致の条件を実装しました。当然、ここに実装するのは、変数の判定ですから、
のようになりますが、それぞれの処理に
のようになります。
挙動の確認
シミュレーターを実行すると
の状態になりますが、ボタンを押すと数値が変わるので、
のように表示が変化します。ただし、このコードでは、数字が変わるだけなので、押した後はその状態が維持されます。
挙動の変更
先程のプログラムでは、状態が維持されていたのですが、今回の処理は変数参照なので、変数にリセットをかければ表示を消すことができるようになります。ということは、関数側でリセットをかければいいので、
のように数値が増える処理に変数を0にする処理を追加して、
のような形にすると、ボタンを押してしばらくすると表示が消えるようになります。今回は、
のような構造にしているのですが、
で入力を行い
のように用意した処理を
■ センサー
■ コントローラー
■ アクチュエーター
■ センサー
■ ボタンなど
■ 発光体
■ スピーカー
■ キーボード
■ マウス
■ ゲームパッド