意外と知られていない?INPUT_PULLUP

Arduino IDE 1.0.1からの新機能でpinMode関数の第2引数にINPUT_PULLUPキーワードが使えるようになっています。この機能、便利なんですけどあまり知られていないのかもと思い、改めてご紹介いたします。

Arduino IDE のメニューから「ファイル」→「スケッチの例」→「02.Digital」→「Button」をクリックすると、タクトスイッチや押しボタンスイッチを押している間、LEDが光るスケッチが開かれます。本当に基本的なボタンの使い方ですね。スケッチの先頭に配線方法が書かれています。

この通りに配線すると下図の様になります。

LEDは、Arduino Uno上のモノを使うことにして配線を省略しています。
回路図にすると

こんな感じですね。ボタン読み取りピンは、ボタンが押されていない時にGNDに繋がるようにプルダウン抵抗が入っています。 この時にボタンピンを読み取るとLOWになりますね。ボタンが押された時には+5Vに繋がり、読み取るとHIGHになる仕組みです。
このスケッチではボタン読み取りピンの設定でpinMode(buttonPin, INPUT);INPUTキーワードを使っています。

ここで、このINPUTキーワードの代わりにINPUT_PULLUPキーワードを使ってみましょう。このキーワードを使うと、そのピンがINPUTモードになると共に、マイコンチップ内部のプルアップ抵抗が有効になります。先ほどの回路ではプルダウン側に抵抗が入っていたのですが、逆のプルアップが有効になるので、ボタンを押していない時と押した時の関係が逆になるように配線(回路)とスケッチを直さなければなりません。

配線は

先ほどのと比べると、抵抗とジャンパワイヤが1本減ってずいぶんシンプルになりましたね。

回路図は

こうなります。普通の回路図では書かれない内部のプルアップ抵抗も比較のため表してみました。抵抗値はデータシート上最小20KΩ~最大50KΩ程度の様なので、間をとって33KΩの表示をしました。

さて、このように回路を組み、読み取りボタンの設定を pinMode(buttonPin, INPUT_PULLUP); と変更します。すると、ボタンが押されていない時にボタンピンを読み取るとHIGHになり、ボタンが押された時にはLOWになります。最初とは逆の値で読み取られるため、読み取った値を使う部分も変更しなければいけません。
if (buttonState == HIGH) { この判定を逆の if (buttonState == LOW) { に変えましょう。

これで、元のスケッチ・回路と同じ動作になりましたが、ボタンの状態がどうなった時の処理なのか、分かりにくいですね。そこで、buttonONbuttonOFFという定数を用意してこれと比べる様に直してみます。

これで、分かりやすくなったでしょうか。
今回はArduinoのAVRマイコンチップが持つ内部プルアップ抵抗の機能をINPUT_PULLUPキーワードで使ってみました。 これを知っていれば、配線やパーツを減らすことが出来ますので、ぜひご活用下さい。

Pocket