Raspberry Pi

ラズパイ+PCA9685で複数サーボ制御|二足歩行ロボット自作

更新: 中村 拓也
Raspberry Pi

ラズパイ+PCA9685で複数サーボ制御|二足歩行ロボット自作

PCA9685は、ラズパイのI2C 2本だけで最大16個のサーボを扱える16チャンネルPWMドライバで、二足歩行ロボットの土台を組むときにGPIO直結の弱点をきれいに避けられる部品です。

PCA9685は、ラズパイのI2C 2本だけで最大16個のサーボを扱える16チャンネルPWMドライバで、二足歩行ロボットの土台を組むときにGPIO直結の弱点をきれいに避けられる部品です。
ワークショップでは、サーボを4個つないだ瞬間にラズパイが再起動し、別電源を使っていなかったことが原因だと分かった場面が何度もありました。
だからこそ、VCCは3.3V、V+は別系統の5V、GNDは共通という電源設計を先に固め、raspi-configでI2Cを有効化してi2cdetect -y 1で0x40を確認してから配線を進める流れが安定します。
角度指定はkit.servo[n].angleで始められ、複数の角度を時系列に並べれば歩行の早見表になるので、最後はZMPや逆運動学まで自然につながっていきます。

完成イメージ|PCA9685で何ができるか

PCA9685を挟むと、ラズパイはサーボの細かなタイミング生成から解放され、16チャンネル分のPWMをまとめて扱えるようになります。
I2Cの2本、SDA=GPIO2とSCL=GPIO3だけで指示を送り、各サーボは12ビット分解能の範囲で安定して動かせます。
最初はサーボ1個で動作を確かめ、そこから複数同時制御へ広げ、最終的には二足歩行ロボットのような多関節構成へつなげていく流れです。

この記事で組み上げる最小構成と最終ゴール

最小構成は、ラズパイとPCA9685、そしてサーボ1個です。
そこから複数のサーボを同時に動かし、足の上げ下げや体重移動を順番に組み立てていくと、二足歩行ロボットの土台になります。
完成形の全体像は、ラズパイ→I2C→PCA9685→複数サーボ+別電源という一本の流れで捉えると整理しやすいでしょう。

この構成が便利なのは、制御の役割分担がはっきりするからです。
ラズパイは「何番を何度にするか」を送るだけでよく、サーボの駆動そのものはPCA9685が受け持ちます。
角度の並びを時系列で再生していけば、片脚3自由度、両脚6自由度以上の動きも段階的に組み上げられます。

なぜGPIO直結では複数サーボがつらいのか

GPIO直結は、1個か2個なら試せても、本数が増えた瞬間に不安定さが目立ちます。
ソフトウェアPWMは処理の都合でタイミングが乱れやすく、サーボが小刻みに震える原因になりやすいからです。
ハードウェアPWMも使えるピンが限られるため、10本以上を同時に動かす二足歩行のような用途では、最初から無理が出やすくなります。

筆者がワークショップで最初に見せるのは、GPIO直結で3個目のサーボを足した瞬間に全部が小刻みに震え出すデモです。
受講者は「増やしただけでここまで崩れるのか」と驚きますが、PCA9685に載せ替えると揺れが収まり、構成の差が一目で伝わります。
初学者ほど「16個も使わないから直結でいい」と考えがちですが、二足歩行を目指すなら最初からPCA9685前提で組んだ方が後戻りが少なくておすすめです。

PCA9685が肩代わりしてくれる仕事

PCA9685は、16チャンネルのPWMを12ビット分解能、つまり0〜4095段階で出力する専用ドライバです。
ラズパイ側はI2Cの2本、SDA=GPIO2とSCL=GPIO3で命令を送るだけなので、CPUがPWM生成に追われません。
しかも各チャンネルのパルス幅を保持して出し続けるため、ラズパイは数値を投げるだけの単純な制御にまとまります。

この「保持して出し続ける」役割が、サーボ制御では効きます。
サーボが増えるほど、ラズパイの中で個別タイミングを面倒見る設計は破綻しやすいからです。
PCA9685を挟めば、配線もコードもシンプルになり、複数関節を同時に滑らかに動かす土台が作れます。
ロボットを本気で組むなら、ここを省略しない構成が結局いちばんおすすめです。

必要なパーツと電源設計

ラズパイで二足歩行ロボットを組むなら、最初にそろえるべきなのはラズパイ本体、PCA9685ボード、サーボ、そしてサーボ用の別電源です。
配線の手間を減らすためにブレッドボードとジャンパ線も用意し、電源ラインには電解コンデンサを足しておくと立ち上げが安定します。
買い物の抜けを防ぐには、役割と目安と注意点をひと目で見られる形にしておくのがいちばんです。

最低限そろえるパーツ早見表

パーツ役割目安注意点
ラズパイ本体制御の中心I2Cを使える機種サーボ電力は直接まかなわない
PCA9685ボード16ch PWM出力12ビット分解能、I2C接続デフォルトアドレスは0x40
サーボ関節を動かすまずはSG90を数個数が増えると電源設計が先に効く
サーボ用の別電源サーボ専用の5V供給5V 2〜4Aラズパイの5Vとは分ける
ブレッドボード/ジャンパ試作配線まずは配線確認用電源系の抜けや接触不良に注意
電解コンデンサ突入電流の吸収5サーボなら470µF以上電源ラインに近く置く

PCA9685を挟む理由ははっきりしています。
ラズパイのGPIO直結で複数サーボを動かすと、ソフトウェアPWMのタイミングが乱れやすく、同時制御も安定しません。
PCA9685ならラズパイからはI2Cの2本、SDA=GPIO2とSCL=GPIO3だけで最大16個のサーボを扱えますし、アドレスを変えて数珠つなぎにすれば拡張もできます。
二足歩行や多関節ロボットで扱いやすいのは、この配線の単純さが効いているからです。

サーボ電源をラズパイの5Vから取ってはいけない理由

最重要なのは、サーボ用の別電源を必ず用意することです。
サーボはモーターなので、起動や急停止の瞬間に定常時の何倍もの電流を引きます。
ここをラズパイの5Vから取ると電圧が一瞬落ち、ラズパイ本体の再起動やSDカード破損につながりかねません。
筆者は教室用に5V 4AのACアダプタを常備していますが、受講者の「動くけど時々カクつく」は、2A以下の電源が原因であることがかなり多いです。

電源はロジック系とサーボ系で分け、VCCはラズパイの3.3V、V+は別系統の5V 2〜4A、GNDだけ共通にします。
コモンGNDにしておかないと信号の基準がずれ、震えや不安定動作の原因になります。
さらに電源ラインへ電解コンデンサを入れておくと、突入電流の山を受け止めやすくなります。
目安はサーボ個数×100µFで、5サーボなら470µF以上を入れておくと扱いやすいでしょう。

サーボの選び方(SG90とSG92Rのトルク差)

最初の1台はSG90で十分です。
SG90は定格4.8V、トルク約1.8kgf・cm、速度0.1秒/60度、重量約9gのマイクロサーボで、軽くて安く、配線確認や姿勢制御の学習に向いています。
ただし二足歩行の脚部では、自重を支える局面でヘタることがあります。
そこで次の候補になるのがSG92Rで、ストールトルク約2.5kg・cmとSG90の約1.5倍あります。

サーボ定格電圧トルク速度重量向いている場面
SG904.8V約1.8kgf・cm0.1秒/60度約9g初期試作、軽負荷の関節
SG92R4.8V系約2.5kg・cm非公表非公表脚に体重が乗る関節、負荷の高い脚部

筆者の感覚では、脚に体重が乗る設計へ進んだ段階でトルク不足に必ずぶつかります。
だからSG92Rを2〜4個ほど予備で持っておくと、原因切り分けが早くなります。
まずはSG90で動かしてみて、脚部が持ち上がり切らない、立ち姿勢で震える、踏み出しで失速する、といった兆候が出たらトルクを上げていきましょう。
電源容量もサーボの数と種類で決まるので、SG90を数個なら5V 2A、10本超や大きめサーボなら4A級を選ぶのが安全です。

配線|I2C接続と2系統電源のつなぎ方

PCA9685の配線は、ラズパイ側のロジック電源とサーボ側のモーター電源を分けて考えるとです。
まずVCCにはラズパイの3.3V、SDAにはGPIO2、SCLにはGPIO3、GNDにはラズパイのGNDをつなぎます。
ここは制御信号と基準電位を渡す部分で、サーボを直接回す電力は流れません。

ラズパイとPCA9685のI2C 4本(VCC/GND/SDA/SCL)

ラズパイとPCA9685の接続はI2Cの4本だけで成立します。
VCCはラズパイの3.3V、GNDはラズパイのGND、SDAはGPIO2、SCLはGPIO3へつなぎ、基板同士が会話できる状態を先につくります。
ここで扱うのはあくまでロジック電源と通信線であり、サーボを動かすための電流をここに流してはいけません。
筆者はワークショップで必ずVCCとV+を指差し確認させていますが、配線図を見せてもなお取り違える受講者がいるほど、名前の似た端子は落とし穴になります。

サーボ用電源V+の接続とGND共通化

サーボを回す電力は、PCA9685の電源端子V+に別電源の5Vを直接つなぎます。
V+とVCCは役割が別で、V+=モーター用、VCC=ロジック用と分けて考えるのが安全です。
ここを混同してVCCに5Vを入れると壊す恐れがあるため、端子名を1つずつ見ながら挿しましょう。
さらに、ラズパイのGNDと別電源のGNDは必ず共通にします。
筆者の経験では、GND共通化を忘れた配線は「たまに動く・たまに震える」という一番デバッグしづらい症状を出すので、動かないときはまずGNDのループを疑うようにしています。

サーボの3線を挿す向きとチャンネル番号

サーボの3線、つまり信号・+・GNDは、PCA9685のチャンネル列0〜15にそのまま挿します。
ここで見るべきなのはコネクタの向きで、基板のシルク印刷に合わせて線の並びを確認し、逆挿しを防ぐことです。
色だけで判断すると迷いやすいので、信号線がどちら側かを毎回そろえておくと配線の再現性が上がります。
まずはチャンネル0に1個だけつないで動作確認し、問題なく動いたら本数を増やしていく流れが安全です。
最初から全部を挿すより、1本ずつ確認したほうが原因切り分けも楽になります。

セットアップ|I2C有効化とライブラリ導入

I2Cを先に有効化して0x40を見える状態まで通し、そこからServoKitを入れる流れにすると、配線ミスとソフト設定ミスを切り分けやすくなります。
筆者の教室では、0x40 が見えた瞬間を最初のチェックポイントにしています。
ここまで来れば9割は配線が正しく、受講者の表情も一気に変わります。

raspi-configでI2Cを有効にする

raspi-config か OS 設定の Interface から I2C を有効にします。
無効のままだとラズパイは I2C バスを認識できず、次の i2cdetect で何も表示されません。
設定後に再起動が必要になることもあるので、有効化と再起動を1手順として扱うと流れが途切れにくいです。
まずここを通しましょう。

i2cdetectでアドレス0x40を確認する

配線と I2C 有効化が済んだら、i2cdetect -y 1 を実行してバス上の機器を確認します。
PCA9685 のデフォルト I2C アドレスは 0x40 なので、表の中に 0x40 が出れば認識成功です。
出てこない場合は、SDA/SCL/VCC/GND の配線か I2C の有効化を疑うのが切り分けの近道になります。
筆者の経験では、0x40 が薄く表示されたり、たまに消えたりする症状はジャンパ線の接触不良が多く、ブレッドボードの挿し直しで直るケースを何度も見てきました。

ServoKitライブラリの導入と初期化

制御ライブラリは sudo pip3 install adafruit-circuitpython-servokit で入れます。
ServoKit は内部で PCA9685 を扱いながら、角度をそのまま指定できる API を提供してくれるので、初心者でもコードの見通しが良いのが利点です。
I2C 関連の依存もまとめて入るため、セットアップを一段まとめて進められます。
導入後は from adafruit_servokit import ServoKit と書き、kit = ServoKit(channels=16) で初期化します。
channels はボードのチャンネル数に合わせる値で、16ch ボードなら 16 を指定します。
この1行が通れば、あとは kit.servo[n] で各サーボへアクセスできる状態になります。

コード|1個から複数サーボの同時制御へ

まずは ServoKit(channels=16) で受け皿を用意し、kit.servo[n].angle に角度を入れるところから始めると、配線とソフトの切り分けが一気に楽になります。
最初の1個を 0度、90度、180度と順に動かして、命令した位置へ素直に追従するかを見れば、ハード側が生きているかどうかを短時間で確認できます。
ここが通ると、その先は複数制御やキャリブレーションを落ち着いて積み上げられるでしょう。

サーボを1個だけ動かす最小コード

最小コードは驚くほど単純で、kit.servo[0].angle = 90 のように1行で角度を代入するだけです。
ServoKit(channels=16) を初期化したあと、まずはチャンネル0の1個だけを動かし、0度→90度→180度と段階的に試すのが基本になります。
筆者はワークショップで、いきなり複数を動かさず必ず「1個を90度で止める」から始めさせます。
ここを飛ばして全チャンネルを一気に書くと、配線の問題なのかコードの問題なのか、原因の切り分けができなくなるからです。
この段階で素直に動けば、少なくともサーボ本体・電源・I2C制御の流れはつながっています。
逆に止まるなら、次へ進む前に角度指定が正しいか、チャンネル番号が合っているかを見直しましょう。

複数チャンネルを順番/同時に動かす

複数制御は、チャンネル番号を変えて kit.servo[0].angle = 90kit.servo[1].angle = 45 のように並べるだけで実現できます。
サーボは1本ずつ別々に命令しても、同じ制御基板の上ではほぼ同時に更新されるので、歩行のように複数関節をまとめて姿勢づけたい場面で扱いやすいのです。
さらに for 文でチャンネル番号とターゲット角度の組を回せば、二足歩行の1ポーズ、つまり全サーボの角度セットを一気に書けます。
筆者の経験では、複数をまとめて動かす前に1個単位で成功体験を作っておくと、受講者が安心して配線を増やせます。
角度が5〜10度ずれる相談の多くは個体差で、パルス幅の上下限を1回キャリブレーションすれば解決します。
全サーボで共通値を使い回すとズレが目立つので、あとから1本ずつ詰める流れにしておくと仕上がりが安定します。

角度が合わないときのパルス幅キャリブレーション

PWM周波数はサーボ用に50〜60Hz、周期で言えば約20msが基本です。
ServoKitはサーボ向けの前提で扱える設計ですが、角度指定が合わないときは、見た目の角度と実際の停止位置を一致させるために、可動範囲に対応するパルス幅の下限・上限を詰めます。
目安としてはカウント150〜600前後を起点にし、サーボ個体ごとに追い込むのが実用的です。
ここを丁寧にやると、90度のつもりで少し戻る、180度で無理に押し込む、といった違和感が減ります。
歩行ロボットでは1関節の誤差が全体の姿勢に連鎖するため、最初の補正があとで効いてくるわけです。
連続回転サーボを混ぜる場合は、角度ではなく throttle(-1〜1) で速度を指定します。
位置決めのサーボは angle、車輪やグリッパで使う連続回転は throttle と覚えると、APIの違いを迷わず使い分けられるでしょう。

二足歩行の動きを設計する

二足歩行の設計は、まず何自由度で組むかを決めるところから始まります。
片脚に股・膝・足首を持たせるだけでも最低3自由度、両脚なら6自由度以上が目安になり、左右回転まで入れるとサーボ数と制御の難易度が一気に上がります。
ここを先に固めておくと、PCA9685の何チャンネルを使うかまで自然に決まるので、配線もプログラムも組み立てやすくなるでしょう。

何自由度で組むか(脚の関節設計)

二足歩行でまず押さえるべきなのは、脚を「どこまで人間らしく曲げるか」ではなく、「どこまで安定して支えられるか」です。
股・膝・足首の3点がそろうと、脚は前後方向の踏み出しだけでなく、体重移動や着地の微調整まで受け持てます。
片脚3自由度、両脚で6自由度以上という目安は、単に見た目の都合ではなく、重心を支持基底面の内側に戻すための最低ラインだと考えると理解しやすいです。
そこに左右の回転を足すと表現力は上がりますが、必要なサーボ数も配線の分岐も増えるため、最初は「歩ける最小構成」を見極めるのが近道です。

歩行を『角度の配列』として持たせる

歩行の実体は、各サーボの角度を時系列で並べた配列です。
ポーズ1で重心を片足へ寄せ、ポーズ2で遊脚を前へ出し、ポーズ3でまた重心を移す、という具合に、全サーボの角度セットを何コマも用意して順番に送れば歩きになります。
ここを「動きの制御」と捉えると難しく感じますが、実際には角度表の再生に近い仕組みです。
筆者が初めて歩かせたときも、いきなり大股にして前のめりに転倒させました。
そこから小股、低速、重心を落とすの3点に絞っただけで安定し、最初は歩幅を欲張らないことが最大のコツだと強く実感しました。

ℹ️ Note

角度の配列は、後から補間して滑らかにできます。最初から完成形を狙うより、3〜5ポーズでもよいので「確実に前へ進む」並びを作ってみてください。

逆運動学を数式で完璧に解こうとして手が止まる人も多いです。
そこで、まずは足先位置ごとの股・膝角度の早見表を手作業で数ポーズ作り、動く実感を得てから式に戻す方が挫折しにくいです。
滑らかに歩かせたいなら、角度を細かく補間して加減速をつけると、着地の衝撃が減って姿勢も崩れにくくなります。
おすすめです。

逆運動学とZMPで転倒を防ぐ考え方

足先を「この位置に置きたい」から各関節角を逆算するのが逆運動学です。
二足歩行では、支持脚の股と膝だけを見ればよい場面もあれば、足首まで含めて角度を合わせないと、足裏が浮いたりつま先が引っかかったりします。
三角関数で解く方法は理屈として美しいものの、最初は計算式を追いすぎるより、足先位置と角度の対応を体で覚えた方が実装に進みやすいです。
筆者の経験では、早見表から入った方が「動かせる」感覚を先につかめて、その後の数式理解も速くなりました。

転倒対策の中心になるのがZMPです。
接地している足裏、つまり支持基底面の内側に動的な重心が収まっていれば、少なくともその瞬間には転びません。
だから重いラズパイや電池は腰の低い位置に置くべきで、重心が高い構成ほど小さな揺れで支持基底面の外へ出やすくなります。
まずはゆっくり、小股、重心低めで「転ばない範囲」を詰めることが、二足歩行を形にするいちばん確実な方法です。

動かないときのトラブルシュート

サーボがうまく動かないときは、まず電源系と信号系を切り分けると原因が見えやすくなります。
震え、再起動、角度ズレ、トルク不足は別の不具合に見えて、実際には同じ配線や電源設計の弱さから連鎖して起きることが多いです。
順番を決めて潰していけば、初心者でも短時間で安定動作に近づけられます。

震える・勝手に動く(ジッターと電源ノイズ)

サーボが小刻みに震えるときは、電源ノイズかGND共通化漏れ、あるいは周波数設定のずれを疑うのが先です。
ここでいきなり制御値を疑うより、まずコモンGNDがきちんとつながっているかを確認し、その次にサーボ用の電源をより余裕のあるものへ替えます。
信号線を短くし、複数本をまとめて引くだけでも改善することがあるので、配線の取り回しまで含めて整えると安定しやすいでしょう。
ジッターはサーボ単体の故障に見えて、実は周辺の電気的な荒さを拾っているだけ、という場面が少なくありません。

動いた瞬間に落ちる(ブラウンアウトとコンデンサ)

動いた瞬間にラズパイが再起動するなら、サーボの突入電流で電源が落ちるブラウンアウトをまず疑います。
筆者はこうした相談を受けると、まずコンデンサ1個、数百µFを電源ラインに足させます。
これだけで直るケースがかなり多く、突入電流を一時的に吸収できるかどうかが分岐点になります。
目安はサーボ個数×100µFで、たとえば5サーボなら470µF以上を入れて、別電源側の電流容量も見直しましょう。

角度がずれる・脚が上がらない(クロック誤差とトルク不足)

角度が全体的にずれるなら、PCA9685の内蔵クロック誤差が原因候補になります。
50Hzに設定したつもりでも実測で54.7Hz前後、約10%ずれることがあり、この差がそのままサーボ角度のズレに出ます。
筆者の経験では、複数サーボで「指示より少し行き過ぎる」「少し足りない」が同時に出るときは、クロック誤差と個体差の合わせ技になっていることが多いです。
周波数を微補正し、パルス幅の上下限を実測に合わせて再キャリブレーションすると、かなり安定します。

脚が持ち上がらない、あるいは途中で止まる場合は、トルク不足のサインです。
SG90のトルク約1.8kgf・cmで自重を支えきれない構成なら、ストールトルク約2.5kg・cmのSG92R等へ格上げするのが近道になります。
あわせて重心を下げ、関節にかかる負荷を減らしましょう。
部品交換だけでなく機構側の見直しも効くので、同じサーボでも動きが変わります。
おすすめの進め方は、まず低負荷姿勢で動作確認をしてから、少しずつ荷重を上げていく方法です。

この記事をシェア

中村 拓也

大手メーカーで組込みシステムの開発に15年従事。Arduino・Raspberry Piを活用した自作IoTデバイスの制作実績多数。電子工作の基礎から応用まで、実務経験に基づいた解説を得意とする。

関連記事

Raspberry Pi

Raspberry Pi 5は、Cortex-A72 1.5GHzからCortex-A76 2.4GHzへ刷新され、Pi 4では「一応動く」止まりだったブラウジングや常用デスクトップを、実用域へ押し上げた世代です。

ツール&パーツ

安定化電源とは、電子工作で電圧を任意に設定できるだけでなく、電流を制限して部品を守れる可変DC電源である。ワークショップで持ち込まれる失敗の大半が、電源を電圧源としてしか使っていなかったことに起因していたため、まず押さえるべきは「電圧を変えられる箱」ではなく「電流を制御できる箱」だという点になる。

ツール&パーツ

EasyEDAは、ブラウザだけで動く無料のPCB設計ツールで、回路図からPCBレイアウト、部品ライブラリ、JLCPCBへの発注までをひとつにまとめたサービスです。ArduinoやESP32でブレッドボード試作までは進めたものの、オリジナル基板の設計と海外PCB業者への発注で足が止まる場面でも、

電子工作入門

M5Stackは、約5cm四方のケースにESP32マイコン、カラー液晶、3ボタン、スピーカー、Wi-Fi/Bluetoothまで詰め込んだ小型開発デバイスです。電子工作で最初に立ちはだかるはんだ付けとブレッドボード配線を飛ばせるので、ArduinoやRaspberry Piのように部品を自分でつなぐ前提から、