PR

Raspberry Pi 5でボタンを使ってサーボモータを制御する方法(gpiozero・GPIO22)

4. Raspberry Pi

Raspberry Piでサーボモータを動かせるようになると、

・ボタンで操作したい
・角度を手動で変えたい
・より実用的な制御をしたい

と感じることはありませんか?

本記事では、ボタンを使ってサーボモータの角度を変更する方法を解説します。

スポンサーリンク

今回やること

・GPIO22 → サーボモータ(信号)
・GPIO18 → ボタン①(左へ回転)
・GPIO27 → ボタン②(右へ回転)

ボタンを押すことでサーボの角度を変更します。

※GPIO22は汎用的に使用しやすいため採用しています。

準備するもの

・Raspberry Pi 5
・サーボモータ(SG90など)
・ボタン ×2
・ジャンパーワイヤー
・外部電源(5V・2A以上推奨)

配線方法

■ サーボモータ
赤 → 外部電源(5V)
茶(黒) → GND
橙(黄) → GPIO22

■ ボタン①
GPIO18 → ボタン → GND

■ ボタン②
GPIO27 → ボタン → GND

Raspberry Pi 5でサーボモータを制御する方法 の記事と同じ回路構成です。

※外部電源を使用する場合でも、
Raspberry PiとサーボモータのGNDは必ず共通にしてください。

Pythonコード

ファイル名:servo_button_control.py

from gpiozero import Servo, Button
from signal import pause

servo = Servo(22, min_pulse_width=0.0005, max_pulse_width=0.0025)

button_left = Button(18, pull_up=True, bounce_time=0.01)
button_right = Button(27, pull_up=True, bounce_time=0.01)

position = 0
servo.value = position

def move_left():
    global position
    print("LEFT PRESSED")
    position -= 0.2
    if position < -1:
        position = -1
    servo.value = position
    print(f"position: {position:.2f}")

def move_right():
    global position
    print("RIGHT PRESSED")
    position += 0.2
    if position > 1:
        position = 1
    servo.value = position
    print(f"position: {position:.2f}")

button_left.when_pressed = move_left
button_left.when_released = lambda: print("LEFT RELEASED")

button_right.when_pressed = move_right
button_right.when_released = lambda: print("RIGHT RELEASED")

pause()

コード解説

サーボモータは-1〜1の値で角度を制御します。

・-1 → 左
・0 → 中央
・1 → 右

ボタンごとに値を増減させることで、
角度を変更しています。

※起動時にservo.valueを設定することで、
サーボの初期位置を明示的に指定しています。

動作確認

・左ボタン → サーボが左へ動く
・右ボタン → サーボが右へ動く

正常に動作すれば成功です。

よくある失敗

・電源不足で動作しない
・GNDが共通になっていない
・値が-1〜1を超えている
・ボタンのGPIO番号ミス

チャタリング対策

ボタン入力ではチャタリングにより、
意図せず複数回動作する場合があります。

詳しくは以下の記事を参考にしてください。
 ▶ Raspberry Pi 5でボタンのチャタリングを防止する方法

ボタンを押しても反応しない場合

サーボモータを使用していると、
ボタンを押しても反応しないことがあります。

この原因は1つではなく、主に以下の2つが考えられます。

①PWM(パルス幅)の設定が合っていない

サーボモータはPWM信号のパルス幅によって角度を制御していますが、
製品ごとに適切なパルス幅の範囲が異なります。

そのため、デフォルト設定のままでは
値を変更しても正しく動作しない場合があります。

Servo(22, min_pulse_width=0.0005, max_pulse_width=0.0025)

のようにパルス幅を調整することで、改善するケースがあります。

②電源の影響による不安定動作

サーボモータは動作時に大きな電流を消費するため、
電源が不安定だと電圧が一時的に低下し、
GPIO入力が正しく検出されないことがあります。

以下を確認してください。

・外部電源を使用しているか
・GNDが共通になっているか
・電源に十分な電流容量があるか(2A以上推奨)

※サーボモータの動作は「電源」と「PWM設定」の両方に影響されます。
どちらか一方だけでなく、両方を見直すことが重要です。

ボタンを押していないのに動く場合

サーボモータはPWM信号を常に受信して位置を維持しています。

そのため、ソフトウェアPWMでは信号のタイミングがわずかに変動し、
サーボが微妙に動く(ジッター)ことがあります。

これはある程度正常な動作です。

ボタンの反応が遅い場合

サーボの動作時間やソフトウェアPWMの影響により、
ボタンを押してから動作するまでに
わずかな遅延が発生することがあります。

電源を安定させることで改善する場合があります。

応用

・長押しで連続回転
・カメラの向き制御
・ロボットアーム制御

まとめ

本記事では、ボタンを使ってサーボモータの角度を制御する方法を解説しました。

・ボタンで操作可能
・PWMで角度制御
・実用的な制御が可能

こちらの記事で使用しているRaspberry Pi 5 はこちら
 ▶ Amazonで詳細を見る

本記事では、こちらの電子工作キットを使用しています。
 ▶ OSOYOO(オソヨー) Raspberry Pi 用 学ぶ電子工作キット(Amazonへのリンク)

タイトルとURLをコピーしました