『ラズパイ』全モデル対応!GPIOピン配置の歴史と使い方をマスターする究極ガイド
Raspberry Pi(ラズパイ)の真髄は、電子工作の世界への扉を開くGPIOピンにあります。しかし、モデルチェンジの度に変化するピン配置や、複数の番号体系、専門的な用語の数々に、戸惑いを感じる人も少なくありません。私が電子工作にのめり込んだ当初も、このGPIOの複雑さに頭を悩ませた一人です。
この記事では、ラズパイの全モデルに対応したGPIOピンの完全なガイドを提供します。初代の26ピンモデルから最新のRaspberry Pi 5、そしてマイクロコントローラのPicoまで、その歴史、ピン配置、電気的特性、そしてプログラミング方法を網羅的に解説します。この記事を読めば、あなたはGPIOを完全に理解し、自信を持ってプロジェクトに取り組めるようになります。
Raspberry PiのGPIO|最初に知るべき3つの基本
ラズパイで電子工作を始めるには、GPIOの基本的な概念を理解することが不可欠です。ここでは、その役割、安全に使うためのルール、そして最も混乱しやすいピン番号の体系について解説します。
GPIOの役割|デジタル信号で電子部品を動かす仕組み
GPIOは「General-Purpose Input/Output」の略で、日本語では「汎用入出力」と訳されます。その名の通り、プログラムから制御できるデジタル信号の入出力ポートです。具体的には、ピンの電圧をHIGH(3.3V)またはLOW(0V)に切り替えることで、LEDを点灯させたり、スイッチからの信号を読み取ったりします。
さらにGPIOピンは、単なるデジタル入出力だけでなく「代替機能(Alternate Functions)」を持っています。これにより、I2CやSPIといった高度な通信プロトコル用の専用ピンとして動作し、センサーやディスプレイなど複雑なデバイスとのデータ交換を実現します。
電気的な特性と安全のためのルール
GPIOを安全に、そして確実に動作させるには、その電気的な制約を守ることが極めて重要です。私が過去にラズパイを壊してしまった経験からも、このルールは絶対に守るべきだと断言します。
- 動作電圧は3.3V|ラズパイのGPIOは全て3.3Vの論理レベルで動作します。ここに5Vの信号を入力すると、ラズパイ本体に恒久的なダメージを与えるため、絶対に避ける必要があります。5V系のデバイスと接続する際は、必ずロジックレベルシフタを使いましょう。
- 電流制限を守る|1つのGPIOピンから流せる電流は最大で16mAです。さらに、全てのGPIOピンから同時に流せる電流の合計は約50mAに制限されています。
- 高出力デバイスは直接接続しない|上記の電流制限により、モーターやリレーのような大きな電力を必要とする部品は直接駆動できません。これらの部品を制御するには、トランジスタやリレーモジュールといった駆動回路を間に挟む必要があります。
3つのピン番号体系|BOARD、BCM、WiringPi
ラズパイのGPIOで初心者が最も混乱するのが、ピンを特定するための複数の番号体系の存在です。これを正確に理解することが、エラーのないプログラミングへの第一歩です。
番号体系 | 説明 | 特徴 |
物理 (BOARD) 番号 | ヘッダ上のピンの位置を物理的に1から40まで数えた番号です。 | 最も直感的で、配線図を見ながら作業する際に分かりやすいです。 |
BCM (Broadcom) 番号 | プロセッサ(SoC)が認識するGPIOチャンネル番号です。 | プログラミングにおける事実上の標準で、ライブラリでピンを指定する際に一般的に使われます。 |
WiringPi 番号 | 現在は非推奨となった古いライブラリが使っていた番号体系です。 | 過去のチュートリアルなどで見かけますが、新規プロジェクトでの使用は混乱を招くため避けるべきです。 |
Pythonのライブラリなどを使う際は、スクリプトの冒頭で「これからBOARD番号を使います」あるいは「BCM番号を使います」と宣言する必要があります。この一手間が、意図しないピンを操作してしまうミスを防ぎます。
標準40ピンヘッダの完全ガイド
現在の主流である40ピンヘッダのレイアウトは、Raspberry Pi 1 Model B+以降の全てのモデルで標準化されています。この配置を理解すれば、どのモデルでも迷うことなく配線できます。
電源ピンとGNDピンの配置
GPIOヘッダには、電子回路を動かすための電源ピンと、回路を完成させるためのグランド(GND)ピンが配置されています。
- 5V電源ピン (物理ピン 2, 4)|ラズパイの主電源から直接供給される5Vです。3.3Vよりも多くの電力を必要とする部品に使いますが、GPIOの入力ピンには決して接続してはいけません。
- 3.3V電源ピン (物理ピン 1, 17)|安定化された3.3Vです。ほとんどのセンサーやICモジュール、そしてGPIOピンとのやり取りには、この電圧を使います。
- GND (グランド) ピン (物理ピン 6, 9, 14, 20, 25, 30, 34, 39)|回路の基準となる0Vのラインです。電子回路を正しく動作させるために不可欠で、複数のピンが用意されているのは配線を容易にするための配慮です。
主要なGPIOピンの機能一覧
電源とGNDを除いた多くのピンが、プログラミングで自由に制御できる汎用I/Oピンです。以下の表は、物理ピン番号とBCM番号、そして主要な機能をまとめたものです。
物理ピン # | 機能/名称 | BCM # | BCM # | 機能/名称 | 物理ピン # |
1 | 3.3V Power | – | – | 5V Power | 2 |
3 | GPIO 2 (SDA) | 2 | – | 5V Power | 4 |
5 | GPIO 3 (SCL) | 3 | – | Ground | 6 |
7 | GPIO 4 | 4 | 14 | GPIO 14 (TXD) | 8 |
9 | Ground | – | 15 | GPIO 15 (RXD) | 10 |
11 | GPIO 17 | 17 | 18 | GPIO 18 | 12 |
13 | GPIO 27 | 27 | – | Ground | 14 |
15 | GPIO 22 | 22 | 23 | GPIO 23 | 16 |
17 | 3.3V Power | – | 24 | GPIO 24 | 18 |
19 | GPIO 10 (MOSI) | 10 | – | Ground | 20 |
21 | GPIO 9 (MISO) | 9 | 25 | GPIO 25 | 22 |
23 | GPIO 11 (SCLK) | 11 | 8 | GPIO 8 (CE0) | 24 |
25 | Ground | – | 7 | GPIO 7 (CE1) | 26 |
27 | ID_SD | 0 | 1 | ID_SC | 28 |
29 | GPIO 5 | 5 | – | Ground | 30 |
31 | GPIO 6 | 6 | 12 | GPIO 12 | 32 |
33 | GPIO 13 | 13 | – | Ground | 34 |
35 | GPIO 19 | 19 | 16 | GPIO 16 | 36 |
37 | GPIO 26 | 26 | 20 | GPIO 20 | 38 |
39 | Ground | – | 21 | GPIO 21 | 40 |
特殊な予約ピン|HATとの連携
物理ピン27 (ID_SD) と28 (ID_SC) は、HAT(Hardware Attached on Top)と呼ばれる拡張ボードのために予約されています。ラズパイはこれらのピンを使い、接続されたHATを自動で識別・設定します。
この仕組みがあるため、HATを設計しているなどの特別な理由がない限り、これらのピンを汎用のI/Oとして使うのは避けるべきです。意図しないバスの競合を引き起こす原因となります。
GPIOの高度な使い方|主要な通信プロトコルを使いこなす
GPIOの真価は、代替機能を使った高度な通信にあります。ここでは、代表的な4つの通信プロトコルを解説します。これらの機能を使いこなすことで、プロジェクトの幅が大きく広がります。
I2C (Inter-Integrated Circuit)|2本線で多数のデバイスを接続
I2Cは、SDA(データ線)とSCL(クロック線)のわずか2本の信号線で、複数のデバイス(センサーやOLEDディスプレイなど)を一つのバスに接続できるシリアル通信プロトコルです。
主なピン割り当て
デフォルトのI2Cバスは、GPIO2 (SDA) と GPIO3 (SCL)、つまり物理ピンの3番と5番に割り当てられています。これらのピンには基板上でプルアップ抵抗が接続されているため、汎用I/Oとして使う際にはこの点を考慮する必要があります。
有効化と使い方
I2C機能はデフォルトでは無効になっています。使用するには、sudo raspi-config
コマンドで表示される設定ツールから有効化する必要があります。有効化後、i2cdetect -y 1
コマンドを実行すると、接続されているデバイスのアドレスを一覧で確認できます。
SPI (Serial Peripheral Interface)|高速なデータ通信
SPIは、I2Cよりも高速なデータ通信が求められる場面で使われる同期式シリアルプロトコルです。主に4本の信号線(MOSI, MISO, SCLK, CE)を使い、高速なADCや一部のディスプレイ、センサーとの通信に利用されます。
主なピン割り当て
デフォルトのSPIバスは、GPIO10 (MOSI), GPIO9 (MISO), GPIO11 (SCLK), GPIO8 (CE0) などに割り当てられています。I2Cと同様に、使用する前にはraspi-config
での有効化が必要です。
UART (Universal Asynchronous Receiver/Transmitter)|シリアル通信の基本
UARTは、TXD(送信)とRXD(受信)の2本線で通信する、シンプルで古典的な非同期シリアル通信です。PCとのデバッグ用シリアルコンソールや、GPSモジュール、他のマイクロコントローラとの接続によく使われます。
主なピン割り当て
プライマリUARTは、GPIO14 (TXD) と GPIO15 (RXD)、つまり物理ピンの8番と10番に割り当てられています。特に、ラズパイをヘッドレス(ディスプレイなし)でセットアップする際にシリアルコンソールとして非常に役立ちます。
PWM (Pulse Width Modulation)|アナログ的な制御を実現
PWMは、デジタル信号のオンとオフの比率(デューティー比)を高速で変化させることで、擬似的にアナログ出力を生成する技術です。これにより、LEDの明るさを滑らかに調節したり、サーボモーターの角度を精密に制御したりします。
ハードウェアPWMとソフトウェアPWM
ラズパイには、安定した信号を生成する専用回路による「ハードウェアPWM」と、OSが任意のGPIOピンで擬似的に行う「ソフトウェアPWM」があります。精密な制御が求められるサーボモーターなどには、ジッター(揺らぎ)の少ないハードウェアPWM対応ピン(GPIO12, GPIO13, GPIO18, GPIO19など)を使うのが最適です。
モデル別の進化を徹底解説|初代からPi5、Picoまで
ラズパイのGPIOは、モデルの進化とともにそのアーキテクチャを大きく変えてきました。この歴史的変遷を理解することで、各モデルの特性を最大限に活かせます。
初代モデルの26ピンヘッダ
私が初めて手にした初代Raspberry Pi Model Bには、26ピンのGPIOヘッダが搭載されていました。このオリジナルのピン配置は、現在の40ピンヘッダの最初の26ピンとして引き継がれており、後方互換性が維持されています。
40ピン標準の確立|Pi B+からPi 4、Zeroファミリー
2014年に登場したRaspberry Pi 1 Model B+で、現在の40ピンヘッダが採用されました。これにより利用できるGPIOピンの数が増え、より複雑なプロジェクトに対応できるようになりました。この40ピンレイアウトは、Pi 2, Pi 3, Pi 4、そしてPi Zeroファミリーに至るまで、全てのモデルで標準仕様となっています。
ただし、Pi ZeroやZero 2 Wでは、コストとサイズの制約からピンヘッダは実装されておらず、ユーザー自身ではんだ付けする必要があります。Raspberry Pi 4ではさらに、利用できるI2CやSPIのバス数が増え、config.txt
を編集することで様々なGPIOピンに機能を割り当てられるようになりました。
Raspberry Pi 5の革命|RP1コントローラという大変革
Raspberry Pi 5は、GPIO制御において革命的なアーキテクチャ変更が行われました。従来はメインのCPU(SoC)が直接GPIOを制御していましたが、Pi 5では「RP1」と呼ばれる専用のI/Oコントローラチップにその役割が移管されました。
この変更の最大の理由は、半導体製造の経済合理性です。高性能なCPUと、比較的シンプルなI/O機能を別々のチップにすることで、コストを最適化しています。このアーキテクチャ変更により、従来のRPi.GPIO
ライブラリなど、古い方法ではGPIOを操作できなくなりました。Pi 5ではlibgpiod
という新しい標準的な方法でアクセスする必要があります。
Raspberry Pi Pico|まったく異なるマイクロコントローラ
Raspberry Pi Picoは、名前に「Raspberry Pi」と付いていますが、これまでのモデルとは全く異なる「マイクロコントローラ」です。LinuxなどのOSは動作せず、書かれたプログラムを直接実行します。
Picoのユニークな機能
PicoのGPIOは、標準のラズパイにはない強力な機能を持っています。
- アナログ入力 (ADC)|GP26, GP27, GP28の3つのピンはアナログ信号を直接読み取れます。これにより、可変抵抗やアナログセンサーを外部ADCなしで扱えます。
- プログラマブルI/O (PIO)|CPUに負荷をかけずに、独自の通信プロトコルなどを実装できる強力なステートマシンです。
リアルタイム性や低消費電力が求められるプロジェクトには、SBCである標準ラズパイよりも、マイクロコントローラであるPicoが最適です。
GPIOプログラミング実践ガイド|現代的なライブラリの選び方
正しい知識とツールを使えば、GPIOのプログラミングは決して難しくありません。ここでは、ピン配置の確認方法から、現代的で最も推奨されるプログラミング方法までを解説します。
ピン配置をその場で確認する方法
配線作業中に「このピンは何番だっけ?」と迷うことはよくあります。そんな時、ラズパイのターミナルから簡単にピン配置を確認できます。
最も簡単なpinoutコマンド
gpiozero
ライブラリをインストールすると使えるpinout
コマンドが非常に便利です。ターミナルでこのコマンドを実行するだけで、現在使用しているラズパイのモデルに合わせた、分かりやすい色付きのピン配置図が表示されます。
より詳細なpinctrlコマンド
pinctrl
コマンド(古いOSではraspi-gpio
)を使うと、各ピンの現在の機能(入力/出力/代替機能)やプルアップ・プルダウン設定など、より詳細な状態を調査・設定できます。
ライブラリの変遷と現在のベストプラクティス
GPIOを制御するPythonライブラリも、ラズパイの進化と共に変わってきました。
- レガシーな方法|
RPi.GPIO
は長年標準として使われてきましたが、Raspberry Pi 5のアーキテクチャ変更に対応しておらず、その役目を終えつつあります。古いチュートリアルではまだ使われていますが、新規プロジェクトでの採用は推奨しません。 - 現代的な方法|現在の標準は
libgpiod
です。これはLinuxカーネルが提供する公式のインターフェースで、ハードウェアに依存しない堅牢な制御を実現します。 - 推奨ライブラリ|gpiozero|私が全てのプロジェクトで推奨するのが
gpiozero
ライブラリです。このライブラリは、libgpiod
などの低レベルな部分をラップし、部品ベースの非常に直感的なインターフェースを提供します。
gpiozero
の最大の利点は、背後で動くライブラリ(ピンファクトリ)を自動で切り替えてくれることです。これにより、同じPythonコードがRaspberry Pi 4でもRaspberry Pi 5でも、変更なしで動作します。将来のモデルにも対応できる、最も移植性の高い選択肢です。
gpiozeroを使った簡単なプログラミング例
gpiozero
がいかに直感的か、LEDを点滅させる「Lチカ」のコードで見てみましょう。BCM番号の17番ピンに接続したLEDを1秒間隔で点滅させます。
from gpiozero import LED
from time import sleep
# BCM 17番ピンをLEDとして定義
led = LED(17)
# 無限ループで点滅させる
while True:
led.on() # 点灯
sleep(1) # 1秒待つ
led.off() # 消灯
sleep(1) # 1秒待つ
led.on()
やled.off()
のように、部品が何をするのかが非常に分かりやすく、クリーンなコードを書くことができます。さらに、led.blink()
という一行で点滅させることもでき、定型的な処理を大幅に削減してくれます。
まとめ
Raspberry PiのGPIOは、その歴史の中でピンの数を増やし、アーキテクチャを革新し、Picoという新たなファミリーを生み出してきました。40ピンヘッダの物理的なレイアウトは安定していますが、その背後にある技術と制御方法はモデルごとに大きく異なります。
- アナログ入力やリアルタイム制御|Raspberry Pi Picoが最適です。
- 汎用的なプロジェクトで安定性を求める|豊富な情報とライブラリ互換性を持つRaspberry Pi 4が強力な選択肢です。
- 最高のCPU性能と新しい技術への挑戦|Raspberry Pi 5が明確な答えですが、
libgpiod
やgpiozero
といった現代的なライブラリへの移行が必須です。
どのモデルを選ぶにしても、私が最も強く推奨するのは、Pythonプロジェクトでgpiozero
ライブラリを使用することです。その優れた抽象化と移植性は、あなたのコードを将来のハードウェア変更から守り、モデル間の差異を吸収してくれます。GPIOをマスターすることは、ラズパイという強力なツールのポテンシャルを最大限に引き出す鍵です。このガイドが、あなたの創造的なプロジェクトの成功に繋がることを確信しています。