メインコンテンツへスキップ

RPi.GPIO と gpiozerono

🐍 はじめに

この記事は、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、Button、PWMLED、Servo、DistanceSensor などを**“部品クラス”**として呼び出すだけで利用開始。

  • イベント駆動(when_pressed 等)・安全なデフォルトわかりやすい命名で、学習コストを最小化。

できること

  • ボタン・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 を自前で構成。

ボタン+イベント(チャタリングに悩みたくない)

  • gpiozero:Button(pin).when_pressed = handler の1行でイベント化、bounce_timeも簡単。

  • RPi.GPIO:add_event_detect と bouncetime 指定。例外・再入・多重登録は自衛が必要。

サーボ・PWM(素早く試作→微調整へ)

  • まず gpiozero の Servo / AngularServo / PWMLED で“動く値”を掴む。

  • その後、RPi.GPIO の PWM に降りて周波数やデューティを詰める。

複数センサーの同時監視

  • gpiozero:複数 when_* ハンドラで自然にイベント駆動化。

  • RPi.GPIO:イベントキューやスレッド化の設計を自分で裁く(柔軟だが設計力が要る)。


🧱 設計指針(落とし穴を先回りで潰す)

  1. ピン番号は“BCM”で統一(資料・サンプルの再現性が高い)

  2. 共通ユーティリティを用意

    • RPi.GPIO:init_pins() / safe_cleanup() / edge_handler() をチームで共有

    • gpiozero:クラス生成のラッパ(pinマッピング・共通設定)を一箇所に集約

  3. イベントは“最小の副作用”で書く

    • ハンドラ内でI/Oを長時間ブロックしない(別スレッド/キューへ)

  4. 例外と後片付け

    • try/finallyで cleanup 保証(gpiozero でも長期運転なら明示の close を検討)

  5. 電気的安全

    • 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 併用の二刀流でほぼ網羅できます。

必要なら、このページに**“用途別スニペット集(gpiozero版・RPi.GPIO版の対訳)”**を追補します。欲しいデバイス(例:HC-SR04、PIR、人感、I2C温度、サーボ、リレーなど)を挙げてくれれば、そのまま貼れる実用サンプルを作るよ。