目次

夜間点滅器(その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つに絞って並べてみます。

 センサーの値は、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


目次

inserted by FC2 system