現在は小学校の算数と理科でプログラミングを行うようになっていますが、この時にScratchのようなブロック型のプログラミング言語を使用します。このプログラミング言語は、他にもありますが、基本となる仕様は同じなので、ブロックの形と処理の方法は共通しています。
こうしたプログラミング言語では、
■ 最初だけ
■ ずっと
のように
■ 初期化
■ メインループ
が用意されていますが、Scratchの場合だと、下にだけつながるようなブロクを使うことになります。
これとは別に、イベントハンドラも用意されているので、
■ 〇〇を行った場合の処理
を実装するためのブロックも用意されています。MAKE CODEの場合だと
■ ボタン
■ センサー
などが独立した処理としてイベントを実装できるようになっていますが、この中に処理を実装していくことになります。
MAKE CODEのようにワンボードマイコンマイコンの処理を実装する場合だと、
■ 実装されている入力装置
■ 実装されている出力装置
を使用して
■ 何をしたら
■ どうなるのか?
を考えることになります。
MAKE CODEで使用できるワンボードマイコンの場合、どれも
■ 入力
■ 出力
が実装されているので、ブロックを使用してLEDが点灯するような状態を作ることが出来ます。
マイコンの処理の最小単位は、
【 電源 】 ─▷ 【 LED 】
のようなものなので、理科の実験で登場する
【 通電すると豆電球が点灯する 】
という状態を作るものになります。
これが 【 LEDの制御 】 の基本形なので、 数学の関数だと 【 f(x)=x 】 と同じ状態になります。
関数
数学の関数は、先程の基本形に対して 【 変数項の変化 】 を追加することで法則性を作る仕組みになっていますが、中学校では一次式と二次式を使った関数を学習します。
■ 一次式 : 一次関数
■ 二次式 : 二次関数
になりますが、この関数はそれぞれ
■ 一次関数 : 直線
■ 二次関数 : 曲線
になっているので、
■ 一次関数 : 線形関数
■ 二次関数 : 非線形関数
となります。大学の数学だと、
■ 線形代数
■ 非線形代数
が存在しますが、これらは、対象物が直線としたものなのか否かの違いによって区分けされています。
その為、行列を使用して処理を行う 【 線形代数 】 の分野は直線を用いるので二点間の距離を使うことになりますが、この場合に使用するのが 【 ベクトル 】 になります。
基礎と応用
現在の高校のカリキュラムだと数学Cで扱うようになっていますが、ここで扱うのは
■ 平面座標
■ 空間座標
を用いた際の 【 幾何ベクトル 】 になります。
これは、中学校の 【 力の釣り合い 】 を数学的に座標平面で使用するようなカリキュラムになりますが、中学校では登場しなかった 【 除算 】 に該当する 【 内積 】 も扱うことになります。
こうした幾何ベクトルは、現実世界における出来事と同じなので、三次元に置き換えると
■ 運動エネルギー
■ 物体の状態
などを示すことができるのですが、こうした考え方を仮想空間内で実装する時に使用するのが3DCGツールになります。
その為、3DCGツールでキャラクターモデルを作る場合のポリゴンの考え方は幾何ベクトルそのものですし、制御を行う際は、幾何ベクトルを制御する時に使用する
■ 三角関数
■ 線形代数
などを使用することが出来ます。また、開演行列を使用したオイラー角も使用できますが、これを使うとボーンの制御をする際にジンバルロックが生じるのでクォータニオンで制御することになります。
行列を使用すると数値の並びが使用できますが、この並びで座標を指定して演算処理を行うことで簡単に数値を求めることができる仕組みになっています。これが線形代数になりますが、これは線形の移動なので直線的な移動のみになります。物体は6DoFの自由度を持っていますから、この状態だとその中の直線移動の3DoFをカバーしただけになりますから回転の制御が出来ません。
この行列を使用した際に回転軸を用いた回転を行う時に使用するのが 【 回転行列 】 になります。
回転行列では軸の回転を使用するので行列内で三角関数を使用することになりますから、数学IIの知識が確実に身についている必要があります。高校の三角関数を使用すると
■ 三角関数 : 距離
■ 逆三角関数 : 角度
を求めることができるので、アークタンジェントで向きを取得すると平面的な
■ 追尾
■ 逃走
を実装できます。こうした処理を三次元で行う場合には回転行列を使うことになりますが、ジンバルロックを回避する場合にはクォータニオンを使用することになります。
こうした処理ですが、制御高額における
【 ロボットアームの制御で必要になる知識 】
と全く同じなので、動かしている物が現存する物理モデルと仮想空間内のシミュレーターのデータなのかの違いしかありません。
このように関数の基本は簡単な線形関数になりますが、この応用部分が非線形の関数になります。中学校の数学だと
■ 分数関数
■ 二次関数
が非線形関数になります。このように 【 関数の法則性の変化 】 で複雑な処理ができるようになっています。
デバイスの制御も同様に 【 動作する条件 】 が存在しており、その条件に対して何を行えばその状態に至るのか?を考えていくことになります。
スイッチの役割
理科の豆電球で考えると、電池に豆電球が繋がっている状態が基本形で、これに対して処理を実装する場合、一旦 【 通電していない状態 】 を作る必要があります。乾電池でこの状態を作る場合には、配線内を電流が通らなくすればいいので、
■ 電池を外す
■ 配線線が繋がっていない状態にする
と言う2つの選択肢があります。電源供給が行われている条件だと最初の条件はなくなるので、2番めの条件のみが残りますから、配線が繋がっていない状態を作ることで 【 遮断 】 の状態を作ることになります。
この状態で、 【 オンとオフの切り替え 】 を作る場合には通電の状態を用意することになりますから、この断線している部分に接点を作って操作によって
■ 接続
■ 遮断
の状態を作ることになります。これが、 【 スイッチ 】 の役割になります。
これを実装すると
■ 接続 : 1
■ 遮断 : 0
をコントロールできるようになりますから、この入力の判定に対して論理演算を適応することができるようになります。
論理演算
倫理演算は高校で登場しますが、小学校の理科では
■ 直流と交流
■ モーター
を利用しますから、
■ 論理積(AND)と論理和(OR)の判定
■ 符号による処理の反転
のような挙動を数学以外の形で体験して理解することになりますが、これを用いると
■ 組み合わせによる判定
■ 極性の変化による挙動の違い
を考えることができるようになります。小学校の直流と交流は
■ 2つの電池の状態
■ 豆電球の点灯
の関係性絵お示したものになりますが、これが論理ゲートと全く同じ居づになっています。
このカリキュラムだと、
■ 直流 : 豆電球が明るくなる
■ 交流 : 持続時間が長い
と言う特性もありますが、先程の2つの条件を二値に置き換えてみると
【 直流 】
0・0=0
1・0=0
0・1=0
1・1=1
【 交流 】
0・0=0
1・0=1
0・1=1
1・1=1
のようになります。この状態は、
■ 直流 : 1・1のみで成立
■ 交流 : 0・0以外は成立
と言う状態になります。この状態が論理積と論理和と同じなので、
■ 直流 : 論理積
■ 交流 : 論理和
と考えることが出来ます。この事例では電池をスイッチの代わりに使用していますが、これを電池電源を確保した閉回路を用意して豆電球が点灯するような仕組みにて、直流と交流の回路を作り、電池の代わりにスイッチに置き換えると、スイッチのオンとオフの状態と豆電球の点灯の関係性が全く同じ状態になります。
回路の内にスイッチを2つ用意して直列回路と並列回路を作ると、
■ 直列回路 : 論理積
■ 並列回路 : 論理和
として使用することが出来ます。人が操作するような構造だと先程の接点の制御になりますから、
■ タクトスイッチ
■ トグルスイッチ
で制御をすることができます。この構造にすると二値で状態を考えることができるので、挙動を考えやすいのですが、電気を使う場合には回路内の電気の変化や流れを考えないと回路が壊れるので、そうならないような設計が必要になります。こうした知識の基礎が、中学校の物理で学習する 【 オームの法則 】 などのでんK地の知識になりますが、高校では 【 電位に着目した考え方 】 で電流の流れなどを考えることになるので、実際にどのように回路内での電気の流れを正確に理解する方法を学習することができるようになっています。
中学校の理科の知識だと、【 電気の流れと操作 】までだと理解できるので、パーツのデータシート似合わせた 【 過電流で壊れないようにする方法 】 までは致死医の範囲内で理解できると思うのですが、この状態だと出流の逆流の対策などを取るすべがありません。というのも、そういった制御は高校の物理の知識が必要になるためです。
中学校までの知識だと
■ 入力
■ 出力
が存在する際に、その中での電気の変化を考えることはできるので、
■ 電池の仕様で発生する物
■ 回路内の電流と電圧
について考えることが出来ます。この際にパーツの
■ 定格電流
■ 定格電圧
を基準に 【 その範囲内で運用する方法 】 を考えることが出来ます。中学校の知識だと
■ 電流の増幅
■ 電圧の変化
を回路内で行う方法は学びませんし、
■ 回路内での判定の実装
■ 電位を貯める
■ 電流の流れの向きを決める
などの処理をする方法ついても学習しません。その為、
■ 入力の方法の選択
■ 定格での運用
■ 出力の選択
辺りは行えます。中学校の知識だと 【 電磁力 】 アタリまでは学習するので、DC接続のブラシモーターの構造までは学びますから、モーターと発光体を使った処理だと義務教育の範囲で対応できるようになっています。
入力を変更する
小学校の理科では
【 太陽電池(小型のソーラーパネル) 】
を扱いますが、これは、光を得ると電気を発する仕組みになっています。この構造物はLEDなどと同じ構造なので、ダイオードの一種になりますが、
■ 発光 : LED
■ 発電 : 太陽電池
のようになっていますが、LEDも同じ構造なので、光を当てると微弱な電流を発する仕組みになっています。
その為、発電効率は絶望的に悪いのですが、日中にオーロラビジョンのような巨大なドットマトリックスLEDを用意して送電線の電流を図ると発電されているので電流が流れている事が確認できると思います。
当然、逆流をしてもらうと困る環境では、そうならないような仕組みにする必要があるので、回路自体をそのように設計する必要があります。
義務教区だと
■ 接点
■ センサー
を使用できるので、 【 入力の選択 】 が可能になっていますが、この選択は、
■ 接 点 : 配線の状態変化
■ センサー : 電流が流れる(電圧の発生)
なので考え方が少し異なります。センサーの場合、
■ 光
■ 音
■ 温度
■ 風
■ 運動エネルギー
を検知して動くものを作ることができます。接点の場合と同様に
■ 通電
■ 遮断
が生じますから、 【 センサーで検知した状態変化 】 をスイッチとして使用することが出来ます。
義務教育でマイコンを使わない状態だと理科のカリキュラムの範囲内だと
■ 豆電球
■ DCモーター(ブラシモーター)
辺りになるのではないかな?と思いますが、これをスイッチでの制御で行うような回路を組むことになります。
ワンボードマイコンの場合
ワンボードマイコンの場合、
■ 実装機能
■ 拡張パーツ
でできる事が変わりますが、モーター制御をする場合だとドライバーボードなどを追加して動かすことになります。その為、 【 処理に必要な機材構成にする 】 ことになります。
実装機能だとそのまま使用できるので、何が実装されているのかにもよりますが、Arduino R4 WifiのようにドットマトリックスLEDが実装されている製品だとGPIO接続でそういった製品を追加してライブラリを使用して動かすのではなく実装機能の範囲で動かす事が出来ます。
マイコンの場合、パーツを追加して動かす仕様になっていますが、ワンボードマイコンのように既に色々実装されているものだと、実装機能だけで色々な処理ができるようになっています。その為、
■ 入力
■ 出力
を考える際に、マイコンのチップだと回路の設計を行ってターンを用意して接続する必要があるものであっても標準実装機能の範囲内で同じことができる用になっている場合もあります。
この辺りは、
■ 入力 : タクトスイッチ
■ 出力 : LED
を使用した際の制御と同じですが、これは、Raspberry PI Picoでも実装されているのでコードを書くことで
■ LEDの発光/点滅
■ タクトスイッチによる操作
を実装できるようになっています。その為、この状態だと家庭用証明のようなスイッチと証明のコントロールのような仕組みをワンボードマイコンだけで行えるようになっていますが、こうした処理もワンボードマイコンに実装されている機能でできる事が異なります。
ちなみに、マイコンの性能ですが、製品医よってクロック周波数が異なりますが現在の製品の多くは2コア構成になっています。Arduinoのように少電力で動かすものだと16MHzのシングルコア動作だったりしますが、R4だと48Mhzのシングルコア動作になっています。この場合、平行処理になるのでタスクで処理を管理していくことになりますから、タイマーなどを使用する場合には割り込み処理を使った制御が必要になります。
ちなみに、ESP-WROOM32開発ボードに実装されているCPUは、
【 32bit Dual Core Tensilica LX6 】
ですが、これが、240MHzで動作する仕様になっています。ちなみに、
■ RAM : 520KB
■ Flash : 4MB
となっています。このように目的で使用するものが違ってきますが、クロック周波数についても異なります。
また、M5Stackについては64bitのマイコンなので、マイコンによってできることが異なります。
入力と判定
完全な回路だけの構造とマイコン制御では少し異なりますが、ワンボードマイコンにボタンがある場合だと、ボタンの操作をスイッチの操作として使用することが出来ます。その為、2つのボタンがある場合だと論理ゲートを使用した判定ができるのですが、マイコンだとこれをコードで実装することになります。
ブロックを使った処理の場合も同様の方法を用いることになりますが、同時押しのようなものを扱う場合には、優先順位に気をつける必要があります。
ボタンAとボタンBの同時押しの場合、
■ ボタンA ∈ 同時押し
■ ボタンB ∈ 同時押し
の条件が成立しますから、分岐を使用して単一のボタンの処理を実装すると同時押しの判定が選択されなくなります。その為、異なる処理を割り当てて動く仕様のものを作る場合には
■ 同時押し : 処理1
■ ボタンA : 処理2
■ ボタンB : 処理4
のような処理の順番で実装する必要があります。
電気工作が含まれる場合、高校の物理などの知識が必要になりますが、義務教育までの知識だと単一の閉回路で動作する構造だと、個別の回路を並べた構造にすると複数の処理を実装することができるので
■ 入力 → 処理
の構造を実装できるようになります。この時に直列回路と並列回路を使い分けることになりますが、
■ 直列回路 : 順番に処理をする
■ 並列回路 : 同時進行
になりますから、電力が足りている事が前提になりますが、ボタン操作で複数のものが動作するような仕組みにする場合だと並列回路を用いることになります。
直列回路は遅延回路を入れるとタイミングのコントロールが出来ますが、基本定位に回路内で直列に配置したものは 【 電力の減衰の影響 】 は生じますがそのまま繋いだ場合医はラグを感じることはありません。
というのも、 【 電気の移動速度は光の速度と同じ 】 なので、処理を入れるとその分だけ動作が送れることがありますが、通常の通電においては人が遅延を感じることがないレベルの速度で動作する仕組みになっています。
直列の接続は 【 遅延を感じない 】 ので、点滅をした場合でも週H数雨を上げると点滅を感じなくなるので、直列では位置したLEDを順番に光るようにして点滅させた場合、60Hz以上で動作させると同時に点灯しているように見えます。これを行うと、配列を使用して個別に点滅する処理を行うだけで複数のLEDを少ないピンの数で制御できるようになります。
マイコンでドットマトリクスLEDを使用する際にはこの方法で管理が行われていますが、電気工作で直列回路を作った場合には肉眼で遅延を感じないレベルの差しか生じないので、遅延を追加する場合には、遅延回路を間に挟む必要があります。
アプリケーションの場合
PC上で動作するアプリケーションの場合だとデバイスの制御ではありませんから、処理の方法だけを考えれば良いのですが、この場合、
■ 使用するデーター
■ 表示に関する内容
■ 処理に関する内容
を最初に分けて考えると作業が行いやすくなります。この考え方ですが、
■ 外部データ参照
■ ウィジェットの利用
■ アプリケーションの処理
と書き換えるとコンソールアプリのようなコードでの処理はアプリケーションの処理部分だけになるので、それ以外と完全に分けて考えることが出来ます。
この考え方は、ブラウザで動く物に置き換えると
■ JSONファイルやマルチメディアファイルなど
■ HTML+CSS
■ ECMA SCRIPT(JavaScript)
のようになります。このように置き換えると完全に異なるファイルを用意することになりますが、
■ 部品
■ レイアウト
■ 処理
になりますから、個別に状態を考えて連携して処理を行うことになります。
コンソールアプリだとcursesを使用した場合だと同じ考え方で作業をしたほうが良いような気がしますが、コード内での処理の役割分担とは別に、このような役割分担をして個別に考えて連携の方法を模索すると必要なものを明確にすることが出来ます。
処理を実装する場合には、処理の役割分担を行い、その処理はどのようにすれば実現可能なのかを可が得ていくことになりますが、これが、電気工作を行う時に使用するモジュールに該当するパーツ作りになります。
当然、電気工作のように処理の順番を考える必要がありますから 【 処理の順番 】 を考えて実装していくことになります。