M5Stackでサーボ雲台

Servo pan-tilt mount ・ 舵机云台

I2C ハブ経由で 2 つのサーボを制御し、カメラを上下左右に動かします。

この構成をエディタで開く・編集する →

部品リスト(BOM)

部品役割ポートリンク・価格
M5Stack Core2Controllergrove_i2c, grove_analog, grove_uart, mbusofficial page — $46.9
Unit PaHub2I2C Hub (1→6)grove_i2cofficial page — $7.95
Unit 8ServosPan Servogrove_i2cofficial page — $6.95
Unit 8ServosTilt Servogrove_i2cofficial page — $6.95

配線

作り方

M5Stack Core2と2つのサーボユニット(Unit 8Servos)を使って、カメラのパン・チルトを制御するシステムです。I2Cハブ(Unit PaHub2)を介してCore2から2つのサーボユニットを制御し、それぞれにサーボモーターを接続してカメラの向きを変えます。

  1. 部品を用意する — 用意するもの:M5Stack Core2本体、Unit PaHub2(I2Cハブ)、Unit 8Servos×2(サーボドライバー)、Groveケーブル(4ピン)3本、サーボモーター(パン用・チルト用)各1個、サーボ用外部電源(9-24Vまたは5V)、Core2とパソコンをつなぐUSB-Cケーブル。
  2. GroveケーブルでCore2とPaHub2をつなぐ — Groveケーブルの一端をCore2の赤いPort.A(I2Cポート)に差し込み、もう一端をPaHub2の入力ポート(INと書かれた方)に差し込みます。コネクタは一方向にしか入らないので、無理に押し込まないでください。
  3. PaHub2と2つのサーボユニットをつなぐ — PaHub2の出力ポート(OUT 1~6)のうち、2つのポートを使います。1本目のGroveケーブルでPaHub2のOUT 1と1つ目のUnit 8ServosのGroveポートをつなぎます。2本目のGroveケーブルでPaHub2のOUT 2と2つ目のUnit 8ServosのGroveポートをつなぎます。
  4. サーボモーターを接続する — 各Unit 8Servosのサーボ端子(CH1~CH8)にサーボモーターを接続します。パン用サーボを1つ目のUnit 8ServosのCH1に、チルト用サーボを2つ目のUnit 8ServosのCH1に接続します。サーボの信号線(オレンジ/白)、電源線(赤)、GND線(茶/黒)を端子に合わせて差し込みます。
  5. サーボユニットに外部電源を接続する — 各Unit 8Servosには外部電源が必要です。9-24Vまたは5Vの電源をユニットの電源端子に接続します。極性に注意し、プラス(+)とマイナス(-)を正しく接続してください。電源はまだ入れないでください。
  6. パソコンにつないでMicroPythonを書き込む — USB-CケーブルでCore2をパソコンにつなぎます。UIFlowやThonnyなどのツールで、Core2にMicroPythonファームウェアが入っていることを確認し、下のコードをデバイスにコピーして実行します。
  7. 動作をテストする — コードを実行すると、パン用サーボが0度から180度、チルト用サーボが90度から0度に動きます。サーボがスムーズに動くことを確認してください。動きがおかしい場合は、配線や電源を再確認してください。

サンプルコード(micropython)

# M5Stack Core2 + PaHub2 + 2x Unit 8Servos (camera pan/tilt)
# Wiring: Core2 Port.A (red) -> PaHub2 IN
#         PaHub2 OUT1 -> Servo Unit 1 (pan)
#         PaHub2 OUT2 -> Servo Unit 2 (tilt)
# Servos connected to CH1 of each Unit 8Servos

import time
from machine import Pin, I2C

# I2C setup on Core2 Port.A (sda=21, scl=22)
i2c = I2C(0, sda=Pin(21), scl=Pin(22), freq=400000)

# TCA9548A address (PaHub2)
TCA_ADDR = 0x70

# Unit 8Servos I2C address (default 0x40)
SERVO_ADDR = 0x40

def select_channel(channel):
    """Select PaHub2 channel (0-5)."""
    i2c.writeto(TCA_ADDR, bytes([1 << channel]))

def set_servo_angle(channel, angle):
    """Set servo angle (0-180) on the currently selected Unit 8Servos, channel 1."""
    # Convert angle to pulse width (500-2500 us)
    pulse = 500 + (angle / 180) * 2000
    # Unit 8Servos command format: [channel, pulse_low, pulse_high]
    # pulse in 0.1us steps, so multiply by 10
    pulse_ticks = int(pulse * 10)
    low_byte = pulse_ticks & 0xFF
    high_byte = (pulse_ticks >> 8) & 0xFF
    # Channel 0 corresponds to CH1 on the unit
    i2c.writeto(SERVO_ADDR, bytes([0, low_byte, high_byte]))

# Initialize: set all channels to 90 degrees (neutral)
for ch in range(2):
    select_channel(ch)
    set_servo_angle(0, 90)

time.sleep(1)

# Test sequence: pan 0->180, tilt 90->0
while True:
    # Pan servo (channel 0 on PaHub2)
    select_channel(0)
    for angle in range(0, 181, 10):
        set_servo_angle(0, angle)
        time.sleep_ms(50)
    time.sleep(1)
    
    # Tilt servo (channel 1 on PaHub2)
    select_channel(1)
    for angle in range(90, -1, -10):
        set_servo_angle(0, angle)
        time.sleep_ms(50)
    time.sleep(1)

コツ・安全上の注意

この作り方はAIが構成から生成したものです(未検証)。通電前に配線とコードをご確認ください。

この構成はAIが実在するM5Stack部品から設計し、ポート互換をサーバで検証したものです。編集・共有できます。

エディタで開く →

UnitKit は M5Stack® 製品向けの非公式ツール。作りたいものを書くと、部品リストと配線図が出ます。