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ステップ:setmodesetupoutput
  • ピン番号の数え方 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.GPIOgpiozerolgpio は何が違いますか?

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
スポンサーリンク

シリーズ記事一覧

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


超音波距離センサーHC-SR04をRaspberry Pi Picoで使う|仕組み・配線・精度検証
.uds1-block { position: relative; overflow: hidden; border-radius: 12px; border: 1px solid #f0cba8; background: linear-g…
今週の注目ガジェット〜09/07週〜|電子工作・自作向け新製品まとめ(TickrCast/Radxa Linkr ほか)
ニンジンのガジェット通信 09/07週。ESP32-P4の自作気象モニター、極小IP-KVM「Radxa Linkr」、ESP32のDINレール型PLC、LTE開発キットなど、電子工作で使えそうな新製品5つを解説。
サーボモータの角度をタクトスイッチで可変|OLED(SSD1306)に現在角度をリアルタイム表示
Raspberry Pi Pico 2W×MG996RにタクトスイッチとOLED(SSD1306)を追加。ボタンで角度を可変しながら現在角度をリアルタイム表示するMicroPython実装を、framebufの文字拡大やサーボの遊び対策まで実機ベースで解説します。
MG996RサーボモーターをRaspberry Pi Pico 2Wで動かす:PWM制御とキャリブレーション実践
MG996RサーボモーターをRaspberry Pi Pico 2Wで動かす方法を解説。公称180度のはずが実測198度だった個体差の原因究明から、ホーンのズレ補正、タクトスイッチでの角度制御まで実機検証の様子を紹介します。
Tapo P110Mの消費電力をExcelレポート化する【年次集計・電気代試算・セキュリティ判断編】
FastAPI+openpyxlでTapo P110Mの消費電力をExcelレポート化。15秒間隔の生ログを日次集計する設計や、31円/kWhでの電気代試算、外部公開を見送った理由まで解説します。

コメント