概要
前回は信号自体の伝搬についてでした。非常に重要な概念なので、これを意識しながらGPIOのデジタル入力について学んで行きたいと思います。基本的には測定値をLOWかHIGHかを判定した結果になります。
仕組み

前回と同じような回路になります。GPIOの入力部分にはキャパシタがあり、その電圧を測定をしているイメージになります。これは途中の経路にあるキャパシタ成分をすべて充電しないと、入力の電圧は上がらないためです。とくに長いケーブルなどを使っているとキャパシタの成分が多くなります。
キャパシタですので、充電と放電には時間がかかります。その時間を左右するのが電流値になります。たくさんの電流が流れば速く充放電されます。そして電流を制御するのが抵抗になります。抵抗を減らすことで、電流が増えて充放電速度が上がります。

抵抗がなければ最速なのですが、いろいろ問題が出てきます。前回のようにコイルの成分である寄生インダクタンスによりリンギングが発生する可能性があります。また、GPIOの出力側にも制限があります。多くのマイコンの場合には数十mAまでしか電流を流すことができません。

たとえばESP32のデータシートを確認するとピンによって違うのですがIOHが20mAから40mAまでの出力となります。ここでは20mAとして考えてみたいと思います。(詳細は次回のGPIOデジタル出力で解説予定です)
- オームの法則(抵抗)(keisan)
上記のサイトで電圧と電流から抵抗値を計算してみたいと思います。

3.3VマイコンのESP32で20mAを流す場合は165Ωと出ました。つまり165Ωの抵抗値が出力側に最初から入っている状態とも言えます。

ちなみに電圧と電流の関係は上記になります。オレンジが電流になります。電圧が変化しているときにキャパシタへの充放電がされますので電流が流れています。

抵抗値を増やすことで、充放電のスピードが落ちてその分電流も減ります。ただし、最終的に充放電しないといけない量はほとんど変わらないので、ピークが減っただけで大きく省電力になったわけではありません。また、電源側の最大電流には制限がありますので、ピーク電流を減らすことが必要な場合もあります。
ただし、一般の回路では上記のように大量のキャパシタ成分はありませんので、ここまで電流が流れることはないと思います。
ちなみに電源オンのときに、電源回路の中にあるキャパシタに一斉に充電をはじめるので大量の電流が流れます。ソフトスタート機能とかで、最初の立ち上げをゆっくりすることで防ぐそうです。
判定方法

ESP32のデータシートで確認します。VIHより動作電源の75%以上でHIGH、VILより25%未満でLOWと判定するとのことです。ですが、実際のところ動作電圧の50%ぐらいで判定がされています。この値をスレッショルド(threshold)と呼びます。閾値とも書くのですが閾の漢字をひらいた場合には、しきい値。漢字のままだと「しきいち」、もしくは「いきち」と読みます。読み方は分野によって違うのでどちらでもよいのですが、工学系はしきい値と呼ぶのが多いような気がします。
よくみるとCINでピンにあるキャパシタが2pFであると書いてあります。今回は10nFなので5000倍ぐらい大きな値で実験しています。

上記が3.3Vのときの範囲です。HIGHは動作電圧であるVDD×0.75からVDD+0.3Vの範囲と書いてあります。LOWは-0.3VからVDD×0.25ですね。真ん中にグレーゾーンがありますが、VDD×0.5の1.65V前後でHIGHとLOWの判定をするしきい値が本当はあります。ただし、ノイズなどの影響を受けやすいためデータシート上ではグレーゾーンでの利用を禁止しています。
Arduino UNOなどは5Vで動いているボードになります。そこに3.3Vの信号を入力させると動作電圧に対して66%の電圧であり、ちょっと低いです。通常電圧が違う場合には直接接続しないほうがよいとされています。たまたま動く場合もあるのですが、ケーブルが長くなると抵抗などが増えて更に電圧低下します。いろいろなマージンを考えての75%ですので守るようにしましょう。ちなみに特定のICなどでは60%ぐらいでもHIGHと判定してくれないものもあったりしますので注意が必要です。
さて、気をつけないといけないのは判定で使われるしきい値は、動作電圧に左右されることです。ESP32の場合には3.0Vから3.6Vで動かすことができます。一般的には3.3Vで動かしますが、電圧が変動する場合や特殊な電圧で動かす場合には注意しましょう。

上記の場合は3Vで動かした場合の範囲になります。この場合3.3V以上の電圧は範囲外になります。つまり3.6Vで動かしているESP32と信号を接続するとHIGHの範囲外になります。規定より電圧が超過している場合、最悪壊れる可能性があります。ただし、ESP32は比較的壊れにくいチップのため、3.6Vを入力しても壊れることはほぼないと思います。
シュミットトリガ
ESP32は比較的中央にしきい値がありましたが、ばたばたする信号の場合に判定基準を安定化させる仕組みがあります。シュミットトリガは電圧が上がっていくときと、下がるときでしきい値を変更するような仕組みになります。

上記のように真ん中ぐらいではなくて、上下に寄っている場所にしきい値があります。LOWの時にはLOW→HIGHの電圧を越えた場合にトリガがかかり、HIGHに変更されます。同じようにHIGHの時にはHIGH→LOWの電圧を下回った場合にトリガがかかり、LOWに変更されます。シュミットトリガはトリガとトリガの間で信号が変化しても前の状態を保持する性質があります。これにより中間のグレーゾーンでの信号変化でばたばたと信号レベルが変更されることがなくなります。

上記は信号がばたばたしているときの図になります。シュミットトリガがない場合には①②③などの場所でも入力値が変更されます。シュミットトリガがあることでノイズなどの影響も受けにくくなります。非常に便利な機能なのですがESP32では搭載されていません。Arduino UNOなどには搭載されているので、利用するボードなどの仕様を確認する必要があります。
トレラント
ESP32は3.3Vで動作させた場合には+0.3Vの3.6VまでがHIGHの範囲でした。例えば5Vで動作しているArduino UNOと直接接続することがはできません。ただし、一部のマイコンなどでは5Vトレラントという機能があります。これは動作電圧とは関係なく、5Vの入力を受け付けても壊れないという機能になります。有名なところでSTM32では一部のピンが5Vトレラントになっています。逆にすべてのピンが5Vトレラントではないので、間違ったピンに5Vを流すとマイコンが壊れてしまいます。
違う電圧の信号を通信する方法はいろいろあるのですが、長くなりますので後日まとめたいと思います。
フローティング

たとえば上記みたいな回路を作ったとします。ボタンを押すとVCCに接続されていますのでHIGHになります。さて、ボタンを離したときはなにになるでしょう。実は不定です。なにになるかわかりません。入力の部分にはキャパシタがあり、そこの電圧を計測していると最初に書きました。キャパシタには電荷と呼ばれる静電気のようなものが溜まっています。自然放電する分もあるのですが、一定の電圧が残ることが多く未接続のピンの入力値は信用してはいけません。
どこにも接続されていないピンをフローティングや浮いていると表現します。マイコンで未使用のピンについてデータシートでどこに接続するか指定がある場合があります。フローティング、VCC、GNDの3パターンありますので注意してください。
ちなみにタッチセンサーなどはわざとHIGHを一瞬出力して充電した状態にしてから読み取ります。人が触っていると電荷が人に移動しているのでタッチの判定ができるようです。
プルダウン

プルダウンは、GNDに引っ張るという意味の回路になります。上記のように抵抗経由でGNDに接続することで常に入力に溜まっている電荷をGNDに吐き出しています。これによりボタンを押していないときはLOWで安定します。ボタンを押すと抵抗経由でGNDにも無駄に電流が流れるのですが、OUTの入力端子にも十分な電圧が入力されるためにHIGHになります。
プルアップ

逆にVCCに引っ張るプルアップという回路もあります。上記のように抵抗経由でVCCに接続するので、ボタンを押していない時にはHIGHで安定しています。ボタンを押すとGNDに接続されるのでLOWになります。このとき抵抗経由でVCCからGNDに無駄に流れる電流があります。
プルダウン or プルアップ?
どちらでも構いません。ただし、プルアップを利用している場合が多いです。VCCとGNDではGNDの方が基板のいろいろな場所で接続しやすいです。プルダウンだとボタンの近くにVCCがない場合にはわざわざ引っ張ってくる必要があります。GNDは大抵の場合近くにあることが多いので接続しやすいです。
- オームの法則(電流)(keisan)
上記サイトでボタンを押したときに流れる電流を電流と抵抗値から計算してみました。

0.33mAと十分小さい電流ですね。一般的に10KΩが使われることが多いですが、他の値でも構いません。100KΩにするとボタンを押したときの消費電力を更にへらすことができます。ただし、その分ノイズにも弱くなります。逆にプルダウン抵抗を小さくしすぎてしまうと電流が流れすぎてしまいますので3.3Vの場合には1Kぐらいまでにしたほうがよいと思います。
内蔵プルアップ、プルダウン
ESP32などのマイコンでは内部にプルアップ抵抗とプルダウン抵抗があり、設定により有効化することができます。これにより外部の回路を使わなくてもプルアップやプルダウンが可能になります。今回紹介したボタンなどのプルアップやプルダウンであれば内蔵のもので十分だと思います。ESP32内部では45kΩの抵抗が使われているようです。ただし、入力専用ピンでは抵抗が内蔵されていないので利用できません。内蔵抵抗を利用する場合には事前に使えるか確認をしてから使ってみてください。
まとめ
いろいろあり複雑なんですが、出力はさらにいろいろな要素が絡みます。入力側はフローティングに注意すれば、あとは出力側の問題が多いです。第一回の「データ伝搬」の概念が重要で、あれを頭に入れながらいろいろ考えてみてください。





コメント