目次
前
次
ライントレーサチェック
IchigoJam体験会で使うライントレーサを動かしてみます。
センサーは3ビットで、デジタル入力にIN_1、IN_2、IN_4に接続。
センサーからの情報を10進数に変換するサブルーチンを定義。
200 ' get sensor
210 LET [1],IN(2),IN(4),IN(1)
220 IF [1]=1 LET [1],0 ELSE LET [1],1
230 IF [2]=1 LET [2],0 ELSE LET [2],1
240 IF [3]=1 LET [3],0 ELSE LET [3],1
230 LET [0],[1] * 4 + [2] * 2 + [3]
240 RTN
センサーの出力値は、以下。
- 0(b'000) on line
- 1(b'001) tiny right
- 2(b'010) *illeagal
- 3(b'011) right
- 4(b'100) tiny left
- 5(b'101) *illeagal
- 6(b'110) left
- 7(b'111) *illeagal
DCモータを動かすには、論理値の'1'を与えればよいので
OUT_2、OUT_4から出力します。
センサー値により、OUT_2、OUT_4の出力論理値を決めて
配列に格納しておけばよいでしょう。
1変数に左右の出力論理値を同時に格納します。
100 ' initialize
110 LET [10],1*2 + 1
120 LET [11],0*2 + 1
130 LET [12],1*2 + 0
140 RTN
センサー値により、DUTY比を設定するサブルーチンを定義。
300 ' set logical value
310 LET A,[10]
320 IF [0]=1 LET A,[11]
320 IF [0]=3 LET A,[11]
340 IF [0]=4 LET A,[12]
350 IF [0]=6 LET A,[12]
360 LET [20],(A >> 1) & 1: LET [21],A & 1
370 OUT 2,[20] : OUT 4,[21]
380 WAIT 60
390 RTN
モータの回転を止めるためのサブルーチンも
定義しておきましょう。
400 ' stop
410 OUT 2,0: OUT 4,0
420 RTN
動作シーケンスを考えると、以下。
- モータ停止
- DUTY比格納
- センサー情報入力
- DUTY比設定
- ボタンが押されていたら、7に分岐
- 3にもどる
- モータ停止
これをBASICコードに変換。
10 ' Jam Car
20 GOSUB 400
30 GOSUB 100 ' initialize
40 GOSUB 200 ' get sensor
50 GOSUB 300 ' set duty ratio
60 IF BTN() GOTO 80
70 GOTO 40
80 GOSUB 400 ' stop
90 END
まとめます。
10 ' Jam Car
20 GOSUB 400
30 GOSUB 100 ' initialize
40 GOSUB 200 ' get sensor
50 GOSUB 300 ' set duty ratio
60 IF BTN() GOTO 80
70 GOTO 40
80 GOSUB 400 ' stop
90 END
100 ' initialize
110 LET [10],1*2 + 1
120 LET [11],0*2 + 1
130 LET [12],1*2 + 0
140 RTN
200 ' get sensor
210 LET [1],IN(2),IN(4),IN(1)
220 IF [1]=1 LET [1],0 ELSE LET [1],1
230 IF [2]=1 LET [2],0 ELSE LET [2],1
240 IF [3]=1 LET [3],0 ELSE LET [3],1
230 LET [0],[1] * 4 + [2] * 2 + [3]
240 RTN
300 ' set logical value
310 LET A,[10]
320 IF [0]=1 LET A,[11]
320 IF [0]=3 LET A,[11]
340 IF [0]=4 LET A,[12]
350 IF [0]=6 LET A,[12]
360 LET [20],(A >> 1) & 1: LET [21],A & 1
370 OUT 2,[20] : OUT 4,[21]
380 WAIT 60
390 RTN
400 ' stop
410 OUT 2,0: OUT 3,0
420 RTN
ラベルを使って、まとめることも可能。
10 ' Jam Car
20 GSB @POFF:GSB @INIT:
30 @LOOP
40 GSB @GSEN:GSB @SDUTY
50 IF BTN() GOTO @EXIT
60 GOTO @LOOP
70 @EXIT
80 GSB @POFF
90 END
100 @INIT
110 LET [10],1*2 + 1
120 LET [11],0*2 + 1
130 LET [12],1*2 + 0
140 RTN
200 @GSEN
210 LET [1],IN(2),IN(4),IN(1)
220 IF [1]=1 LET [1],0 ELSE LET [1],1
230 IF [2]=1 LET [2],0 ELSE LET [2],1
240 IF [3]=1 LET [3],0 ELSE LET [3],1
230 LET [0],[1] * 4 + [2] * 2 + [3]
240 RTN
300 @SDUTY
310 LET A,[10]
320 IF [0]=1 LET A,[11]
320 IF [0]=3 LET A,[11]
340 IF [0]=4 LET A,[12]
350 IF [0]=6 LET A,[12]
360 LET [20],(A >> 1) & 1: LET [21],A & 1
370 OUT 2,[20] : OUT 4,[21]
380 WAIT 60
390 RTN
400 @POFF
410 OUT 2,0: OUT 3,0
420 RTN
1ビットの論理反転を「!」で扱うと、気がつけば
つぎのようにもできます。
200 @GSEN
210 LET [1],!IN(2),!IN(4),!IN(1)
220 LET [0],[1] * 4 + [2] * 2 + [3]
230 ? [1],[2],[3]
240 RTN
雛形を書いてから、より短いコードにできるかを
考えるのが、スキル向上につながります。
目次
前
次