今回はRaspberry PiのGPIOピンの概要を確認します。

今回の説明内容

今回はRaspberry PiのGPIOピンの概要を確認します。GPIOのピン番号や電気的仕様を確認したあと、GPIOピンにLEDを接続する回路とスイッチを接続する回路を検討します。

今回の説明内容は以下になります。

GPIOピンの番号

Raspberry Piにはプログラムで制御できるGPIOピンは26本あります(第一世代A+/B+と第二世代の場合)。プログラムで制御する際、どのGPIOピンを制御するのかを番号で指定します。

番号の指定方法は2種類あります。

一つはRaspberry Pi本体のピン番号です。以前説明しましたが、Raspberry Piの拡張ピンには番号が振られていて、以下のようになっていることを確認しました。(図はRaspberry Pi本体を逆においています)

Raspi front numbering

このピン番号を使って、「何番のピンの出力電圧を3.3Vにする」などと指定する方法です。

もう一つはGPIO番号を使って指定する方法です。GPIO番号は、2番〜27番の連番になっています。ボードのピン番号で指定した方がわかりやすい気もしますが、GPIO番号は連番になっているので、プログラムを作る際にはこちらの方が便利かもしれません。

このGPIO番号についてもうちょっと詳しく説明しておきます。

Rasbperry Piの処理の中心となるプロセッサはブロードコム社の「BCM2836」(あるいはBCM2835)が使用されています。このプロセッサは非常に多くのピンがあり、その中にGPIOピンもあります。このプロセッサのGPIOピンは53本あります。この53本のGPIOピンのうち、2番から27番の26本が拡張コネクタに接続されています。例えばBCM2836にはGPIO2というピンがあり、これが拡張コネクタの3番ピンに「GPIO2」として接続されている、という感じです。

Bcm connector

プロセッサの残りのGPIOピンはRaspberry Pi内の制御に使われていたりします。

ちょっと話が飛びますが、Pythonでよく使われているGPIO制御ライブラリでは、プログラムの最初でボード番号で指定するのか、GPIO番号で指定するのかの設定をします。その際、ボード番号の場合は “BOARD”、GPIO番号の場合は “BCM”と指定します。このBCMはプロセッサ名に由来しています。

それでは、どのピンがどのGPIO番号に割り当てているか、以下の表で説明します。

Raspberrypi gpio numbering

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の内部の電気的な動作は以下のようになります。

Gpio out 1

この状態で例えばLEDを光らせる回路を接続すると、以下のように電流が流れます。

Gpio out 2

GPIOを出力電圧制御にした場合、このように電流が流れますが、この電流には以下のような制限があります。

「制限」と書くと、例えば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 in 1

この時、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 out led source

このような回路にすれば、プログラムのGPIOピンのスイッチをONにすると、GPIOピンの出力電圧は3.3VになってLEDが光ります。当然、スイッチをOFFにすればLEDは光りません。(スイッチは実際にあるのではなく、電気的に制御しているだけです)

もう一つ、以下のように接続する方法もあります。

Gpio out led sink

この場合は、スイッチをOFFにするとLEDが光り、ONにすると光りません。これは前回説明したように抵抗やLEDに電位差があるかないかで考えればわかりますよね。

でも下の方は、スイッチの状態とLEDの光る状態が逆なので分かりづらいですよね。Raspberry PiのGPIOピンの場合は分かりやすい上の方の接続で問題ないですが、他の電子回路の場合は下のケースの方が有利な場合もあります。

上の方は、スイッチをONにするとGPIOピンから電流が抵抗・LEDに流れ出ます。これをソース電流と呼んでいます。(「ソース」は源、出どころ、とかいう意味です)

Gpio out led source cur

これに対して、もう一方の接続方法は、スイッチをOFFにすると、抵抗・LEDを通してGPIOピンに電流が流れ込みます。これをシンク電流と呼んでいます。(「シンク」は沈み込むなどの意味です)

Gpio out led sink cur

Raspberry PiのGPIOピンの場合、ソース電流とシンク電流の制限は16mAで同じ仕様になっています。でもこの電流はいつも同じとは限らず、他の電子部品(マイコンなど)では、製品によっては、電流制限はソース電流よりシンク電流の方が大きい場合があります。そのような場合、より大きな電流を流すためにシンク電流でLEDを光らせるケースもあります。

GPIOピンにスイッチを接続する回路

GPIOピンを、電圧の状態を読み取るように設定した場合、0Vか3.3Vか(実際のプログラムでは0か1か)を知ることができます。この仕組みを使って、スイッチの状態を読み取ることができます。

スイッチを使ってGPIOピンを0Vか3.3Vにするのは簡単そうですよね。例えばこんな感じです。

Gpio switch 1

このようにすれば、スイッチがONの時、GPIOピンは3.3Vになり、プログラムでこの値を読むと3.3Vが読み取れます(実際は数値として1が読み取れる)。でもこのスイッチの回路は問題があります。スイッチをOFFにすると、GPIOピンはどこにも繋がれていないので、電位が不安定になります。

Gpio switch 2

スイッチがOFFの場合、GPIOピンが0Vになればいいんですよね。ってことで、スイッチがOFFの時に0Vになるように以下のように回路を追加してみました。

Gpio switch 3

でもこのようにするとスイッチを入れた時に問題が発生します。スイッチをONにすると、、、

Gpio switch 4

電源のプラス側とマイナス側が直接接続される、つまりショートしてしまいます。この問題を避けるためには以下のように抵抗を接続します。

Gpio switch 5

このようにすると、スイッチがOFFの場合はGPIOピンの電圧は0Vになります。ちょっとわかりづらいようでしたら、前回の電位を求めるクイズのM点のところを見てみてださい。同じ回路になっています。

スイッチ回路にはこのように抵抗を接続しますが、この抵抗のことを「プルダウン抵抗」と呼んでいます。0Vの方に引っ張って(プルして)、0Vに落とす(ダウン)という意味です。プルダウン抵抗、ということはプルアップ抵抗とかいうのもあるんでしょうか。実はあります。以下の回路がプルアップ抵抗をつけたスイッチ回路です。

Gpio switch 6

この回路の場合、スイッチがONの時、GPIOピンは0V、OFFの時3.3Vになります。OFFの時は0Vにつながっていますのでわかると思いますが、スイッチがONの時、ちょっとわかりづらいかもしれません。まずRaspberry Piに限らず、マイコンなどの入力ピンにはほとんど電流が流れません。

Gpio switch 7

そのため、スイッチをONにした時のGPIOピンの電圧は、前回のK点と同じことになります。

なお、プルダウン・プルアップの抵抗ですが、だいたい1kΩ〜10kΩのものを使用します。この入門シリーズでは1kΩの抵抗を使用します。

ということでスイッチ回路ができました。と言いたいところですが、今回の入門シリーズのスイッチ回路は、安全対策もしておきます。

Raspberry PiのGPIOピンの機能はプログラムで簡単に変更できます。この入門シリーズではスイッチを一つつけますが、もしそのスイッチを接続したGPIOピンを間違って出力電圧制御にしてしまった場合を考えてみます。出力電圧制御の場合、電気的には以下のような回路になります。(出力電圧を0Vにしている場合です)

Gpio switch 8

この時、スイッチをONにすると、、、

Gpio switch 9

ということでショートしてしまいます。プログラムが動かない時に、いろいろ設定を変えて動作確認するケースなどもあります。その時に気づかないで上のような状況になってしまう可能性もあります。そこで、上のような接続になった場合でも電流が流れ過ぎないように1kΩの抵抗をGPIOピンの入力のところに追加します。

Gpio switch 10

このように抵抗を接続しておけば、この回路でスイッチがONになっても、電流はあまり流れません。1kΩの抵抗を使いますので、電流 = 電圧 ÷ 抵抗 = 3.3 ÷ 1k = 3.3mAです。3.3mAであれば間違ってスイッチをずっと押したままでも何も問題はありません。

ところで、この抵抗をつけた場合、スイッチの状態はきちんと読み取れるのでしょうか。

Gpio switch 11

この回路でスイッチをONにした時とOFFにした時は、前回の電圧を考える回路のP点とQ点と同じになります。

これでスイッチ回路もできました。

プルアップ抵抗・プルダウン抵抗の注意点

一番最初のGPIOのピン番号の説明で、GPIO2とGPIO3は内部で抵抗が接続されている、と説明しました。具体的にどうなっているのか確認してみます。

Gpio2 3 pullup register
Raspberry Pi電子回路図より引用・加工

ちょっとわかりづらいかもしれませんが、今までの知識があればこの回路図は読めるようになっていると思います。中央にある黒い四角が2列あるところがGPIOピンです。3番ピンと5版ピンはGPIO2とGPIO3ですが、内部回路を見ると、1.8kΩの抵抗で3.3Vの電源に繋がれています。GPIO2とGPIO3は1.8kΩの抵抗が接続されていることがわかります。この理由ですが、GPIO2とGPIO3はI2Cというデータ通信にも使われるピンで、このデータ通信を行う場合、この2つの信号線は抵抗を接続する必要があります。そのため、もともとRaspberry Piの回路側で抵抗が接続されています。

このGPIO2とGPIO3に先ほどのスイッチ回路を接続した場合を考えてみます。

Gpio2 3 pullup register 2

なんかだんだん回路が複雑になってきましたね。もう一息頑張りましょう!

この回路はスイッチがOFFの状態ですが、入力電圧の値は0Vではありません。この回路を書き換えると、以下のようになります。

Gpio2 3 pullup register 3

詳しい計算は省略しますが、この回路の電圧は、約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を使用する場合は内部の抵抗に注意してください。

補足 – Raspberry Pi内部のプルアップ・プルダウン抵抗

今回はプルアップ・プルダウン抵抗を用意しましたが、Raspberry Pi(プロセッサのBCM2835/2836)ではソフトウエアでプルアップ・プルダウン抵抗を設定できます。これはRaspberry Piに限らず、一般的なマイコンなどでも同様の機能を持っています。

内部のプルアップ・プルダウン抵抗を設定すればスイッチを直接GPIOピンに接続しても問題ありませんので、部品点数を減らすことができます。ただ、その場合でも先ほどのようにGPIOの設定を出力電圧制御にした場合、ショートが発生するリスクがあります。

内部のプルアップ・プルダウン抵抗は、電子回路設計に慣れてきてからトライしてみてください。





 

 

Raspberry PiのGPIOを制御するための回路を組み立てます。

GPIOとは

Raspberry Piに限らず、BeagleBone BlackArduinoなどでも「GPIO」という言葉がでてきます。電子工作が初めての方から、このGPIOという言葉がわかったような、わからないような、ということをよく聞きます。Raspberry PiのGPIO制御方法を確認する前に「GPIO」という言葉について簡単に説明しておきます。

よく、「GPIOとは『General Purpose Input/Output』の略で、汎用入出力のことです」という説明がされています。まず「入出力」ということは電気信号を入力したり出力したりできるんだろうな、ということは想像つきそうです。でも「汎用」って具体的にどういう意味かわかりづらいですよね。「汎用」というぐらいなので「専用」がありそうですが、「専用ピン」という言葉はあまり聞きません。そこで、具体例を挙げて、どのような機能を持つピンが汎用で、どのようなピンが汎用ではないのか(専用ピンなのか)という説明をしてみます。余計にわからなくなったら、、、ゴメンナサイ。

突然ですが、ステッピングモータってご存知でしょうか。

おもちゃでよく使われているモータは一般にDCモータと呼ばれているもので、

DCモータ

このように2つの端子が付いています。この2つの端子に電池のプラスとマイナスをつなぐとモータが回ります。電池で走る車や電車のおもちゃをつくる場合はこのようなモータが使われています。でも組み立てロボットのアームなど、正確な動作が必要な時に使用するモータはどうでしょうか。上のモータは電池をつなぐと回り始め、回転速度や回転角度の制御をするのはかなり困難です、というかほぼ無理です。ロボットアームでは、どのくらいの速度でどのくらい回転して、というような細かい制御をしたいですよね。そこでこのような目的に使用する、回転を正確に制御できるモータがあります。それがステッピングモータです。

ステッピングモータ

上のリンクにあるステッピングモータは1.8度単位で回転を制御できます。1.8度というステップ単位で回転を制御できるのでステッピングモータと呼ばれています。ステップ単位で回転が制御できますので、例えば90度ちょうど回転させたいなどの制御ができます。ただ、このステッピングモータは電池をそのままつないでも動きません。モータの画像を見ていただければわかると思いますが、線がたくさん出ていますよね。実はそれぞれの線に加える電圧をうまい具合に制御すると回転します。制御方法自体の詳細な説明はしませんが、以下のリンクにあるように、各線にかける電圧を順番にずらしながらON/OFF制御すると回転します。また、このON/OFF制御する時間間隔を変えることにより回転速度も正確に制御できます。

ステッピングモータ制御方法

このような制御はマイコンなどを使ってブログラムを組めば制御できますが、ステッピングモータを制御するのであれば、制御信号はいつも決まったパターンになりますので、もっと手軽に制御したいと思いますよね。ということで、ステッピングモータ制御専用の部品が売られています。以下は一例です。

ステッピングモータドライバIC

ステッピングモータを制御する場合、このICに回転方向や回転ステップ数、回転速度などを設定すると、上のリンクにあるようなステッピングモータを制御する信号を生成してくれます。上のICでは、4, 9, 16, 21番ピンからステッピングモータを制御するための信号が出ていて、これらをステッピングモータのそれぞれの線に接続すると回転制御できます。

かなり長い説明になってしまいましたが、このICの例では、4, 9, 16, 21番ピンは、ステッピングモータを制御するためだけに用意された「専用」のピンですよね。

このような特定用途のピンはGPIOとは呼びません。かといってわざわざ専用ピン、とも呼ばないのでGPIOが理解しづらくなっているのかもしれません。

では、どのようなものがGPIOなのでしょうか。

Raspberry Piにはいろいろな機能を持ったピンがあり、ひとつは0Vか3.3Vのどちらかを入出力するピンです。これは出力を0Vにするのか3.3Vにするのかプログラムで制御できます。また今、ピンにかかっている電圧(入力の電圧)が0Vか3.3Vなのか調べることもできます。

0Vか3.3Vというピンの状態を入出力に使えるということは、例えばそのピンにLEDをつなぎ、ピンの電圧を制御するプログラムを動作させればクリスマスツリーの電飾をつくることができます。また、赤外線LEDをつないでうまくピンの電圧を制御すれば特定のリモコン信号を発生させることができ、家電をリモコン制御できます。さらにスイッチを接続すればONがOFFかの信号を入力することができます。このように入出力ピン自体は0Vか3.3Vのどちらかの出力をしたり、入力をしたりする機能を持っているだけで、どのような目的に使うのかというのは予め決められていません。使いようによっていろいろな目的で使用できるわけです。このようなピンを、汎用的に使用できる、という意味で「汎用入出力」ピン、つまり「GPIO」ピン、と呼んでいます。

Raspberry PiではGPIOピンが17本用意されています。また17本のGPIOピンのうち、特定のピンはデータ通信を行うピンと兼用になっています。これについては後ほど説明します。

Raspberry PiのGPIOピン構成

それではRaspberry PiのGPIOピン構成を確認してみましょう。まずRaspberry Piのコネクタピンは全部で26本あります。この26本には1から26まで物理的な「ピン番号」が振られています。いろいろな電子部品はピンが複数ある場合、1番ピンがわかるように何らかの目印が付いています。Raspberry Piでは以下のように「P1」と書かれていて、ピンの一番左下が1番ピンになります。

Raspi gpio 1st pin

2番から26番までは以下のように振られています。

Raspi gpio pin numbering

先ほどRaspberry Piでは17本のGPIOピンを持っている、と説明しました。Raspberry PiのGPIOコネクタは全部で26本ありますが、26本のうち電源やグランドのピンが9本あります。そのため26-9=17、ということで17本がGPIOに使用できます。

GPIOピンは17本もありますので、それぞれを区別するために番号が付いています。例えば、”GPIO 3″ピン、などです。ここから先がかなりややこしい話になります。GPIOピンが17本あるので、”GPIO 0″ 〜 “GPIO 16″というようにGPIO番号は順番に振られてはいるのですが、同じピンにそれとは別のGPIO番号が振られていて、そちらの番号は飛び飛びなんです。この理由を説明します。

MacやWinPC本体を開けて中身を見たことがある方はわかると思いますが、本体の中には、CPUがあって、メモリがあって、ビデオカードがあって、という感じでいろいろな部品が別々に組み込まれています。一方でRaspberry Piなど小さなコンピュータの場合は、CPUやメモリなどなどいろいろな部品を別々に置くスペースがほとんどありませんので、ひとつの部品にCPU、メモリなど多くの機能を詰め込んでいます。このような部品をSoC(Sillicon on Chip)などと呼んでいます。この部品はひとつでさまざまな機能を対応しているため、多くの機能のピンを持っていて、このSoCがGPIOピンも持っています。Raspberry Piの基板にあるGPIOコネクタはこのSoCのGPIOピンに接続されているのですが、SoCのGPIO番号とRasberry PiのGPIOコネクタの番号が違うのです。以下に例を示します。

Raspi gpio soc pin number

SoCには多くのGPIOピンがあり、そのうち例えば”GPIO 11″はRaspberry PiのGPIOコネクタの物理ピン番号23番ピンに接続されています。SoCでは”GPIO 11″ですが、GPIOコネクタ側ではこれを”GPIO 14″と呼んでいます。同じような感じで、SoCの”GPIO 27″ピンはGPIOコネクタの物理ピン番号13番に接続されていて、GPIOコネクタ上では”GPIO 2″ピンと呼んでいます。

このような背景があり、Raspberry PiのGPIOコネクタの物理ピンには、2通りのGPIO番号の呼び方があります。プログラムでGPIOピンを制御する場合、このGPIO番号を指定しますが、どちらの呼び方なのか注意する必要があります。なんかややこしいですね。

ということで、Raspberry PiのGPIOコネクタの物理ピン番号、SoCでのGPIO番号の呼び方、GPIOコネクタでのGPIO番号の呼び方をまとめておきます。

なお、SoCでの呼び方は、ネットや書籍をいくつか調べたところ、単に「ピン名」などと呼ばれていました。また当初のRasberry Piでは、このSoCはBroadcom社製の部品だっため「Broadcom名」と呼んでいるところもありました。

GPIOコネクタでの呼び方は、「Raspberry Pi名」という呼び方をしているところもありました。また、プログラムでの制御方法を説明する際にでてきますが、WiringPiというツールで制御する場合、GPIOコネクタでの番号で指定するため、「WiringPi番号」と呼んでいるケースもありました。

Raspi pin name table