プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

ラズパイゼロのプルアップ抵抗を調べる

ラズパイでいよいよIOTを始めようとGPIOの資料を読み漁っていたら、ラズパイのGPIOは内部プルアップまたはプルダウンされているという情報を見つけた。

d.hatena.ne.jp

プルアップ・ダウンは、使われていないGPIOをHIGH(3.3Vや5V) or Low(0V = GND)に高抵抗で接続して、入力を安定させるためのものである。
f:id:s51517765:20180128180703p:plain
GPIOの内部は上左図のように電源(3.3V or 5V)が直接ヘッダピンに来ていると思いがちだが、上右図のように、10kΩ程度の抵抗が入っていることがある。これがプルアップである。

プルアップがあるかないかで、どのように影響があるかはたとえばGPIOの1番と3番にLEDをつけてみるとわかる。
GPIO1はいわゆる3.3Vピンで、GPIO3は出力をプログラムで制御できるピンである。
開放状態でテスターをあてるとどちらも3.32V(個体差があるかも)であるが、LEDの明るさが全く違う。
f:id:s51517765:20180128183857j:plainf:id:s51517765:20180128183850j:plain
このように見かけ上同じ3.3Vでもプルアップであるかそうでないかは出力におおきな違いをもたらす。
そこで、実際のところどれくらいの抵抗が入っているのか?設定はプルアップなのかプルダウンなのかを実際に調べてみた。

プルアップ抵抗は↓のように適当な抵抗(ここでは680Ω)を接続し、その抵抗の両端の電圧を測定するとわかる。
f:id:s51517765:20180129213617p:plain

ここでは、ラズパイゼロは電源を入れただけの状態(Raspbianが起動している状態)である。
(また別途試す予定だが、プルアップ・ダウンの有効無効はpythonなどで切り替えられる。)

次の表は、GPIO開放状態の電圧と、680Ωの抵抗を接続したときの電圧をすべてのピンについて実測したものである。
f:id:s51517765:20180128184725p:plain

この結果から内部プルアップ抵抗をR0として、たとえばGPIO7では680Ωの抵抗の両端は0.04V、開放の時の出力が3.15Vであることから、
680Ω+内部抵抗R0で3.15Vとなり、680Ωで0.04Vなので
f:id:s51517765:20180128185102p:plain
たすき掛け計算より、
680*3.15=0.04*R+0.04*680
R0=52,870(Ω)≒53.8k(Ω)と算出できる。
同様にGPIO3,GPIO5は約1.7kΩ。

次に、プルダウン設定になっているピンについては、反対に3.3Vに引っ張り上げて測定すれば算出できる。
f:id:s51517765:20180129213710p:plain

f:id:s51517765:20180128185709p:plain
ここでも、測定電圧は同様に抵抗の両端の電圧である。

こちらは、GPIO8、GPIO15が0で、それ以外が約70.7kΩと算出できた。

しかし、プルアップとプルダウンで抵抗値がちがうのは不自然である。
電圧の読み取り値が0.04Vと0.03Vなので、テスターの分解能+誤差の問題と推定される。
つまり、どちらの場合も本来は0.03~0.04V程度で±0.02V程度の誤差がある可能性がある。
つまり0.02Vが真値であれば約106kΩとなり、0.06Vであれば約35.4kΩとなってしまう。

そこで、基準抵抗を19.9kΩにして再度測定してみると、基準抵抗両端の電圧が大きくなるのでより正確に測定できる。結果、約46.4kΩと算出された。

まとめ

プルアップ・ダウン抵抗値は、GPIO3、GPIO5が1.7kΩ、その他は約46kΩである。
最初に引用したページでの推定結果ともほぼ一致している。
また、測定結果が基準抵抗(最初に使った既知の680Ωのこと)と大きく離れていたら近いサイズのもので再測定するとより正確に算出できる。

ちなみにプルアップを使うべきかプルダウンを使うべきかでは、論理を反転すれば大抵はつかえるが、間違って配線や出力設定をしてしまったときの安全を考えると、電源に抵抗がついているプルアップのほうが安心である。