2020.08.23 Sun
CoDoMo塾 東砂教室

自由製作1回目【2020春 応用クラス1-1】

ロボットプログラミング応用クラス1(2020春)の最初の自由製作です。

個人の作品ですが、まだ作るものが決まっていなかったので、まずはサンプル集を真似てみよう!ということで、スイッチ式イルミネーションを作成しました。

動きは以下の感じです。

  • トグルスイッチを倒すと、LEDが順番に点灯します。
  • 反対側に倒すとLEDが消灯します。

プログラムは以下の感じです。

10 IF IN(3) GOTO 40
20 WAIT 5
30 GOTO 10
40 OUT `000000
50 OUT `000001
60 WAIT 10
70 OUT `000011
80 WAIT 10
90 OUT `000110
100 WAIT 10
110 OUT `001100
120 WAIT 10
130 OUT `011000
140 WAIT 10
150 OUT `110000
160 WAIT 10
170 OUT `100000
180 WAIT 10
190 OUT `000000
200 GOTO 10

比較・分岐と逐次処理による綺麗なコードですね。これでも十分なのですが、LEDが順番に点灯していくのであれば、もっと短く表すこともできます。

5 L=6:W=10
6 T=1:S=1
10 IF IN(3) GOTO 40
20 WAIT W
30 GOTO 10
40 OUT 0:WAIT W
50 IF T<=L OUT T,1:T=T+1
60 IF S<=L AND T>3 OUT S,0:S=S+1
70 WAIT W
80 IF T>L AND S>L GOTO 6
90 GOTO 40

 

短くできましたが、中々解読が難しいと思うので以下は解説です。

5 変数(定数)の設定:L=LEDの数、W=WAITの時間
6 変数の初期化:T=LED点灯用の変数、S=LED消灯用の変数
10 トグルスイッチの値が1になったら行番号40へ行く
20 約0.2秒待つ
30 行番号10へ行く
40 LEDを全て消す。約0.2秒待つ
50 もし「TがL以下」の場合、T番目のLEDを点けて、Tをインクリメントする。
60 もし「SがL以下」かつ「Tが3より大きい」場合、S番目のLEDを消して、Sをインクリメントする。
70 約0.2秒待つ
80 もし「TがLより大きい」かつ「SがLより大きい」場合、行番号6へ行く(ここで、LEDが1巡したので、変数の初期化およびトグルスイッチの状態を判定させる)
90 行番号40へ行く

 

個人レベルで楽しむ分には、最初のプログラムで十分ですし、理解し易くて良いと思います。ただ、世の中で使われるようなシステムであれば、後半のようなプログラムとなることが多いです。(このレベル・ボリュームのプログラムであれば前者が使われる可能性も否定できません。)

システムは、メンテナンスのしやすさが非常に重要になります。例えば、LEDを5台追加する場合を考えてみます。

  • 前半のプログラム:全体的にプログラムの変更が必要
  • 後半のプログラム:行番号5のL=6をL=11に変更で改造完了

こんな感じで、プログラム自体の理解は難しいですが、非常に簡単にシステム変更やメンテナンスが可能になります。この辺りがシステムエンジニアによる設計の腕の見せ所です。