先日は
にて、簡単な処理を実装して、HEXファイルをダウンロードしてみました。
プログラミング言語を使用してコードを書く際には、
■ 内部処理
■ I/Oデバイスの制御
のような感じで、画面の初期化をしてからPRINT文で表示が出来ますが、Python 3.x系だと
のように関数で表示をします。C言語だとI/Oの制御をするライブラリを読み込む必要があるので、stdio.hと言うヘッダーファイrを読み込んでmain関数の中に処理を実装する必要があるので、
のようなコードを書いて、その後コンパイルをして実行すr事になります。そのため、
のような状態になります。
のような処理の塊になっているので、この中に処理を実装することになりますが、
のように最初に実行するだけのものと、処理を永続させるものがあるので、こうしたブロックの中に処理を包含する必要があります。その上で実行をすると、
のシミュレーター上で動作するようになります。先日は簡単なプログラムも作ってみたのですが、micro:bitではLEDの点灯もブロック一つで行えます。
のブロックで
■ 任意のパターン
■ アイコン
■ 文字列
を指定できますが、MakeCodeでは実行不能な状態の場所はがぞうのように色がない状態で表示されます。なので、コードとして実行不能な状態になっている場所は、視覚的に確認できるようになっています。これをボタンのイベントハンドラに格納すると、
のようになります。この幼児実行できる状態にすると色が付くのですが、ボタンの重複があると、片方は実行不能になりますから先に指定されていたほうが優先されて、もう片方は実行不能の表示になります。
ブロックの操作ですが、
■ CTRL + C : コピー
■ CTRL + V : 貼り付け(ペースト)
■ CTRL + X : 削除
のようにOSの操作と同じ方法で複製と削除が出来ます。ちなみに、
のようにパターンを指定して実行してみると、
のようになります。マウスだと同時押しが出来ないので、同時押し用のボタンが増えるので実際に確認することが出来るのですが、別の機能についても動作確認が出来るようにMakeCodeのシミュレーターに確認用のUIが追加されるようになっています。
これが、マイコンを導入した際に最初に行うLEDの点灯とプログラミング言語の最初に行う 【 Hello,World! 】 の表示になりますが、MakeCodeでのプログラミングの場合、イベントハンドラも使えるので、ずっとではなく、ボタンなどの動作で動くようにすることで、 【 操作と動作を連動させる 】 事が出来ます。
ちなみに、この処理では初期化をしていないので画面の消去を入れていないので、パターンとアイコンについては、表示が維持されますが、文字列については、スクロールアウト後に全てのLEDが消えます。
表示については、 【 文字列 】 の指定をすると、電光掲示板のように横に文字が流れていくので特別な処理をしなくてもその設定が最初から行わrてていますが、パターンを作ってスクロールするように発光の制御をする場合には、ブロックを作って処理を実装する必要があります。
マイコンを使う場合、Arduino IDEなどを使ってコードを書くことになりますが、MakeCodeやM5Stackはブロックを使ったプログラミングが出来るようになっています。ただし、Arduino IDEでのコーディングが出来ないというわけではなく、それでも作業が行えるのですが、ブロック型の言語での開発も出来るようになっています。
ブロックで処理を作った後は、
でダウンロードすることになりますが、ボタンをクリックすると
のようなウインドウが出ますが、繋がっていない場合だとLinuxでは
のようなファイルの保存になり、
のようにPCのストレージにファイルが保存されました。右側にある
のアイコンをクリックすると、
のようにGitHubにプロジェクトをアップロードすることが出来るようになっています。
条件分岐
ド・モルガンの法則では、AND/OR/NOTがあれば全ての判定を作れる事が証明されているわけですが、コンピューターで使用されている論理ゲートはNANDが基準になっているので、NANDゲートをCMOSで構成して少電力で動作するNANDの構成を使って基本となる論理ゲートが生成されています。NANDの場合、
【 NOTゲート 】
■ NANDの入力を統合して、AND要素をなくす
【 ANDゲート 】
■ NANDの出力をNOTで反転
【 ORゲート 】
■ NANDの入力をNOTで反転
することで基本となる3つの回路を作ることが出来ます。この構造も日の入力をするものから構成できるので半導体を用意することで構築できるわけですが、回路内での判定を行うパーツを作る際にはトランジスタを用いて処理をすることになります。論理ゲートは、
■ 直列回路 : ANDゲート
■ 並列回路 : ORゲート
になるので、この判定部分にトランジスタを実装するとこの構造に出来るのですが、この判定を行う物を手作業で実装する場合にはスイッチを実装することになります。
その為、中学校の物理のオームの法則のカリキュラムで登場する直列回路と並列回路の抵抗部分をスイッチに入れ替えて、抵抗と不極の間に豆電球を入れた回路を作って、スイッチのオンとオフの状態と豆電t級の点灯の関係性を心理地表を書いて確認してみるとこの2つの心理値表の結果は論理積と論理和と全く同じ状態になります。
コレと全く同じことを、小学校の理科では、直流と交流のカリキュラムで行っているわけですが、このカリキュラムでは、スイッチの役割を電池が担っているので、電池の有無と電球の点灯の心理値表を作ってみると、これも論理積と論理和と全く同じ結果になります。
このことから、 【 スイッチ 】 = 【 条件分岐 】 と考えることが出来るわけです。日常生活でも電気を使うので、【 ON / OFF 】 の切り替えは行っているはずなんですが、この時の処理も二値の状態で結果が変わっているので条件分岐になります。
小学校の理科では、これを複数使用することによって結果が変わることを学ぶことになりますが、この内容を見ると、義務教育のカリキュラムでは理科の分野でプログラミング言語で使用する
■ 条件分岐
■ 論理演算
を扱う物理モデルを使用していることになります。閉回路内に電池との豆電球を配置して、その間にスイッチを入れた場合、
【 通電 】━┳━【 オン 】━【 点灯 】
┃
┗━【 オフ 】━【 消灯 】
と言う形になるわけですが、これが、
【 条件分岐 】━【 True 】 ━【 点灯 】
┃
┗━━━━ 【 False 】━【 消灯 】
の様な状態になっています。このように判定を入れることで、回路内の状態を変更することが出来るので、通電したらその状態が維持されたものとは異なる挙動を実装できるわけですが。この場合、回路内で指定した工程に基づく処理の実行ではなく 【 入力の変化 】 のような 【 特定の条件 】 で変化するものを使用することになります。
プログラミング言語では、これを 【 変数の値 】 などを基準にして判定が行えるようにifが実装されています。
MakeCodeでも条件分岐のブロックが実装されており、それを使用することで判定を実装できるようになっています。
判定を入れる
のように判定によって結果が変わる処理になりますが、プログラミング言語だとifを使用します。このブロックについては、
のような形をしているので、この中に処理を実装する事になります。
MakeCodeでは、
のような形で、一度だけ実行するものと、メインループに該当する物が用意されていますが、このループ内でなにかの判定を入れるときには条件分岐を実装することになります。
その為、
のような処理を実装すると画像が表示された後に文字列が表示されます。
MakeCodeでの判定は六角形のブロック担っているのですが、ここで、入力の指定が出来るので、
のような判定を入れることも出来ます。コード自体は、
判定と処理
MakeCodeでは、Scratchと同様にイベントハンドラを独立させておいて、イベント単位で管理が出来るのですが、その条件自体を判定の中で使用することが出来ます。イベントハンドラは、【 イベント発生時の処理 】 なので、ボタンを押した時の処理を実装するものになりますが、これは 【 動作の実装 】 ですから、判断を行うことは出来ません。
その為、 【 特定の条件でボタンが押された場合 】 のような判定の実装をする場合には、イベントハンドラではなく、条件分岐を用いることになります。こうした判定をするためにMakeCodeでは入力に対する判定も用意されているので
のような構成にすることが出来ます。実行すると常に 【 でなければ 】 の条件が反映されるので、その画像が表示されるので、
が表示されます。ボタンが押されるとそれぞれの判定が行われるので
のようになります。分岐ですが、
■ 【+】 : 判定を増やす
■ 【ー】 : 判定を減らす
事が出来るので、 【 でなければ 】 も削除できるのですが、削除をするとメインループ内に指定された処理が常に行われるようになり、判定が発生したときのみ指定した処理が実行されるようになります。この場合、
のような形になりますが、常に実行される部分が、
の表示で、ボタンが押された時に個別の処理が生じるようになります。
この構造では、
■ 表示
■ 条件分岐
と言う処理が格納されており、常に生じるのは表示でその後、条件分岐が発生するようになっていますが、この処理は個別に分けて考えることが出来ますから、2つの処理が1つのループ内に格納された構造になっています。