ラズパイGPIO入門|PythonでLEDとボタン
Raspberry PiのGPIOは、Linuxを動かす小さなコンピュータからLEDやボタン、PWMまで扱えるのが魅力ですが、最初の一歩で配線や番号の取り違えに引っかかる人が少なくありません。
筆者のワークショップでも、つまずきの大半は「ピン番号の混同」「GND未接続」「プルアップ未設定」で、この3点を先に潰すだけで最初の成功率がぐっと上がります。
この記事では番号体系をBCMに統一し、GPIO17は物理ピン11、GPIO27は物理ピン13、GPIO18は物理ピン12という最低限の対照を押さえながら、3.3V系のGPIOに5Vを直結しない前提で、まずはLED点灯まで最短で進みます。
そのうえで、ボタン入力は内部プルアップと外付け10kΩの両方を整理し、割り込みはbouncetime付き、PWMはGPIO18の例へと段階的につなげます。
Raspberry Pi の公式ドキュメントや pinout.xyz を基本にしつつ、Pi 5 では従来のライブラリ(例:RPi.GPIO)がそのまま動かない事例が報告されているため、gpiozero や libgpiod 系などの代替ライブラリも解説します。
コミュニティや多くのチュートリアルでは gpiozero が入門向けとしてよく紹介されていますが、公式が単一のライブラリを「全面推奨」している明確な文言は確認できません。
ライブラリの対応状況は変わるため、実行前に対象のRaspberry Piモデル(Pi 5 等)とライブラリの互換性を公式ドキュメントやプロジェクトページで必ず確認してください。
ラズパイ Python GPIO入門で最初に知っておくこと
raspberry-piとgpioの基本">Raspberry PiとGPIOの基本
Raspberry PiはLinuxが動くシングルボードコンピュータで、画面表示やネットワークだけでなく、GPIO(General Purpose Input/Output、汎用入出力)を通じて外部回路も扱えます。
たとえばLEDを光らせる、ボタンを読む、センサーの値を受ける、といった電子工作の入口を、ふだんのPythonコードの延長で試せるのが魅力です。
Raspberry Pi Documentation(https://www.raspberrypi.com/documentation/でも、GPIOをPythonから扱う流れがRaspberry Piの代表的な活用として整理されています)。
GPIOヘッダは40ピン構成で、そこには3.3Vや5Vの電源、GND、通常のGPIO、さらにI2C・SPI・UARTのような通信機能を兼ねるピンが混在しています。
この「似た見た目のピンが並んでいる」ことが最初のつまずきになりやすく、筆者のワークショップでも、GPIOだと思って電源ピンに配線していたという場面を何度も見てきました。
そこで本記事では番号表記をBCM番号で統一し、必要なところだけ物理ピン番号(BOARD)を補足します。
たとえばGPIO17は物理ピン11、GPIO27は物理ピン13、GPIO18は物理ピン12です。
配置確認にはRaspberry Pi GPIO Pinout配置確認にはRaspberry Pi GPIO Pinoutのようなピンマップが手元にあると混同を避けやすくなります)。
最初の成功体験として取り組みやすいのは、GPIO17からLEDを点灯するLチカです。
ここで押さえたい基本操作は、出力ピンとして設定する、電圧を出す、終了時に後片付けするの3つです。
RPi.GPIO系の書き方なら、GPIO.setup(..., GPIO.OUT) で出力に設定し、GPIO.output でHIGH/LOWを切り替え、最後に cleanup を呼びます。
コードの流れを見ると、GPIO制御の全体像がつかみやすくなります。
import RPi.GPIO as GPIO # import (1)
import time
LED_PIN = 17 # BCM番号。物理ピンは11
## GPIO.setmode(GPIO.BCM) # section 1
GPIO.setup(LED_PIN, GPIO.OUT) # pin setup (1)
try:
GPIO.output(LED_PIN, GPIO.HIGH)
time.sleep(1)
GPIO.output(LED_PIN, GPIO.LOW)
finally:
GPIO.cleanup()
LEDをつなぐときは、GPIO17からLEDへ直接つなぐのではなく、330Ωの抵抗を直列に入れるのが定番です。
理由は、LEDにもGPIOにも流れる電流を絞るためです。
抵抗なしでつなぐと、LEDが想定以上に電流を引こうとして、ピンやLED本体に無理がかかります。
入門では「LEDが光るかどうか」だけに目が向きがちですが、330Ωを1本入れるだけで回路がぐっと安全側に寄ります。
筆者はこの1本の意味を最初に説明するようにしてから、配線は合っているのにLEDが不安定だったり、部品を傷めたりするケースが明らかに減りました。
3.3V系と破損リスクの注意
GPIOで最初に強く意識したいのは、Raspberry PiのGPIOが3.3V系だという点です。
出力が3.3V基準であるだけでなく、入力に対しても3.3V系として扱う前提で考えます。
ここへ5Vを直接入れると、GPIOピンや本体を傷める方向に一直線です。
筆者の現場感覚でも、入門の最初にこの話を少し厳しめに伝えるだけで、5V誤接続は目に見えて減ります。
LEDが点かない程度なら直せても、GPIOの破損は学習の流れそのものを止めてしまいます。
もうひとつ外せないのが、GNDを共通にするという原則です。
たとえば外部センサーや別電源のモジュールをつなぐとき、信号線だけをGPIOへ持ってきても、GNDが共通でなければ電位の基準がそろいません。
その状態では入力が安定せず、動いたり動かなかったりという切り分けしにくい症状になります。
前のセクションでも触れた通り、GND未接続は初学者の典型的な落とし穴で、ここを外すとコードが合っていても結果が再現しません。
LEDのような単純な出力回路でも、配線の考え方は同じです。
GPIO17から抵抗330Ωを通してLEDのアノードへつなぎ、LEDのカソードをGNDへ戻します。
これで、GPIO.output(17, GPIO.HIGH) のときに3.3V側から電流が流れ、LEDが点灯します。
逆に、5VピンからLEDをつないでGPIOで受けるような配線は、入門では避けたほうが混乱がありません。
40ピンの中には3.3Vピンも5Vピンも並んでいるので、見た目だけで差し込むと事故につながります。
TIP
BCM番号でGPIO17を使うなら、物理位置は11番ピンです。
隣接するピンに3.3VやGNDがあるため、配線前に「番号」と「役割」をセットで見る癖を付けると取り違えを減らせます。
Pi 4/5時代のPythonライブラリ事情
したがって、実際に動かす前には使用する Raspberry Pi のモデル(Pi 5 等)とライブラリの対応状況を、公式ドキュメントやプロジェクトページで必ず確認してください。
公式の記述やチュートリアルは随時更新されるため、公開時点での対応状況を確認する旨を明示しておくことを推奨します。
たとえば Pi 5 で「まずLEDを点ける」だけなら、『gpiozero』では次のように書けます。
from gpiozero import LED
from time import sleep
led = LED(17) # BCM番号。物理ピンは11
gpiozero — gpiozero 2.0.1 Documentation
gpiozero.readthedocs.ioled.on()
sleep(1) led.off()
こちらは `cleanup` を自分で書かないぶん短く、最初の成功体験を作りやすい形です。一方で、古い教材やサンプルを読む力も後で必要になるので、`GPIO.setup(..., GPIO.OUT)` と `GPIO.output` の意味を早い段階で理解しておく価値は残ります。ライブラリ名だけ追うのではなく、「GPIOを出力に設定して、HIGH/LOWを切り替え、終了時に片付ける」という共通の流れを先につかむと、Pi 4でもPi 5でも学びがつながります。
## 必要なものと安全に始めるための部品選び
### ハードウェア一式
まず揃えたいのは、Raspberry Pi 4またはRaspberry Pi 5本体、microSDカード、USB-C電源、ブレッドボード、ジャンパワイヤです。GPIOの学習では本体だけあっても作業が進まず、逆に電子部品だけ先に届いてもOSの準備で止まりやすいので、最初にこの一式をまとめて見ておくと流れが切れません。
本体は、この記事のようなLEDとスイッチの入門ならRaspberry Pi 4でもRaspberry Pi 5でも進められます。違いが出るのは主にGPIOライブラリ周りで、Pi 4では古い入門記事の資産がそのまま使える場面が多く、Pi 5では後述するようにライブラリ選びを少し意識する必要があります。ボード選びで迷ったときは、「手元の作例がPi 4寄りか、Pi 5寄りか」を見ると判断がぶれません。
microSDカードは、OS入りの起動ディスクとして使います。Raspberry Pi Getting startedでは通常版のRaspberry Pi OSに32GB以上、Lite版に16GB以上が目安として案内されています。GPIO学習だけならLite版でも足りますが、デスクトップ環境でエディタやブラウザも一緒に使うなら32GB以上の通常版のほうが余裕があります。実際、最初は画面を見ながら配線図やピン配置を確認する場面が多いので、入門段階では通常版のほうが詰まりにくいんですよね。
電源は、対応したUSB-C電源を使う前提で揃えます。ここをスマートフォン用の古い充電器で代用すると、起動はしても周辺機器をつないだときに不安定になることがあります。GPIOの勉強では「配線ミスなのか、電源由来なのか」の切り分けが難しくなるので、本体に合った電源を最初から用意しておくと原因追跡がぐっと楽になります。
ブレッドボードは、はんだ付けなしで回路を組み替えられる作業台です。LED点灯とボタン入力を行き来する今回の内容では、差し替えながら試せること自体が学習効率につながります。ジャンパワイヤはオス-オスが中心になります。GPIOヘッダからブレッドボードへ信号線を伸ばし、GNDや3.3Vも同じように引き込むので、数本では足りません。色を分けておくと、3.3V、GND、信号の見分けがつきやすく、配線の見直しで迷いません。
### 電子部品
電子部品は、LED×1、330Ω抵抗×1、タクトスイッチ×1、10kΩ抵抗×1が基本セットです。数は少ないですが、それぞれ役割がはっきり分かれていて、この4点だけで「出力」と「入力」の両方を体験できます。
LEDはGPIOの出力確認に使います。長い足がアノード、短い足がカソードで、向きを逆にすると点灯しません。ワークショップでも最初に止まりやすいのがここで、ソフトの前にLEDの向きとGNDへの戻りを見直すと、その場で解決することが多いです。点灯確認用としては赤色の一般的な砲弾型LEDで十分です。
330Ω抵抗はLEDと直列に入れます。この値を選ぶ理由は、明るさと安全性のバランスが取りやすいからです。3.3V系のGPIOでLEDを光らせるとき、330Ωにしておくと明る過ぎず、机の上で状態確認するにはちょうどよい見え方になります。抵抗値を下げればもっと強く光りますが、入門段階では「見えれば十分」で、GPIOに無理をさせないほうが回路全体の理解につながります。
タクトスイッチは入力の定番です。押している間だけONになる単純な部品ですが、GPIO入力ではこの「単純さ」がありがたいポイントです。押したときだけ状態が変わるので、コード側の `if` 文やイベント処理の確認がしやすく、センサーをいきなり扱うより結果が読み取りやすい構成になります。
10kΩ抵抗は、タクトスイッチの外付けプルアップまたはプルダウン用として使います。入力ピンは何も決まっていない状態だと値がふらつくので、押していないときの基準をこの抵抗で固定します。入門サンプルでは10kΩが定番で、部品箱にも入っていることが多い値です。原理をつかむには外付け抵抗つきの回路が分かりやすい一方で、最初の一歩では内部プルアップだけで配線を減らしたほうが、ブレッドボード上の見通しがよくなって作業ミスが減る感覚があります。部品の意味を学ぶ回では10kΩを使い、まず動かす回では内部プルアップを使う、という分け方も現場ではよく効きます。
ジャンパワイヤも電子部品の一部として見ておくと、準備漏れを防げます。LED回路だけでもGPIOから抵抗、LED、GNDへとつなぐ線が必要ですし、スイッチ回路では信号線に加えて3.3VやGNDへの配線も増えます。ワイヤが短すぎるとブレッドボードの配置が窮屈になり、長すぎるとどこにつながっているか見失いやすくなります。入門では、ボードを横に置いたときに無理なく届く長さを何本か揃えておくと配線の並びが素直になります。
> [!NOTE]
> スイッチ回路を最初に組むときは、LED回路と同じブレッドボード上でも「信号線の列」と「電源の列」を分けて置くと、GNDの取り違えが減ります。部品点数が少ない段階で並べ方の癖をつけておくと、その後センサーを増やしたときに崩れません。
### OSとPython環境の準備
ソフトウェアはRaspberry Pi OSのBookworm系を前提にすると話をそろえやすくなります。デスクトップ付きの通常版なら、ターミナル、エディタ、ブラウザを同時に開きながら進められます。Lite版は軽くまとまりますが、GPIOピン配置や公式ドキュメントを別端末で見ながら作業する前提になります。OSイメージやセットアップの流れはRaspberry Pi Documentationにまとまっていて、初期導入の基準として見通しが立てやすい内容です。
Python環境は、Bookworm系ならPython 3を標準で使う構成を基本にします。GPIOの入門では、ターミナルで `python3` を使って実行する前提にそろえておくと、古い `python` コマンドとの混同を避けられます。エディタは標準のテキストエディタでも十分ですが、ターミナルを開いたままコードを編集できる構成にしておくと、配線を直してすぐ再実行する流れが止まりません。
ライブラリは、Pi 4ならRPi.GPIOの作例を読み解きやすく、古典的な `setmode`、`setup`、`output`、`cleanup` の流れを学ぶ教材としてまだ有効です。ただしPi 5ではここが少し変わります。現時点では『gpiozero』やlibgpiod系、あるいは『rpi-lgpio』のような代替候補を視野に入れるほうが混乱を避けやすい状況です。とくに『gpiozero』はLEDやButtonを高水準APIで扱えるので、入門ではコード量を抑えながら配線と挙動の関係に集中できます。
RPi.GPIOを前提にした古い記事が多いので、Pi 5でそのまま写経すると、配線は正しいのに動かないという場面が出ます。こういうとき、ハードの不具合ではなくライブラリの世代差だと分かっているだけで、切り分けの方向がぶれません。Pi 4で学習を始めるならRPi.GPIOの基本を押さえる価値がありますし、Pi 5なら『gpiozero』を中心に見ていくほうが導入が滑らかです。後のセクションでもPi 5向けの選択肢はあらためて触れますが、この段階では「使用OSはBookworm系」「Python 3を使う」「Pi 5では古いGPIO記事をそのまま信じ込まない」という3点がそろっていれば十分です。
{{related:raspberry-pi-setup}}
## GPIOの見方:物理ピン番号とBCM番号の違い
### 番号体系
Raspberry PiのGPIOヘッダは**40ピン**あります。ただし、この40本がすべて自由に使えるGPIOではありません。3.3V、5V、GND、そしてGPIOの機能ピンが**同じ列の中に混在している**のが最初のつまずきどころです。見た目はどれも同じ金属ピンなので、位置だけで配線すると、GPIOにつないだつもりが電源ピンだったというミスが起きます。ここがポイントです。まずは「40ピンの中には役割の違うピンが並んでいる」と頭の中で分けておくと、配線図の読み方が安定します。
番号の見方には、主に**物理ピン番号**と**BCM番号**の2種類があります。物理ピン番号は、ヘッダ上での位置そのものです。たとえば「物理11番ピン」は、基板上の40ピンヘッダで11番目の位置を指します。一方のBCM番号は、SoC側の論理名で、「GPIO17」「GPIO27」のように表記されます。コード例や技術記事ではBCM表記のほうが多く、ピンの役割も追いやすいため、**本記事ではBCM番号に統一**して説明します。
図を頭に浮かべるなら、物理ピン番号は「座席番号」、BCM番号は「その席に座っている人の名前」に近いです。物理11と書かれていれば場所は一意に決まりますが、その場所にある信号線の論理名はGPIO17です。この2つを混ぜて覚えると、コードでは17を使っているのに、実機では17番目の物理ピンへ挿してしまう、という典型的な事故につながります。
入門でまず押さえる対照は次の3本です。LEDは**GPIO17(物理11)**、ボタンは**GPIO27(物理13)**、PWMは**GPIO18(物理12)**です。数字が近いので混ざりやすいのですが、物理11・12・13に、BCM17・18・27が並んでいるわけではありません。ここを声に出して確認しながら配線すると、手が止まる回数が減ります。
### pinout.xyzの使い方
配線前の確認にはRaspberry Pi GPIO Pinoutが定番です。pinout.xyz[pinout.xyz](https://pinout.xyz/)を開くと、40ピンヘッダを上から見た形で、各ピンが**3.3Vなのか、5Vなのか、GNDなのか、GPIOなのか**を色分け付きで追えます。紙の配線図だけだと向きを取り違えやすい場面でも、この表示なら今見ている実機のどの列を触っているのかを照合しやすくなります)。
使い方は単純で、まず実機の向きをそろえます。そのうえで、目的のBCM番号を探し、対応する物理ピン番号を見る流れです。たとえばGPIO17を使うなら、pinout.xyzではGPIO17のページに物理11と表示されます。GPIO27なら物理13、GPIO18なら物理12です。筆者はワークショップでもpinout.xyzをスマホで開き、実機の向きと合わせてから配線してもらっていますが、これだけで差し間違いが目に見えて減ります。机の上で基板を回転させたまま作業すると、左右感覚がすぐ崩れるためです。
見分ける順番も決めておくと安定します。筆者はまずGNDを探し、その次に使うGPIOを確認し、電源ピンは最後に見る流れで進めます。いきなり信号ピンだけを追うと、隣の5Vや3.3Vを見落としやすいからです。とくにブレッドボードでジャンパ線が増えてくると、「黒線だからGNDのはず」と思い込んで実際は別の列に刺さっていた、という初歩的なミスが起こります。pinout.xyzの表示で一度ピンの役割を見直すだけで、その思い込みを止められます。
> [!WARNING]
> pinout.xyzを見るときは、GPIO名だけでなく**周囲のピンがGNDか電源か**まで一緒に眺めると、刺し間違えたときの危険度まで判断できます。GPIOの隣が5Vだと気づいているだけで、配線時の手つきが慎重になります。
{{ogp:https://pinout.xyz/|Raspberry Pi GPIO Pinout|The comprehensive add-on boards & GPIO Pinout guide for the Raspberry Pi|https://pinout.xyz/v1/img/index.png}}
### 避けたいピン(GPIO2/3)と電源ピンの注意
初心者向けの配線では、**GPIO2とGPIO3は避ける**ほうが素直です。この2本はI2Cに使われるピンで、外部プルアップが入っている前提の扱いになりやすく、ただのLED点灯やボタン入力の練習用としては癖があります。押したはずなのに期待通りの入力にならない、何もつないでいないのに状態が安定して見える、といった混乱の元になるためです。最初の数回は、GPIO17やGPIO27のような素直なピンで入出力の基本を覚えたほうが、回路とコードの対応が見えます。
電源ピンの区別も同じくらい大切です。40ピンヘッダには**3.3Vピン、5Vピン、GNDピン、GPIOピン**が並んでいます。GPIOは信号の出し入れに使う場所、GNDは基準電位、3.3Vと5Vは電源供給用です。この役割を混同すると、LEDが光らないだけで済まず、配線全体の見直しが必要になります。とくに「物理ピン番号だけを見て隣へずらして刺す」作業は危険で、GPIOのつもりで5Vへ触れてしまう事故が起きます。
入門で使うピンを固定しておくと、その危険を避けやすくなります。本記事の回路は、LEDをGPIO17(物理11)、ボタンをGPIO27(物理13)、PWMをGPIO18(物理12)として進めます。3本とも並びが近く、pinout.xyzでも追いやすい配置です。まずこの3本の位置関係を覚えておくと、ブレッドボード上で信号線をまとめやすく、GNDへの戻りも整理しやすくなります。
配線ミスの多くは、難しい電子回路の話ではなく、**番号の意味を混ぜたまま手を動かすこと**から始まります。BCMで統一して考え、実機ではpinout.xyzで物理位置を照合し、GPIO2/3のような癖のあるピンは避ける。この3つを守るだけで、最初のGPIO作業はずっと落ち着いて進みます。
{{related:raspberry-pi-camera}}
## Step 1 LEDを光らせる:PythonでGPIO出力
### 配線
ここでは、GPIO17からLEDを光らせる最小構成を作ります。配線は**GPIO17(物理11)から330Ωの抵抗を通してLEDのアノードへつなぎ、LEDのカソードをGNDへ戻す**形です。BCM番号で考えるので、コード側では17、実機では物理11を触ります。
LEDには向きがあります。**長い足がアノード(プラス側)、短い足がカソード(マイナス側)**です。ワークショップでもこの向きを逆にしてしまう相談は毎回のように出ます。こういうときは配線図だけで済ませず、文章でも「長い足をGPIO側、短い足をGND側」と書いておくと、その場で原因にたどり着けます。LEDが光らないとき、まず疑うべきなのはコードより極性です。
330Ωを入れる理由もここで押さえておきます。LEDをGPIOに直結すると電流が流れすぎるおそれがあるため、**直列抵抗で過電流を防ぎます**。330Ωは入門用のLED点灯回路で広く使われる実例値で、最初の1本として扱いやすい定番です。明るさを極端に追う設定ではなく、まず安全に点灯を確認するための値だと考えると腑に落ちます。
ブレッドボード上では、GPIO17から出たジャンパ線を抵抗へ挿し、その先をLEDの長い足へつなぎます。LEDの短い足はGND列へ入れ、GND列をRaspberry PiのGNDピンへ戻します。ピン配置の再確認にはRaspberry Pi GPIO Pinout[ピン配置の再確認にはRaspberry Pi GPIO Pinout](https://pinout.xyz/)が役立ちます。GPIO17が物理11に対応していることを見ながら作業すると、物理番号とBCM番号の取り違えを途中で止められます)。
{{product:2}}
### コード全文
配線ができたら、PythonからGPIO17を出力モードにして、1秒ごとにON/OFFしてみます。RPi.GPIOが未導入なら、Raspberry Pi OSでは `python3-rpi.gpio` で入れられます。なお、Raspberry Pi 5でRPi.GPIOは既知の非互換があるため、このあと扱う代替案へ進む前提で読んでください。ここではまず、GPIO出力の基本形そのものをつかむことを優先します。
```python
import time
import RPi.GPIO as GPIO # import (2)
LED_PIN = 17 # BCM番号
### GPIO.setmode(GPIO.BCM) # section 2
GPIO.setup(LED_PIN, GPIO.OUT)
try:
while True:
GPIO.output(LED_PIN, GPIO.HIGH) # LED ON
print("LED ON")
time.sleep(1)
GPIO.output(LED_PIN, GPIO.LOW) # LED OFF
print("LED OFF")
time.sleep(1)
except KeyboardInterrupt:
print("終了します")
finally:
GPIO.cleanup()
このサンプルで見てほしいのは3点です。
ひとつ目は GPIO.setmode(GPIO.BCM) でBCM番号を使うと明示していることです。
ふたつ目は GPIO.setup(LED_PIN, GPIO.OUT) でGPIO17を出力モードにしていることです。
みっつ目は GPIO.output(...) でHIGHとLOWを切り替え、LEDの点灯と消灯を作っていることです。
LEDが光る仕組みもコードと対応させておくと、次の応用に進みやすくなります。
GPIO17がHIGHの間はピンから電流が流れ、抵抗を通ってLEDにかかるので点灯します。
LOWにすると電位差がなくなり、LEDは消灯します。
たったこれだけですが、ソフトウェアが物理ピンの状態を変えているという感覚がつかめると、ボタン入力やPWMの理解まで一気につながります。
実行とcleanup
ファイル名を led_blink.py としたら、ターミナルで次のように実行します。
python3 led_blink.py
うまく動けば、LEDが1秒ごとに点滅し、ターミナルにも LED ON と LED OFF が交互に表示されます。
止めるときは Ctrl + C です。try / except / finally にしてあるので、中断しても GPIO.cleanup() が呼ばれ、使ったGPIOが解放されます。
この cleanup は見落とされがちですが、入門の段階で癖にしておくと後が楽です。
筆者の経験では、cleanupを忘れたまま何度も実行すると、次の起動時に警告が出て原因が見えにくくなる場面がよくあります。
LEDが光くかどうかだけに目が向く時期ほど、終了処理まで含めて1セットで覚えたほうが混乱が減ります。
もし光らなければ、確認する順番を固定すると切り分けが早くなります。
まずLEDの足の向き、次にGPIO17と物理11の取り違え、続いてGNDへ戻っているか、そのあとでコードの GPIO.BCM と LED_PIN = 17 を見ます。
いきなり全部を疑うより、電流の流れる道を頭の中でたどるほうが、ミスの位置がはっきりします。
NOTE
LEDが点かないときは、抵抗の有無より先にLEDの極性を見ると原因に当たりやすいです。
長い足がGPIO17側、短い足がGND側という確認だけで、その場で解決することが珍しくありません。
Step 2 ボタンを読む:GPIO入力とプルアップ/プルダウン
入力が浮く理由
LEDを光らせる出力は、GPIO.output(...) でHIGHかLOWをこちらから決められました。
入力は逆で、外側の回路がどちらの状態を作るかをRaspberry Piが読む立場になります。
ここで最初につまずきやすいのが、ボタンをつないだだけでは入力ピンの電圧が定まらず、0にも1にも見えてしまう「浮いた状態」です。
図で描くと、浮いている入力はこんなイメージです。
3.3V ────────────
\
GPIO入力ピン ● ) どこにも安定してつながっていない
/
GND ────────────
この状態では、周囲のノイズや指で触れたときの影響を受けて、GPIO.input() の結果がHIGHになったりLOWになったりします。
ワークショップでも「押していないのに反応する」「手を近づけると値が変わる」という現象はよく出ます。
ボタン入力で安定して読めるようにするには、押していないときの基準電位をあらかじめ決めておく必要があります。
その役目を持つのがプルアップとプルダウンです。
プルアップは、押していないときに入力を3.3V側へ引っ張ってHIGHに保つ方法です。
ボタンを押した瞬間だけGNDへ落としてLOWにします。
プルダウンは逆に、押していないときにGND側へ引っ張ってLOWに保ち、押したときだけ3.3Vへつなぎます。
プルアップの考え方
3.3V
|
[抵抗]
|
GPIO入力ピン ●───[ボタン]─── GND
未押下: HIGH
押下時: LOW
最初の成功体験を作るなら、筆者はこのあと紹介する内部プルアップから入ることが多いです。
理由は単純で、配線が一気に減るからです。
ボタンとGNDだけで動く形にすると、受講者が「ボタンを押すとGNDに落ちる」という関係に集中できます。
なお、入力回路でもRaspberry PiのGPIOは3.3V系です。
前述の通り、5Vのスイッチ回路や5V出力のモジュールをGPIOへ直結する構成は入れません。
内部プルアップの回路とコード
まずは内部プルアップを使って、ボタンを押したらLEDが点灯する小さな演習を動かします。
LED側は前のステップと同じ考え方で、GPIOからLEDへ流れる電流に330Ωを直列に入れます。
これはLEDに流れる電流を抑え、GPIOとLEDの両方を無理な状態にしないためです。
今回の配線は、BCM番号でそろえると次の構成です。
- LED: GPIO17 → 330Ω → LED → GND
- ボタン: GPIO27 → ボタン → GND
LEDのGPIO17は物理11、ボタンのGPIO27は物理13です。
位置が曖昧になったらRaspberry Pi GPIO Pinout位置が曖昧になったらRaspberry Pi GPIO Pinoutの対応表を見ると止まらず進められます)。
内部プルアップを使うコードのポイントは、入力設定で pull_up_down=GPIO.PUD_UP を指定するところです。
これでGPIO27は、何も起きていないときHIGH、ボタンでGNDにつながるとLOWになります。
つまり押されたら0になるので、最初はここが少し直感に反します。
import time
import RPi.GPIO as GPIO # import (3)
LED_PIN = 17 # BCM 17
BUTTON_PIN = 27 # BCM 27
## GPIO.setmode(GPIO.BCM) # section 3
# LEDは出力
GPIO.setup(LED_PIN, GPIO.OUT)
GPIO.output(LED_PIN, GPIO.LOW)
# ボタンは入力 + 内部プルアップ
GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
try:
while True:
button_state = GPIO.input(BUTTON_PIN)
if button_state == GPIO.LOW:
GPIO.output(LED_PIN, GPIO.HIGH)
print("button pressed -> LED ON")
else:
GPIO.output(LED_PIN, GPIO.LOW)
print("button released -> LED OFF")
### time.sleep(0.05)
except KeyboardInterrupt:
print("終了します")
finally:
GPIO.cleanup()
このコードには、前のステップで押さえた基本形がそのまま残っています。GPIO.setup(LED_PIN, GPIO.OUT) でLED用ピンを出力にし、GPIO.output(...) で点灯と消灯を切り替えています。
そのうえで、GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) を加え、入力の基準をソフトウェア側で作っています。
終了時の GPIO.cleanup() も同じです。
入出力を混ぜる場面ほど、cleanupまで含めて1セットで覚えておくと混乱が減ります。
ここでは割り込みではなく、短い間隔で状態を読むポーリングにしています。
入門段階では、ループの中で「読む → 判定する → LEDを書き換える」という流れが目で追えたほうが理解が進みます。
ボタン入力の最初の一歩では、この直線的な構造のほうが腑に落ちやすいはずです。
TIP
内部プルアップでは、ボタン未押下がHIGH、押下時がLOWです。押したのに 0 が返るのは故障ではなく、この回路の仕様です。
内部プルアップは部品が減るので、教材としての立ち上がりが速い構成です。
筆者も最初の実演ではよく使います。
ただし、Pi 5 を対象に公開する教材では、内部プルアップだけで済ませると一部環境で期待通りに動かない報告があるため、外付け10kΩの回路例も併記しておくと読者のトラブルを減らせます。
実機で配布する教材では外付け抵抗の図版を併せて掲載することを推奨します。
3.3V
```text
3.3V
|
[10kΩ]
|
GPIO入力ピン ●───[ボタン]─── GND
(補足) Pi 5 環境では内部プルアップが期待通りに動かない報告が一部あります。
公開用の教材やチュートリアルでは、外付け10kΩの回路例も併記して動作確認することを明示すると、読者のトラブルを減らせます。
この回路も未押下はHIGH、押下時はLOWです。
動作の考え方は内部プルアップと同じですが、抵抗を物理的に見ながら回路を追えるので、プルアップの原理を理解するにはこちらのほうが頭に残ります。
Pi以外のマイコンへ移るときにも、そのまま応用できます。
逆に外付けプルダウンなら、こうなります。
GPIO入力ピン ●───[ボタン]─── 3.3V
|
[10kΩ]
|
GND
こちらは未押下がLOW、押下時がHIGHです。
コード上の判定も反転します。
どちらを選んでも構いませんが、Raspberry Pi入門では「ボタンでGNDに落とす」内部プルアップ構成のほうが配線が少なく、ミスの場所も絞り込みやすいという利点があります。
比較の視点を表にすると、選び分けの軸が見えます。
| 項目 | 外付け10kΩ | 内部プルアップ/プルダウン |
|---|---|---|
| 部品点数 | 抵抗が1本増える | ボタンだけで組める |
| 回路の見通し | 電流の流れを図で追いやすい | ソフト設定に隠れる部分がある |
| 配線ミス | ブレッドボード上の差し間違いが増える | 配線本数が少ない |
| 応用範囲 | 他のマイコンでもそのまま考えられる | Raspberry Pi側の機能に依存する |
| ノイズ対策の考え方 | 物理回路として調整しやすい | まずは簡単に試せる |
学び始めの段階では内部プルアップのほうが前に進みやすく、回路の原理を腹落ちさせたい段階では外付け10kΩの価値が出てきます。
両方を知っていると、「今回は部品を減らして試す」「今回は安定性を優先して外付けにする」と選べるようになります。
こうした判断ができるようになると、ボタン1個の回路でも急に電子工作らしく見えてきます。
Step 3 割り込みでボタン検出する
ポーリング vs 割り込み
前のステップでは、while True の中で GPIO.input() を繰り返し読むポーリングを使いました。
あの形は「読む → 判定する → GPIO.output(...) でLEDを切り替える」という流れが一直線なので、入門段階では理解が進みやすい構造です。
一方で、ボタン待ちの時間が長い処理では、押された瞬間だけ反応したい場面が増えてきます。
そこで出てくるのが割り込みです。GPIO.add_event_detect() を使うと、ピンの状態変化をきっかけにコールバック関数を呼べます。
CPUは常にループで見張り続けなくてよく、コードも「待つ処理」と「押されたときの処理」を分けて書けます。
比較すると、次の違いが見えてきます。
| 項目 | ポーリング | 割り込み |
|---|---|---|
| CPU待機効率 | ループで読み続ける | 変化が起きたときだけ反応する |
| コードの見通し | 直線的で追いやすい | コールバック理解が必要 |
| 入門時の理解コスト | 低い | 中程度 |
| ボタン待ち用途 | 動作確認向き | 実用品に近い作り向き |
ここが。
ポーリングは「何が起きているか」を学ぶのに向いていて、割り込みは「押された瞬間だけ処理したい」を実現するのに向いています。
ワークショップでも、最初はポーリングで納得してから割り込みへ進んだほうが、途中で置いていかれる人が減ります。
なお、このセクションではBCM番号で統一します。
Raspberry Pi GPIO PinoutRaspberry Pi GPIO Pinoutを見ると、GPIO17は物理ピン11、GPIO27は物理ピン13です。
前述の対応関係を、コードでもそのまま使います)。
add_event_detectの実装例
まずは、LED出力とボタン入力を組み合わせた最小コードを全文で載せます。
LEDはBCM 17、ボタンはBCM 27です。
LEDには前のステップと同じく330Ωの直列抵抗を入れます。
これはLEDに流れる電流を抑えて、GPIOピンとLEDの両方を無理なく使うためです。
抵抗なしで直結すると、明るさ以前に回路を痛める方向へ進みます。
import RPi.GPIO as GPIO # import (4)
import time
from queue import SimpleQueue, Empty
LED_PIN = 17
BUTTON_PIN = 27
## events = SimpleQueue()
led_state = False
def on_button_pressed(channel):
# コールバックでは重い処理をせず、イベントだけ渡す
events.put("pressed")
### GPIO.setmode(GPIO.BCM) # section 4
# LED出力
GPIO.setup(LED_PIN, GPIO.OUT)
GPIO.output(LED_PIN, GPIO.LOW)
# ボタン入力(内部プルアップ)
GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
# FALLING: HIGH -> LOW
# 内部プルアップなので、押した瞬間にLOWへ落ちる
GPIO.add_event_detect(
BUTTON_PIN,
GPIO.FALLING,
callback=on_button_pressed,
bouncetime=300
)
try:
print("button interrupt test started")
while True:
try:
event = events.get_nowait()
except Empty:
event = None
if event == "pressed":
led_state = not led_state
if led_state:
GPIO.output(LED_PIN, GPIO.HIGH)
print("button pressed -> LED ON")
else:
GPIO.output(LED_PIN, GPIO.LOW)
print("button pressed -> LED OFF")
### time.sleep(0.01)
except KeyboardInterrupt:
print("終了します")
finally:
GPIO.cleanup()
このコードでも、出力の基本は変わりません。GPIO.setup(LED_PIN, GPIO.OUT) でLED用ピンを出力にし、GPIO.output() でHIGHとLOWを切り替えています。
違うのは、ボタンを読む部分をループの中の GPIO.input() から GPIO.add_event_detect() に置き換えたところです。
add_event_detect の第2引数には、どの変化を検出するかを指定できます。
| 指定値 | 検出する変化 | 典型的な用途 |
|---|---|---|
GPIO.RISING | LOW → HIGH | プルダウン回路で押下検出 |
GPIO.FALLING | HIGH → LOW | プルアップ回路で押下検出 |
GPIO.BOTH | 両方 | 押下と離した瞬間の両方を取りたいとき |
今回の配線は内部プルアップなので、未押下がHIGH、押した瞬間がLOWです。
したがって GPIO.FALLING が自然です。
もし押した瞬間と離した瞬間の両方を拾いたければ GPIO.BOTH に変え、コールバック内で GPIO.input(channel) を読んで現在状態を判定する形にします。
割り込みに切り替えると、最初の成功体験が一段進みます。
ボタンを押した瞬間にLEDが切り替わるので、ポーリングより「イベントで動いている」感覚がはっきり出ます。
筆者も教材ではこの段階で一度、LEDをトグル点灯させます。
押すたびに状態が反転するので、入力と出力がつながった手応えが残りやすいからです。
ただし、コールバック関数の中に sleep() や長いファイルI/O、通信処理をそのまま入れると詰まりやすくなります。
実際、ここでハマる例を何度も見てきました。
そのため筆者は、コールバックでは「起きた事実だけをキューへ渡す」、本体のループ側でLED制御や表示処理を行う設計を案内しています。
上のコードで SimpleQueue を使っているのはそのためです。
NOTE
割り込みのコールバックは「短く返す」が基本です。押された記録だけ渡し、時間のかかる処理はメインループ側で受ける形にすると、原因の切り分けが一気に楽になります。
bouncetimeとハード対策
ボタンは、押した瞬間にきれいに1回だけON/OFFが切り替わるとは限りません。
接点が細かく震えて、短時間にHIGH/LOWが何度も揺れることがあります。
これがチャタリングです。
割り込みでそのまま拾うと、1回押したつもりなのに2回、3回と検出されることがあります。
GPIO.add_event_detect() の bouncetime は、この揺れをソフトウェア側で吸収するための設定です。
単位はミリ秒で、たとえば bouncetime=300 なら、検出後の300msは続けて入ってくる変化を無視します。
実例としては100ms、300ms、1000msあたりがよく使われますが、入門では300ms前後から始めると扱いやすいです。
筆者の経験でも、300ms程度にすると「連打したら二重検出した」という相談が目に見えて減ります。
ただ、反応の速さを優先する用途では長すぎることもあるので、用途に合わせて詰めていきます。
たとえば次のように考えると調整しやすくなります。
| 用途 | bouncetimeの目安 |
|---|---|
| 学習用の単発ボタン | 300ms |
| ゆっくり押すメニュー操作 | 300ms〜1000ms |
| 反応速度を上げたい操作 | 100ms付近から検証 |
ソフト対策だけでなく、ハード対策にも触れておきたいところです。
チャタリングはスイッチの機械接点が原因なので、回路側で和らげる方法もあります。
代表例はRC回路での平滑化と、接点品質のよいスイッチを選ぶことです。
教材レベルでは bouncetime で十分前に進めますが、ボタンを増やしたり、配線が長くなったり、誤検出を減らしたい場面ではハード側の対策が効いてきます。
ここで見落としやすいのが、「二重検出の原因が全部ソフトのせいではない」という点です。bouncetime を長くしても収まらない場合、スイッチそのものや配線の引き回しに原因があることがあります。
前のステップで扱った入力回路の基本に戻り、プルアップの作り方やGNDの取り回しを見直すと、症状が素直に消えることがあります。
この段階で押さえたいのは、割り込みは便利ですが、イベント駆動ならではの注意があるということです。GPIO.setup(..., GPIO.OUT) と GPIO.output() でLEDを制御する基本はそのままに、入力の扱いだけが「ループで読む」から「変化を受け取る」に変わった、と捉えると混乱しません。
終了時に GPIO.cleanup() まで含めて整えておくと、次の実験へ移るときもピン状態を引きずらずに済みます。
PWMの基本とライブラリ選び
PWMの考え方と用途
PWMは、電圧を連続的に変える代わりに、短い周期でONとOFFを切り替え、そのONになっている割合(Duty比)で平均的な電力を調整する考え方です。
LEDなら明るさの調整、DCモーターなら回転の勢いの調整、サーボなら一定周期のパルス制御へとつながっていきます。
GPIOの出力を「点く・消える」から一歩進めて、「どれくらい点けるか」を扱えるようになるのがPWMです。
ここが。
人の目は高速な点滅をそのまま分離して見ないので、PWMでONの時間を少しずつ増やすと、LEDがだんだん明るくなったように見えます。
筆者の経験でも、LEDの調光はソフトPWMでも十分なめらかに感じられ、GPIO学習の次の題材として相性が良いと感じます。
一方で、同じPWMでもサーボに進むと話が変わります。
サーボは周期の揺れやパルス幅のばらつきが動きに出やすいため、そこでpigpioを選ぶ場面が増えてきました。
PWMの文脈では、ソフトウェアPWMとハードウェアPWMの違いも軽く押さえておくと整理しやすくなります。
ソフトウェアPWMはCPU側の処理でタイミングを作る方法で、実装は手軽ですが、負荷のかかり方によって周期がぶれたり、細かなジッタが出たりします。
ハードウェアPWMは専用機能で波形を出すので、一定周期を保ちたい用途に向いています。
LEDの明るさ調整ではソフトウェアPWMでも前に進めますが、音やサーボのようにタイミングの安定が結果へ直結する用途では、別の選択肢を検討する流れになります。
GPIO18は物理ピン12で、PWM対応ピンとしてよく使われる代表格です。
ピン配置の確認にはRaspberry Pi GPIO Pinoutピン配置の確認にはRaspberry Pi GPIO Pinoutが手元にあると迷いません)。
RPi.GPIOでのPWM例
入門として試しやすいのは、GPIO18(物理ピン12)にLEDをつなぎ、RPi.GPIO のPWM機能で明るさを変える例です。RPi.GPIO のPWMは基本的にソフトウェアPWMなので、まずはLED調光の感覚をつかむ用途に向いています。
前のステップと同じく、LEDには直列抵抗を入れ、BCM番号でGPIO18を指定します。
コード全体は次のとおりです。
import time
import RPi.GPIO as GPIO # import (5)
LED_PIN = 18
## GPIO.setmode(GPIO.BCM) # section 5
GPIO.setup(LED_PIN, GPIO.OUT)
pwm = GPIO.PWM(LED_PIN, 500) # 周波数 500Hz
pwm.start(0) # Duty比 0% で開始
try:
while True:
for duty in range(0, 101, 5):
pwm.ChangeDutyCycle(duty)
time.sleep(0.05)
for duty in range(100, -1, -5):
pwm.ChangeDutyCycle(duty)
time.sleep(0.05)
except KeyboardInterrupt:
pass
finally:
pwm.stop()
GPIO.cleanup()
GPIO.PWM(LED_PIN, 500) の 500 は周波数です。pwm.start(0) でPWMを開始し、ChangeDutyCycle() に0から100までの値を渡すと、Duty比を百分率で変えられます。
0なら消灯、100なら点灯しっぱなしに近い状態になります。
ループでDuty比を少しずつ増減させると、呼吸するように明るさが変わる動きになります。
SparkFun Python RPi.GPIO API(https://learn.sparkfun.com/tutorials/raspberry-gpio/python-rpigpio-apiでも、RPi.GPIO でPWMを扱う基本形が整理されています。
最初は周波数とDuty比の役割が混ざりやすいのですが、周波数は点滅の速さ、Duty比は明るさの割合と分けて捉えると頭の中が整います。
LEDでは周波数を少し変えても見え方の差はつかみにくい一方、Duty比の変化はすぐ見えるので、学習順としても自然です)。
TIP
LEDの調光で違和感があるときは、配線ミスより先にDuty比の変更幅と待ち時間を見ると切り分けが進みます。5%刻みを1%刻みにすると変化が細かくなり、sleep() が長すぎると段階的に見えます。
この段階では、PWMを「アナログ出力の代わり」と思い込みすぎないことも大切です。
実際には高速のデジタルON/OFFなので、テスターで読む値とLEDの見え方が一致しない場面もあります。
ただ、LEDの調光という体験に限れば、ソフトウェアPWMでも十分に手応えがあります。
GPIOの基本入出力を通ったあとにこの変化を見ると、同じピン操作でも表現の幅が一気に広がったと実感できます。
Pi 5や高精度用途の選択肢
ライブラリ選びでは、RPi.GPIOが古い入門記事に多く出てくる一方で、Raspberry Pi 5ではそのまま動かない報告が多い点を先に整理しておきたいところです。
Pi 5ではGPIOまわりの構成が変わっており、従来の直接レジスタ操作に寄ったライブラリがつまずきやすくなっています。
このため、Pi 5で新しく始めるなら、GPIO Zeroやlibgpiod系、あるいは『rpi-lgpio』のような代替を視野に入れる流れが現実的です。
GPIO ZeroはPi 5での利用事例が多く、内部でlgpioやgpiod系のバックエンドを使って互換を取る考え方が広まっています。
精度重視の用途では、選び方がもう一段変わります。
たとえばサーボ制御、音の生成、一定周期の維持が結果を左右する処理では、ソフトウェアPWMの揺れがそのまま動作に出ることがあります。
筆者もLED調光まではRPi.GPIOのソフトPWMで進めることがありますが、サーボまで入る教材ではpigpioへ切り替える構成を選ぶことが多くありました。pigpio は高精度PWMに強みがあるためです。
ただし、Pi 5ではpigpioが未対応という報告が複数あり、ここは旧来の記事をそのまま当てはめにくい部分です。
そのためPi 5では、用途ごとに方向性を分けて考えると混乱しません。
LEDの明るさ調整や単純なPWM学習ならGPIO Zeroで始める。RPi.GPIO互換コードをなるべく保ちたいなら『rpi-lgpio』を候補にする。
LinuxのGPIO character deviceを素直に扱いたいならlibgpiod系で組む、という整理です。
Raspberry Pi Documentation(https://www.raspberrypi.com/documentation/でも、PythonからGPIOを扱う話題ではGPIO Zeroがよく登場します)。
高精度PWMそのものについては、GPIO18のようなPWM対応ピンを使い、ハードウェアPWMを活用する構成が候補に入ります。
ただし、Pi 5でどのライブラリ経由でそれを安定して扱うかは、RPi.GPIO時代よりも一段低い層の理解が要る場面があります。
ここで押さえたいのは、LED調光の入門と、周期精度が要る制御は、同じPWMでも求めるものが違うという点です。
橋渡しとしてはまずLEDでDuty比の感覚をつかみ、その先でモーターやサーボへ進む段階になったら、ソフトウェアPWMの限界とライブラリ選定をセットで考える流れが自然です。
README — rpi-lgpio 0.6 Documentation
rpi-lgpio.readthedocs.io動かないときのチェックリスト
配線と番号の再点検
動かないときに最初に戻る場所は、たいていコードではなく配線です。
ここが。
ブレッドボードでは、1本ずれただけで見た目は合っているのに回路がつながっていない、ということがよく起こります。
GNDを使う回路では、Raspberry Pi側のGNDと外部回路側のGNDが共通になっているかを先に見ます。
LEDもボタンも、信号線だけ合っていてGNDが切れていると反応しません。
ジャンパ線の差し込みが浅い、ブレッドボードの左右で電源レールが分かれている、同じ列のつもりで1列ずれている、といった初歩的な見落としが意外と多いところです。
番号の見直しも同時に進めます。
本記事はBCM番号で統一しているので、コードで17と書いてあるならBCM 17を指します。
ここで物理ピン番号(BOARD)と混ざると、配線が正しく見えても別のピンを触ってしまいます。
pinout.xyzpinout.xyzで、使っているGPIOの物理位置をもう一度指で追うと混乱がほどけます。
GPIO17は物理ピン11、GPIO27は物理ピン13、GPIO18は物理ピン12という対応を、配線図ではなく実機の40ピンヘッダで確認すると取り違えに気づきやすくなります)。
筆者の経験では、「LEDが光らない」は極性かピン番号ミスに行き着くことが多いです。
LEDには向きがあり、長い足側と短い足側を逆にすると点灯しません。
さらに、直列抵抗の入れ忘れも見逃せません。
LEDには330Ωを入れる前提で組んでいるので、抵抗が抜けていたり、手元の別の値に入れ替わっていたりすると、期待した見え方にならないことがあります。
LED自体が不良というケースもゼロではないため、同じ配線のままLEDだけ交換して反応を見ると、回路か部品かの切り分けが進みます。
回路・部品の切り分け
ボタン入力で反応が不安定なときは、回路の状態を一つずつ分解して考えると整理できます。
押していないのに値が揺れる、勝手に反応するという症状は、プルアップまたはプルダウンが入っていないときに典型的です。
ワークショップでも「ボタンが勝手に反応する」という相談はよくありますが、原因の中心は未設定の入力ピンが宙ぶらりんになることです。
外付け抵抗を使う構成なら、10kΩのつながる先が3.3VなのかGNDなのかを回路図どおりに見直します。
ボタンをブレッドボードにまたがせる向きが逆で、押しても同じ列の中だけを短絡していることもあります。
LED側の切り分けでは、まずLEDを一度外し、電源ラインとGPIOの位置関係が合っているかを見ます。
そのあとで、抵抗、LEDの順に戻すと、どの段階でおかしくなるかを追えます。
ボタン側も同じで、スイッチを外した状態で入力が安定しているか、押したときだけ変化するか、という順で見ていくと原因が狭まります。
部品を一気に疑うより、回路を小さくして1つずつ戻すほうが、初心者でも迷子になりにくい進め方です。
電圧の見直しも見逃せない。
Raspberry PiのGPIOは3.3V系なので、外部モジュールをつなぐ場面では5Vを信号ピン側へ入れていないかを見ます。
とくにVCCとSIGの表記が並ぶモジュールでは、5V電源は合っていても、信号線まで5V系のままつないでしまう例があります。
LEDやボタンだけの入門では起こりにくいものの、センサーや中継基板を足した瞬間に混乱しやすい部分です。
NOTE
配線確認は「全部を見る」より、「GND」「信号」「部品の向き」の3点だけに絞って追うと、目線がぶれません。
初心者ほど一度に多くの箇所を見ようとして、かえって見落としが増えます。
ライブラリ・環境の見直し
配線が合っているのに動かないなら、ソフト側の土台を見ます。importで始まるエラーはライブラリ未導入のことがあり、逆に起動はするのにGPIO操作だけ失敗する場合は、別のライブラリが混在していることがあります。
古い記事のコードをつなぎ合わせると、RPi.GPIO前提の書き方とGPIO Zero前提の書き方が混ざり、セットアップ方法や後始末が食い違います。
終了時にcleanupを入れていないコードを何度も実行すると、前の状態が残って次の実行結果を読み違えることもあります。
権限まわりのエラーも、配線ミスと同じくらい初学者を止めます。Permission系の表示が出るなら、コードの内容より先に実行方法やGPIOへアクセスできる設定を疑います。
たとえばgpioグループの扱いや、どの環境からPythonを起動しているかが噛み合っていないと、配線が正しくてもGPIOに触れません。
ターミナルでは動くのにエディタの実行ボタンだと失敗する、という差もここで起こります。
Pi 5では、ライブラリの世代差がそのまま動作差になります。
前のセクションでも触れた通り、RPi.GPIOはPi 5で不一致を起こす例が多く、古い入門コードをそのまま実行するとつまずきます。
そういうときはGPIO Zero、あるいは『rpi-lgpio』やlibgpiod系へ頭を切り替えるほうが筋が通ります。
GPIO ZeroGPIO ZeroはPi 5での利用事例が多く、LEDやButtonのような基本部品から入り直すのに向いています。
『rpi-lgpio』もRPi.GPIO互換の流れを引き継ぎたい場面で候補になります。
Pi 5でRPi.GPIOのコードが動かず、配線ばかり見直して時間を使ってしまうのはよくある遠回りです。
ライブラリ不一致を先に疑うだけで、原因の探索範囲がぐっと狭まります)。
まとめと次のステップ
この記事で到達できるレベル
おすすめの次の一手
次に試してほしいのは、まず自分で書いたポーリングのボタン監視を割り込み式へ書き換えることです。
処理の置き場所が変わるだけで、コードの見え方がどう変わるかを体で理解できます。
そのあとにPWMでLEDの点灯率を変え、明るさの感覚をつかむと、出力制御の理解が一段深まります。
筆者の経験では、SSHやVS Codeから何度も実行と修正を回すと、この感覚は短時間で身につきます。
そこまで進んだら、I2Cセンサーの読み取りやサーボ制御へ広げる流れが自然です。
関連記事
ラズパイ×人感センサーで照明自動化|リレー配線と安全策
Raspberry Piの GPIO でPIR人感センサー検知→リレー制御を実装する手順を、完成イメージから順に追います。この記事を読めば、低電圧(5V)ランプで安全に検証しつつ、配線と gpiozero の Python コードで実用的な保持時間制御まで試せるようになります。
ラズパイ 自宅サーバー構築|Samba/Nextcloud/VPN
Raspberry Pi 5で自宅サーバーを始めるなら、まずはSambaでLAN内の共有フォルダを作り、外出先からはWireGuard経由で入る構成にすると、最短で実用品になります。
Raspberry Pi Pico入門|違い・選び方・始め方
Raspberry Pi PicoはRaspberry Piという名前でも、Linuxを動かす小さなパソコンではなく、電子工作向けの“マイコン”です。筆者のワークショップでも「PicoにRaspberry Pi OSを入れるには?」という質問が毎回のように出ますが、ここを最初に腹落ちさせるだけで、
ラズパイでできること15選|初心者〜上級者の活用例
Raspberry Piは、Linuxが動く小さなシングルボードコンピュータとして、電子工作から自宅サーバー、IoT、監視、ロボットまで手を広げられる道具です。この記事では、これから始める人から一歩踏み込みたい人までに向けて、活用例を初心者・中級者・上級者の3段階で15例に絞り、用途、必要なもの、難易度、