はじめに
大学で電子工作に触れていた時に、よくでてきたプルアップ回路やプルダウン回路。おそらく、電子工作を使ってなにか作品を作りたいという熱意を持つMakerならば、必ず一度は耳にしたことがあるのではないでしょうか。マイコンのピンを使った検知をしようとした際に必ず頭の片隅に留めて置かなければならない単語です。私が初めて耳にした時にとても理解に時間がかかってしまったので(非理系というのもあったのですが)、少しでも理解を深めるためにも記事にしました。こういう分野に詳しいベテランの方の意見も是非聞いてみたいので、少しでも記事内容に疑問点や、こんな面白いことあるよ!というのがありましたら、容赦なくコメントいただければと思います。
ダメな回路(オープン回路・ショート回路)
例えば、以下のような回路でHighかLowを検知したいとします。
インプットのピンを検知ピンとしたとき、ボタンがOFF(図の状態)のときは、Vccと繋がってないからLow、逆にボタンがOFFのときは、Vccと繋がっているからHighだよね!ということで一見間違った回路ではないように見えます。
しかし、結論からいうとこの回路はNGです。ボタンがONのときは正しい検知が可能ですが、OFFのときを考えてください。完全にインプットピンが宙ぶらりんになってしまっています。これをオープン(開放)と呼び、ここではオープン回路と名付けます。このオープン回路はダメな回路です。
では、次のパターンの回路はどうでしょうか。
少しだけ複雑になりましたね。ボタンの配置がインプットピンと並列に並んだようになっています。この場合、インプットのピンを検知ピンとしたとき、ボタンがOFF(図の状態)のときは、Vccと繋がっているからHigh、逆にボタンがONのときは、GNDと繋がっているからLOWかな?ということで、これも間違っていなさそうです。
しかし、この回路には大事故に繋がるトンデモナイ罠が隠されています。ボタンがONのとき、すなわち繋がっている状態を考えてみましょう。Vccからかかる電圧は、図の点部分で並列にインプットピンがある方とボタンがある方にかかっていきます。ここで、並列回路時の電圧のきまりを思い出してください。ボタンの方にかかっていく電圧V1とインプットピンの方にかかっていく電圧V2は等しいです。
つまり、上の図に落とし込むと、
V = V_{1} = V_{2}
となります。インプットピンの方は、マイコンのインプットピンがそれなりの大きな抵抗値をもっているため、特に問題はないでしょう。危険なのはボタンの方に流れた電圧にあります。ボタンというのは殆ど抵抗値を持っていません。ということで、オームの法則を使って流れる電流量I1を計算してみましょう。(オームの法則については、他サイトを参考にしてください)
I_{1} = \frac{V_{1}}{R_{1}}
上記が電流量I1を求める式で、ボタンの抵抗値R1は極めて0Ωに近い数値です。するとI1はいくつになるでしょうか。分母がほぼ0ということは、I1→∞(無限大)になってしまうことがわかると思います。これだけ大きな電流が流れるのが危険というのは、言及しなくてもわかるかと思います。これをショート(短絡)と呼び、ここではショート回路と名付けます。このショート回路もダメな回路です。まあ実際はマイコンにそこまで大きな電流を流す力はないので、大事故になっちゃうというのはないかと思います。
OKな回路(プルダウン回路)
さてここからが記事の本題です。次の回路をみてみましょう。
2つのダメな回路と大きく違うのは、抵抗があることです。この抵抗が、ショート回路で問題となったショートを防ぐ役割を果たします。インプットのピンを検知ピンとしたとき、ボタンがOFF(図の状態)のときは、GNDと繋がっているからLow、逆にボタンがONのときは、Vccと繋がっているからHighを検知することができます。結論から言えば、この回路はOKです。理由は、抵抗を介したおかげでショートが発生しなくなるからです。この抵抗をプルダウン抵抗といい、この回路をプルダウン回路といいます。
またプルダウン抵抗というのはもう一つ大きな役割を担っています。インプットピンとGNDを繋げているこの抵抗は、フローティング(floating)対策としても使われます。どこにも繋がれていないピンは静電気等でHighとLowを不安的に行き来するわけですが、これをGND側に引っ張ってLowに安定させることから引っ張り下げるの意味を込めてプルダウン抵抗です。
OKな回路(プルアップ回路)
次の回路はプルアップ回路です。プルダウン回路と何が違うかが重要ポイントです。
抵抗とボタンの位置が入れ替わっただけですが、仕組みが大きく違います。インプットのピンを検知ピンとしたとき、ボタンがOFF(図の状態)のときは、Vccと繋がっているからHigh、逆にボタンがONのときは、GNDと繋がっているからLowを検知することができます。この回路も勿論OKです。理由は、この抵抗をプルアップ抵抗といい、この回路をプルアップ回路といいます。検知がプルダウン回路と正反対であることに注意です。プルダウン回路よりもよく使う印象があります。
マイコンピンの内部プルアップ
上記はマイコン外でプルアップ回路を作成していますが、実はマイコンでよく使われているArduinoおよびRaspberryPiにおいては、内部で既にプルアップ回路を形成しているおかげで、上のような組み方をしなくても大丈夫...なようです。
(Arduino)
いくつか種類がありますが、マイコンチップがATmega328なら可能と書いてあったので、おそらく一般的なUNOでもできるような気がします。ピンの動作を入力か出力に設定するpinMode(pin, mode)
をセットアップ内で行う時、第2引数のmodeにINPUT_PULLUP
とすることで、内部プルアップを有効にできるようです。普通にINPUT
だと有効にならないので要注意です。
(RaspberryPi)
いろいろと調査してみましたが、できるという記事とできないという記事があるので怪しいです。ただできるという記事に関して言及すると、GPIO2とGPIO3は内部で抵抗が接続されているようです。(1.8kΩとの記述あり)ラズパイのプロセッサは、ソフトウェアの書き方次第でプルアップ設定ができるようなので、なんとな〜くいける気がします。ただ、手違いでダメだった!ということも考えられるので、マイコンに頼らずに自分で回路を作成した方が安全な気がします。
まとめ
プルアップ回路とプルダウン回路についてまとめてみました。
回路 | ボタンON | ボタンOFF |
---|---|---|
プルアップ | Low | High |
プルダウン | High | Low |
プルアップ・プルダウン抵抗に用いる抵抗値はおおよそ10kΩくらいが良いとされているみたいです。値によってまた違いがあり、プルアップかプルダウンでの違いもあるので、よく調査して再度記事にしたいと思います。
追記
- 12/21「マイコンピンの内部プルアップ」を作成しました。