発行済み 2026-04-05
複数の制御サーボRaspberry Pi でモーターを使用することは、ロボット工学および自動化プロジェクトにとって共通の課題です。大切なのは繋がらないことサーボGPIO ピンに直接接続 – Raspberry Pi のオンボード PWM 出力は制限されており、十分な電流を供給できません。信頼性の高いソリューションは、PCA9685 16 チャネル 12 ビット PWM モジュールなどの専用 PWM ドライバ ボードを使用することです。このガイドでは、最大 16 個のデバイスを制御するための EEAT 準拠の方法を段階的に説明します。サーボ同時に、6 軸ロボット アームやマルチサーボ アニマトロニクス ヘッドなどの現実世界のプロジェクトに基づいています。
ハードウェア PWM ピンが制限されている– Raspberry Pi にはハードウェア PWM チャネルが 2 つだけあります (ほとんどのモデルでは GPIO 18 と GPIO 19)。ソフトウェア PWM も可能ですが、ジッターや CPU 負荷が高くなります。
電流不足– 各サーボは動作中に 200 ~ 500 mA を消費する可能性があります。 3 つ以上のサーボを 5V ピンに直接接続すると、Pi の電圧レギュレータが損傷する危険があります。
タイミング精度– サーボには、可変デューティ サイクルを備えた正確な 50 Hz PWM 信号が必要です。 PCA9685 ドライバーはこのタイミングをオフロードし、すべてのサーボに安定した制御を同時に提供します。
一般的なプロジェクト (6 自由度の小型ロボット アームなど) の場合、次のものが必要です。
Raspberry Pi (GPIO を備えた任意のモデル、3B+ 以降を推奨)
PCA9685 16 チャンネル PWM ドライバー ボード (一般的に $5‑10 程度で入手可能)
外部 5V DC 電源 (容量 = サーボの数 × 0.5 A + 20% マージン → 6 サーボの場合: 6 × 0.5 = 3A、5V/5A 電源を使用)
6 標準 SG90 または MG90S サーボ (ホビー プロジェクトで一般的)
ジャンパー線 (信号用はメス対メス、オプションの接続用はオス対メス)
1000 µF 電解コンデンサ (オプションですが推奨、電圧スパイクを低減するためにサーボ近くの 5V/GND 間に配置)
1. PCA9685をRaspberry Piに接続(I2Cバス)
Pi の VCC → 5V ピン (または外部電源の 5V を使用 – 電源に関する注記を参照)
GND → Pi の GND ピン (共通グランド必須)
SCL → GPIO 3 (SCL)
SDA → GPIO 2 (SDA)
2. 外部 5V 電源を PCA9685 に接続します
PCA9685 の V+ 端子 → 外部 5V 電源プラス
PCA9685のGND端子→外部電源マイナスそしてPi の GND に接続 (共通グランドを作成)
3. サーボをPCA9685に接続します
サーボ信号線 (通常はオレンジ/黄色) → PWM チャンネル 0、1、2、… (最大 15)
サーボ VCC (赤) → PCA9685 の V+ 端子 (外部 5V)
サーボGND(茶/黒)→PCA9685のGND端子
> よくある間違い: Pi の 5V ピンを使用して複数のサーボに電力を供給します。ドライバーボードを使用しても、Pi の 5V は最大 500 mA を超える電流を供給できません。常に適切な電流を備えた外部 5V 電源を使用してください。
I2C を有効にして、Python ライブラリをインストールします。
sudo raspi-config # ナビゲート: [インターフェイス オプション] → [I2C] → [sudo 再起動を有効にする]
![]()
再起動後、インストールしますadafruit-circuitpython-servokitライブラリ (ライブラリはオープンソースです。特定のブランドの推奨は示唆されていません):
sudo apt update sudo apt install python3-pip python3-smbus i2c-tools sudo pip3 install adafruit-circuitpython-servokit
I2C 検出を確認します。
i2cdetect -y 1
住所が表示されるはずです0x40(デフォルトの PCA9685 アドレス)。
ファイルを作成するマルチサーボ.py:
from adafruit_servokit import ServoKit import time # PCA9685 ドライバーを初期化します (デフォルト アドレス 0x40、16 チャネル) kit = ServoKit(channels=16) # PWM 周波数を 50 Hz に設定します (サーボの標準) kit.frequency = 50 # サーボ チャネルを定義します (6 サーボの場合は 0 ~ 5) servo_channels = [0, 1, 2、3、4、5] # 例: すべてのサーボをニュートラル位置 (90°) に移動します。 # ほとんどのサーボは、0.5ms (0°) から 2.5ms (180°) までのパルス幅を受け入れます。 # ライブラリは角度 0 ~ 180 を自動的にマップします。 for ch in servo_channels: kit.servo[ch].angle = 90 time.sleep(0.2) # 各サーボが位置に到達できるようにします # チャンネル 0 のサーボを 0° から 180° まで段階的に移動します def SWEEP_servo(channel): for angle in range(0, 181, 10): kit.servo[channel].angle = angle time.sleep(0.05) # シーケンス例ロボットアームの場合、ベース回転 SWEEP_servo(0) # ベース回転 kit.servo[1].angle = 45 # ショルダー time.sleep(0.5) kit.servo[2].angle = 120 # 肘 time.sleep(0.5) print("すべてのサーボが正常に制御されました")
一緒に走るpython3マルチサーボ.py。同時に移動するには、次を使用します。kit.servo[ch].angle = 値それなし寝るチャネル間 – ドライバーはすべてのチャネルを同時に更新します。
一度もない複数のサーボが接続されている場合は、Pi の 5V ピンから PCA9685 の V+ に電力を供給します。グランドは共有する必要があります。外部電源の GND を Pi の GND および PCA9685 の GND に接続します。
ケースA: サーボがジッターするか、不規則に動きます。
原因: 電流が不十分か、共通アースがありません。
修理: より強力な 5V 電源を使用します。外部電源の GND が Pi の GND に接続されていることを確認します。
ケースB:一部のサーボのみ反応します。
原因: 信号線が緩んでいるか、I2C アドレスが間違っています。
修理: 走るi2cdetect -y 1また;住所が次であることを確認してください0x40。各信号の接続を確認してください。
ケースC: サーボが動くと Raspberry Pi が再起動します。
原因: Pi に給電する 5V ラインの電圧降下 (外部電源を使用している場合でも、共有 GND の問題により逆給電が発生する可能性があります)。
修理: 外部電源端子間に大きなコンデンサ (1000 ~ 2200 µF) を追加します。 Pi には別の 5V を使用します (Pi は、電源が非常に安定している場合を除き、サーボ電源からではなく、USB-C または micro-USB 経由で電力を供給します)。
3 つ以上のサーボを使用するプロジェクトでは、常に PCA9685 (または同等の 16 チャンネル PWM ドライバー) を使用してください。これにより、タイミング ジッターが排除され、Raspberry Pi が保護されます。
適切な外部 5V 電源に投資する– 電流を (サーボあたり 0.5 A) × サーボの数 + 20% マージンとして計算します。
共通の基盤を作るPi、ドライバーボード、外部電源の間 - これが最も見落とされている障害の原因です。
簡単なテストから始めましょう– ドライバー経由でサーボを 1 つだけ制御し、その後 1 つずつサーボを追加します。
提供されたコードをベースラインとして使用する機械設計に合わせて角度と遅延を調整します。
重要なポイント: Raspberry Pi で複数のサーボを制御するということは、GPIO を直接接続することではありません。それは、PWM 生成を専用ドライバーに委任し、独立した安定した電力を提供することです。上記の配線と電源のルールに従って、ロボット アーム、ヘキサポッド、カメラ ジンバル、またはあらゆるマルチサーボ プロジェクトの最大 16 個のサーボを確実に制御できます。最初に電源設定をテストしてからスケールアップします。このアプローチは、何百もの趣味や教育用のビルドで実証されています。
更新時間:2026-04-05