5.1 デジタル入力を使う

ここまでは、LEDを光らせるという出力について扱ってきました
次は、マイコンに外部から入力をしてみましょう

ボードの下の部分を見てください。

図5-1 2つのボタン

ボタンが2つあるのが分かるでしょうか?
左側のボタンの上にはP1.3と
右側のボタンの家にはRESETと
シルク印刷されています。

印刷通り、
左側のボタンはマイコン左側上から5本目のP1.3ピンに
右側のボタンはマイコン右側上から5本目のRSTピンに
それぞれつながっています。


RESETボタンは、ボタンを押すとマイコンは動作を止め、
ボタンを離した瞬間からプログラムを最初(setup関数)から始めます。
ボタンを押す以前の動作は全てクリアされます。

P1.3につながれたボタンは、
図5-2に示すような回路でマイコンのピンに接続してあります。

図5-2 P1.3の回路

つまり、ボタンを押すと電圧の低い状態 (0「V]) に
ボタンを離すと電圧の高い状態 (+3.3[V]) になります。

では、新しく以下のようなプログラムを作ってみましょう。

int buttonState = 0; 

void setup() {
  pinMode(P1_0, OUTPUT);      
  pinMode(P1_3, INPUT_PULLUP);     
}

void loop(){
  buttonState = digitalRead(P1_3);

  if (buttonState == HIGH) {     
    digitalWrite(P1_0, HIGH);  
  } 
  else {
    digitalWrite(P1_0, LOW); 
  }
}

このプログラムでは、setup関数で
P1_0の赤色LEDのつながっているピンを出力に
P1_3の左側SWのつながっているピンを入力にしています。
INPUT_PULLUPについては、後で解説します。

loop関数ではP1_3の状態をdigitaiRead関数で読み取っています。

関数の書式は

digitaiRead(ピン番号);

となります。

digitaiRead関数は、int型の値を返しますので

  buttonState = digitalRead(P1_3);

のようにint型の変数に代入する形で使います。
P1_3の状態が高い電圧ならHIGHを低い電圧ならLOWを返します。

if-else文では
P1_3の状態がHIGHならP1_0をHIGHに
HIGHでないときP1_0をLOWにしています。

これによって、ボタンが押されていないときは赤色LEDが光り
ボタンが押されると赤色LEDが消えます


では、なぜsetup関数でINPUT_PULLUPとしていたかの話に移ります

入力にするときには単に

  pinMode(P1_3INPUT);     

とすると、入力モードになります。

ここで出てきたPULLUP(プルアップ)とは
電圧の高い側との間を抵抗によってつなぐことを指します
このとき使用する抵抗をプルアップ抵抗といいます

図5-2からわかるようにLaunchPadのタクトスイッチは
(この基板についているタイプの押しボタンスイッチをタクトスイッチといいます)
47kΩのプルアップ抵抗でプルアップされています。

この抵抗のおかげで、ボタンが押された場合でも
+3.3[V]とGNDが直接つながる(ショートする)ことはありません。
この抵抗によって安全にマイコンの入力ピンに電圧を加えることができます。
スイッチを使うときには、このようにスイッチがONになったときでも
回路がショートしないように抵抗を介した状態でマイコンにつながなくてはいけません。
マイコンは、非常に精密にできていますので
大きな電流を扱うことはできません
外部から大きな電流が流れ込めば故障の原因になります。

この図5-2の回路の場合
仮にマイコンのP1_3が入力であり、P1_3の電圧が低い状態だとしても
47kΩの抵抗で+3.3[V]に接続されているので

3.3[V] / 47000[Ω] = 0.000070 [A] = 0.070[mA]

の電流がマイコンに流れ込むだけですみます。
これはLEDを光らせる電流(約10mA~20mA)よりもずっと小さく
マイコンが故障することがありません。

これが、プルアップ抵抗を使ってマイコンにスイッチの入力を接続するときの定番の回路です。

しかし、スイッチを接続するピン毎に抵抗を接続するのは少々面倒です。
そこで、そのプルアップ抵抗を簡略化できるように、
マイコンの内部にプログラムでON/OFFできるプルアップ抵抗が準備されています。

つまり、ボタンを図5-3のようにマイコンのピンとGNDの間に接続しても
同じような動作させることができます。
なお、図5-3で青い点線の右側がマイコンのIC内部です。
青い点線の左側がマイコンのICの外側(足の外)になります。
この回路の場合、ピンモードは必ずINPUT_PULLUPにしなければいけません。


図5-3 マイコン内部のプルアップ

でないと、ボタンを押しても、離しても
ずっと0[V]のままです。

0 件のコメント:

コメントを投稿