Arduinoの便利な機能として内部プルアップ機能があります。
デジタル端子にスイッチを接続しON/OFF判定をする際にプルアップ抵抗やプルダウン抵抗が必要となってきますが、Arduinoの内部プルアップ機能を使うことによりそれら物理的に接続する必要がある抵抗を省くことが出来ます。
またI2C接続の際のデータ信号線SCK/SDAに必要となるプルアップ抵抗もArduinoの内部プルアップ機能によりあまり意識することなく使うことが出来るようになっています。
このようにArduinoの内部プルアップ機能は回路を簡略化し接続も簡単にする事が出来る便利な機能となります!
Arduinoの内部プルアップ機能について
冒頭でお話したようにArduinoの内部プルアップ機能は便利に使える機能です。
Arduinoの内部プルアップの話に入る前にプルアップやプルダウンについて少し見ておきます。
Arduinoに接続したスイッチのON/OFFの判定をしたい場合、どのように接続したらいいのか考えてみます。
単純なスイッチのON/OFFなのでアナログ回路のようにArduinoの[5V端子]にスイッチを繋ぎこれをデジタル端子に接続すれば、スイッチが押されたらデジタル端子が5V(HIGH)になり、スイッチが押されていない時は0V(LOW)となり上手くいくように思いますが・・・
実際にこの回路を使いスイッチのON/OFF判定のテストをしてみます。
デジタル端子D2に接続したスイッチの状態をシリアルモニタに表示させる簡単なスケッチです。
1 2 3 4 5 6 7 8 9 10 11 | void setup() { Serial.begin(9600); pinMode(2, INPUT); } void loop() { int SW = digitalRead(2); Serial.print("デジタルピンD2の状態: "); Serial.println(SW); delay(100); } |
スイッチが押されている状態ではちゃんとON(HIGH)の判定は出来ていますが、スイッチが押されていない状態で観察しているとON(HIGH)になったりOFF(LOW)になったりと上手く判定が出来ていない事が分かります。
上記回路ではスイッチが押されている状態では5Vが入力されHIGH状態が確定されますが、スイッチが押されていない時にはフロートと呼ばれる開放された状態になってしまいます。(デジタル端子に何も繋がっていない状態)
マイコン(Arduino)のデジタル端子がこの開放されている状態になるといろんな要因により状態が安定しなくなってしまいます。
スイッチが押されていない状態でもしっかりとLOWになるように回路を工夫する必要があるということです。
その際にプルアップやプルダウンが使われます。
プルアップ・プルダウンについて
デジタル端子のHIGHまたはLOWをしっかりと確定するためにスイッチのON/OFF判定ではプルアップ回路やプルダウン回路が使われます。
スイッチが押されている時、または押されていない時、どちらの状態でもHIGHまたはLOWのどちらかになるようにするための回路となります。
プルアップ
まずプルアップ回路です。
Arduinoのデジタル入力端子とスイッチとの接続に抵抗を1本付け加えています。
この回路ではスイッチが押されていない状態では抵抗を介してArduinoのデジタル端子に接続されているのでHIGH(5V)となります。
またスイッチが押された状態ではプルアップ抵抗に5Vがかかるため(スイッチ自体の抵抗は限りなく低いので)、Arduinoのデジタル端子はLOW(0V)となります。
スイッチのON/OFFでデジタル端子はLOW/HIGHとなり、スイッチ出力が反転しているのが特徴です。
スイッチの状態 | デジタル入力端子の状態 |
ON | LOW(0V) |
OFF | HIGH(5V) |
これでスイッチがON/OFFどちらの状態でもArduinoのデジタル入力端子はHIGHまたはLOWのどちらかに確定する事が出来るようになります。
この回路をプルアップ回路と呼び使われている抵抗がプルアップ抵抗となります。
プルダウン
プルアップ回路の抵抗とスイッチの位置を変えたのがプルダウン回路となります。
プルダウン回路ではスイッチが押されていない状態ではArduinoのデジタル入力端子はGNDと接続されるのでLOWとなります。
またスイッチが押されるとプルダウン抵抗に5Vがかかりデジタル入力端子もHIGH(5V)の状態となります。
プルダウン回路も同様にスイッチのON/OFFによるデジタル端子の状態がHIGHまたはLOWのどちらかの状態に確定する事が出来るようになっています。
スイッチの状態 | デジタル入力端子の状態 |
ON | HIGH(5V) |
OFF | LOW(0V) |
Arduinoの内部プルアップ機能を有効にする
このように回路に1本抵抗を加えることによりArduinoのデジタル入力端子を使ってスイッチのON/OFF判定を上手くさせることが出来るようになります。
しかし抵抗を用意する必要があり、また回路も少し面倒なものとなります。
そこで便利なのがArduinoの内部プルアップ機能です。
Arduinoのマイコンチップ内でプルアップ抵抗を繋いだ状態に出来るというものです。
Arduinoの内部プルアップを有効にするには、pinMode();関数で[INPUT_PULLUP]を指定するだけです。
Arduinoのデジタル入出力端子D2のプルアップ機能を有効にする場合、
pinMode(2, INPUT_PULLUP);
と記述すれば、D2端子はプルアップされた状態となります。
つまりD2端子にプルアップ抵抗が繋がれたのと同じ状態になります。
先程のスケッチを内部プルアップを有効にしたものに変更するとこのようになります。
pinMode();内の[INPUT]が[INPUT_PULLUP]に変わっているだけです。
1 2 3 4 5 6 7 8 9 10 11 | void setup() { Serial.begin(9600); pinMode(2, INPUT_PULLUP); } void loop() { int SW = digitalRead(2); Serial.print("デジタルピンD2の状態: "); Serial.println(SW); delay(100); } |
そしてスイッチの接続はこのようになります。
先程の回路と違うのは、D2端子とGND間にスイッチが接続されているところです。
これでプルアップ抵抗が繋がれたのと同じ状態なので、スイッチのON/OFF判定をちゃんと行えるようになります。
上記回路では少し分かりにくいのでArduinoの内部プルアップ抵抗も書くとこのようなイメージとなります。
先程のプルアップ回路と同じ接続ですね!
プルアップされた状態なのでスイッチのON/OFFによる入力端子の状態はLOW/HIGHと反転するのも同様です。
スイッチの状態 | デジタル入力端子の状態 |
ON | LOW |
OFF | HIGH |
Arduinoの内部プルアップ機能を使うことにより物理的に接続する必要がある抵抗を省くことができ、回路も簡略化する事が出来ます。
非常に便利な機能ですね!
その他にも、I2C接続の際の信号線(SCK/SDA)の接続で必要となるプルアップ抵抗も通常あまり意識しませんがこの内部プルアップ機能が有効になり省くことが出来るようになっています。
最後に!
Arduinoを使った電子工作でデジタル端子にタクトスイッチなどを繋げたON/OFF判定はよく使われますが、マイコンを使った回路ではプルアップやプルダウンは重要となってきます。
Arduinoには内部プルアップ機能があるので、これを活用すれば便利に使うことができますね。
プルアップ・プルダウンに関しては、こちらの記事でも詳しく解説しているので合わせて見て頂ければと思います。
コメントを残す