Raspberry PiのGPIOは起動直後から内部プルダウンされている

Raspberry Piで電子工作をするときの話題です。

Raspberry PiにはGPIOと呼ばれる電子工作に使う端子が出ています。これらのGPIO端子は「プルアップ抵抗」「プルダウン抵抗」の2つを内蔵しており、ソフトウェアから有効・無効を切り替えることができます。

ちなみに、プルアップ・プルダウンというのは端子に何も接続されていない状態で電気的に安定させるためのテクニックで、端子と電源の間に抵抗を入れて接続したり(プルアップ)、端子とグランドの間に抵抗を入れて接続したり(プルダウン)することを言います。

ところで、起動直後にこれらの設定がどうなっているかの資料が見つからなかったので、手元のRaspberry Pi 2で実験してみました。結論としては全端子が初期状態でプルアップまたはプルダウンされており、電気的に不安定なハイインピーダンス状態の端子は一つもないようでした。

一方で、一部書籍・雑誌記事では起動直後のGPIO端子がハイインピーダンス状態になっているかのような記述がありました。初心者が混乱する原因になりかねず、よろしくないですね。

初期状態の一覧

起動直後のRaspberry Pi 2について、全端子を調査した結果は以下の通りです。Raspbianの設定は特に変更しておらず、UART以外の機能は無効になっています。

初期状態 GPIO番号   GPIO番号 初期状態
3.3v   5v
1 2   5v
1 3   GND
1 4   14(TxD) -
GND   15(RxD) -
0 17   18 0
0 27   GND
0 22   23 0
3.3v   24 0
0 10   GND
0 9   25 0
0 11   8 1
GND   7 1
- -   - -
1 5   GND
1 6   12 0
0 13   GND
0 19   16 0
0 26   20 0
GND   21 0

「初期状態」欄が1になっているポートは起動直後からプルアップされています。0ならプルダウンです。これは適当な抵抗を入れつつテスターで電圧値を測定して確認しました。

これらの内蔵プルアップ・ブルダウン抵抗の大きさは、GPIO2番3番のみ1.74KΩ、他のポートでは47.5KΩと推定しました。ネット上の情報では1.8KΩおよび50KΩという情報が見つかりますので、それなりに妥当そうです。

また、この結果はSoCの初期状態とも矛盾しません。下記URLの「Pull」欄がSoCの初期状態を示していますが、上の表と完全に一致しています。

書籍での混乱

ところで、僕が先日買った雑誌にはGPIO20番ポートと3.3V電源の間に10KΩ抵抗を接続してプルアップする、という記述がありました。既にプルダウンされている端子と電源を接続しても余計な電流が流れるだけですから、このライターさんが Raspberry Pi の初期状態を知らず、ハイインピーダンス状態だと誤解しているような気がします。

さらに悪いことに、雑誌記事連動のキットには10KΩ抵抗の代わりに100KΩ抵抗が入っていました。端子がハイインピーダンス状態であれば100KΩでもプルアップできたはずですが、実際には50KΩ抵抗でプルダウンされているため、電源との間に100KΩ抵抗を入れても端子の入力はLOWのままになってしまって誌面の記述通りには動かない状態でした。

とはいえ、このライターさんだけに問題があるわけでも無さそうです。というのも、ほぼ同じ記述を別の書籍でも見つけたからです。一般論として書籍の情報は信頼できそうに感じてしまいますから、同じ間違いをしているなら雑誌より書籍の方が罪が重いような気がします。

そもそも電子工作まわりって必要な知識の範囲が広い上に資料も不親切なものが多いので、書籍もピンキリになりやすい傾向がありそうです。特に最近は電子工作ブームとも呼べる状況ですから、書籍ごとのレベル差が広がっているのかもしれませんね。