こどもパソコン IchigoJamの互換機の一つに、IchigoKamuyがある。
これは、パソコンにUSBで直結できるので、別にUSB-シリアル変換器を用意しなくていいという特徴がある。
なお、ディスプレイとキーボードを接続するためのパーツは別売りである。
そのIchigoKamuyとともに売られているものに、
IchigoKamuy 教材基板シリーズ L-01|LED しんごうき というのがあった。
信号機といえば、応用情報技術者試験の過去問にあったなあ…
ということで、今回はこれを実装してみた。
※IchigoJamはjig.jpの登録商標です。
実装したもの
今回は、令和元年度秋期試験の午後の問8で定義されている信号機制御システムを実装した。
具体的には、問題文で定義されている夜間の主道路信号および歩行者信号の状態遷移を実装した。
存在のみ示唆されている従道路信号と昼間の動作、および信頼性設計(故障時の動作)は今回は対象外とした。
今回の主道路信号は、赤15秒→青60秒→黄3秒→赤1秒→右10秒→黄3秒→赤15秒→…という動作をする。
ただし、ボタンが押された時は青の時間が短くなることがある。
また、「右」とは右折信号のことである。
今回の歩行者信号は、ボタンが押されるまでずっと赤であり、
ボタンが押された後主道路信号の赤15秒が始まったら、3秒後に青8秒→青点滅3秒→赤となる。
実装
今回実装したプログラムは、以下のものである。
10 ' AP R1アキ トイ8 シンゴウ
20 C=1:W=1:S=2:H=2:LET[1],15,0,0,0,0,0,0,0,0
30 T=0:CLT:P=TICK():GOTO 270
40 N=TICK():D=N-P:P=N:IF D<0 D=D+32000+768
50 X=0:T=T+D:IF T<60 GOTO 90
60 FOR I=1 TO 9:IF[I]>0 [I]=[I]-1:X=1
70 NEXT
80 T=T-60
90 OUT (S=0)+2*(S=1)+4*(S>1)+8*(S=3)+32*(H=0 OR (H=1 AND T%30<15))+16*(H=2)
100 B=BTN():Y=C:Z=W
110 IF C=1 AND [1]=0 C=2:S=0:[2]=60
120 IF C=2 AND [2]=0 C=3:S=1:[3]=3
130 IF C=3 AND [3]=0 C=4:S=2:[4]=1
140 IF C=4 AND [4]=0 C=5:S=3:[5]=10
150 IF C=5 AND [5]=0 C=6:S=1:[3]=3
160 IF C=6 AND [3]=0 C=1:S=2:[1]=15
170 IF C=1 AND B C=11
180 IF C=11 AND [1]=0 C=12:S=0:[6]=10
190 IF C=2 AND B C=12:[6]=10
200 IF C=12 AND ([2]=0 OR [6]=0) C=3:[2]=0:[6]=0:S=1:[3]=3
210 IF W=1 AND B W=2
220 IF W=2 AND C=1 W=3:[7]=3
230 IF W=3 AND [7]=0 W=4:H=0:[8]=8
240 IF W=4 AND [8]=0 W=5:H=1:[9]=3
250 IF W=5 AND [9]=0 W=1:H=2
260 IF X=0 AND Y=C AND Z=W GOTO 40
270 CLS:FOR I=1 TO 9
280 ?"[";I;"] ";CHR$(#20+(#10+[I]/10)*([I]>9));[I]%10;" ";
290 IF I%3=0 ?CHR$(10);
300 NEXT
310 ?CHR$(#43-C/10);"-";C%10;" W-";W
320 GOTO 40
C
で主道路信号の状態を表す。1~6がそれぞれ状態C-1~状態C-6を、11が状態B-1を、12が状態B-2を表す。
W
で歩行者信号の状態を表す。1~5がそれぞれ状態W-1~状態W-5を表す。
S
で主道路信号の表示を表す。0が青、1が黄、2が赤、3が右を表す。
H
で歩行者信号の表示を表す。0が青、1が青点滅、2が赤を表す。
配列[1]
~[9]
でそれぞれタイマ1~タイマ9の残り秒数を表す。
10行目は、FILES
用のタイトルである。
20行目で、開始時の処理(S1、R1)を行う。各信号の状態と表示を設定し、各タイマを初期化する。
30行目で、タイマおよび青点滅の制御用の時刻を初期化し、最初の状態の出力に移る。
40行目で、時刻の増分を計算する。
50行目で、時刻を更新し、タイマを更新するべきかの判定を行う。
60行目~70行目で、タイマを更新する。
80行目で、次のタイマの更新に向けて時刻を更新する。
90行目で、信号の表示を管理する変数の値を実際の表示(出力)に反映させる。
100行目で、ボタンの入力を取得し、変化したかの判定のために状態を保存する。
110行目~250行目で、問題文に定義された状態遷移の処理を行う。
260行目で、状態が更新されたかの判定を行う。
270行目~320行目で、各タイマの残り秒数および各信号の状態を画面に出力する。
実行結果
YouTube動画 (6:00)
応用
実行結果より、設問1 (2) の答え (主道路信号がC-6 (黄) になった直後にボタンを押した時、
何秒後に歩行者信号が最初に青になるか) は「6(秒後)」であるとわかる。
220行目を
220 IF W=2 AND S=2 W=3:[7]=3
とすると、設問2 (1) の状況を再現できる。
すなわち、遷移の条件を「主道路信号が状態C-1に遷移」ではなく「主道路信号が赤」とすることができる。
このとき、例えば主道路信号が青のときにボタンを押すと、
主道路信号が右のときに歩行者信号が青になってしまうことが確認できる。
結論
問題文の通りに状態遷移を実装することで、
応用情報技術者試験で出題された信号機制御システムを実装することができた。
さらに、この実装を用いて、いくつかの問題の答えを確かめることができた。