はじめに

「Raspberry Piで何か動かしたいけれど、GPIOの設定がいまいちピンとこない…」 そんな悩みはありませんか?
実は、本格的なXYテーブル(自作CNC)を動かすコードでも、GPIOの基本操作はたったの3ステップに集約されます。今回は、実際にモーターを制御している現場のコードを抜粋しながら、最短ルートでGPIOをマスターしましょう。
GPIO操作の「3つの型」をマスターする
プログラムの中で、モーターを動かす心臓部となっているのは以下の3つの命令です。
# 1. モードを決める
GPIO.setmode(GPIO.BCM)
# 2. ピンの役割を決める(出口か入り口か)
GPIO.setup(X_STEP, GPIO.OUT)
# 3. 電気信号を送る(動かす!)
GPIO.output(X_STEP, GPIO.HIGH)
この3ステップが何を意味しているのか、XYテーブルの動きとリンクさせて解説します。
Python×Raspberry PiでXYテーブルを作る 完成構成と機構部品の資料(図面・BOM)の紹介【第11回】
①【Step 1】BCMとBOARD、どっちを使う?
GPIO.setmode(GPIO.BCM)
ラズパイには「ピンの番号」の数え方が2種類あります。

Raspberry Piのピンアサインをみると
GPIO番号とコネクタのピン番が異なっていることが分かります。
- BOARD: 基板上の端子番号(1番、2番…)で指定
- BCM: チップ上の名前(GPIO20、GPIO21…)で指定
現場の知恵:
自作CNCやXYテーブルの界隈では、拡張基板や回路図との整合性が取りやすい「BCM」が主流です。今回のコードでも、配線のメンテナンス性を考えてBCMを採用しています。
② 【Step 2】OUT / INの意味:電気の「方向」を決める
GPIO.setup(pin, GPIO.OUT)
ピンを「出力(OUT)」にするか「入力(IN)」にするかの設定です。
- 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 が必要なの?
リミットスイッチのコードに出てくるこの一見複雑な指定。実は、精密なマシンを動かす上で「誤動作を防ぐ命綱」のような役割を持っています。
1.「浮いている」状態は、ラズパイが迷う原因
スイッチが押されていないとき、そのピンはどこにもつながっていない「空中に浮いた」状態になります。
この時、周りの静電気やノイズの影響を受けて、ラズパイ内部では「今はHIGHかな?それともLOWかな?」と判断がフラフラと不安定になってしまいます。このフラフラと不安定な状態を『浮遊状態(フローティング)』と呼びます。
2.PUD_UP で「ふだんはHIGH」に固定する
ここで GPIO.PUD_UP(プルアップ)の出番です。 この設定をすると、ラズパイの内部でそのピンをこっそり3.3V(HIGH)に接続してくれます。
- スイッチを押していない時: 内部で電気につながっているため、安定して HIGH と認識される。
- スイッチを押した時: 電気がグランド(0V)に流れるため、一気に LOW に変わる。
3.なぜXYテーブルで重要なのか?
もしこの設定を忘れると、モーターが動いている最中のノイズを「あ、リミットスイッチが押された!」とラズパイが勘違いして、何も当たっていないのに急停止(誤作動)してしまう原因になります。
整理すると:
PUD_UPは「普段はHIGHで安定させておくよ」というおまじない。- 「スイッチが入った瞬間だけLOWになる」という明確な差を作るための設定。
③【Step 3】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の移動を生み出しています。
まとめ:GPIOは「道具」
難しく考えがちなGPIOですが、要するに「どのピンに」「いつ」「電気を流すか」を決めているだけです。
今回のXYテーブル制御コードも、分解してみればこの基本の積み重ねでできています。まずは1つのLEDを光らせることから始めて、その延長線上にある「精密な機械制御」の世界を楽しんでみてください!



コメント