Skip to content

Day 7|身体:サーボモーターで動く

  • サーボモーター(SG90) を配線する
  • Picoから角度(0度〜180度) を指定する
  • ワイパーのように行ったり来たりさせる

スポンサーリンク(開発中はプレースホルダー)

NO IMAGE
Raspberry Pi Pico Hピンヘッダ付き
NO IMAGE
ブレッドボード標準サイズ
NO IMAGE
マイクロサーボ SG90青い9gサーボ
NO IMAGE
ジャンパーワイヤオス-オス
  • Raspberry Pi Pico H / ブレッドボード
  • マイクロサーボ SG90 ×1
    • ※青い小さな箱に、プロペラのようなアームが付いた部品
  • ジャンパーワイヤ(オス-オス) ×3本

モーターのアームが「ウィーン」と動いて、指定した角度でピタッと止まります。 ロボットの腕や首を作るための基礎技術です。

普通のモーター(ミニ四駆など)は「回るだけ」ですが、サーボモーターは 「指定した角度になれ!」 という命令を聞きます。 線は3本あります。

  • 茶色(または黒):GND(マイナス)
  • 赤色:電源(プラス)
  • オレンジ(または黄色):信号(命令)
  1. 茶色GND
  2. 赤色VBUS(またはVSYS)
    • 重要!: 今までは3.3Vでしたが、モーターはパワーが必要です。VBUS(USBからの5V電源) に繋ぎます。Picoの40番ピンです。
  3. オレンジGP15(PWM信号)

注意! 配線を間違えると、Picoが一瞬で壊れる(ショートする)ことがあります。電源を入れる前に、赤の線が本当にVBUSか、茶色がGNDか、指差し確認してください。

import machine
import time
# サーボはPWMで制御します(周波数は50Hzがお約束)
servo = machine.PWM(machine.Pin(15))
servo.freq(50)
# 角度(0-180)を、PWMのDuty値(整数)に変換する計算式
# ※SG90の仕様に合わせて調整しています
def set_angle(angle):
# 0度=約2000, 180度=約8000 (個体差あり)
duty = int((angle / 180 * 6000) + 2000)
servo.duty_u16(duty)
while True:
# 0度へ
set_angle(0)
time.sleep(1)
# 90度へ
set_angle(90)
time.sleep(1)
# 180度へ
set_angle(180)
time.sleep(1)

⚠️ Picoの電源が落ちる / 再起動する

  • 原因: 電力不足
    • → モーターが動き出す瞬間、大量の電気を食います。PCのUSBポートの電力供給が追いつかず、Picoごと一緒に落ちている可能性があります。
    • → 基本的には外部電源を使いますが、SG90 1個ならUSB接続位置を変える(ハブを使わず直挿しする)などで改善することがあります。

⚠️ ジジジ...と震えて止まらない

  • 原因: 無理な角度
    • → 安いサーボは、本当に0度や180度まで行けないことがあります。「5度〜175度」くらいに範囲を狭めてみてください。
  • VBUS (5V): Picoを素通りしてきた、USBケーブル直結の強力な電気。「太い水流」。
  • 3V3: Picoの中で優しく整えられた電気。「おちょこの水」。計算には使えるけど、力仕事(モーター)には足りない。
  • Duty比(サーボ編): ここでは「右腕をどこまで上げるか」という角度の指示書になります。

「物理的に動く『筋肉』を手に入れた!」

ここまでで「入力」「判断」「出力(光/音/動作)」が揃いました。 次回はこれらを統合して、「周りの明るさに反応して動く」自律ロボットの原型を作ります。