Raspberry Pi × Python
はじめに:GPIO操作は「3つの型」で理解できる
こんにちは、ニンジンです🥕
「Raspberry Piで何か動かしたいけれど、GPIOの設定がいまいちピンとこない」——そんな方向けの記事です。
じつは、本格的なXYテーブル(自作CNC)を動かすコードでも、GPIOの基本操作はたった3つの命令に集約されます。この記事では、実際にステッピングモーターを制御している現場のコードを抜粋しながら、最短ルートでGPIOの考え方を押さえます。使うライブラリは RPi.GPIO です。
この記事で分かること
- GPIO操作の基本3ステップ:
setmode→setup→output - ピン番号の数え方 BCM と BOARD の違いと、どちらを使うか
- 出力(OUT)と入力(IN)の使い分け
- リミットスイッチの誤作動を防ぐプルアップ(
PUD_UP)の役割 - HIGH / LOW の切り替えで「モーターが回る」仕組み
GPIO操作の「3つの型」
プログラムの中で、モーターを動かす心臓部になっているのは次の3つの命令です。
# 1. モードを決める
GPIO.setmode(GPIO.BCM)
# 2. ピンの役割を決める(出口か入り口か)
GPIO.setup(X_STEP, GPIO.OUT)
# 3. 電気信号を送る(動かす!)
GPIO.output(X_STEP, GPIO.HIGH)この3ステップが何をしているのかを、XYテーブルの動きと結びつけて解説します。
① setmode:ピン番号の数え方を決める(BCM / BOARD)
GPIO.setmode(GPIO.BCM)ラズパイには「ピンの番号」の数え方が2種類あります。
- BOARD:基板上の端子番号(1番、2番…)で指定
- BCM:チップ上の名前(GPIO20、GPIO21…)で指定
② setup:ピンを「出力(OUT)」か「入力(IN)」かに設定する
GPIO.setup(pin, GPIO.OUT)- OUT(出力):ラズパイからモータードライバーへ「動け」と命令を送る側
- IN(入力):リミットスイッチなどが「壁に当たった」という信号をラズパイへ伝える側
XYテーブル製作シリーズでは、次のように使い分けています。
# モーターを動かす信号は「OUT」
GPIO.setup(X_STEP, GPIO.OUT)
# 原点検知用のリミットスイッチは「IN」
GPIO.setup(X_LIMIT, GPIO.IN, pull_up_down=GPIO.PUD_UP)「命令を出すピン」と「状態を監視するピン」を明確に分けるのが制御の基本です。
プルアップ(pull_up_down=GPIO.PUD_UP)が必要な理由
リミットスイッチの setup に出てくる pull_up_down=GPIO.PUD_UP は、精密なマシンを動かすうえで「誤作動を防ぐ命綱」の役割を持っています。
1. 「浮いている」状態はラズパイが迷う原因になる
スイッチが押されていないとき、そのピンはどこにもつながっていない「空中に浮いた」状態(フローティング)になります。この状態だと、周りの静電気やノイズの影響でラズパイ内部の判定が HIGH と LOW の間でフラフラして不安定になります。
2. PUD_UP で「ふだんはHIGH」に固定する
この設定をすると、ラズパイ内部でそのピンをこっそり3.3V(HIGH)につないでくれます。
- スイッチを押していないとき:内部で電気につながっているので安定して HIGH
- スイッチを押したとき:電気がグランド(0V)に流れて一気に LOW
3. なぜXYテーブルで重要なのか
この設定を忘れると、モーターが動いている最中のノイズを「リミットスイッチが押された」と勘違いして、何も当たっていないのに急停止(誤作動)する原因になります。
③ output:HIGH / LOW = 物理的な電圧の切り替え
GPIO.output(pin, GPIO.HIGH)
- HIGH:電圧がかかっている状態(3.3V)
- LOW:電圧がかかっていない状態(0V)
「モーターが回る」の正体は、このHIGHとLOWを高速で繰り返しているだけです。
# 1ステップ動かす仕組み(コードより抜粋)
GPIO.output(STEP, GPIO.HIGH) # 電気を通す
time.sleep(t) # 少し待つ
GPIO.output(STEP, GPIO.LOW) # 電気を切る
time.sleep(t) # 少し待つこの「カチ・カチ」という電気のスイッチングが、XYテーブルの精密な1mmの移動を生み出しています。
よくある質問(FAQ)
QRPi.GPIO と gpiozero、lgpio は何が違いますか?
ARPi.GPIOは昔からある定番ライブラリで、この記事のコードもこれを使っています。gpiozeroはより簡単に書ける上位ラッパーです。なお、Raspberry Pi 5やBookworm以降ではRPi.GPIOが動かないことがあり、その場合はlgpio系を使います。
QBCMとBOARD、途中で混ぜて使えますか?
A混ぜられません。プログラムの最初にGPIO.setmode()でどちらか一方を宣言し、以降のピン指定はすべてその番号体系で書きます。この記事ではBCM(GPIO番号)で統一しています。
QGPIO.setup(pin, GPIO.OUT) を忘れるとどうなりますか?
A出力設定をしていないピンにGPIO.output()を実行すると、エラー(RuntimeError)になります。使うピンは必ず先にsetupで役割を決めます。
Qプルアップ(PUD_UP)とプルダウン(PUD_DOWN)はどう使い分けますか?
Aスイッチの片側をGND(0V)につなぐ配線ならPUD_UP(普段HIGH・押すとLOW)、片側を3.3Vにつなぐ配線ならPUD_DOWN(普段LOW・押すとHIGH)です。リミットスイッチはGND側につなぐPUD_UPが一般的です。
QHIGHとLOWを繰り返す間隔(time.sleep(t) の t)はどのくらいですか?
Aモーターとドライバーによりますが、数百マイクロ秒〜数ミリ秒の範囲です。tを小さくすると速く回り、小さくしすぎると脱調(回転が追いつかず飛ぶ)します。加減速の制御は、このシリーズの別記事で扱っています。
Qプログラム終了時に GPIO.cleanup() は必要ですか?
A推奨されます。GPIO.cleanup()を呼ぶと、使ったピンを入力状態に戻して開放します。呼ばずに終了すると「このチャンネルは既に使用中」という警告が次回出ることがあります。
Follow me on X
本ブログの中の人「ニンジン🥕」はXやってます。新着記事はいち早くポストでお知らせしているので、見逃したくない方は @ninjin_py_vba をフォローしてみてください🥕
@ninjin_py_vba をフォローシリーズ記事一覧
電子工作・自動化ツールの製作記録をシリーズごとにまとめています。気になるテーマからお読みください。
-
FILE.01 — IoT
Raspberry Pi Pico W × GASラズパイPico W×GASで自作!「LINEで動く温湿度&スマートリモコン」完全ロードマップ
「外出中のペットの室温が心配…」そんな思いからスタートしたIoT自作プロジェクトの総集編。温湿度監視からエアコン遠隔操作まで、仕組みをゼロから作りたい方のための全5回の開発記録です。
シリーズを読む -
FILE.02 — CNC
Arduino × レーザー刻印CNCCNC自作シリーズ
高精度な加工を目指し、本格的な自作CNC製作に挑戦中。現在は基幹パーツであるオリエンタルモーターの納品を待つ「設計・準備編」を公開。ハードとソフトの両面から、理想のマシンを形にする過程をリアルタイムにお届けします。
シリーズを読む -
FILE.03 — XY軸制御
Raspberry Pi × ステッピングモーターXYテーブルシリーズ
Raspberry Piとステッパモーターを使い、ゼロから2軸制御に挑む記録。OS設定から回路設計、多軸制御のPythonコードまで、躓きやすいポイントを徹底図解。電子工作初心者が「動く感動」を味わうための実戦ガイドです。
シリーズを読む -
FILE.04 — 業務自動化
Python × Excel × CustomTkinter【Python開発記】NINJIN Mail制作記
PythonとExcelを連携させ、実務で即戦力となるメール送信ツールを開発。CustomTkinterによるUI構築や、ミスを防ぐテンプレート活用術など、現場の「痒い所に手が届く」自動化ノウハウを細部まで丁寧に解説します。
シリーズを読む -
FILE.05 — 業務自動化
Python × Excel × GUIアプリ化Invoice Maker(請求書・見積書自動作成)
手作業の請求書作成から卒業!PythonでExcelデータを読み込み一括PDF化する「Invoice_Maker」の作り方を全3回で解説。基本ロジックからGUIアプリ化まで、実務で役立つ自動化ノウハウが満載です。
シリーズを読む


コメント