JAMCAR版 黒ラインを見つけろ!

7.参考プログラム1

・別の考え方をプログラムにした自動運転の例です
・コースアウトしたときの自動的に戻るしくみに、コースアウト直前の状態を調べて動きを決めるように工夫してあります
・スタート時に道路外のときは、コースアウト処理を実行して前進するように工夫しています

10 ‘2022 JAMCAR LT2 OTARU
20 CLV:CLO:POKE#700,114,182,0,32,3,73,10,104,64,28,0,42,251,209,64,9,98,182,112,71,0,16,0,80
30 IF BTN() CONT
40 IF!BTN() [2]=(TICK()/30%2)*20:WS.LED1,8:CONT
50 IF BTN() CONT:ELSE:CLV:[0]=20:WS.LED1,8
60 ‘
70 @MAIN
80 B=ANA()/10:’セッショクセンサー
90 OUT6,1:OUT6,0:U=ABS(USR(#700,0)):WAIT10:’チョウオンパセンサー
100 IF B>4 AND U>10 Q=0:GOTO@ライントレースショリ
110 @ジドウテイシ ショリ
120 ?B,U;” “;
130 IF Q!=1 Q=1:P=0:OUT20:WAIT10:?”OUT20-“;
140 ?”OUT0 for”;
150 OUT0:WAIT120
160 ?” 2secs”
170 GOTO@MAIN
180 ‘
190 @ライントレースショリ
200 L=IN(3):R=IN(4):’ラインセンサー
210 ?”L=”;L,”R=”;R,”P=”;P
220 IF L=1 AND R=1 AND P!=1 P=1:?”OUT10″:OUT10:GOTO@MAIN
230 IF L=0 AND R=1 AND P!=2 P=2:?”OUT8″ :OUT8 :GOTO@MAIN
240 IF L=1 AND R=0 AND P!=3 P=3:?”OUT2″ :OUT2 :GOTO@MAIN
250 IF L=0 AND R=0 ELSE GOTO@MAIN
260 @コースアウト ショリ
270 IF P=0 ?”OUT10″:OUT10:GOTO@MAIN
280 IF P=2 ?”OUT12″:OUT12:GOTO@MAIN
290 IF P=3 ?”OUT18″:OUT18:GOTO@MAIN
300 IF P=1 OR P=4 ?”OUT20″:OUT20:P=4:GOTO@ライントレースショリ
310 BEEP10,-1:END

プログラム説明

■初期化とスタート待ち(20~60行目)
・超音波距離センサー用のマシン語を準備する
・LEDバーを点滅してスタートスイッチが押されるのを待つ

■メイン処理(70~300行目)
・接触センサー と 超音波距離センサー の状態を調べて、
 障害物を感知していたら、自動停止処理に行く
 そうでなければ、ライントレース処理に行く

■■自動停止処理(110~170行目)
  障害物を感知していたら、少し下がって(OUT20)、
  2秒停止する(OUT0)
  障害物を連続して感知しているときは、少し下がる
  動作は最初の1回だけ。あとは2秒停止を繰り返す

■■ライントレース処理(190~250行目)
・ラインセンサーの状態を調べて、
 1.道路上なら、ロボットカーを前進する OUT10
 2.道路が右曲がりなら、右へ向く OUT8
 3.道路が左曲がりなら、左へ向く OUT2
 4.道路外なら、コースアウト処理に行く
 #変数Pは、ロボットカーの状態を表すフラグ
  =0 スタート時、もしくは障害物停止中
  =1 前進中
  =2 右折中
  =3 左折中
  =4 後退中

■■コースアウト処理(260~300行目)
・ラインセンサー過去の状態(変数P)を調べて、
 0.最初の直進中だったなら、道路を感知するまで前進する OUT10
 1.直進中か後退中だったなら、道路を感知するまで
                    後退する OUT20
 2.右折中だったなら、道路を感知するまで右旋回する OUT12
 3.左折中だったなら、道路を感知するまで左旋回する OUT18

■■例外処理(310行目)
・本来実行されないはずの命令(BEEPが鳴り続ける)
 この命令が実行された場合、誤った行を修正した可能性があると判断できる