manvaのエンジニアリング魂

エンジニアリング・ものづくり・DIYをもっと身近にするためのブログ。インスピレーションを刺激します。

デジタル入力の基礎的な話 - プルアップとかそんなん

自作キーボードで使われるキーマトリクスの話を書こうとしたが、もうちょっと基礎的な話も書いてみた。

普通のスイッチ1個をデジタル入力する場合。下図のような回路で,Vccに繋げばDIはHighとなり,GNDに繋げばDIはLowとなる。
f:id:manva:20210117231024p:plain
ただ,こういうスイッチは値段が高かったりサイズが大きくなったりするので,普通はオン・オフのみのスイッチを使う。その場合,もし,こんなん↓とか
f:id:manva:20210117231040p:plain
こんなふうに↓
f:id:manva:20210117231059p:plain
つないでしまうと,スイッチがオンのときはよいが,オフのとき,線がどこにもつながっていない状態となり,電圧が不確定(静電気や電磁波などで簡単に変わってしまう状態)になる。そこで,↓のように,
f:id:manva:20210120070214p:plain
スイッチオフのときには抵抗を介してGNDにつながるようにしておく。そうすれば,もし抵抗の両端に電位差があっても,一瞬だけわずかに電流が流れてすぐにGNDと同じ電位になるので,DIは安定してLowとなる。このようにGNDにつなぐための抵抗をプルダウン抵抗といい,こんな回路にすることをプルダウンする,という。このプルダウン抵抗は,スイッチオンのとき電流が流れて無駄に電力を消費してしまうのを抑えるため,大きめの抵抗にしておく。この回路だと,スイッチオンのときがHigh,スイッチオフのときがLowとなる(アクティブハイという)。
同様に,下図のようにしても良い。
f:id:manva:20210120070226p:plain
スイッチオフのときはプルアップ抵抗を介してVccにつながる。この回路だと,スイッチオンのときがLow,スイッチオフのときがHighとなる(アクティブローという)。
Pro MicroなどのArduinoマイコンでは、プルアップ抵抗が内蔵されており(内部プルアップ),それを使えばスイッチをGNDに繋ぐだけでDIができる。
f:id:manva:20210117234713p:plain

Arduino IDEでプログラムするなら、以下のように書けば良い。

pinMode(ピン番号, INPUT_PULLUP);