第22回 Raspberry PiのGPIO概要

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

今回の説明内容

今回は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本体を逆においています)

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ピン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 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の設定を出力電圧制御にした場合、ショートが発生するリスクがあります。

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

« »

  • LIU

    分かりやすい説明です。大変参考になりました。ありがとうございます。

  • claynets

    コメントどうもありがとうございます!

    コメントいただいた記事、再度読み直してみたのですが、ちょっとわかりづらいかな、ということころもありそうな感じでした。もしちょっとでもわかりづらいところがありましたらご指摘いただければと思います。

    このようなサイトを通じて、電子工作に興味の持つ方が増えるといいな、と思ってます。

  • キャップ

    電子回路の勉強を始めたばかりの初心者です。
    Raspberry Piへの回路接続で、やってはいけない接続を調べている最中です。
    もしよろしければ教えていただけないでしょうか。

    claynetsさんの記事を見て覚えた内容。

    電源をショートさせる行為
    ・3.3Vまたは5V電源を直接、GNDに接続

    Raspberry Piの制限を越える接続
    ・GPIOピン1本から16mAを超えた電流を流す
    ・複数本のGPIOピンを使用し、合計50mAを超えた電流を流す

    こちらは問題の接続に当てはまりますか?
    ・GPIOピン(OUT)を直接GNDに接続。GPIOピン(OUT)から3.3V出力
    ・GPIOピン(OUT)を直接GPIOピン(IN)に接続。GPIOピン(OUT)から3.3V出力

    • claynets

      キャップさま、
      ご質問いただきどうもありがとうございます!

      早速ですがご質問の回答です。

      ・GPIOピン(OUT)を直接GNDに接続。GPIOピン(OUT)から3.3V出力
        → これはNG接続になります。GPIOピン(OUT)から大きな電流が流れてしまいます。

      ・GPIOピン(OUT)を直接GPIOピン(IN)に接続。GPIOピン(OUT)から3.3V出力
        → これはOKです。

      ちょっと???かもしれませんが、以下の考え方を身につけていただければ他のケースでも自分で考えることができると思います。

      性質1) GPIOピンを出力にした場合、そのGPIOピンはなるべく電流を流そうとする性質を持ちます。

      性質2) GPIOピンを入力にした場合、そのGPIOピンはなるべく電流をもらわないような性質を持ちます。

      この2つの性質を覚えておけば、いろいろなケースでも対応できると思います。この性質は、Raspberry Piに限らず、ArduinoやBeaglebone、PICマイコンでも同じ性質ですので応用がきくと思います!

      他にも不明点がございましたらご質問いただければと思います。

      • キャップ

        ご回答ありがとうございます。

        とても分かりやすい説明で理解できました。

        自分で回路を組み替えていたとき、Raspberry Piが再起動しているようだったので、今回の理解で解決できました。
        感謝いたします。

      • claynets

        早速のご確認どうもありがとうございました!

        他にも何かわからないことがありましたらご質問いただければと思います。

      • キャップ

        お手数をおかけします。また質問よろしいでしょうか。

        電子回路に興味を持ち始め、電源が欲しくなりました。
        毎回、Raspberry Piから3.3Vや5Vの電源を取っていたのですが、GPIOの制御をしない場合は、別の電源を使用したいと考えています。

        私の頭では、直流安定化電源または乾電池しか思い浮かびません。
        他に選択肢やお勧めはありますでしょうか?
        アドバイスをいただけると助かります。

      • claynets

        ご質問どうもありがとうございます。

        直流安定化電源や電池の他にもいくつかあります。なお、直流安定化電源は本格的なものになると値段がかなり高いので、入手しやすい値段のものをご紹介します。

        以下の候補が考えられますので、ご自分にあったものを選ばれると良いと思います。

        a) 電池

         使い捨て電池は1.5V、充電電池は1.25Vですので、これらを組み合わせてほしい電圧にする方法があります。例えば3.3Vや5Vなど、正確な電圧が欲しい場合は、3端子レギュレータという部品を使用します。例えば3.3Vでしたら以下のようなものです。

        http://akizukidenshi.com/catalog/g/gI-00534/

        ブレッドボード上に回路を組んで、電池から3.3Vを作ることができます。

        b) スイッチングACアダプタ

         ステッピングモーターなど電力消費量の多い部品を使用すると電池がすぐになくなってしまいますので、そのような場合はACアダプタなどを使用するとよいと思います。以下のアダプタは5V2Aですので、ちょっとした回路実験に十分だと思います。

        http://akizukidenshi.com/catalog/g/gM-11996/

         なお、ACアダプタからブレッドボードに電源供給する場合は、以下のような部品を使用します。

        http://akizukidenshi.com/catalog/g/gK-05148/

        c) 安定化電源キット

         固定電圧ではなく、いろいろな電圧で動作させたい場合は直流安定化電源があるといいですが、値段がかなり高いので、キットを使用すると良いと思います。秋月電子通商で手頃な価格で可変電圧電源キットが売られています。

        http://akizukidenshi.com/catalog/g/gK-00095/

         実際に使用する場合はこのキット以外にACアダプタ、可変抵抗(ボリューム)などが必要になります。

        d) スマホやゲーム機用の充電USB電源アダプタ

         出力電圧は5Vのものが多いですが、5Vでよければこの選択肢もあります。USB端子からブレッドボードに接続する場合は以下のような部品を使用します。

        http://akizukidenshi.com/catalog/g/gK-06656/

        思いつくのはこのぐらいですが、ご自分の用途にあったものを選択されるとよいとおもいます。自分の場合は、(c)をよく使います。

      • キャップ

        ご回答ありがとうございます。
        電源にも色々あるのですね。こんなに種類があるとは知らず驚きました。

        3端子レギュレータは初めて聞いた部品でしたが、定電圧レギュレータなら私のような初心者にも使いやすそうです。

        秋月電子通商は遠いので、通販でa)~d)と、関連する部品をまとめて購入して使ってみようと思います。
        ただ、C)は難易度が高そうなので、製作は最後になりそうです。

        このような情報は初心者にはとてもありがたく、a)~d)と言った、電源のまとまった情報が記載されているサイトは見つからなかったのでとても助かりました。

        この度は、ご親切にありがとうございました。

      • claynets

        電子回路は知識を身につけていくといろいろとできることが広がりますので、是非いろいろ挑戦されてみてください。

        電子回路は自然現象相手なので、一度経験したことはずっと使えます。ソフトウエアの場合、プログラミング言語や開発環境はバージョンが変わると仕様がガラッと変わってしまうことがあって追いつくのが大変ですが、電子回路の場合は、新しい部品は出てくるものの、動きとしては「電気・電子の働き」という自然現象なのでバージョンアップで仕様が変更になる、ということはありません。知識を蓄積すればするほど視野が広がっていく、という感じですので、一生楽しめます!

        それではまた何かわからないことがありましたらご質問いただければと思います。

      • キャップ

        claynetsさん、すいません。また教えていただけないでしょうか。

        以下のサイトの例ですが、ブザーの+に5V(3.3V?)を接続し、ブザーの-にGPIO19(OUTPUT)を接続しています。
        http://osoyoo.com/2016/09/29/using-raspberry-pi-to-drive-buzzer/

        GPIOの出力の反対側に電源を接続することに違和感があったのですが、一般的に行われる配線なのでしょうか?

        お手数をおかけします、自分だけでは解決できそうに無かったので質問いたしました。

      • claynets

        キャップさま、ご質問どうもありがとうございます。

        はい、この海路で問題ありません。この海路の接続方法は、「+5V」→「ブザーのプラス側」→「ブザーのマイナス側」→「GPIO19」となっています。

        この接続は、このページ(今ご覧いただいているページ)の最初の方で説明している「LED点灯回路のシンク接続」に相当します。この回路のLEDをブザーに置き換えれば、ご質問いただいたブザー回路と同じになります。

        なお、この回路の場合、GPIO19を1にした時がブザーOFF、0にした時がブザーONになります。

        言葉だけではなかなか分かりづらいと思いますが、何かご不明点などありましたら再度ご質問いただければと思います。

      • キャップ

        お手数をおかけしました。しっかりこのページに書いてありました。
        再度熟読して理解します。
        ご回答ありがとうございました。

        3.3Vと3.3Vが向かい合わせに接続されることに慣れていなかったので違和感を感じてしまいましたが、問題ないということで理解できました。

      • claynets

        電子回路はいろいろありますが、パターンを覚えていくとだんだん複雑な回路も理解できるようになってきますので、今回のようにいろいろと疑問を持たれて覚えていくのはとてもいいことだと思います。

        また何かわからないことなどありましたらご質問いただければと思います。