先日は、

 

 

にて変数について書きました。

 
 先日の処理は、ボタンの状態の変化で判定を実装したわけですが、この時の判定は、ボタンが押された時というものになっています。実際にマイコンを使って制御をする場合だと、タクトスイッチの状態変化ですから、GPIOの端子の信号の有無を検知して動くことになりますから、プログラミング言語で処理をする場合だとブール値で判定をするようなものになります。この条件を通常のプログラミング言語で考えた場合、
 
  ■ ON   : True
  ■ OFF : False
 
のような考え方になると思うのですが、MakeCodeでブロックを使う場合には、判定部分をそのまま使用できるようになっています。

 このように実際には二値で動いている物の場合、数字のように決まった状態ではありませんから、任意の数値を格納できる状態にして置かなければならないわけですが、この時に使用するのが変数になります。
 
 変数と定数については、中学校1年生の数学登場しますが、

 ■ 定数 : アラビア数字
 ■ 変数 : アルファベット

を用いて記述を行います。これは 【 項 】 と言う処理を一つにまとめた構造物を使う時に使用するのですが、この形にすると 【 数式を加算の状態に出来る 】 ので、プログラミング言語の順次と同じ状態に出来ます。つまり、アルゴリズムを用意して現在の状態に追加していくような形に出来るので、【 加工を行うときの工程表 】 のような形で4季を整形できるようになっています。

 中学校で登場する方程式や関数はこの形になっているのですが、この構造を簡素な形にする時に因数分解を行うことになります。

 項のカリキュラムは、【 工程表を数式で示す方法 】 になりますが、この時に

  ■ 確定した値
  ■ 任意の値を代入できるもの

を使う事になりますが、関数のように 【 変数に任意の値を代入して解を求めることが出来るもの 】 を扱う際には、便宜上、任意の値を代入できる変数を用意して処理をすることになります。
 
 プログラミング言語でも変数と定数を使う事になりますが、先日の判定を見ても二値を用意して1を取得している状態ですから、件分岐を実装する場合にも変数を用いることになります。

 

 

  変数を使う

 

 MakeCodeもScratchと同様に変数を作ることが出来るので、新規変数を作成した後に、
 
   ■ 変数の初期化
   ■ 変数の実装
 
 を行うことが出来ます。プログラミング言語には

  ■ 変数の宣言
  ■ 変数の初期化

の2つが存在するのですが、宣言は名称と型を指定してそれを使えるようにする処理で、初期化は、プログラムを実行した際に常にその値でスタートできるように予め値を指定しておく処理になります。

 初期化については、始点と終点が決まっていて、その間を移動する様な処理を実装する際に必要になりますが、初期化をせずに移動だけ実装した場合には、
 

 
のような動作になりますから、意図した結果とは異なるものが出来てしまいます。コレに対して、初期化を入れて調整をすると、
 

 
のようになるので処理が終わると始点の戻ってくるので、始点と終点の間でのみ移動するようになります。変数を使用する際には登録することになりますが、

 

 

のメニューの変数をクリックすると、

 

 

が表示されるで、【 変数を追加する... 】 をクリックします。すると、

 

 

のようなダイアログが出るので、名前をつけて 【 OK 】 ボタンをクリックします。今回は、

 

 

のようにTESTにしておきました。この状態で【 OK 】ボタンをクリックすると、
 
 
のように変数が使用できるようになります。作った変数ですが、ブロックの中に包含して使用することになります。今回は、

 

 

のような感じにしてみました。まず、

 

 

が初期化なので、最初だけ変数を0にしています。コレを行うことで、プログラムが実行されたときには常に変数は0の状態からスタートします。そして、処理を行うメインループの部分ですが、

 

のようにしています。これが値を増やすブロックと値自体を使用するブロックになりますが、最初に、数値を増やしてその後表示をするようになっています。そのままだとものすごおい勢いで数値が変わるので、一時停止を入れてタイミングを調整しています。こうすることで、特定のタイミングで数値が増えて更新されるので、100MSごとに数値が書き換わるようになります。

 

 

 

  先程のコードは自動処理になりますが、ボタンの入力に対応させて数値を変化させることも出来ます。

 

のようなコードにした場合、

 

の部分で初期化をして、

 

 

の部分で表示をするので、そのまま実行すると0が表示されるのですが、

 

 

のようにボタンの動作でのイベントで数値を変えるようにすると、変数が書き換わるので、表示を変更することが出来ます。実行すると、

 

 

の状態になり、何もしないとその状態が維持されます。そして、

 

 

のようにボタンを押すと

 

 

のように数値が増えます。この状態で、Bボタンを押すと

 

 

のようになり、数値が変わります。

 

 

 このプログラムでは、メインループで常に値を更新しているわけではないので、値が固定された状態になっており、ボタンを押したイベントによって数値が変わるようになっています。そして、表示は変更後の値を表示できるので、押した回数で

 

 

 

のように値を変更することが出来ます。このプログラムでは左で増えて右で減ると言う状態にしていますが、数直線の構造を考えると、右で増えて左で減るほうが自然な気がしますから、操作を考える場合には、そうした部分にも気を配ることになります。

 
 

  回路と構造

 

 機械を作る場合、最も簡単な構造は、

 

  ■ 電源

  ■ スイッチ

  ■ 電球

 

になりますが、プログラミングも同様の構造にすることが出来ます。micro:bitはハードウェアなのでスイッチと表示が可能なので、この構造と同じ考え方で処理を実装することができます。

 

 ボタンでの処理ですが、変数を使うと入力を行った結果を数値で制御できるようになるので、

 

 

のような形で使用する変数を用意しておきます。makecodeでは、

 

 

 

のように初期化とメインループで使用するブロックが用意されているので、【 最初だけ 】のブロックに初期化を行う設定を導入しておいて、処理自体はメインループに包含するので 【 ずっと 】 のブロックに追加していくことになります。

 

 初期化ですが、

 

 

のようにすると用意した変数は常に0になるわけですが、表示もリセットしたい場合には、

 

のように 【 表示を消す 】 も追加します。こうすることで何も表示されていない状態を作ることが出来ます。この状態に対して変数の変化などを加えてアプリケーションを作ることになりますが、その記述をメインループに実装します。

 

のような感じにすると、変数が順番に入れ替わるわけですが、この状態だと初期化された値の表示なので、常に0が表示されます。

 

 このように定数と表示だけだと何も変化が生じませんから、この状態は豆電球と電池を使用して閉回路を作ったのと同じですから、常に通電後の結果が発生している状態になります。

 

 これが、定数で指定したものを表示した際の挙動になりますが、変数を使うと変化を実装できるので、この状態を変更することが出来ます。

 

 

  スイッチの実装

 

 プログラミング言語でスイッチに該当するのは条件分岐になりますが、実際には、

 

  ■ スイッチ   : イベントハンドラ

  ■ トランジスタ : 条件分岐(ifなど)

 

になります。高校の物理では、トランジスタが登場しますが、このパーツは電流によって使用する回路を切り替えることができるので、実施素敵にスイッチの役割をしているわけですが、この処理は回路内での電圧の変化やコンパレーターに寄る判定で制御が出来るものですから、内部処理になります。そして、中学校の理科でも登場するスイッチは操作をするものなので、これは、内部処理ではなく、操作のみで条件が変わるパーツになります。プログラミング言語を使用してアプリケーションを作る場合にも

 

  ■ 入  力 : イベントハンドラ

  ■ 内部処理 : 条件分岐(ifなど)

 

を使う分けることになるので、バッファで文字列を記憶しておく入力待ちも含めて操作を必要とする処理になりますが、この判定を行うのは内部処理なので条件分岐を使用することになります。スイッチだけで動くものだとスイッチに直結した処理が実行されているわけですが、この入力に判定を入れる場合には、論理ゲートなどを追加することになります。

 

 micro:bitの場合、物理的なスイッチが実装されているので、イベントハンドラでコレを使用できるのですが、この場合、

 

 

のようにブロックを使うことでボタンの判定を取得することが出来ます。今回は 【 一致 】 の判定を使うので、

 

 

のようにボタンで変数の値を変更するようにしておきました。

 

 

  挙動の実装

 

 イベントハンドラを実装したので、この状態で異なる条件になる要素を作ったのですが、実際に動くものを用意して動かすことにします。通常だと、このイベントハンドラに実装するのですが、今回は、別のパーツを動かす様な作り方をします。

 

 イベントハンドラに処理を実装するとその構造が一つのモジュールになってしまうのですが、今回はイベントハンドラはスイッチで、処理は別のモジュールと言う考え方で作ります。この場合、処理を関数で独立させることになりますが、MakeCodeでも関数を実装できるので、関数を作ることにします。

 

 

のような形で、関数歩ブロックを作ると関数名をしていするだけでなく、関数で使用する引数の指定も出来るようになっています。

 

 今回は引数なしなのでこのまま作りますが関数を作ると、

 

 

 

のように処理の実装用と実行用のブロックが生成されます。戻るは戻り値になりますが、関数内の変数はブロックスコープがかかるので、外部参照が出来ません。その為、演算結果を変数に格納した場合にそれを関数外に出力することができませんから、戻り値として出力することで、関数の実行時の値を得ることが出来ます。この戻り値を変数に代入して使用することで、関数外のコードで関数で引数使用した演算結果を使用することができるようになっています。

 

 今回は、

 

のような4つの関数を作り、

 

 

のように異なる表示をするような作りにしてみました。表示はラグを入れないとすぐに消えてしまうので、遅延をリれることになりますが、この処理はScratchで文字や数字をふきだしで表示する際にも使用します。

 

 

  判定の実装

 

 これまでの作業で、

 

  ■ イベントハンドラで変数の値を取得する

  ■ 実行する処理の実装

 

を行いました。ただし、この状態では、

 

  ■ 入力

  ■ 出力

 

は存在しますが、判定部分が存在しません。そこで、変数の値で動作する判定を実装することになります。

 

 この場合、内部処理になるので 【 条件分岐 】 を使用しますが、電気工作だとこの部分がコントローラーの仕事になります。なので、マイコン制御もこうした入出力が存在する場合に、どういった判定をすればいいのか?を実装することになります。

 

 今回は判定の条件が4つあるので、

 

の様な形にして、ここに

 

 

のように比較演算子で一致の条件を実装しました。当然、ここに実装するのは、変数の判定ですから、

 

 

のようになりますが、それぞれの処理に

 

 

のようになります。

 

  挙動の確認

 

 シミュレーターを実行すると

 

 

の状態になりますが、ボタンを押すと数値が変わるので、

 

 

のように表示が変化します。ただし、このコードでは、数字が変わるだけなので、押した後はその状態が維持されます。

 

 

  挙動の変更

 

 先程のプログラムでは、状態が維持されていたのですが、今回の処理は変数参照なので、変数にリセットをかければ表示を消すことができるようになります。ということは、関数側でリセットをかければいいので、

 

 

のように数値が増える処理に変数を0にする処理を追加して、

 

 

のような形にすると、ボタンを押してしばらくすると表示が消えるようになります。今回は、

 

 

 

のような構造にしているのですが、

 

 

で入力を行い

 

 

のように用意した処理を

 

 
の判定部分で実行しているわけですが、プログラミング言語も機械と同じように
 

  ■ センサー

  ■ コントローラー

  ■ アクチュエーター

 
で分けて処理を考える事が出来ます。micro:bitは入出力がデバイスなので、PC内のアプリケーションよりもハードウェアよりに考えることが出来るのでイメージしやすいと思いますが、PCのアプリケーションの場合、
 
【 入力 】 

 

  ■ センサー

  ■ ボタンなど

 
 
【 出力 】 

 

  ■ 発光体

  ■ スピーカー

 
になります。入力には、
 

  ■ キーボード

  ■ マウス

  ■ ゲームパッド

 

がありますが、これは、接点で動いているのでその検知になりますが、コレとは別に加速度センサーなどを使った判定も存在します。画像解析を使用する場合だとここにカメラなども含まれますが、入力の対象を用意することで自動処理ではなく入力された変数を参照するプログラムを作ることが出来ます。
 
 出力はモニターとスピーカーが基本的な実装k脳になりま菅、現在のゲームのコントローラーは振動用のモーターが存在しているので、モーター制御で状態の伝達が出来るようになっています。この構造はSIEの製品がかなり複雑な制御をする構造になっている(ので、PS5のコントローラーは結構高額です。)わけですが、使用するデバイスで出力部分も変わってきます。
 
 現在のアプリケーションをゲーム機よりに作るとセンサー類やモーター制御なども存在するので、実際にはロボティクスの分野と同じ様なパーツの制御が発生するのですが、基本的にPCのアプリケーションも入出力がないと操作できないので、先程書いた3つの分野で分けて考えることが出来るようになっています。