Raspberry Pi 4BのGPIO端子に5V系デバイスを接続する時の注意点と対策方法
前回、LCD1602をラズパイで制御しましたが、ラズパイ側のI/O電源は3.3VなのにLCD1602モジュール側が5Vになっているという問題がありました。
ラズパイのI/Oに5Vが入力されると最悪壊れてしまう恐れがあります。
なぜ問題となるのかや、対策方法について詳しく説明していきたいと思います。
事の発端
LCD1602モジュールとラズパイとはI2Cで通信させるので、接続としてはこのようになっています。
I2CはHi側は抵抗でプルアップされています。
Raspberry Pi 4Bの場合、ボード上で1.8kΩで3.3Vにプルアップされています。
一方、今回使用したLCD1602モジュールは4.7kΩで5Vにプルアップされていました。
通常、GPIO端子には静電保護素子(ダイオード)が対電源、GND間に入っています。
したがって、LCD1602側からラズパイ側の静電保護素子を通って電源側へ電流が流れてしまいます。
4.7kΩで電流制限がかかるのですぐに破壊に至るということは無いと思いますが、推奨される使い方ではありませんので対策をしておきたいと思います。
HIGHレベルを計算
I2Cポートの電圧が何Vまで上昇するか計算してみましょう。
静電保護素子のVFを0.6Vとすると、
\[
V_{H} = 3.3V + 0.6V = 3.9V
\]
となります。
このとき流れる電流は、
\[
I_{H} = \frac{5V – 3.9V}{4.7k} = 0.234mA
\]
となります。
この程度の電流であれば、壊れる可能性はほとんど無いとは思います。
GPIO端子の最大定格
最大定格とは、これ以上の電圧を加えるとデバイスが破壊するという限界の電圧です。
Raspberry Pi 4 Model Bのデータシートを見ると、現時点では最大定格の記載はありませんでした。
Raspberry Pi Compute Moduleのデータシートを見ると、最大定格は4.1Vと記載があるので、なんとなく大丈夫なような気はしますが、念のため対策はしておこうと思います。
対策方法
対策案は次の3つを考えました。
- LCD側に3.3Vを供給
- 双方向レベルシフターを使う
- LCD側のプルアップ抵抗を外す
順番に説明していきます。
対策案1:LCD側に3.3Vを供給
一番簡単なのは、LCD側の電源を3.3Vにすることです。
実際やってみると、バックライトがほとんど光りません…
LCD1602のデータシートを見てみると、バックライトLEDの順方向電圧が4.2Vでした。
今回使用したLCDモジュールではこの方法は使えないようです。
LCDモジュールの中には3.3Vで動作するものもありますので、ラズパイで使うなら、そういったLCDモジュールを選ぶのが良さそうです。
対策案2:双方向レベルシフターを使う
入力した信号のHIGHレベルを変換してくれるレベルシフターICを使うのが対策としては確実です。
I2Cバスリピーターでもレベルシフトできるものがあります。
今回の場合でいうと、ラズパイ側からの信号は0V⇔5Vに変換し、LCD側からの信号は0V⇔3.3Vに変換してくれます。
電子工作でやるには、ちょっと大げさという気もします。
対策案3:LCD側のプルアップ抵抗を外す
ということで、今回採用したのはLCD側のプルアップ抵抗を外すという方法です。
これであれば、I2Cバスラインは3.3Vにだけプルアップされることになるので、ラズパイ側の最大定格を気にする必要がありません。
懸念点は、LCD側が3.3VでHIGHレベルを確定できるかという点です。
LCDモジュール(実際にはPCF8574)の入力HIGHレベルは0.7VDDとなっています。
VDD=5Vなら、3.5V以上でHIGHが確定するということになります。
入力HIGHレベルが3.3VだとHIGHが確定できないように思えますが、0.7VDD以上であれば確実にHIGHが確定できるというだけで、実際にはもっと低い電圧でHIGHが確定できます。
試してみると、問題なく動作しました。
仕事でやるならやってはいけない対策ですが、趣味の電子工作であれば、この対策が一番カンタンです!
入力だけならダイオードで対策できる
これまではI2Cに関する対策でしたが、通常のGPIOの場合であればダイオード1つと抵抗があれば対策できてしまいます。
HIGH出力の場合、ダイオードが逆バイアスとなってオフするため、入力側のHIGHレベルはプルアップされた3.3Vとなります。
これにより、5Vから3.3Vへのレベルシフトをすることができます。