発行済み 2026-04-05
シリアルバスサーボ通信プロトコルにより複数のサーボデイジーチェーン接続して単一のデータラインで制御できるため、複雑なロボットシステムの配線が大幅に簡素化されます。従来のPWMとは異なりますサーボサーボごとに 1 本の信号線が必要なシリアル バス サーボは、双方向デジタル通信を使用して位置、速度、およびフィードバック データを送信します。この記事では、業界で広く採用されている慣例に基づいて、標準的なフレーム構造、コマンド タイプ、エラー チェック方法、および実際の実装手順について説明します。すべての例は、典型的なロボット プロジェクトで観察される、ブランド固有ではない一般的なシナリオから抽出されています。
最も一般的なシリアル バス サーボ プロトコルは、固定パラメータ (ボー レート 115200、データ ビット 8、ストップ ビット 1、パリティなし) を備えた半二重非同期シリアル通信 (UART) で動作します。通信はマスター/スレーブ アーキテクチャに従い、マイクロコントローラー (マスター) が 1 ~ 254 の範囲の一意の ID 番号を使用して個々のサーボ (スレーブ) にコマンドを送信します (ID 0 はブロードキャストによく使用されます)。各サーボはコマンドごとにステータス パケットを返し、位置、負荷、温度、電圧をリアルタイムで監視できます。
主な利点:最大 254 個のサーボが 1 つのバスを共有できるため、配線の複雑さが 254 本のワイヤからわずか 3 本のワイヤ (電源、グランド、信号) に軽減されます。
すべてのコマンドと応答パケットは一貫した形式に従っており、信頼性の高い通信が保証されます。以下の表は、一般的なバイト シーケンスを示しています。
現実世界の例:一般的な 2 バイトのヘッダーは次のとおりです。0x55 0x55。一部の実装では、0xFA 0xAF。サーボのデータシートでヘッダー パターンを常に確認してください。
シリアル バス サーボは、最小限だが完全な命令セットをサポートします。以下は、最も頻繁に使用されるコマンドとその命令バイト値 (10 進数) です。
一般的なシナリオ:6‑DOF ロボット アームでは、書き込み_データ各関節の目標位置を順番に設定し、アクションすべての関節が同時に動くようにして、ぎくしゃくした動きを避けます。
各サーボは、動作パラメータを保存する一連のレジスタを維持します。アドレスと意味は、広く採用されている標準に従います。これらにアクセスするには、読み取りデータそして書き込み_データ.
現実世界の検証:これらのレジスタ アドレスは、複数のメーカーのデータシートや、Dynamixel SDK などのオープンソース ライブラリ (ブランド名を除く) に表示されます。アドレスマッピングはサーボのマニュアルで必ず確認してください。
データの整合性を確保するために、各パケットはチェックサム バイトで終わります。最も一般的な方法は、XORチェックサム:
アルゴリズム:
1. 初期値 0 から開始します。
2. ヘッダーのすべてのバイト (チェックサム自体を除く) を 1 つずつ XOR します。
3. 最終的な XOR 結果はチェックサムです。
計算例サーボ ID 5 への PING コマンドの場合:
チェックサムのないパケット:0x55 0x55 0x05 0x00 0x01
すべてのバイトの XOR:
0x55 ^ 0x55 = 0x00
0x00 ^ 0x05 = 0x05
0x05 ^ 0x00 = 0x05
0x05 ^ 0x01 = 0x04
チェックサム =0x04
フルパケット:0x55 0x55 0x05 0x00 0x01 0x04
代替方法 – 合計チェックサム:すべてのバイト (チェックサムを除く) を 256 を法として加算し、2 の補数を求めます (つまり、チェックサム = ~(合計 % 256) & 0xFF)。サーボのプロトコル仕様を確認してください。
シナリオ:ID=1 の単一サーボを制御して、速度 100 (スケール 0~1023) で位置 2048 (0~4095 の中間範囲) に移動します。
ステップ 1 – WRITE_DATA パケットを構築します。
ターゲットアドレス: ゴール位置 =0x18(2バイト)
書き込むデータ:0x800(10進数の2048) =0x08 0x00(リトルエンディアン: 下位バイトが最初)
データ長 = アドレスバイト (2) + 値バイト (2) = 4 バイト
パケットバイト数:
ヘッダー: 0x55 0x55 ID: 0x01 データ長: 0x04 命令: 0x03 (WRITE_DATA) パラメーター: 0x18 (アドレスの下位バイト)、0x00 (アドレスの上位バイト)、0x00 (下位の値)、0x08 (上位の値)
ステップ 2 – チェックサムを計算します。
ヘッダーから最後のパラメータまでのすべてのバイトを XOR します。
0x55^0x55=0x00; ^0x01=0x01; ^0x04=0x05; ^0x03=0x06; ^0x18=0x1E; ^0x00=0x1E; ^0x00=0x1E; ^0x08=0x16
チェックサム =0x16
ステップ 3 – 完全なパケットを送信します。
55 55 01 04 03 18 00 00 08 16
ステップ 4 – 応答パケットを読み取ります。
通常、各書き込みコマンドはステータス パケット (同じヘッダー、ID、データ長 = 2、ステータス フラグ、チェックサム) を返します。たとえば、成功の応答は次のようになります。
55 55 01 02 00 00 01(ステータス 0x00 = 成功、チェックサム 0x01)
現実世界のケース:趣味で六脚ロボットを製作している人は、サーボが位置コマンドを無視する場合があることに気づきました。パケット間に 5 ミリ秒の遅延を追加し、チェックサムを検証した後、信頼性は 85% から 99.9% に増加しました。
ブロードキャストコマンド (ID=0):すべてのサーボに同時にコマンドを送信します。緊急停止や全サーボのリセットに便利です。例: ブロードキャストリセットID=0 の (0x06) パケット – バス上のすべてのサーボが工場出荷時の設定に戻ります。
同期書き込み:多数のサーボを制御する場合、個別に送信する書き込み_データ各サーボは次のコマンドの前に応答するため、コマンドは遅延を引き起こします。SYNC_WRITE(0x07) でこれを解決します。パケット構造:
ヘッダー、ID=0xFE (同期書き込みによく使用されます)、データ長、命令=0x07
続いて、アドレス (2 バイト)、サーボごとのデータ長 (1 バイト)、および (サーボ ID、データ バイト) のペアが続きます。
例:サーボ 1 (値 1000) とサーボ 2 (値 2000) のゴール ポジション (0x18) を設定するための同期書き込み:
パケット:55 55 FE 0B 07 18 00 02 01 00 03 E8 02 00 07 D0(簡潔にするためにチェックサムは省略されています)。これにより、1 回の送信で両方のサーボが更新され、応答遅延がなくなります。
ステータスリターン制御:一部のサーボでは、(レジスタ 0x05 などを介して) 書き込みコマンドのステータス戻りを無効にすることができ、バス トラフィックを削減できます。デバッグまたは重要なフィードバックの場合のみ、ステータスの戻り値を有効にします。
プロトコルの実装が正しく機能することを確認するには、次のテストを順番に実行します。
1. Ping テスト:送信ピング既知のIDに。予期される応答: 同じ ID とエラー フラグ = 0 のステータス パケット。
2. ファームウェアのバージョンを読み取ります:送信読み取りデータアドレス 0x02、長さ 1 へ。期待される戻り値: バージョン番号 (v12 の場合は 0x0C)。
3. 書いて読み返します:書き込み可能なレジスタ (ID レジスタ 0x03 など) に値を書き込み、それを読み戻します。値は一致する必要があります。
4. 位置フィードバック:読み取り中にサーボホーンを手動で回転させます現在の位置(0x1E) – 値は滑らかに変化するはずです。
5. 負荷テスト:外部トルクを加えて読み取る現在の負荷(0x22) – 符号は方向を示します。
6. バス競合チェック:ID の異なる 2 つのサーボを接続します。コマンドを交互に送信します。パケットの衝突は発生しないはずです。
実証済みの実践:ロジック アナライザーを使用して UART トラフィックをキャプチャします。送信されたバイトを予想されるパケット構造と比較します。これは、フレーミング エラーまたはチェックサム エラーを特定する最も速い方法です。
何百ものシリアル バス サーボ実装の現場での経験に基づいて、堅牢な動作を確保するには次のガイドラインに従ってください。
常にチェックサムを計算する– 決してハードコーディングしたりスキップしたりしないでください。送信前にパケットの XOR 演算を行う専用関数を実装します。
最初に角度制限を設定します– 位置を指令する前に、機械的損傷を防ぐために、安全な最小/最大制限値 (たとえば、0 ~ 4095 の範囲の場合は 200 ~ 3800) を書き込みます。
ステートマシンを使用する– マルチサーボ システムの場合は、再試行 (コマンドごとに 3 回の試行) とタイムアウト検出 (100 ミリ秒など) を備えたコマンド キューを実装します。
ハードウェアエラーレジスタを監視する– 定期的にアドレス 0x2A を読み取ります。ゼロ以外の値は、過負荷、過熱、または電圧の問題を示します。ビット 2 (オーバーヒート) が設定されている場合は、直ちにトルクを遮断してください。
プルアップ抵抗を追加する– フローティング状態を防ぐために、信号ライン (通常は TX/RX の組み合わせ) に 4.7kΩ の抵抗を 3.3V または 5V (論理レベルに一致) に追加します。
電源グランドと信号グランドを分離する– データを破損するグランド ループを回避するには、スター グランドを使用します。サーボ電源 (通常 5 ~ 7.4V) には、ロジック グランドからの別のリターン パスが必要です。
最初に 1 つのサーボでテストしてください– 複数のユニットに拡張する前に、必ず単一のサーボでプロトコルのタイミングとチェックサムを検証してください。
核心的な結論を改めて述べます:シリアル バス サーボ通信は、ヘッダー、ID、長さ、命令、パラメーター、チェックサムを含む構造化フレームに依存します。 XOR チェックサム、レジスタ マップ、および同期書き込みコマンドを習得すると、シンプルな 3 線式バスを介して数百のサーボを確実に制御できるようになります。チェックサムやタイミング制約を無視することが、断続的な障害の主な原因です。
最終的なアクションステップ:特定のサーボ モデルのリファレンス データシートをダウンロードしてください。そのレジスタ アドレスを上記の共通マップと比較します。次に、PING コマンドを実装する短いテスト スクリプト (pyserial を使用した Python、または SoftwareSerial を使用した Arduino) を作成します。正しい応答を受信すると、機能するプロトコル基盤が確立されたことになります。チェックサムと応答解析がロジック アナライザーで検証されるまで、マルチサーボ制御に進まないでください。
更新時間:2026-04-05