RPi.GPIO と gpiozeroの比較
🐍 はじめに
この記事は、Raspberry PiのPython向けGPIO制御ライブラリである「RPi.GPIO」と「gpiozero」を、背景・思想の違いから実装のコツ、用途別のおすすめまで1本にまとめたガイドです。
「なぜ2つあるの?」「どちらを選べば良い?」に答えつつ、学習~運用まで迷わない判断基準を用意します。
本文では、低レベル寄りの RPi.GPIO と、高レベル抽象の gpiozero を“ドライバ的API”と“部品志向API”として対比します。
🧭 背景:なぜ2つの流派が並立しているのか
-
まず登場したのは RPi.GPIO。Raspberry PiのGPIOをそのままPythonから触るための“素朴で薄いラッパ”として普及しました。教育用途でも「LEDを点ける」「ボタンを読む」を最短で学べるため、一気に定番化。
-
次に現れたのが gpiozero。教育現場での“実装のつまずき(デバウンス・後片付け・ピン番号迷子・PWM設定など)”を埋めるべく、センサーやアクチュエータを**オブジェクト(部品)**として扱える設計を採用。コード量とバグの温床を減らし、「作る楽しさ」を前面に出しました。
学び始めは gpiozero で“動く喜び”を最短で。電気的注意点やタイミング制御を詰めたい段階で RPi.GPIO の生APIへ降りる、という二段ロケットが王道です。
🔌 RPi.GPIO 概要(低レベル制御の定番)
ねらい
-
ピンを入力/出力に設定し、HIGH/LOWを直接読む・書く。
-
エッジ検知(立ち上がり/立ち下がり)やPWMを最低限の手数で扱う。
-
BOARD(物理ピン)/BCM(SoC論理番号)の番号系を明示し、
cleanup()
で必ず後始末。
できること
-
ピンモード設定(BCM/BOARD)
-
入力(プルアップ/プルダウン内蔵制御、イベント検知、デバウンス)
-
出力(LED、リレー、MOSFET経由の外部負荷など)
-
PWM(LEDの明るさ、モータの速度)
使う嬉しさ
-
挙動が見通しやすい(何をどう触っているかが明確)
-
資料が豊富、古い記事や教材とも互換性が高い
-
細かい制御が効く(タイミングや例外処理を自分で握れる)
自分で全部面倒を見る設計=後片付け忘れ・番号系の混乱・デバウンス不足・複数プロセス競合などの“初学者落とし穴”が発生しやすいです。
🧩 gpiozero 概要(部品指向・高レベルAPI)
ねらい
できること
-
ボタン・LED・サーボ・距離/光センサー等の高レベルクラス
-
非同期イベントとタイマーの簡易利用(無限ループのポーリング不要)
-
“ピン番号の迷子”対策、クリーンアップやデバウンスの良い初期値
使う嬉しさ
-
コードが短い・読みやすい・壊れにくい
-
回路図とクラス名が一致しやすく、記事や授業スライドと親和性が高い
-
チーム開発で“作法のバラつき”を減らせる
gpiozero は内部で RPi.GPIO などのバックエンドを利用します。必要になれば、低レベルAPIと併用・切替も可能です。
⚖️ RPi.GPIO と gpiozero の比較(実務目線の判断表)
-
思想
-
RPi.GPIO:ピンを直接叩く“薄いドライバ”
-
gpiozero:部品を操作する“高レベル抽象”
-
-
学習コスト
-
RPi.GPIO:中(手続き的・自由度が高い)
-
gpiozero:低(宣言的・誤りにくい)
-
-
バグの温床
-
RPi.GPIO:デバウンス/cleanup/番号系/排他を自前管理
-
gpiozero:多くを初期値とクラスが吸収
-
-
拡張性・微調整
-
RPi.GPIO:細かいタイミングや例外処理を握りたいときに強い
-
gpiozero:一般的な範囲は十分。特殊要件はバックエンド直叩きも可
-
-
教育・共有性
-
RPi.GPIO:仕組み理解に最適
-
gpiozero:授業・記事・ハッカソンで“動かす速度”が速い
-
「まず gpiozero で完成→必要箇所だけ RPi.GPIO に“降りる”」のハイブリッド運用が、最短で品質とスピードを両立します。
🧪 用途別レシピ発想(コードは擬似記述で要点だけ)
LEDの点滅(最短で動かしたい)
-
gpiozero:LED(pin).blink() を呼ぶだけ。プログラム終了時の後片付けも原則お任せ。
-
RPi.GPIO:setup→whileでHIGH/LOW→sleep→cleanup を自前で構成。
ボタン+イベント(チャタリングに悩みたくない)
サーボ・PWM(素早く試作→微調整へ)
-
まず gpiozero の Servo / AngularServo / PWMLED で“動く値”を掴む。
-
その後、RPi.GPIO の PWM に降りて周波数やデューティを詰める。
複数センサーの同時監視
-
gpiozero:複数 when_* ハンドラで自然にイベント駆動化。
-
RPi.GPIO:イベントキューやスレッド化の設計を自分で裁く(柔軟だが設計力が要る)。
🧱 設計指針(落とし穴を先回りで潰す)
-
ピン番号は“BCM”で統一(資料・サンプルの再現性が高い)
-
共通ユーティリティを用意
-
RPi.GPIO:
init_pins() / safe_cleanup() / edge_handler()
をチームで共有 -
gpiozero:クラス生成のラッパ(pinマッピング・共通設定)を一箇所に集約
-
-
イベントは“最小の副作用”で書く
-
ハンドラ内でI/Oを長時間ブロックしない(別スレッド/キューへ)
-
-
例外と後片付け
-
try/finally
で cleanup 保証(gpiozero でも長期運転なら明示の close を検討)
-
-
電気的安全
-
3.3V直結NGのデバイスは必ずドライバIC/レベル変換を挟む。インダクティブ負荷は逆起電力対策。
-
【危険】
5Vや外部電源の誤配線は、SoCを一発で破壊します。疑わしい回路はまずブレッドボード上で低負荷デバイスから検証を。
🧰 併用・移行のコツ(“二段ロケット”運用)
-
プロトタイプ:gpiozeroで部品クラス中心に素早く動かす
-
性能/精度要件が出た箇所のみ:その部位だけ RPi.GPIO の生APIに差し替え
-
バックエンド切替:gpiozero は RPi.GPIO を裏で使えるため、学習資産が無駄になりにくい
テスト時は“モック”でロジック部分を単体試験→実機I/Oは最終段だけ差し替えると開発効率が跳ね上がります。
🧾 よくある誤解と対策
-
「gpiozero はおもちゃ、実運用は難しい」→誤解。安全な初期値・イベント駆動・部品クラスはむしろ保守性に効く。
-
「RPi.GPIO は古いから非推奨」→誤解。いまも“基礎体力”として価値が高い。
-
「両者は競合」→誤解。設計レイヤが違う。使い分け・併用が正解。
🧩 まとめ:最短で“動く”、必要なだけ“掘れる”
-
まずは gpiozero で「部品をつなぐ感覚」で成功体験を積む
-
要件が厳しくなったら、その部分だけ RPi.GPIO に降りて微調整
-
設計と安全対策(番号統一・イベント最小化・cleanup保証・電気的保護)を“型”にする
記事のテンプレをそのまま使えば、教育・試作・小規模運用は gpiozero 主体、大規模/高精度は RPi.GPIO 併用の二刀流でほぼ網羅できます。