GPIO
from https://iot.keicode.com/raspberry-pi/pinout.php
from https://tool-lab.com/make/raspberrypi-startup-22/
GPIO の番号は BCM ピン番号で割り当てられており、通常プログラミング時には BCM 番号を使います。
from https://tool-lab.com/make/raspberrypi-startup-22/
今回はRaspberry PiのGPIOピンの概要を確認します。GPIOのピン番号や電気的仕様を確認したあと、GPIOピンにLEDを接続する回路とスイッチを接続する回路を検討します。
今回の説明内容は以下になります。
- GPIOピン番号
- GPIOピンの電気的仕様
- GPIOピンのLEDを接続する回路
- GPIOピンにスイッチを接続する回路
- プルアップ抵抗・プルダウン抵抗の注意点
- 補足 – Raspberry Pi内部のプルアップ・プルダウン抵抗
GPIOピンの番号
Raspberry Piにはプログラムで制御できるGPIOピンは26本あります(第一世代A+/B+と第二世代の場合)。プログラムで制御する際、どのGPIOピンを制御するのかを番号で指定します。
番号の指定方法は2種類あります。
一つはRaspberry Pi本体のピン番号です。以前説明しましたが、Raspberry Piの拡張ピンには番号が振られていて、以下のようになっていることを確認しました。(図はRaspberry Pi本体を逆においています)
このピン番号を使って、「何番のピンの出力電圧を3.3Vにする」などと指定する方法です。
もう一つはGPIO番号を使って指定する方法です。GPIO番号は、2番〜27番の連番になっています。ボードのピン番号で指定した方がわかりやすい気もしますが、GPIO番号は連番になっているので、プログラムを作る際にはこちらの方が便利かもしれません。
このGPIO番号についてもうちょっと詳しく説明しておきます。
Rasbperry Piの処理の中心となるプロセッサはブロードコム社の「BCM2836」(あるいはBCM2835)が使用されています。このプロセッサは非常に多くのピンがあり、その中にGPIOピンもあります。このプロセッサのGPIOピンは53本あります。この53本のGPIOピンのうち、2番から27番の26本が拡張コネクタに接続されています。例えばBCM2836にはGPIO2というピンがあり、これが拡張コネクタの3番ピンに「GPIO2」として接続されている、という感じです。
プロセッサの残りのGPIOピンはRaspberry Pi内の制御に使われていたりします。
ちょっと話が飛びますが、Pythonでよく使われているGPIO制御ライブラリでは、プログラムの最初でボード番号で指定するのか、GPIO番号で指定するのかの設定をします。その際、ボード番号の場合は “BOARD”、GPIO番号の場合は “BCM”と指定します。このBCMはプロセッサ名に由来しています。
それでは、どのピンがどのGPIO番号に割り当てているか、以下の表で説明します。
GPIOの番号自体は連番になっているものの、配置は結構バラバラですよね。ちゃんと並べてくれればいいのに、という気もしますが、これは仕方ない面もあります。拡張コネクタのGPIOピンは、プロセッサのGPIOピンから配線して接続する必要があります。プロセッサ(BCM2836)は非常に多くのピンがあり、他の配線も多くありますので、拡張コネクタ上に連番で並べようとすると配線が交差してしまいうまく配線できなくなってしまいます。交差を緩和する方法もありますが、そうすると製造コストが高くなってしまいます。ということで、このような配列で決着したのだと思います。
なお、GPIOピンの中でもGPIO2とGPIO3は内部で抵抗が接続されていますので、これらのピンを使用する場合、回路上問題ないか確認する必要があります。これについては、スイッチを接続するセクションで詳しく説明します。
また、ボードピン番号の27番と28番のID_SDとID_SCは外部にEEPROMというデータを記憶するための部品を接続するピンですが、あまり使用しないと思います。
なお、GPIOピンで出力電圧を制御したり、電圧値を読み取ったりできますが、出力電圧を制御するのか、あるいは電圧値を読み取るのかは、プログラムで各GPIOピンの役割を設定します。Raspberry Piでは、このように出力電圧制御や入力電圧の読み取り以外にも、設定を変えると外部とデータ通信も可能になっています。このデータ通信を行う場合は、データ通信の方法により使用するピンが決められています。この入門シリーズの範囲を超えてしまいますが、例えばSPI通信という規格があります。このSPI通信では、GPIO7〜GPIO11の5ピンがこの通信のために専用に割り当てられます。GPIOピンの役割はこのようにプログラムで設定をして使うことになります。
GPIOピンの電気的仕様
先ほど説明しました通り、GPIOピンはプログラムの設定で、出力電圧制御ができるようにしたり、入力電圧の読み取りができるようにすることができます。
それぞれのケースで、電気的な制限がありますのでまとめておきます。
まず、出力電圧を制御する際の制限です。GPIOを出力電圧制御ができるように設定すると、Raspberry Piの内部の電気的な動作は以下のようになります。
この状態で例えばLEDを光らせる回路を接続すると、以下のように電流が流れます。
GPIOを出力電圧制御にした場合、このように電流が流れますが、この電流には以下のような制限があります。
- GPIOピン1本あたりの最大電流は16mA
- 複数本のGPIOピンを使用する場合、同時に流せる電流の合計は50mAまで
「制限」と書くと、例えばGPIOピンに20mA流れるようなLEDを光らせる回路を接続した場合、GPIOピンから流れる電流は16mAで制限される、という意味に取られるかもしれません。でも実際には、20mA流れるような回路を接続すると20mA流れてしまいます。上の制限とは、この値を超えないように電子回路を設計してください、いう意味になります。では、上の制限を超えて使用するとどうなるかというと、これはプロセッサ(BCM2836)の制限ですので、いずれプロセッサがダメになってしまいます。
また、複数本のGPIOピンを使用する場合は、1本のGPIOピンに流す電流が16mA以内であっても、同時に流れる電流の合計は50mAを超えないようにします。GPIOピンは26本もありますので、26個のLEDを光らせることはできますが、それぞれのLEDに流れる電流が2mAでも合計電流は52mAとなりオーバーしてしまいます。
GPIOピンで出力電圧制御をする電子回路を設計する場合は、電流についてはかなり余裕を持った設計にしましょう。ギリギリで設計すると、例えば部品のばらつきや温度変化で特性が変わってきますので、余裕を持った設計をするようにします。目安としては、制限の半分、というところでしょうか。
次に電圧を読み取る場合の制限です。
GPIOピンで電圧を読み取るようにした場合、Raspberry Piの内部は以下のようになります。
この時、GPIOピンに入力する電圧は、0V〜3.3Vの範囲内にする必要があります。3.3V以上の電圧を加えると、先ほどの電流のケースと同様に、プロセッサがダメになってしまいます。
なお、Raspberry PiのGPIOピンは電圧値そのものを読み取ることはできず、0Vか3.3Vかのどちらかを読み取ることになります(例えば1.5Vの時に、1.5Vとして読むことはできない)。では、中間の値の時はどうなるのかというと、以下のようになります。
電圧 | 読み取り値 |
---|---|
0V〜0.8V | 0Vとして読み取る |
0.8V〜1.3V | 不定 |
1.3V〜3.3V | 3.3Vとして読み取る |
GPIOで電圧を読みとる場合、3.3Vを超えないようにすることも重要ですが、0Vから3.3Vのどちらかをきちんと読み取れるようにすることも大切です。
GPIOピンにLEDを接続する回路
GPIOピンにLEDを接続して点滅制御する回路を検討してみます。といっても先ほど例としてあげましたので、以下のように接続すればLEDを点滅制御できますよね。
このような回路にすれば、プログラムのGPIOピンのスイッチをONにすると、GPIOピンの出力電圧は3.3VになってLEDが光ります。当然、スイッチをOFFにすればLEDは光りません。(スイッチは実際にあるのではなく、電気的に制御しているだけです)
もう一つ、以下のように接続する方法もあります。
この場合は、スイッチをOFFにするとLEDが光り、ONにすると光りません。これは前回説明したように抵抗やLEDに電位差があるかないかで考えればわかりますよね。
でも下の方は、スイッチの状態とLEDの光る状態が逆なので分かりづらいですよね。Raspberry PiのGPIOピンの場合は分かりやすい上の方の接続で問題ないですが、他の電子回路の場合は下のケースの方が有利な場合もあります。
上の方は、スイッチをONにするとGPIOピンから電流が抵抗・LEDに流れ出ます。これをソース電流と呼んでいます。(「ソース」は源、出どころ、とかいう意味です)
これに対して、もう一方の接続方法は、スイッチをOFFにすると、抵抗・LEDを通してGPIOピンに電流が流れ込みます。これをシンク電流と呼んでいます。(「シンク」は沈み込むなどの意味です)
Raspberry PiのGPIOピンの場合、ソース電流とシンク電流の制限は16mAで同じ仕様になっています。でもこの電流はいつも同じとは限らず、他の電子部品(マイコンなど)では、製品によっては、電流制限はソース電流よりシンク電流の方が大きい場合があります。そのような場合、より大きな電流を流すためにシンク電流でLEDを光らせるケースもあります。
GPIOピンにスイッチを接続する回路
GPIOピンを、電圧の状態を読み取るように設定した場合、0Vか3.3Vか(実際のプログラムでは0か1か)を知ることができます。この仕組みを使って、スイッチの状態を読み取ることができます。
スイッチを使ってGPIOピンを0Vか3.3Vにするのは簡単そうですよね。例えばこんな感じです。
このようにすれば、スイッチがONの時、GPIOピンは3.3Vになり、プログラムでこの値を読むと3.3Vが読み取れます(実際は数値として1が読み取れる)。でもこのスイッチの回路は問題があります。スイッチをOFFにすると、GPIOピンはどこにも繋がれていないので、電位が不安定になります。
スイッチがOFFの場合、GPIOピンが0Vになればいいんですよね。ってことで、スイッチがOFFの時に0Vになるように以下のように回路を追加してみました。
でもこのようにするとスイッチを入れた時に問題が発生します。スイッチをONにすると、、、
電源のプラス側とマイナス側が直接接続される、つまりショートしてしまいます。この問題を避けるためには以下のように抵抗を接続します。
このようにすると、スイッチがOFFの場合はGPIOピンの電圧は0Vになります。ちょっとわかりづらいようでしたら、前回の電位を求めるクイズのM点のところを見てみてださい。同じ回路になっています。
スイッチ回路にはこのように抵抗を接続しますが、この抵抗のことを「プルダウン抵抗」と呼んでいます。0Vの方に引っ張って(プルして)、0Vに落とす(ダウン)という意味です。プルダウン抵抗、ということはプルアップ抵抗とかいうのもあるんでしょうか。実はあります。以下の回路がプルアップ抵抗をつけたスイッチ回路です。
この回路の場合、スイッチがONの時、GPIOピンは0V、OFFの時3.3Vになります。OFFの時は0Vにつながっていますのでわかると思いますが、スイッチがONの時、ちょっとわかりづらいかもしれません。まずRaspberry Piに限らず、マイコンなどの入力ピンにはほとんど電流が流れません。
そのため、スイッチをONにした時のGPIOピンの電圧は、前回のK点と同じことになります。
なお、プルダウン・プルアップの抵抗ですが、だいたい1kΩ〜10kΩのものを使用します。この入門シリーズでは1kΩの抵抗を使用します。
ということでスイッチ回路ができました。と言いたいところですが、今回の入門シリーズのスイッチ回路は、安全対策もしておきます。
Raspberry PiのGPIOピンの機能はプログラムで簡単に変更できます。この入門シリーズではスイッチを一つつけますが、もしそのスイッチを接続したGPIOピンを間違って出力電圧制御にしてしまった場合を考えてみます。出力電圧制御の場合、電気的には以下のような回路になります。(出力電圧を0Vにしている場合です)
この時、スイッチをONにすると、、、
ということでショートしてしまいます。プログラムが動かない時に、いろいろ設定を変えて動作確認するケースなどもあります。その時に気づかないで上のような状況になってしまう可能性もあります。そこで、上のような接続になった場合でも電流が流れ過ぎないように1kΩの抵抗をGPIOピンの入力のところに追加します。
このように抵抗を接続しておけば、この回路でスイッチがONになっても、電流はあまり流れません。1kΩの抵抗を使いますので、電流 = 電圧 ÷ 抵抗 = 3.3 ÷ 1k = 3.3mAです。3.3mAであれば間違ってスイッチをずっと押したままでも何も問題はありません。
ところで、この抵抗をつけた場合、スイッチの状態はきちんと読み取れるのでしょうか。
この回路でスイッチをONにした時とOFFにした時は、前回の電圧を考える回路のP点とQ点と同じになります。
これでスイッチ回路もできました。
プルアップ抵抗・プルダウン抵抗の注意点
一番最初のGPIOのピン番号の説明で、GPIO2とGPIO3は内部で抵抗が接続されている、と説明しました。具体的にどうなっているのか確認してみます。
ちょっとわかりづらいかもしれませんが、今までの知識があればこの回路図は読めるようになっていると思います。中央にある黒い四角が2列あるところがGPIOピンです。3番ピンと5版ピンはGPIO2とGPIO3ですが、内部回路を見ると、1.8kΩの抵抗で3.3Vの電源に繋がれています。GPIO2とGPIO3は1.8kΩの抵抗が接続されていることがわかります。この理由ですが、GPIO2とGPIO3はI2Cというデータ通信にも使われるピンで、このデータ通信を行う場合、この2つの信号線は抵抗を接続する必要があります。そのため、もともとRaspberry Piの回路側で抵抗が接続されています。
このGPIO2とGPIO3に先ほどのスイッチ回路を接続した場合を考えてみます。
なんかだんだん回路が複雑になってきましたね。もう一息頑張りましょう!
この回路はスイッチがOFFの状態ですが、入力電圧の値は0Vではありません。この回路を書き換えると、以下のようになります。
詳しい計算は省略しますが、この回路の電圧は、約1.74Vになります。電圧の読み取りは以下のようになっていました。
電圧 | 読み取り値 |
---|---|
0V〜0.8V | 0Vとして読み取る |
0.8V〜1.3V | 不定 |
1.3V〜3.3V | 3.3Vとして読み取る |
1.74Vの場合、3.3Vとして読み取られてしまいます。つまり保護抵抗をつけたスイッチの回路はこのままGPIO2とGPIO3には接続できないことになります。実際にこのような回路を作った場合、スイッチをONにしてもOFFにしても3.3Vとして読み取られてしまいます。
GPIO2とGPIO3を使用する場合は内部の抵抗に注意してください。
留言
張貼留言