先日は、

 

 

 

 

にて処理について書きました。

 

 プログラミング言語を学習する際には、最初にループのない状態で個別の処理を学びます。MakeCodeだと

 

 

のブロックでに処理を実装するような形になります。その為、一度実行すると処理が簡潔するコードを書きます。

 

 これは、 【 一つの処理はそういった構造になている 】 ことも含めて理解するためのものになりますが、この構造を連続して行うための手段としてループ処理が存在しています。

 

 

のブロックはPythonのwhile Trueと同じように無限ループになっていますが、ループを使う場合にはどういった方法で管理するのかをなんが得る必要がでてきます。プログラミング言語を使ってコードを書く場合、 【 一つの処理で完結する 】 と言う構造を踏まえてコードを考えることになりま菅、通常のコードは 【 処理の実装 】 のためにコードを書いているので、実装する処理は処理単位で分けて考えることが出来ます。これが、処理のブロックになりますが、BASICの場合だと、これを行単位で考えていくような作りになってます。行う内容としては

 

  ■ 処理の塊を用意する

  ■ 処理の順番を考えて並べる

 

という流れになりますが、手続き型のプログラミング言語だとこの考え方でコードを書いていくことになります。この考え方はハードウェアの構築でも同じですし、美術の分野でも同じですから、何かを作る場合に極当たり前に行われている物になります。

 

 考え方としては、

 

 

  ■ 材料から部品を作る

 

  ■ 部品を組み合わせてモジュールを作る

 

  ■ 処理にあった順番で動作するように

    モジュールを並べる

 

 

という流れですから、電気工作や運動エネルギーで動作する物理現象の生じるハードウェアの構築と同じような作業の進め方になります。

 

 この場合、モジュールがないことには作業が出来ませんから必要なモジュールを用意することになりますが、プログラミング言語を用いて記述したソースコードも 【 処理の塊 】 で分けることが出来ます。その為、どういった役割をするものなのかで分けた状態で個別に作っていくことになります。

 

 BASICの場合だとこの処理をサブルーチンで分けることが出来るのですが、これは、GOSUB〜RETURNの間でしかやり取りが出来ないので、少し不便だったりします。この機能は20世紀に登場した最初のVisual BASICにも実装されていましたが、関数のほうが利便性が高いので現在は関数が使用されるようになっています。その為、BSASICにはFORTRUNのようなサブルーチンは存在しますが、現在のプログラミング言語で当たり前に使用されている関数が実装されていません。

 

 関数については、MakeCodeでもブロックが用意されているので、

 

 

のように実装して

 

のような形で処理を呼び出して使用できるようになっていますが、Scratchでも関数を使って処理を独立させて管理することができるようになっています。

 

 このように関数を使った場合、 【 処理を独立させて管理できる 】 ので、コード内を探さなくても関数の部分を探して修正をすれば機能の変更が出来ますし、機能の追加も関数の追加で行えるのでこの構造にしたほうが管理がしやすくなります。

 

 また、

 

 

の構造のように関数で実装するのは一度実行すると終了する形なので、基本で学習するコードの形と同じものになります。

 

 そのため、基礎では動き自体を作ることを学習することになります。

 

 

 

  動きの制御

 

 関数のように処理は 【 処理の塊 】 として扱うことが出来るので、

 

のように順番で実行することが出来ます。処理を考える場合にはこのような形で処理の順番を決めて実行していくことになりますが、このブロックの並びのように連続している状態だと、加算ではなく乗算で処理が出来るので、

 

 

のようなループでまとめることが出来ます。処理の基本構造は、

 

 のような 【 順次 】 なので、FA施設のオートメーションのように順番通りに工程が進行する仕組みになっています。

 

 工程の中には1つの処理で終わるものと複数の工程が日強雨になるものがありますが、この工程を実装するのが関数になります。

 

その為、

 

のような処理も一つの工程として考えることになります。MakeCodeでは、マイコン制御をするので、機械の動作をするのに便利なブロックが揃っていますが、 【 条件付きでループが変わる 】 ような構造にする場合には分岐を入れる必要があります。その為、

 

 

のように分岐を含めた処理を実装することになります。マイコンの場合、起動後には常に動くような常時かどうする構造の物で使用するので 

 

  ■ ずっと

  ■ ●ミリ秒ごとに動作する

 

のようなループが使いやすいのですが、OS上で動作するアプリケーションの場合だと、無限ループはそのままだと永遠に動いてしまうのでアプリケーションを終了するには強制終了するしかありません。流石に、そういった作りはよくないので、通常は、終了処理と無限ループをセットで組み合わせて使用することになります。

 

 分岐とループの構造を見てもらうと、それぞれが 【 処理を包含している 】 ので、この2つについては、処理の実行方法を指定するための手段として考えることが出来ます。その為、基本となるのは工程通りの処理ですから、

 

 

になりますが、判定で異なる処理を行う場合や、繰り返す場合には条件分岐やループを実装することになります。

 

 プログラミングを行う際に実装する基本の処理は、

 

  ■ 順次

  ■ 反復

  ■ 分岐

 

になりますが、この3つは、

 

  ■ 順次 : 工程表(順番に行う処理)

  ■ 反復 : 掛け算(繰り返す処理)

  ■ 分岐 : スイッチ(切替が発生する処理)

 

なので、工程表の中にどういった形で存在しているかで実装方法が変わってきます。

 

 プログラミング言語の基本となるのは工程表のように動作する 【 順次 】 で処理が実装されたものになりますが、これフォ最初に行うのは 【 手順の破綻によるエラーがでない状態を作るための練習 】 になります。この辺りが出来ていれば、その中に切り替えや繰り返しが入ってもそれほど影響はでないでしょうし、小学校高学年の算数の 【 面積の計算 】 のように複数の図形を組みわせた形の面積を出す時のように 【 処理が複数存在する工程 】 を扱う場合でも影響は少なくなります。

 

 その為、低年齢用のプログラミング教材では 【 順次 】 をしっかりと身につけることが出来るようなカリキュラムに基づいたものが多く存在していますが、LOGOで行うような処理を直感的な処理で行えるように記号のついたブロックで動きを指定して動作させるようなものも存在しています。

 

 これが 【 工程を考える為のツール 】 になりますが、こうしたツールでは、

 

のような形で処理が決まっていてその並びを実行して目的の状態にする方法を学習できるようになっています。

 

 その処理をもう少し複雑なことも出来る状態で学習できるのがHour Of Codeなどになりますが、そこで体験したり学習した内容を自分が考えた物を制作するために使用できるのがScratchやMakeCodeになります。

 

 PythonでPC用のアプリケーションを作る場合、無限ループはwhile True:で実装しますが、この処理を終了させるのでifで判定を行って、ループを止める処理としてbreakを使用します。この構造はMakeCodeでも作れます。

 

のように最初だけの中に 【 もし<真>ならくりかえし 】 のブロックを入れます。これは、whileの判定条件がTrueということですから、Pythonの 【 while True: 】 と同じループなので、無限ループになります。このループの中に処理を入れた場合、 【 ずっと 】 と同じ状態になります。この状態だと停止が出来ないので、OS上で動くアプリケーションの場合だと、ifで条件分岐を作って、任意の条件でループを停止する 【 break 】 を実行することになります。MakeCodeだと、

 

のように 【 もし<>なら 】 のブロックを用意して、その中に 【 くりかえしを終わる 】 のブロックを包含します。

 

 このブロックは、

 

  ■ if

  ■ break

 

の機能なので、この構造にするとループを停止できます。この時の判定をAボタンにしていますが、この条件を実装すると、ボタンが押されない限りは無限ループ内に実装された処理が実行されます。

 

 最初に判定を入れておいて、その後に

 

 

のような処理を実装します。この選択されたブロック以降の処理が無限ループで実行されます。そのまま終了してもいいのですが、

 

のようにして、ENDの文字が表示されるようにしました。これは、ループの外に配置してあるので、ループが終了した際に表示されます。

 

 実際に動かしてみると、

 

 

が交互に表示されるのですが、

 

 

 

のようにボタンを押すとENDの文字が横に流れ

 

 

 

のように何も表示されていない状態になります。通常のプログラミング言語だと 【 ずっと 】 のようなブロックで無限ループを作ることは出来ないので、C言語のようにforで作る場合もありますが、Pythonだとwhile True:で無限ループを作ることになります。こうしたループはアプリケーションのように常にループする仕組みのもので扱うことになりますが、終了処理を実装してく必要があるので、

 

  ■ 無限ループ

  ■ 終了処理

 

はセットで使うことになります。その為、

 

  ■ 反復

  ■ 分岐

 

を組み合わせたものを雛形で用意することになりますが、ループ内の処理は工程通りに行われているので、この部分は順次になります。先程のプログラムで確認すると

 

 

  ■ 無限ループ

  ■ 終了後の処理

 

になっていますが、無限ループの中を見ると

 

  ■ 終了処理(条件分岐)

  ■ 表示(順次)

 

になっています。このように処理を実装する際には、
 
  ■ 順次
  ■ 反復
  ■ 分岐
 
の3つの要素が存在しているのですが、アプリケーションの場合だと、メインループ内に処理が実装されているので、その中に先程の3つがどう配置されているのかを考えることになります。オブジェクト指向の場合だとクラス(クラス内で実装するメソッドは手続き型と考え方は同じなので基礎分野は共通しています。)を使うので少し考え方が違ってきますが、手続き型の場合だと、処理の塊をどう配置してどのように処理をするのかを反復と分岐で管理して、処理の順番を順次で指定することになります。
 

 

  処理の方法を考える

 
 MakeCodeでmicro:bitのプログラムを考える場合、表示をする際には5x5のドットマトリックスLEDを使うことになりますから、文字の表示は 【 単一 】 になります。そして、文字列の場合だと 【 スクロール表示 】 になるので、これを基準に表示を考えることになります。
 
 マイコンの場合、接点などの入力でUIを操作することになるので、基本的な考え方としては家電のリモコンのようなUIを想定することになります。その上で実装した接点に対して機能を実装していくことになりますから、入力の方法も家電のような少し特殊な方法を使用することになります。
 
 家電で何かしらの入力を行おうと思うと、キーボードのような操作が出来ないので、ボタン操作で童謡の処理を実装する必要がありますが、microbitも
 
  ■ ボタン
  ■ センサー
  ■ 接点
 
での操作になっていますから、表示をコントロールする場合には、【 どのようにすれば、意図した状態になるのか? 】 を考えることになります。
 
 基本的に
 
  ■ 文字の表示(5x5)
  ■ 文字の入力(なし)
 
となっているので、表示の場合だとスクロールすることを前提で考えることになりますし、そもそも文字入力の機能はMicro:bitには存在しないので、そうした機能は実装しなければ使用することは出来ません。
 
 その為、そのまま使える機能であれば、ブロックの接続だけで作れますが、存在しないものだとブロックを繋いで機能其の物を実装する必要があります。

 

 

  入力と方法

 
 マイコンは基本的に電気耕作の制御用のコントローラーなので、機械の制御をしやすい作りになています。その為、アナログの制御に向いていrのですが、入ってきた値に連動して値を取得するなどの処理に向いています。例えば、
 
【 センサーの値を取得して、目視できるようにする 】
 
ような条件だと機械の部分が多いので、こうした分野は得意としています。
 
 例えば、センサーからの入力値をサーボモーターの回転で示す場合、
 
  ■ 数値の最小値 : 0
  ■ 数値の最大値 : 180
 
とすると、針は半回転するので、ここからメーターの移動範囲の角度分だけ数値をちょうせうすると、振れ幅を指定することが出来ます。これを用いると針が振れることで強弱を示すことが出来る装置を作ることが出来ます。
 
 デジタルの場合だと、接点の変化と同じですから、
 
 
のようなリレーでの信号の変化と同じものを使うことになります。
 
  ■ タクトスイッチ
  ■ トグルスイッチ
 
などもこうした接点の接触で通電することで二値の切り替えをしているわけですが、この場合だと、
 
  ■ 明るい・暗い
  ■ 音がした・音がしない
 
のような判定を実装することが出来ます。アナログの場合だと、
 
  ■ 照度の変化
  ■ 音圧の変化
  ■ 温度の変化
 
などを実装できるのですが、センサーの得意とする分野がアナログの部分になります。
 
 midcro:bitでは外部環境の変化を検知するためのセンサーが用意されているので、センサー入力をトリガーにして動くものを作ることが出来ます。その為、変数の数値にセンサーの値を代入すればそれを表示できるのですが、GPIOの出力で何かしらのデバイスを追加すればそれを制御することが出来ます。
 
 サーボモーターの場合だとドライバーボードを間に挟んで電力不足を解消した状態で運用することになりますが、回転運動を制御するデバイスを使うことも出来ます。
 
 micro:bitで、操作を行う場合に使用できるブロックは、
 
 ■ ボタン
 ■ ロゴ
 ■ 加速度センサー
 ■ 音
 
があります。ボタンについては、
 
が用意されており、同時押しなどもイベントとして独立した状態で動作するようになっています。
 
 次に 【 ロゴのタップ 】 ですが、これは、接触している状態の認識なので、
 
 
のような判定が用意されています。ボタンは完全に二値ですが、こちらは時間と触れ方による違いで別の挙動を実装できるようになっています。
 
 micro:bitには加速度センサーが実装されているので、
 
のように
 
  ■ 向き
  ■ 傾き
  ■ 落下
 
などに対応しています。その為、micro:bitの状態で判定を用意して処理を実行することが出来ます。
 
 そして、接点に振れることでも動作するので、
 
のようにGPIOでワニ口クリップを使用できる大きなサイズの端子部分も判定として仕様出来るようになっています。更に音でも反応するので、
 
のように音の変化を検知して動作するものを作ることも出来ます。
 
 このように操作出来る部分だけ見ても結構な数が用意されていますが、この数を見てもらうと明らかにキーボードのようにすべての文字を割り当てることは出来ませんから、文字入力をする際には工夫が必要になります。
 
 この入力の中にはアナログなものもありますが、イベントハンドラで動作する場合には個別のスイッチとして考えることが出来ますから、
 
 
 
のように操作によって別の処理が発生するような仕組みを考えることになります。連動をさせる場合は論理演算を使うことになりますが、それがない場合だと、
 
 
のように独立したスイッチがあって、そこに異なる処理を実装するような仕組みを考えることになります。
 
 
 

  文字入力

 
 前述のように、MakeCodeで最初から使用できるブロックでは、文字入力が出来るようなものが実装されていないのですが、文字入力を実装する機能の生成をするコードを作れないわけではありません。
 
 C言語だと、char型はそのままだとintとして使用できるので配列にしない限りは
 
  ■ インクリメント
  ■ デクリメント
 
でASCIIコードの版後の変化を与えて表示をすることが出来ますが、micro:bitの変数は数値に固定されているので、C言語のようなことは出来ません。ちなみに、数値をコードに変換するブロックは存在するので、それと同じ方法が出来ないわけではありませんが、上手く行かなかったので、別の方法を模索することにしました。
 
 
 ASCIIコードが駄目となると、文字配列を作って番号を制御すればいいので、今回はそれを試してみることにしました。
 
 micro:bitも配列を作ることが出来るので、【 配列の中のデータの制御 】 をすることで、文字の選択を行えるようにすることが出来ます。ブロックのメニューの中から
 
 
の場所にあるの配列を選択すると
 
 
のように
 
  ■ 数値の配列
  ■ 文字の配列

  ■ 空の配列

 
が作成できるようになっています。ここを見ると、既に、文字列が格納されているので、これを利用すると3つの文字を選択できるようになります。
 
 読み出し方を見てみると
 
 
のようになっているので、n番目のデータを呼び出せるようになっており、
 
 
のように乱数で成業することも出来るようになっています。
 
 配列では、データの管理をするのに必要な機能はブロックで揃っているのですが、
 
 
のようにPythonのAppend相当の物も用意されていました。
 
 

  基本構造を作る

 
 文字の選択だけを考えると、
 
  ■ 配列を作る
  ■ データを格納する
  ■ データを読み出す
  ■ 表示する
 
と言う方法で対応できるので、
 
  ■ 配列の生成
  ■ 変数の生成
  ■ 変数の制御
 
と言うかんたんな処理だけでこの状態を作ることが出来ます。まず、
 
のように 【 最初だけ 】 の部分で初期化を行い、次に 【 ずっと 】のブロック内に表示を行う処理を実装します。
 
配列はもとから用意されているa〜cまでの物を使用し、新規に作成した変数でデータを選択するようにしています。
 
 この時の変更をボタンで行うので
 
 
のようにしていますが、こうすることで
 
  ■ Aボタン : 文字が戻る
  ■ Bボタン : 文字が進む
 
ので、aが表示された状態から変化を入れることが出来ます。PCのアプリケーションの場合だと、キーボードがあるので、文字の入力はそのまま行え、表示の枠も広いので 【 文字列 】 の形で表示をすることが出来ますが、1文字のみでスクロールする表示で、ボタン数が少ない場合、文字数を制御する方法を考える必要がでてきます。
 
 文字の選択をする場合だと、 【 文字をどう扱うのか? 】 を考えることになりますが、文字の場合
 
  ■ キャラクターコード
  ■ 配列内のデータ
 
として扱うことで、文字列を 【 番号 】 で制御することができるようになります。
 
 

  問題点の修正

 

 ここまでで、動きの部分は出来たのですが、この状態だと、

 

  ■ Aボタン : 0で押すと-1になる
  ■ Bボタン : 2で押すと3になる

 

のでエラーが発生します。この場合、配列がループするように動いてもらったほうがいいので、条件分岐を実装してその処理を追加します。
 
 この条件だと
 
 
のような判定になります。個別の処理を見てみるとAボタンでは、
 
のようにマイナスになった場合には最大値に向かうようにしてあり、Bボタンでは、
 
のように最大値を超える場合には最小値に向かうようになっています。これで、文字列画は死にに言った時に
 
  ■ 最小値を超える → 最大値
  ■ 最大値を超える → 最小値
 
のように文字が入れ替わるようになります。文字が止まるようにする場合には、座標制御と同じで、範囲を超過した場合に、最小値や最大値になるような指定をすることになります。これを実装するとAボタンでは、
 
 
のようになりますが、最初に変数に変化を与えた後に変化した値で判定を入れると、マイナスになる状態で判断が出来るので、このような流れになっています。Bボタンも同様に
 
のように先に変数の値を変更してから判定を入れています。
 
 これで実際に、ボタン操作で文字の表示が変わる処理がエラーがでずに動くようになりましたが、こうした処理を実装する場合でも
 
 
のような簡素な仕組みで動かすことが出来るようになっています。
 
 

  動作確認

 
 処理を実装したら実際に動かして見る必要があるので、MakeCodeのシミュレーターでコードを動かしてみます。
 
 通常は、
 
 
のようになっていますが、左側の三角形のアイコンをクリックするとブロックで作った処理が実行されます。実行すると、初期化の後に、【 ずっと 】のループ内の内容が実行されます。ここでは、配列の表示を行っていますが、この時の番号を変数腕指定しています。初期化の段階で0を指定しているので、
 
 
のように最初の値の 【 a 】 が表示されていますが、
 
 
のようにAボタンを押すと、マイナスになりますが、条件分岐で最大値でる2になるようにしてあるので、3番目に格納されている2の数値で呼び出せる 【 c 】 に切り替わります。
 
 
この状態で、
 
 
のようにBボタンを押すと、3になってしまいますが、条件分岐で0に向かうようになっているので、
 
 
が表示されます。当然、
 
でBボタンを押すと
 
 
になり、この状態でAボタンを押すと
 
 
のように動くのでアルファベット値の並びの左右の移動を2つのボタンで制御できるようになっています。
 
 表示は配列の中のデータを使っているので、配列内のデータ数を増やせば、アルファベットのすべての文字を扱うことも出来ます。配列には、
 
 
 
のように 【 ー 】 と 【 + 】 がついていますが、プラスを使うとデータを追加することが出来るので、必要な数だけ配列内のデータを追加できます。