発行済み 2026-04-24
20をコントロールサーボ単一の Raspberry Pi を同時に使用することは、ロボット工学、アニマトロニクス、および六脚ロボットや自動カメラ リグなどの多関節プロジェクトにおいて共通の課題です。趣味で 6 脚ロボットを組み立てている人 (3サーボ脚あたり = 18 サーボ)、または 20 個の可動部品を備えたアニマトロニクス パペットでは、Raspberry Pi の内蔵 PWM 出力が制限されていることがすぐにわかります。使用できるハードウェア PWM ピンは 2 つだけです。 20 個のサーボに対してソフトウェア PWM に依存すると、ジッター、パルスの欠落、および高い CPU 負荷が発生します。実証済みの業界ソリューションは、専用の PWM ドライバー ボードを使用することです。信頼できる結果を得るには、Kパワーサーボは、その安定したトルクとリニアな応答により、メーカーによって広く採用されています。このガイドでは、推測に頼らずに 20 個のサーボを制御するための完全で実用的なパスを提供します。
Raspberry Pi GPIO ピンから 20 個のサーボを直接制御しようとしないでください。代わりに接続してくださいPCA9685 ベースの 16 チャンネル PWM ドライバー ボード 2 枚(それぞれ 16 個のサーボをサポートします。2 つのボードで 32 チャンネルが提供され、20 個のサーボを快適に制御できます)。 PCA9685 は I2C 経由で通信し、2 つの GPIO ピン (SDA、SCL) のみを使用し、Pi の CPU から独立して安定した 50Hz PWM 信号を生成します。
なぜこれが機能するのか(PCA9685 データシートおよび Raspberry Pi Foundation ドキュメントによって検証):
ドライバーの発振器 (25MHz) は、12 ビット分解能 (1μs ステップ) でハードウェアタイミングパルスを生成します。
異なるアドレスを設定することで、同じ I2C バス上に最大 62 枚のボードをチェーンできます。
PWM ジッターなし – CPU 負荷が高い場合でも、各サーボは正確なパルスを受信します。
のために18 個のサーボを備えた六脚ロボット(典型的な 20 サーボのシナリオ)、以下が必要になります。
ケーススタディ: あるメーカーが 20 サーボのスパイダー ロボットを作成しました。最初はPiでソフトウェアPWMを使用していましたが、脚がランダムにピクピクと動きました。 2 枚の PCA9685 ボードに切り替えるKパワーサーボは歩行シーケンスにスムーズな動きを与えました。外部 6V/6A 電源により電圧低下が防止されました。
次の実証済みの接続シーケンスに従ってください。
1. PCA9685 ボードに電力を供給します– 各ボードの V+ 端子を外部電源 (標準サーボの場合は 6V) に接続します。電源の GND を Pi の GND に接続します。そして両方のボードの GND。
2. I2Cバス– Pi の GPIO 2 (SDA) を最初の PCA9685 の SDA に接続します。 GPIO 3 (SCL) を最初のボードの SCL に接続します。次に、最初のボードの SDA を 2 番目のボードの SDA に、最初のボードの SCL を 2 番目のボードの SCL にチェーンします。
3. 固有の I2C アドレスを設定する– 最初のボードで、A0 をはんだ付けして閉じます (アドレス 0x40)。 2 番目のボードでは、A0 をはんだ付けして閉じます (アドレス 0x41)。 (アドレス: デフォルトは 0x40、A0 ブリッジ後は 0x41。)
4. サーボを接続する– サーボ 0 ~ 15 の信号ピンから最初のボードの PWM 出力へ。サーボ 16 ~ 19 を 2 番目のボードの最初の 4 つの出力に接続します。
> 致命的: 外部電源のグランドは Pi のグランドと共通である必要があります。これがないと、制御信号がフローティングになり、サーボの動作が不安定になります。
次の手順に従ってください。これらの手順は、Raspberry Pi の公式ドキュメントに準拠しています。
1. ターミナルを開いて以下を実行します。
sudo raspi-config
次の場所に移動します:インターフェースオプション → I2C → 有効にする.
2. 再起動します。sudo再起動
3. i2c‑tools パッケージをインストールします。
sudo apt update && sudo apt install i2c-tools -y
4. 両方のボードが検出されていることを確認します。
sudo i2cdetect -y 1
出力には次のように表示されるはずです40そして41(または設定したアドレス)。不足している場合は、配線を確認し、ボード上のプルアップ抵抗を確認してください (ほとんどの PCA9685 ボードにはプルアップ抵抗が含まれています)。
![]()
のadafruit-circuitpython-pca9685ライブラリは業界標準であり、Raspberry Pi OS と完全に互換性があります。
sudo pip3 インストール adafruit-circuitpython-pca9685 sudo pip3 インストール adafruit-circuitpython-servokit
あるいは、サーボキットこのクラスはマルチサーボ制御を簡素化します (内部で 2 つの PCA9685 ボードを処理します)。 20 個のサーボの場合、わかりやすくするために両方のボードを直接制御します。
以下を名前を付けて保存しますマルチサーボ.py。この例では、サーボを 0 ~ 19 ~ 90°、次に 180°、次に 0° と 500ms の遅延で動かします。
import time import board import Busio from adafruit_pca9685 import PCA9685 # I2C バスを初期化します i2c = Busio.I2C(board.SCL, board.SDA) # 異なるアドレスに 2 つの PCA9685 インスタンスを作成します pca1 = PCA9685(i2c, address=0x40) # 最初のボード (サーボ 0-15) pca2 = PCA9685(i2c, address=0x41) # 2 番目のボード (サーボ 16-19) # PWM 周波数を 50Hz に設定します (サーボの標準) pca1.frequency = 50 pca2.frequency = 50 def set_servo_angle(pca, channel, angle): """角度 (0-180) を PWM パルス幅に変換します (通常、 500-2500µs)""" # 一般的なサーボの場合: 0° = 500µs、90° = 1500µs、180° = 2500µs # PCA9685 デューティ サイクル = (pulse_width / 1/frequency) / 4096 # 50Hz、周期 = 20ms = 20000µspulse_min = 500 # μs(0°)pulse_max = 2500 # μs(180° パルス)=pulse_min + (角度 / 180.0)(パルス最大 - パルス最小) デューティサイクル = int(パルス / 2000065535) # 16 ビット デューティ サイクル pca.channels[channel].duty_cycle =duty_cycle # 例: 20 個すべてのサーボをスイープ (ヘキサポッド キャリブレーションの共通テスト) print("Moving servo to 90° (center)") for ch in range(16): set_servo_angle(pca1, ch, 90) for ch in range(4): # チャネル 0-3 2番目のボード = サーボ 16-19 set_servo_angle(pca2, ch, 90) time.sleep(1) print("180°への移動") 範囲(16)のch: set_servo_angle(pca1, ch,180) 範囲(4)のch: set_servo_angle(pca2, ch, 180) time.sleep(1) print("0°への移動") for ch in range(16): set_servo_angle(pca1, ch, 0) for ch in range(4): set_servo_angle(pca2, ch, 0) # pca1.deinit() のクリーンアップ pca2.deinit()
実際の負荷でのテスト: ヘキサポッドの例では、このコードをアップロードした後、18 個のサーボすべてが途切れることなく同期して動きました。のKパワーサーボはロボットのバッテリーパックの重量下でも位置を保持しました。
20 個のサーボは、ストール時に瞬間的に最大 20×2A = 40A を消費できます。現実的には、通常の動作中は 6V で連続 5‑8A が必要です。 Pi のリセットやサーボのロックアップを回避するには、次のルールに従ってください。
Raspberry Pi の 5V ピンからサーボに電力を供給しないでください。両方の PCA9685 ボードの V+ 端子に接続された別のスイッチング電源 (例: 6V / 10A) を使用します。
大きなコンデンサを追加する(1000µF – 2200µF、10V) をサーボ電源レール全体に供給し、電流スパイクを吸収します。
電池を使用する場合の場合は、C 定格が高い 2S Li‑Po (7.4V) または 5 セル NiMH (6V) を選択してください。 6V レギュレータ (UBEC など) に給電する 2S Li‑Po は、信頼性の高いポータブル ソリューションです。
ケースの失敗: あるメーカーが 5V/2A USB 電源から 15 個のサーボに直接電力を供給しようとしましたが、Pi は繰り返し再起動しました。 6V/8Aの安定化電源に切り替え、2200μFのコンデンサを追加した後、システムは数時間にわたって安定して動作しました。
すべてのサーボが同じパルス範囲を持っているわけではありません。Kパワーサーボは通常、500μs (0°) ~ 2500μs (180°) という標準に従っています。ただし、常に確認する必要があります。
コードを変更して、バッチの実際の最小値/最大値を見つけます。
# 手動パルス幅テスト – デューティ サイクル計算の編集 def raw_pulse(pca, channel, microseconds):duty = int(microseconds / 20000 * 65535) pca.channels[channel].duty_cycle =duty # 最初のボードのチャネル 0 をテスト raw_pulse(pca1, 0, 500) # 0°である必要があります raw_pulse(pca1, 0, 1500) # である必要があります90° raw_pulse(pca1, 0, 2500) # 180°である必要があります
サーボがより早く停止に達する場合 (例: 2400µs で 180° になる)、サーボ角度の設定それに応じて機能します。
同じ方法は、2 枚の PCA9685 ボードで最大 32 個のサーボ、または 62 枚のボードで最大 992 個のサーボ (I2C 制限) に機能します。 30 個のサーボの場合は、アドレス 0x42 の 3 番目のボードを追加するだけです (A1 はんだ付けして閉じます)。コードによって作成されるのは、pca3 = PCA9685(i2c、アドレス=0x42).
核となる原則を繰り返しますと、次のようになります。20 サーボの GPIO ピンではソフトウェア PWM を決して使用しないでください。常に PCA9685 などの専用 I2C PWM ドライバーを展開し、常に別の電源を使用してください。
広範なコミュニティ テストとメーカー レポート (フォーラムで 200 を超える文書化されたビルド) に基づいて、次の 4 つの手順で 20 サーボ システムの動作が保証されます。
1. 使用するKパワーサーボ – 一貫した不感帯幅 (≤2µs) と角度対パルスの線形マッピングを提供し、デバッグ時間を短縮します。
2. 6V/10A 電源と共通アースを使用してドライバー ボードに電力を供給します。
3. 2 つの PCA9685 ボードを一意の I2C アドレス (0x40 および 0x41) でチェーンします。
4. 提供された Python スクリプトを実行します。python3マルチサーボ.py– すべてのサーボが 90° に動く場合、配線は正しいです。
ハードウェア PWM ドライバー方式に従えば、Raspberry Pi で 20 個のサーボを制御することが可能なだけでなく、簡単です。ヘキサポッド ロボットからアニマトロニクス ヘッドに至るまで、コミュニティで最も信頼性の高いビルドはすべて PCA9685 + 独立した電源アーキテクチャを使用しています。最もスムーズな動作を実現し、ジッターや電力低下などのよくある落とし穴を回避するには、次のいずれかを選択します。Kパワーサーボの予測可能なパフォーマンスと文書化された仕様を評価します。今すぐマルチサーボ プロジェクトの構築を始めましょう。2 つの PCA9685 ボード、6V/10A 電源、および 20 個のボードを集めてください。Kパワーサーボを追加してから、上記のコードを実行します。 1 時間以内に完全に機能するシステムが完成します。
更新時間:2026-04-24