目次

ライントレースマシンに挑戦(その6)

 IchigoJamは、音も出せます。
 移動動作で異なるピッチ(周波数)の音
 を出すことに考えます。

 MML(Music Macro Language)を使えるので
 ドレミファソラシをC、D、E、F、G、A、Bに
 割り当てしています。

 MMLでは、PLAY文で音を出せます。

 移動動作のときに、次のようにピッチを
 割り当てて音を出してみます。

 これらの発音は、次のようにプログラムするだけ。

IF S=2 PLAY "C"
IF S=0 PLAY "A"
IF S=3 PLAY "E"
IF S=6 PLAY "G"

 モータに関係するDUTY比を設定するときに
 同時に発音させればよいでしょう。

200 ' set each duty ratio
210 PWM 2,[0],100:PWM 3,[1],100
220 PWM 4,[2],100:PWM 5,[3],100
230 IF S=2 PLAY "C":IF S=0 PLAY "A"
240 IF S=3 PLAY "E":IF S=6 PLAY "G"
250 RETURN

 ラベルを使うと以下。
 走行に音を加えると、全体は以下のようになります。

10 ' car control
20 LET R,0:LET [0],0,0,0,0:GOSUB 200
30 GOSUB 100:IF A>500 LET R,1
40 IF BTN() GOTO 60
50 GOTO 70
60 IF R=0 LET R,1 ELSE LET R,0
80 IF R=1 GOTO 400
90 END
100 ' measure
110 LET A,ANA(2)
120 RETURN
130 ' concatenate
140 LET [10],IN(1),IN(3),IN(4)
150 LET S,[10]*4+[11]*2+[12]
160 RETURN
200 ' set each duty ratio
210 PWM 2,[0],100:PWM 3,[1],100
220 PWM 4,[2],100:PWM 5,[3],100
230 IF S=2 PLAY "C":IF S=0 PLAY "A"
240 IF S=3 PLAY "E":IF S=6 PLAY "G"
250 RETURN
300 ' judge
310 IF S=0 LET [0],50, 0,50, 0
320 IF S=1 LET [0], 0,50, 0,80
330 IF S=2 LET [0], 0,50, 0,50
340 IF S=3 LET [0], 0,50,50, 0
350 IF S=4 LET [0], 0,80, 0,50
360 IF S=5 LET [0], 0,50, 0,80
370 IF S=6 LET [0],50, 0, 0,50
380 IF S=7 LET [0], 0,30, 0,30
390 RETURN
400 ' control
410 GOSUB 130 ' get road state
420 GOSUB 300 ' generate duty ratio
430 GOSUB 200 ' move
440 WAIT 120
450 IF BTN() GOTO 20
460 GOTO 410

 複数台で走行しているときは、どの車からの発音か
 わからなくなるので、コメントで音を出ないように
 します。

200 ' set each duty ratio
210 PWM 2,[0],100:PWM 3,[1],100
220 PWM 4,[2],100:PWM 5,[3],100
230 ' IF S=2 PLAY "C":IF S=0 PLAY "A"
240 ' IF S=3 PLAY "E":IF S=6 PLAY "G"
250 RETURN

 ラベルを利用して、次のようにも書けます。

10 ' car control
20 @HAJIME
30 R=0:LET [0],0,0,0,0:GSB @SETDR
40 GSB @MEASURE:IF A>500 R=1
50 IF BTN() GOTO @NEXT
60 GOTO @TUGI
70 @NEXT
75 IF R=0 R=1 ELSE R=0
80 @TUGI
85 IF R=1 GOTO @CONTROL
90 END
100 @MEASURE
110 A=ANA(2)
120 RTN
130 @GATTAI
140 LET [10],IN(1),IN(3),IN(4)
150 LET S,[10]*4+[11]*2+[12]
160 RTN
200 @SETDR
210 PWM 2,[0],100:PWM 3,[1],100
220 PWM 4,[2],100:PWM 5,[3],100
230 IF S=2 PLAY "C":IF S=0 PLAY "A"
240 IF S=3 PLAY "E":IF S=6 PLAY "G"
250 RTN
300 @JUDGE
310 IF S=0 LET [0],50, 0,50, 0
320 IF S=1 LET [0], 0,50, 0,80
330 IF S=2 LET [0], 0,50, 0,50
340 IF S=3 LET [0], 0,50,50, 0
350 IF S=4 LET [0], 0,80, 0,50
360 IF S=5 LET [0], 0,50, 0,80
370 IF S=6 LET [0],50, 0, 0,50
380 IF S=7 LET [0], 0,30, 0,30
390 RTN
400 @CONTROL
410 GSB @GATTAI ' get road state
420 GSB @JUDGE  ' generate duty ratio
430 GSB @SETDR  ' move
440 WAIT 120
450 IF BTN() GOTO @HAJIME
460 GOTO @CONTROL

目次

inserted by FC2 system