PR

Raspberry PiのGPIOをPythonで制御する基本3ステップ|setmode・setup・outputとプルアップ(PUD_UP)【XYテーブル実例】

Python

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種類あります。

Raspberry Piのピンアサイン図。GPIO番号とコネクタのピン番号が異なることが分かる
▲ GPIO番号とコネクタのピン番号は別物
  • BOARD:基板上の端子番号(1番、2番…)で指定
  • BCM:チップ上の名前(GPIO20、GPIO21…)で指定
現場の知恵:自作CNCやXYテーブルの界隈では、拡張基板や回路図との整合性が取りやすい BCM が主流です。配線のメンテナンス性を考えて、このシリーズのコードもBCMを採用しています。

② 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)
STEPピンのHIGHとLOWを高速で繰り返すことでモーターが1ステップずつ回る仕組みの図解
▲ 「モーターが回る」=HIGHとLOWの高速の繰り返し
  • 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の移動を生み出しています。


スポンサーリンク

まとめ:GPIOは「どのピンに・いつ・電気を流すか」だけ

難しく考えがちなGPIOですが、要するに「どのピンに」「いつ」「電気を流すか」を決めているだけです。XYテーブル制御のような複雑なコードも、分解すればこの基本の積み重ねでできています。

まずは1つのLEDを光らせるところから始めて、その延長線上にある精密な機械制御の世界を楽しんでみてください。

次に読む記事

💡 まずはこれ ラズパイでLチカ|PythonとRPi.GPIOでLEDを点灯・点滅させる方法 GPIO操作のいちばん最初の一歩。1個のLEDを光らせます。 → ⚙️ モーター制御へ ラズパイでステッピングモーターを回す方法|A4988の配線とPython制御・Vref調整 A4988ドライバーとステッピングモーターの配線、STEPパルスの送り方。 → 🗺️ 全体像 自作XYテーブルの全手順ロードマップ|Raspberry Pi+ステッピングモーターで2軸制御 第0回〜第11回。GPIOの基本から2軸のXYテーブル完成まで。 →

スポンサーリンク

よくある質問(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 をフォロー

この記事が役に立ったら、シェアしてもらえると嬉しいです🥕

Xでポスト はてブ LINE Pocket

PROJECT LOG — SERIES INDEX
スポンサーリンク

シリーズ記事一覧

電子工作・自動化ツールの製作記録をシリーズごとにまとめています。気になるテーマからお読みください。


GPSロガーのCSVを地図に表示する方法|Pico 2 WでGT-502MGG-NとATGM336Hを車に積んで走行・トンネル比較【Python・folium】
GPSロガーで記録したCSVを、Pythonのfoliumと地理院タイルで地図に表示する方法。GT-502MGG-NとATGM336Hを車に積んで4回走り、再起動の原因やトンネルでの違いも比べました。
今週の注目ガジェット〜10/19週〜|電子工作・自作向け新製品まとめ(Romu/W1700K SDR ほか)
大手が拾わないニッチな新製品を毎週チェック。今週はe-Paper開発キット、超小型USBボード、自作SDRなど5本立て。
GT-502MGG-NとATGM336Hの使い方|Raspberry Pi Pico 2 WとMicroPythonでGPSを受信して2台を比較
GT-502MGG-NとATGM336Hの使い方を、Pico 2 W×MicroPythonで解説。北斗で衛星数が多いATGM336H、信号が強いGT-502MGG-N。単精度floatで緯度経度が約1.4m刻みになる落とし穴も紹介します。
今週の注目ガジェット〜10/12週〜|電子工作・自作向け新製品まとめ(Q8botOne/Sipeed SLogic32U3 ほか)
大手が拾わないニッチな新製品を毎週チェック。今週は四足歩行ロボット、ロジックアナライザー、広告ブロッカーなど5本立て。
MOSFETはPicoの3.3Vで足りる?DCソレノイド駆動でゲート電圧不足を実測【Pico 2 W】
Pico 2 WとMOSFET(IRLU3410)で12VのDCソレノイドを駆動。ゲート3.3Vでは発振し、オン抵抗も約2.4倍に。レベル変換で5V駆動にした比較と、電流が8割止まりだった本当の原因を実測で紹介します。
まとめハブ
Python
スポンサーリンク

コメント