目次

方向指示器(その1)

 スイッチとLEDを使ってできているシステムには
 自転車や自動車に装備されている方向指示器が
 あります。



 2個のプッシュスイッチと2本のLEDを利用して
 どちらかのスイッチを押している間、対応する
 LEDが点滅するシステムを実現してみます。

 外部の情報を2個のプッシュスイッチで入力しますが
 BASICのIN関数で利用できる1から4のどれかに接続
 します。回路としては、以下。



 スイッチを押すと、高い電圧がIchigoJamの入力INに
 与えられます。スイッチに触れないと、入力INには
 低い電圧が与えられます。

 デジタル回路やデジタルコンピュータのプログラムでは
 高い電圧を'1'、低い電圧を'0'として扱います。
 '1'か'0'のどちらかの値を利用して、処理を考えます。
 この'1'か'0'を論理値と呼びます。
 論理値を利用して表現すると、次のように書きます。

 スイッチを押すと、IchigoJamの入力INに論理値'1'
 が与えられる。スイッチに触れないと、入力INには
 論理値'0'が与えられる。

 スイッチが押されているのかどうかは、IchigoJamの
 ピンに与えられている論理値を取り込んで、判断して
 いきます。

 次のようにIN関数を利用し、変数に2つのピンの
 論理値を取り込んでおきます。

  LET L,IN(1)
  LET R,IN(2)

 変数L、Rの値が論理値'1'であれば、点滅させます。
 左右のLEDの点滅は、専門家に任せると考えれば
 ここまでの内容をBASICプログラムにできます。

10 ' winker
20 LET D,60
30 LET L,IN(1) : LET R,IN(2)
40 IF L=1 THEN GOSUB 100 ELSE GOSUB 200 : ' LEFT
50 IF R=1 THEN GOSUB 150 ELSE GOSUB 200 : ' RIGHT
60 IF BTN() GOTO 80
70 GOTO 30
80 ? "EXIT"
90 END

 BASICプログラムは、行番号を使い、何をするのかを
 書いていきます。上のプログラムの場合は、行番号
 30から70を繰返します。

 上のBASICプログラムの内容を簡単に説明します。

 行番号100、150、200は、LEDを点滅したり、消灯させる
 仕事を書いておきます。

 LEDの点灯、消灯に必要になることを見ておきましょう。

 外部への情報を出力には、手続きOUTを使います。
 OUTには1から6のどれか使えますが、LEDを点灯
 消灯するには、次の回路を使います。



 OUTを利用して、1から6に論理値'1'を与えると
 IchigoJamでは約3Vの電圧が出力されます。
 論理値'0'を与えると、約0Vの電圧が出力されます。

 回路では、LEDに抵抗が接続されています。この抵抗
 を電流制限抵抗と呼びます。直接電圧を与えしまうと
 LEDが破壊されます。LEDが破壊されないように抵抗を
 挟みます。

 OUTを利用して、1から6に論理値'1'を与えると
 IchigoJamでは約3Vの電圧が出力されます。
 論理値'0'を与えると、約0Vの電圧が出力されます。

 回路図から、左のLEDを点灯するにはOUT命令で
 OUT1に論理値'1'を与えます。消灯はOUT命令で
 OUT1に論理値'0'を与えます。
 BASICのコードにまとめると、以下。

100 ' left flashing
110 OUT 1,1 : WAIT D
120 OUT 1,0 : WAIT D
130 RETURN

 論理値をOUT命令で与える他に、WAIT命令を
 使っています。WAITで論理値の'1'、'0'の
 持続時間を決めています。

 WAIT命令を使わないと、点滅とわかりません。
 コンピュータの動作が高速なので、このような
 待ち時間を入れるのが、お約束になります。

 左の点滅ができれば、右の方は論理値を出力する
 ピンが異なるだけなので簡単。

150 ' right flashing
160 OUT 2,1 : WAIT D
170 OUT 2,0 : WAIT D
180 RETURN

 どちらのプログラムでも「RETURN」が含まれて
 います。この命令は、「GOSUB」と対で使われ
 ます。

 専門の仕事が終わったなら、元の仕事に
 戻らなければなりません。元の仕事へと
 戻るための「おまじない」と考えれば
 よいでしょう。

 左、右のどちらのボタンも押していなときは
 2つのLEDを消灯しておかないと、困ったこと
 になります。

 2つのLEDを消灯することを、ひとつの仕事
 としてまとめておきます。2つのピンへと
 論理値'0'を出力します。

200 ' turn off all LED
210 OUT 1,0 : OUT 2,0
220 RETURN

 すべての仕事をプログラムとして書いたので
 ひとつにまとめます。

10 ' winker
20 LET D,60
30 LET L,IN(1) : LET R,IN(2)
40 IF L=1 THEN GOSUB 100 ELSE GOSUB 200 : ' LEFT
50 IF R=1 THEN GOSUB 150 ELSE GOSUB 200 : ' RIGHT
60 IF BTN() GOTO 80
70 GOTO 30
80 ? "EXIT"
90 END
100 ' left flashing
110 OUT 1,1 : WAIT D
120 OUT 1,0 : WAIT D
130 RETURN
150 ' right flashing
160 OUT 2,1 : WAIT D
170 OUT 2,0 : WAIT D
180 RETURN
200 ' turn off all LED
210 OUT 1,0 : OUT 2,0
220 RETURN

 与えられた条件を満たすプログラムは完成しました。

 同じことを実現するプログラムはひとつとは
 限りません。また、プログラムは、短ければ
 短いほど良いとされることもあります。

 左、右のLEDの点灯、消灯は、論理値の'1'、'0'を
 与えるだけですが、ピンが違います。

 ピン番号を変数にして、LEDの点滅処理をひとつに
 まとめられます。

 ピン番号を変数Iに入れて、専門の仕事をする
 プログラム(これをサブルーチンと呼びます)
 をひとつにすると、次のようになります。

10 ' winker
20 LET D,60
30 LET L,IN(1) : LET R,IN(2)
40 IF L=1 THEN LET I,1 : GOSUB 100 ELSE GOSUB 200 : ' LEFT
50 IF R=1 THEN LET I,2 : GOSUB 100 ELSE GOSUB 200 : ' RIGHT
60 IF BTN() GOTO 80
70 GOTO 30
80 ? "EXIT"
90 END
100 ' flashing
110 OUT I,1 : WAIT D
120 OUT I,0 : WAIT D
130 RETURN
200 ' turn off all LED
210 OUT 1,0 : OUT 2,0
220 RETURN

 変数を増やし、繰返しを使えば点滅、消灯でOUT
 命令をひとつだけに減らせます。

 FOR...NEXTのサンドイッチ部分に、OUT命令を
 ひとつ書くようにします。

 言葉では難しそうですが、BASICプログラムは単純。

100 ' flashing
110 FOR J=0 TO 1
120   OUT I,J : WAIT D
130 NEXT
140 RETURN
200 ' turn off all LED
210 FOR J=1 TO 2
220   OUT J,0
230 NEXT
240 RETURN

 短い方がよいと考えば、1行にいくつかの仕事を
 書いて対応します。

100 ' flashing
110 FOR J=0 TO 1 : OUT I,J : WAIT D : NEXT
120 RETURN
200 ' turn off all LED
210 FOR J=1 TO 2 : OUT J,0 : NEXT
220 RETURN


 IchigoJamで入れられるBASICプログラムの文字数は
 決まっているので、1行にいくつかの仕事を入れる
 ことは、長いプログラムを入れるための基本です。

 IchigoJamでBASICプログラムを始めたばかりなら
 1行にいくつかの仕事を書くより、わかりやすい
 構成にすることの方が大切です。

 IF文は、THENを省略できると知ったので、次のように
 書いてもOK。

10 ' winker
20 LET D,60
30 LET L,IN(1) : LET R,IN(2)
40 IF L=1 GOSUB 100 ELSE GOSUB 200 : ' LEFT
50 IF R=1 GOSUB 150 ELSE GOSUB 200 : ' RIGHT
60 IF BTN() GOTO 80
70 GOTO 30
80 ? "EXIT"
90 END
100 ' left flashing
110 OUT 1,1 : WAIT D
120 OUT 1,0 : WAIT D
130 RETURN
150 ' right flashing
160 OUT 2,1 : WAIT D
170 OUT 2,0 : WAIT D
180 RETURN
200 ' turn off all LED
210 OUT 1,0 : OUT 2,0
220 RETURN

 サブルーチンをラベルをつけて利用するようにも書けます。

10 ' winker
20 LET D,60
30 @LOOP
35 LET L,IN(1) : LET R,IN(2)
40 IF L=1 GSB @LFLASH ELSE GSB @LOFF
50 IF R=1 GSB @RFLASH ELSE GSB @LOFF
60 IF BTN() GOTO @EXIT
70 GOTO @LOOP
80 @EXIT
85 ?"EXIT"
90 END
100 @LFLASH
110 OUT 1,1 : WAIT D
120 OUT 1,0 : WAIT D
130 RTN
150 @RFLASH
160 OUT 2,1 : WAIT D
170 OUT 2,0 : WAIT D
180 RETURN
200 @LOFF
210 OUT 1,0 : OUT 2,0
220 RTN

 OUT命令をBUS仕様で使うと、次のようにも書けます。

10 ' winker
20 LET D,60
30 @LOOP
35 LET L,IN(1) : LET R,IN(2)
40 IF L=1 GSB @LFLASH ELSE GSB @LOFF
50 IF R=1 GSB @RFLASH ELSE GSB @LOFF
60 IF BTN() GOTO @EXIT
70 GOTO @LOOP
80 @EXIT
85 ?"EXIT"
90 END
100 @LFLASH
110 OUT 1 : WAIT D
120 OUT 0 : WAIT D
130 RTN
150 @RFLASH
160 OUT 2 : WAIT D
170 OUT 0 : WAIT D
180 RETURN
200 @LOFF
210 OUT 0
220 RTN


目次

inserted by FC2 system