目次
前
次
夜間点滅器(その2)
夜になると、2つのLEDを交互に点滅させ
その場所に物体があることを示す装置を
IchigoJamを利用して作ってみます。
LEDを2本利用するとして、接続は以下とします。
点滅は、サブルーチンとして次のように書けばよいでしょう。
100 ' flashing
110 OUT 1,1 : OUT 2,0 : WAIT 120
120 OUT 1,0 : OUT 2,1 : WAIT 120
130 RETURN
140 ' turn off all LED
150 OUT 1,0 : OUT 2,0
160 RETURN
昼間には、LED点滅をさせないように
2本のLEDを消灯します。
昼夜の判定には、照度センサーを利用した回路を
使ってみればよいでしょう。
回路図にあるVoutを、IchigoJamのINピンのどれか
に接続して、Voutの値を読み込んで、点滅させる
のか、消灯させるのかを判定します。
照度センサーは、光が入っていると高い電圧を
出してくるので、低い電圧で'0'と判断できた
ならば点滅させます。
プログラムにまとめると、以下。
10 ' night flasher
20 LET D,120 : GOSUB 140
30 LET N,IN(1)
40 IF N=0 GOSUB 100 ELSE GOSUB 140
50 IF BTN() GOTO 70
60 GOTO 30
70 ? "EXIT"
80 END
サブルーチンと合体します。
10 ' night flasher
20 LET D,120 : GOSUB 140
30 LET N,IN(1)
40 IF N=0 GOSUB 100 ELSE GOSUB 140
50 IF BTN() GOTO 70
60 GOTO 30
70 ? "EXIT"
80 END
100 ' flashing
110 OUT 1,1 : OUT 2,0 : WAIT D
120 OUT 1,0 : OUT 2,1 : WAIT D
130 RETURN
140 ' turn off all LED
150 OUT 1,0 : OUT 2,0
160 RETURN
夜間点滅器として使えますが、2個のランプを
交互に点灯、消灯するとなると、鉄道の踏切に
ある警報装置を思い出します。
鉄道模型のNゲージのための踏切警報装置に使えそうです。
踏切警報装置は、踏切を鉄道車両が横切る前から
点滅していなくては事故になります。また、車両
が踏切を通過してから、少しの間は点滅を続けて
いることも必要になります。
センサー回路を2箇所に用意し、Nゲージのための
踏切警報装置をIchigoJamで作ってみます。
センサー回路は、以下とします。
踏切は単線の鉄道でも、右から左、左から右と
センサーの反応が変化していきます。これを
どうやって判断するのかを考えて、点滅処理の
サブルーチンを呼出すようにします。
時間の経過で、センサーがどういう値を出力する
のかを考えてみます。
車両が右から左に移動
センサーの出力値を見てみます。
センサー2が反応 1→0→1
多少の時間が経過
センサー1が反応 1→0→1
センサー2、1の順で論理値を並べてと次のようになります。
センサー2が反応 10
多少の時間が経過 11
センサー1が反応 01
多少の時間が経過 11
車両が左から右に移動
センサー1が反応 1→0→1
多少の時間が経過
センサー2が反応 1→0→1
センサー2、1の順で論理値を並べてと次のようになります。
センサー1が反応 01
多少の時間が経過 11
センサー2が反応 10
多少の時間が経過 11
2つのセンサー反応状態を並べてみます。
11→01→11→10→11
11→10→11→01→11
時間の経過とともに、右から左にセンサーの
取る値を10進数で置き換えてみます。
11→01→11→10→11 : 3→1→3→2→3
11→10→11→01→11 : 3→2→3→1→3
センサー値を時間の経過とともに、一つ前と現在の
2つに絞って並べてみます。
- 3→1 1→1 1→3 3→3 3→2 2→2 2→3 3→3
- 3→2 2→2 2→3 3→3 3→1 1→1 1→3 3→3
センサーの値は、1、2、3のいずれかを取ります。
3→1と3→2の変化の場合、点滅を開始します。
2→3と1→3の変化の場合、消灯します。
点滅するか消灯するのかを、一つの変数に入れておき
センサーの状態値の変化で、この変数の値をかえると
うまくいきそう。
10 ' cross point handling
20 LET S,3 : LET T,3 : LET A,0 : GOSUB 100
30 LET R,IN(1) : LET L,IN(2) : LET T,L*2+R
40 IF S=3 AND (T=1 OR T=2) LET A,1
50 IF (S=1 OR S=2) AND T=3 LET A,0
60 GOSUB 100 : LET S,T : ' update
70 IF BTN() GOTO 90
80 GOTO 30
90 ? "EXIT" : END
状態を表す変数値により動作をきめるサブルーチンを
書くと、次のような感じでしょう。
100 ' flashing
110 IF A=1 GOTO 160
120 ' turn off all LED
130 OUT 1,0 : OUT 2,0
140 GOTO 180
150 ' 10 or 01
160 OUT 1,1 : OUT 2,0 : WAIT 120
170 OUT 1,0 : OUT 2,1 : WAIT 120
180 RETURN
まとめます。
10 ' cross point handling
20 LET S,3 : LET T,3 : LET A,0 : GOSUB 100
30 LET R,IN(1) : LET L,IN(2) : LET T,L*2+R
40 IF S=3 AND (T=1 OR T=2) LET A,1
50 IF (S=1 OR S=2) AND T=3 LET A,0
60 GOSUB 100 : LET S,T : ' update
70 IF BTN() GOTO 90
80 GOTO 30
90 ? "EXIT" : LET A,0 : GOSUB 100 : END
100 ' flashing
110 IF A=1 GOTO 160
120 ' turn off all LED
130 OUT 1,0 : OUT 2,0
140 GOTO 180
150 ' 10 or 01
160 OUT 1,1 : OUT 2,0 : WAIT 120
170 OUT 1,0 : OUT 2,1 : WAIT 120
180 RETURN
IchigoJamのBASICでは、変数に値を入れるLET命令が
配列の中に複数の値を、書いた順に入れる規定です。
LET命令をうまく使うと、命令数の少ないプログラムにできます。
10 ' cross point handling
20 LET [0],0,3,3 : GOSUB 100
30 LET [3],IN(1),IN(2) : LET [2],[3]*2+[4]
40 IF [1]=3 AND ([2]=1 OR [2]=2) LET [0],1
50 IF ([1]=1 OR [1]=2) AND [2]=3 LET [0],0
60 GOSUB 100 : LET [1],[2] : ' update
70 IF BTN() GOTO 90
80 GOTO 30
90 ? "EXIT" : LET [0],0 : GOSUB 100 : END
100 ' flashing
110 IF [0]=1 GOTO 160
120 ' turn off all LED
130 FOR I=1 TO 2 : OUT I,0 : NEXT
140 GOTO 180
150 ' 10 or 01
160 OUT 1,1 : OUT 2,0 : WAIT 120
170 OUT 1,0 : OUT 2,1 : WAIT 120
180 RETURN
配列[0]の値で、点滅するのか、消灯するのかを指定します。
配列[1]、[2]には、センサーのひとつ前の値と現在の値を
入れておきます。現在の値とひとつ前の値の組み合わせで
点滅、消灯を決定します。2つの値が同じなら、それまで
の動作を継続。
配列[3]、[4]には、それぞれのセンサーの出力論理値を
入れてます。センサー値を10進数に変換するための一時
変数として使っています。
センサー値の組合せで、点滅と消灯の判断をして
いますが、論理演算が面倒なら判断を専門に扱う
サブルーチンを用意して対応します。
サブルーチンを200行から入れて、プログラムを
書直すと、次のようになります。
10 ' cross point handling
20 LET [0],0,3,3 : GOSUB 100
30 LET [3],IN(1),IN(2) : LET [2],[3]*2+[4]
40 GOSUB 200
50 GOSUB 100
60 LET [1],[2] : ' update
70 IF BTN() GOTO 90
80 GOTO 30
90 ? "EXIT" : LET [0],0 : GOSUB 100 : END
100 ' flashing
110 IF [0]=1 GOTO 160
120 ' turn off all LED
130 FOR I=1 TO 2 : OUT I,0 : NEXT
140 GOTO 180
150 ' 10 or 01
160 OUT 1,1 : OUT 2,0 : WAIT 120
170 OUT 1,0 : OUT 2,1 : WAIT 120
180 RETURN
200 ' judge
210 IF [1]=3 AND [2]=1 LET [0],1
220 IF [1]=3 AND [2]=2 LET [0],1
210 IF [1]=1 AND [2]=3 LET [0],0
220 IF [1]=2 AND [2]=3 LET [0],0
230 RETURN
ラベル利用で見やすくできます。
10 ' cross point handling
20 LET [0],0,3,3 : GSB @FLASH
30 @LOOP
35 LET [3],IN(1),IN(2) : LET [2],[3]*2+[4]
40 GSB @JUDGE
50 GSB @FLASH
60 LET [1],[2]
70 IF BTN() GOTO @EXIT
80 GOTO @LOOP
90 @EXIT
92 ? "EXIT"
94 LET [0],0 : GSB @FLASH : END
100 @FLASH
110 IF [0]=1 GOTO 160
120 ' turn off all LED
130 FOR I=1 TO 2 : OUT I,0 : NEXT
140 GOTO @FLASH2
150 ' 10 or 01
160 OUT 1,1 : OUT 2,0 : WAIT 120
170 OUT 1,0 : OUT 2,1 : WAIT 120
180 @FLASH2
190 RTN
200 @JUDGE
210 IF [1]=3 AND [2]=1 LET [0],1
220 IF [1]=3 AND [2]=2 LET [0],1
210 IF [1]=1 AND [2]=3 LET [0],0
220 IF [1]=2 AND [2]=3 LET [0],0
230 RTN
目次
前
次