HOPE-2023システム詳細
●HOPE-2022●
8bitマイコンを利用して鉄道模型HOゲージを自動運転するシステムです。直列接続した抵抗をマイコン制御のリレーで切り替えて列車の制御をします。ホール素子センサーで列車位置を検出し、往復運転とポイント切り替えによる車庫入れ運転の2種類の自動運転をします。
プログラム解説
概要
今回のHOPE-2022システムのプログラム解説です。
まだこのプログラムには改善の余地がありそうです。
10 '---20220509ProgStopV5_kaisetsu.txt
行 30-40 システムの初期設定をする
30 OUT $E3,$82
40 OUT $E7,$80
30~40 出入力用MSM82C55Aのコントロールワードを設定
解説
行 50 現在地の初期設定をする
50 P%=1
50 現在位置P%(POINT)を1に設定
解説
行 60-70 フラグの初期設定をする
60 SUB%=0:ST%=0
70 MUKI%=0:PMUKI%=0
60 ポイント切り替えの制御SUB%を本線側にして、車両を待避線に格納するかどうかのST%(STOP)を格納しないように設定する
70 現在の進行方向MUKI%と目的地に到着してからの進行方向をPMUKI%(POINT-MUKI)を右に設定する
解説
行 80-90 システムの出力を一時停止させる
80 OUT $E0,0
90 IF SUB%=0 THEN OUT $E5,255 ELSE OUT $E5,239
80 列車を停止させる
90 ポイント切り替えを制御するソレノイドの電源を切る
解説
行 100 入力されたデータを変数に格納する
100 INPUT "PROG?1-5>>>"PROG$
100 命令入力をPROG$に格納する
解説
行 110 入力されたデータの文字数を数える
110 N%=LEN(PROG$)
110 命令入力の文字数をカウントし、N%に格納する
解説
行 112-118 発車音を鳴らす
112 '---TONE=F
115 BEEP INT(50000/440.0)
118 GOSUB 600
115 発車音代わりに0.1秒間"ラ"の音を鳴らす
118 行番号600(FOR文による遅延プログラム)で発車までの間隔をあける
解説
行 120-150 初期設定をして列車を発車させる
120 OUT $E0,254
130 HUA%=0:HUB%=0
150 SHUT$="O"
120 列車を発車させる
130 踏切用フラグHUA%,HUB%(HUMIKIRI-A,HUMIKIRI-B)をそれぞれ0にする
150 踏切開閉を制御するSHUT$をO(OPEN)にする
解説
行 160 入力されたデータの文字数をループ回数に設定する
160 FOR C%=1 TO N%
160 メインシステムのループを、N%(L-110)回繰り返す
解説
行 170-180 入力されたデータから順番に一文字ずつ抜き出す
170 P%=VAL(RIGHT$(LEFT$(PROG$,C%),1))
180 IF C%<N% THEN PF%=VAL(RIGHT$(LEFT$(PROG$,C%+1),1))
170~180 プログラムを1文字ずつ順番に抜き出してP%(POINT),PF%(POINT-FUTURE)に格納する
解説
行 190-195 デバッグ用に変数を表示する
190 PRINT " LOOP >>> ",C%
195 PRINT P%,PF%
190~195 デバッグ用プリント
解説
行 210-230 入力されたデータをもとに到着後の方向を割り出す
210 IF P%<PF% THEN PMUKI%=0
220 IF P%>PF% THEN PMUKI%=1
230 IF P%=PF% GOTO 660
210~220 目的地とスタート位置から到着後の方向を割り出す
230 目的地とスタート位置が同じ場合、GOTO 660(NEXT C%)でループを飛ばす
解説
行 263-270 緊急停止ボタンの設定
263 H%=IN($E1)
270 IF (BIT(H%,3)=0)*(ST%=0)THEN P%=3:PF%=2:PRINT "STOP":ST%=1:GOTO 210
263-270 ボタン1が押され、かつ車両格納フラグが0の場合、車両格納フラグを1にして、GOTO 210(PMUKI%の更新)をする
解説
行 280-430 ホールICセンサーの出力を読み取ってフラグを入力する
280 IF BIT(H%,7)=1 THEN MUKI%=0:'RIGHT
290 '
300 IF BIT(H%,1)=1 THEN MUKI%=0
310 IF (BIT(H%,1))*(ST%=1) THEN ST%=0:GOTO 730
315 IF (BIT(H%,1))*(C%=1) THEN SUB%=1
320 '
330 IF BIT(H%,5)=1 THEN HUA%=1:GOSUB 690
340 IF (BIT(H%,5))*(P%=3)THEN MUKI%=PMUKI%
350 IF (BIT(H%,5))*(P%>3)THEN MUKI%=0
360 IF (BIT(H%,5))*(P%<3)THEN MUKI%=1
370 '
380 IF BIT(H%,4)=1 THEN HUB%=1
390 IF (BIT(H%,4))*(P%=4)THEN MUKI%=PMUKI%
400 IF (BIT(H%,4))*(P%>4)THEN MUKI%=0
410 IF (BIT(H%,4))*(P%<4)THEN MUKI%=1
420 '
430 IF BIT(H%,6)=1 THEN MUKI%=1:'LEFT
280~430 ホールICの入力によって踏切制御HUA%,HUB%とMUKI%を設定する
解説
行 435-450 2つのフラグを踏切の開閉フラグにまとめる
435 IF HUA%+HUB%=0 THEN SHUT$="O"
440 IF HUA%+HUB%=1 THEN SHUT$="C"
450 IF HUA%+HUB%=2 THEN SHUT$="O":HUA%=0:HUB%=0:GOSUB 600
435~450 踏切の開閉を認識する
解説
行 470-480 踏切開閉の操作
470 IF SHUT$="O"THEN OUT $E2,(4+3*MUKI%)
480 IF SHUT$="C"THEN OUT $E2,(0+3*MUKI%)
470~480 踏切の開閉を出力する
解説
行 500-533 ポイント切り替えの動作
500 PT%=255
510 IF SUB%=0 THEN RES PT%,7
520 IF SUB%=1 THEN FOR X%=4 TO 7:RES PT%,X%:NEXT X%
530 OUT $E5,PT%
533 GOSUB 600
500~530 ポイント切り替えの出力をする
533 遅延プログラムに移動
解説
行 540-590 センサー番号からポート番号に変換する
540 IF P%=1 THEN A%=7
550 IF P%=2 THEN A%=1
560 IF P%=3 THEN A%=5
570 IF P%=4 THEN A%=4
580 IF P%=5 THEN A%=6
590 IF BIT(H%,A%)GOTO 650 ELSE GOTO 250
540~590 センサー番号からポート番号に変換する
解説
行 600-640 FOR文を用いた遅延サブルーチン
600 FOR LOOP%=1 TO 300
630 NEXT LOOP%
640 RETURN
600~640 FOR文を用いた遅延プログラム
解説
行 650-670 ループの頭へ戻り、すべてのループが終了したあとに入力待ち状態へ移行する
650 PRINT "PASS POINT>>>",A%
660 NEXT C%
670 GOTO 80
650 ディスプレイ用出力
660~670 FOR文の終了と、入力待ち状態への移行
解説
行 690-710 方向を制御して出力する
690 IF PF%=2 THEN SUB%=1:MUKI%=1
700 IF PF%=1 THEN SUB%=0:MUKI%=1
710 RETURN
解説
行 730-760 緊急停止後に駅に戻るかどうか確認する
730 OUT $E0,0:PRINT "RESET?"
740 FOR CON%=0 TO 2500
750 IF BIT(IN($E1),2)=0 THEN PROG$="2351":GOTO 110
755 IF INT(CON%/250)=(CON%/250) THEN PRINT 10-(CON%/250)
760 NEXT CON%
解説
行 770 データの入力待ちに移行する
770 GOTO 60
解説
プログラム全文
10 '---20220509ProgStopV5.txt
30 OUT $E3,$82
40 OUT $E7,$80
50 P%=1
60 SUB%=0:ST%=0
70 MUKI%=0:PMUKI%=0
80 OUT $E0,0
90 IF SUB%=0 THEN OUT $E5,255 ELSE OUT $E5,239
100 INPUT "PROG?1-5>>>"PROG$
110 N%=LEN(PROG$)
112 '---TONE=F
115 BEEP INT(50000/440.0)
118 GOSUB 600
119 '
120 OUT $E0,254
130 HUA%=0:HUB%=0
150 SHUT$="O"
156 '
160 FOR C%=1 TO N%
170 P%=VAL(RIGHT$(LEFT$(PROG$,C%),1))
180 IF C%<N% THEN PF%=VAL(RIGHT$(LEFT$(PROG$,C%+1),1))
190 PRINT " LOOP >>> ",C%
195 PRINT P%,PF%
200 '
210 IF P%<PF% THEN PMUKI%=0
220 IF P%>PF% THEN PMUKI%=1
230 IF P%=PF% GOTO 660
240 '
250 '-----MAIN-----
260 '
263 H%=IN($E1)
266 '
270 IF (BIT(H%,3)=0)*(ST%=0)THEN P%=3:PF%=2:PRINT "STOP":ST%=1:GOTO 210
275 '
280 IF BIT(H%,7)=1 THEN MUKI%=0:'RIGHT
290 '
300 IF BIT(H%,1)=1 THEN MUKI%=0
310 IF (BIT(H%,1))*(ST%=1) THEN ST%=0:GOTO 730
315 IF (BIT(H%,1))*(C%=1) THEN SUB%=1
320 '
330 IF BIT(H%,5)=1 THEN HUA%=1:GOSUB 690
340 IF (BIT(H%,5))*(P%=3)THEN MUKI%=PMUKI%
350 IF (BIT(H%,5))*(P%>3)THEN MUKI%=0
360 IF (BIT(H%,5))*(P%<3)THEN MUKI%=1
370 '
380 IF BIT(H%,4)=1 THEN HUB%=1
390 IF (BIT(H%,4))*(P%=4)THEN MUKI%=PMUKI%
400 IF (BIT(H%,4))*(P%>4)THEN MUKI%=0
410 IF (BIT(H%,4))*(P%<4)THEN MUKI%=1
420 '
430 IF BIT(H%,6)=1 THEN MUKI%=1:'LEFT
433 '
435 IF HUA%+HUB%=0 THEN SHUT$="O"
440 IF HUA%+HUB%=1 THEN SHUT$="C"
450 IF HUA%+HUB%=2 THEN SHUT$="O":HUA%=0:HUB%=0:GOSUB 600
460 '
470 IF SHUT$="O"THEN OUT $E2,(4+3*MUKI%)
480 IF SHUT$="C"THEN OUT $E2,(0+3*MUKI%)
490 '
500 PT%=255
510 IF SUB%=0 THEN RES PT%,7
520 IF SUB%=1 THEN FOR X%=4 TO 7:RES PT%,X%:NEXT X%
530 OUT $E5,PT%
533 GOSUB 600
538 '
540 IF P%=1 THEN A%=7
550 IF P%=2 THEN A%=1
560 IF P%=3 THEN A%=5
570 IF P%=4 THEN A%=4
580 IF P%=5 THEN A%=6
590 IF BIT(H%,A%)GOTO 650 ELSE GOTO 250
595 '
600 FOR LOOP%=1 TO 300
630 NEXT LOOP%
640 RETURN
645 '
650 PRINT "PASS POINT>>>",A%
660 NEXT C%
670 GOTO 80
680 '
690 IF PF%=2 THEN SUB%=1:MUKI%=1
700 IF PF%=1 THEN SUB%=0:MUKI%=1
710 RETURN
720 '
730 OUT $E0,0:PRINT "RESET?"
740 FOR CON%=0 TO 2500
750 IF BIT(IN($E1),2)=0 THEN PROG$="2351":GOTO 110
755 IF INT(CON%/250)=(CON%/250) THEN PRINT 10-(CON%/250)
760 NEXT CON%
770 GOTO 60