Raspberry Pi : WiringPi-PythonでGPIOの入出力設定の検証

前回はWiringPiインストールついでにPWMが機能するかを勢いで検証した。

Raspberry Pi : WiringPi-PythonでPWM

今回は、GPIOの基本となるIN/OUT設定、プルアップ/ダウンのプログラム指定方法と、ホントにそうなっているのかを検証してみた。

検証方法は、下記のそれぞれのプログラムを実行(設定は都度プログラムで修正して)し、実際にテスターで該当するピンに対して、VDDおよびGNDからの電位抵抗値を測定してみた。

テスターの測定方法が正しいかどうか怪しいところだが、実際にこのピンに対して何かしらの回路へ接続することになるので、目安としてどんな値になるかを体感したかったのが目的。

よくGPIOについて調査すると、**「INPUT/OUTPUTの指定をミスすると短絡するので注意」**を良く見る。理論的には理解できるが、ホントにそうなっていることを確認しないと気が済まないメンドクサイ性格でもある。

GPIO入力の検証

まず、INPUTの検証を以下のサンプルコードで実施。
プルダウン・プルアップ・無しを順番に切り替えて実行した。

#!/usr/bin/env python3
# coding: utf-8

import wiringpi as wp

pin = 23
inout = wp.GPIO.INPUT

updown = wp.GPIO.PUD_DOWN
#updown = wp.GPIO.PUD_UP
#updown = wp.GPIO.PUD_OFF

print( "pin: ", pin, " inout: ", inout, " pull: ", updown )

wp.wiringPiSetupGpio()

wp.pinMode( pin, inout )
wp.pullUpDnControl( pin, updown )

print( "read = ", wp.digitalRead( pin ) )

内部抵抗オフ時の測定結果

raspi_gpio3.jpeg

プルダウン・アップ設定をOFFにした状態の結果は、確かに電圧が不定になった。プログラムで入力値を何度も読み取ると、HIGHとLOWを不規則に繰り返していたことがわかった。あと、VDD間の抵抗値が500kΩと高い抵抗値を示していた。プルアップ抵抗を設定していないので、内部回路全体のインピーダンス?じゃないかと。一般的には、外部でHIGHとLOWを保障する回路にしか接続しない。

ちなみに図中の丸Vは、ラズパイの内部回路で入力電圧をLOW・HIGHのどちらかを判定する回路のイメージ。実際の等価回路は良くわからない。(BCM2835のデータシートをさらっと見てみたが図示されてなかった)

プルダウン設定したときの測定結果

raspi_gpio1.jpeg

もともと内部プルダウン抵抗は50kΩと聞いていたので、そのとおりの結果になった。
この状態で、VDD間にスイッチを通じて接続するだけで、スイッチONのときはHIGHスイッチOFFのときはLOWになる。

気になるのは、VDDとGPIOピン間に関して、電位は3.3Vほどあるのに対して、になっている。短絡状態になってしまっているが、そもそもテスターによる抵抗値の測定方法が良くないかもしれない。

プルアップ設定したときの測定結果

raspi_gpio2.jpeg

プルアップされているので、ピンの電位は3.3V程度になる。GND間の抵抗値が測定不能になっていたので、接続されていないか、ハイインピーダンス状態になっていた。VDD間には185kΩの抵抗値を示した。プルアップ抵抗が50kΩと聞いていたので、50k+αΩということになる。

この状態で、GND間にスイッチを通じて接続するだけで、スイッチONのときはLOWスイッチOFFのときはHIGHになる。

GPIO出力の検証コード

こんどは出力設定の検証。プログラムでHIGHとLOWを設定して実行後、テスターで確認した。

#!/usr/bin/env python3
# coding: utf-8

import wiringpi as wp

pin = 23
inout = wp.GPIO.OUTPUT

output = wp.GPIO.HIGH
#output = wp.GPIO.LOW

print( "pin: ", pin, " inout: ", inout, " output: ", output )

wp.wiringPiSetupGpio()
wp.pinMode( pin, inout )

wp.digitalWrite( pin, output )

print( "read = ", wp.digitalRead( pin ) )

出力HIGHを設定したときの測定結果

raspi_gpio5.jpeg

ピンの電位が3.3Vになっており、抵抗値が21Ωと小さい抵抗値を示した。それなりに電流を流す為に小さくなっているのか、てっきり0Ωだと思っていた。短絡させると、157mAも流れる計算になり許容オーバーなので、抵抗を接続して1ピンあたり16mA、複数ピンでは合計50mAまでに抑える必要がある。(ラズベリーパイの制限)

出力LOWを設定したときの測定結果

raspi_gpio4.jpeg

ピンの電位は0Vで、抵抗値が32.6Ωになった。回路接続時の注意点は、上記と同じ。