【ESC33】DroneCAN ESC——CANバスを使ったESC制御の実装とフォールトトレランス設計
前回はRPMフィルタの動的ノッチフィルタ設計を解説しました。ESC33となる本記事ではDroneCAN ESCを扱います。これまでのDShot系プロトコル(ESC29〜ESC31)はFC-ESC間のポイントツーポイント接続でしたが、DroneCANはCANバスという共有バストポロジーで複数のESCとセンサーを統合する、産業用途向けのアーキテクチャへの転換を解説します。
DShotとDroneCANの設計思想の違い
DShotはFCの各PWM出力ピンと各ESCが1対1で直結する、単純で低レイテンシなプロトコルです。ESC29〜ESC31で解説した通り、4発機なら4本のDShot信号線が必要です。
DroneCANはCANバスという差動シリアルバスに全てのデバイスがぶら下がる、バストポロジーを採用します。4発機でも8発機でも、信号線は2本(CANH、CANL)のみです。
この違いが生む設計上の帰結を整理します。
スケーラビリティの観点では、DShot系は増設するESCごとにFCのPWM出力ピンが必要ですが、DroneCANはバスに接続するだけで何台でも追加できます。8発・12発の大型機では、FCのピン数制約がDShot系の実用上の限界になることがあります。
信頼性の観点では、差動信号(CANH-CANL間の電位差でデータを表現)はESC10・前シリーズで解説した通り、コモンモードノイズに対して高い耐性を持ちます。大型機の長い配線、モーター電源のノイズが大きい環境での安定した通信が、DroneCANの採用理由の一つです。
フォールトトレランスの観点では、DroneCANはプロトコルレベルでのノード管理、死活監視、冗長化設計が組み込まれており、一台のESCの故障がバス全体の通信を止めない設計が可能です。
CANバスの電気的特性の再確認
前シリーズ(シリーズ序盤の差動信号記事)とFC34(差動ペア)で解説した内容を、DroneCANの文脈で再整理します。
CAN物理層はISO 11898-2で規定されます。差動電圧(CANH-CANL)が2.5V〜3.5Vの範囲をドミナント(論理0)、0.5V〜1.5Vの範囲をレセッシブ(論理1)として表現します。
終端抵抗はバスの両端に120Ωを接続します(FC33の差動ペア設計で解説した終端処理)。DroneCANのバス設計で終端を省略または誤配置すると、信号反射(FC38の伝送線路理論)によるデータ化けが生じます。
CANバスの最大速度は、ノードIDからプロトコルのビット長を計算するビットタイミング設定と、バスの物理的な長さ(信号伝搬遅延)の両方に依存します。標準CAN 2.0Bでは1Mbpsが理論上の上限で、DroneCANの典型的な設定は1Mbpsです。
DroneCANのプロトコル階層
DroneCANはOSIモデルに対応した明確なプロトコル階層を持ちます。
物理層はCAN 2.0B(ESC34のCAN FDは次回扱います)です。
データリンク層はCANのフレーム形式(アービトレーションID、DLC、データフィールド、CRC)を使います。CANのアービトレーション(ビット単位の優先度決定)により、複数ノードが同時に送信しても低優先度のノードが自動的に送信を停止し、高優先度メッセージが確実に届く設計になっています。
トランスポート層はDroneCANが独自に定義し、マルチフレームトランスファー(8バイトを超えるデータの分割送信)、転送ID(受信確認用)、データ型ID(どの種類のメッセージかの識別)を提供します。
アプリケーション層はDroneCANが標準化するメッセージ型で、ESC制御に関連する主要なものを次節で整理します。
DroneCAN ESC制御の主要メッセージ
DroneCANでESCを制御するための主要なメッセージ型を整理します。
uavcan.equipment.esc.RawCommandは最も基本的なESC指令メッセージです。1つのメッセージで最大20台のESCへの指令を一括送信できます。各ESCへの指令値は-8192〜+8191の範囲の整数(前進方向と後退方向に対応)で表現します。
ArduPilotはこのメッセージを使い、FCの制御ループで計算した各モーターの出力値を、1メッセージにまとめてCANバスに送信します。各ESCは自身のノードIDに対応するインデックスの指令値を取り出して動作します。
uavcan.equipment.esc.StatusはESCからFCへのテレメトリメッセージです(ESC35と連携)。RPM、電圧、電流、温度、エラーフラグを含み、各ESCが一定周期(典型的10〜50Hz)で定期送信します。このステータスデータがESC32のRPMフィルタへの入力として使われる場合もあります(Bidirectional DShotの代替として)。
uavcan.equipment.esc.RPMCommandはRPM直接指令モードで、スロットルではなく目標RPMをESCに直接指定します。ESC内部でRPMのクローズドループ制御が行われ、FCは実際のスロットル計算から解放されます。ArduPilotの高度なモーター制御設定で使われることがあります。
DroneCANのノード管理——動的ノードID割り当て
DroneCANの重要な特徴の一つが、ノードIDの動的割り当て機能です。
各DroneCANデバイスはバス上で一意のノードID(1〜127)を持ちます。手動設定(固定ノードID)の代わりに、DroneCANはUavcanDnaServer(Dynamic Node ID Allocator)プロトコルで自動割り当てをサポートします。
動的割り当ての流れとして、新しいデバイスがバスに接続されると、ノードIDを要求するメッセージ(uavcan.protocol.dynamic_node_id.Allocation)をブロードキャストします。バス上のノードIDサーバー(通常FC自身が担当、ArduPilotに内蔵)が、このデバイスのユニークID(ハードウェアMACアドレス相当、デバイス製造時に設定)と過去の割り当て履歴から、適切なノードIDを割り当てます。
ArduPilotでのノードID管理として、UAVCAN_NODE_IDパラメータでFC自身のノードIDを設定し、CAN_D1_UC_SRV_BM/CAN_D1_UC_ESC_BMでどのアクチュエータ出力をESCとしてCANバスに出力するかを設定します。これはFC5で解説したhwdef.datのペリフェラル設定と同様に、ArduPilotがCANバスを通じたESCを「どのモーター番号に対応させるか」を定義する設定です。
フォールトトレランス設計——冗長CANバス
DroneCANがDShotより優れる最も重要な側面の一つがフォールトトレランスです。
デュアルCANバス構成は、産業用FCの標準的な信頼性確保の手段です。2系統のCANバス(CAN1、CAN2)を並行して配線し、各ESCを両バスに接続します。一方のバスに断線や短絡が生じても、もう一方のバスで通信を継続できます。
ArduPilotはCAN_P1_とCAN_P2_パラメータ群で二つの独立したCANバスを管理します。FCSのFC設計(前シリーズFC5)では、STM32H7の複数のCANコントローラー(FDCAN1、FDCAN2等)をそれぞれ独立したCANバスに割り当てることで、ハードウェアレベルの冗長性を確保します。
CAN通信自体のエラー検出・回復機能もフォールトトレランスの重要な要素です。CANプロトコルはビットスタッフィング、CRC、ACK、フォームチェック等の複数のエラー検出機構を内蔵し、エラーが検出された場合は自動的に再送を行います。エラーが連続する場合はノードをバスオフ状態に遷移させ、バス全体の通信健全性を保護します。
ノード健全性の監視として、DroneCANはuavcan.protocol.NodeStatusメッセージで各ノードが定期的(デフォルト1Hz)にHeartbeatを送信します。FCはこのHeartbeatを監視し、特定のノード(ESC)からのHeartbeatが途絶えた場合に、フェイルセーフ動作(ESC36で詳述)を起動するトリガーにします。
DroneCANとDShotの性能比較
両プロトコルを実用的な観点から比較します。
レイテンシの観点では、DShotが単一ビットストリームで26.7µs(DShot600)なのに対し、DroneCANはCANフレームの構成、アービトレーション、プロトコルオーバーヘッドが加わるため、典型的に1ms前後のレイテンシになります。この差はFC24で議論した電流ループの帯域幅設計の観点からは無視できない場合があり、レーシングドローンのような超高応答性用途ではDShotが依然として優位です。
スループットの観点では、DroneCANは1Mbpsのバスレートで、複数のメッセージタイプ(指令、テレメトリ、ノード状態)を共有するため、接続するノード数の増加とともに各メッセージの実効レートが低下します。4〜8台のESCと数台のセンサーノードが接続される一般的な構成では、ESC指令の更新レートは通常100〜500Hz程度が現実的な上限です。
信頼性の観点では、前述の通りDroneCANが圧倒的に優位です。DShotのような単方向・非確認型の通信ではなく、CAN固有のエラー検出・再送機構と、DroneCANの上位プロトコルによるノード管理が組み合わさった多層的な信頼性保証が、産業用・高信頼性ドローン向けの採用理由です。
ArduPilotでのDroneCAN ESC設定
実際のArduPilotでのDroneCAN ESC設定を整理します。
CAN_P1_DRIVERは使用するCANドライバの設定で、1(CAN 2.0B)を設定します。
UAVCAN_ENABLEはDroneCANの有効化です。1(センサーのみ)、2(ESCコントロールを含む)の設定があり、ESC制御にはUAVCAN_ENABLE=2が必要です。
CAN_D1_UC_ESC_BMはCAN経由で制御するESCのビットマスクです。例えばモーター1〜4をDroneCANで制御する場合、ビット0〜3を1に設定します(0b00001111=15)。
UAVCAN_ESC_IDXはDroneCANのESCインデックスとArduPilotのモーター番号のオフセット設定です。DroneCANのESCインデックスが0始まり、ArduPilotのモーター番号が1始まりという差を調整します。
DroneCAN ESCの実機接続とデバッグ
実機での設定・デバッグの実践的な手順を整理します。
CANバスの物理的な確認として、終端抵抗(120Ω)がバスの両端に正しく配置されているかを確認します。DroneCANで最も多いトラブルの一つが終端抵抗の設定ミスによる通信不良です。一般的なESCモジュールには内蔵可能な終端抵抗があり、FC側と末端ESC側のみ有効化する設定が必要です。
Mission PlannerのUAVCAN/DroneCAN画面は、バスに接続された全ノードのノードID、健全性、ファームウェアバージョン等を表示するデバッグツールとして有用です。新しくESCをバスに接続した際、この画面でノードIDが正しく割り当てられているかを確認します。
ESC Statusのログ確認として、ArduPilotのデータログにCAN_D1_UC_* 関連のメッセージが記録され、各ESCの電圧・電流・RPM・エラーが確認できます。前回(ESC32)のRPMフィルタが正しく機能しているかどうか、DroneCANからのRPMフィードバックを使う場合、このログでの確認が有効です。
まとめ
DroneCAN ESCはCANバスという共有差動シリアルバスで複数のESCを統合するプロトコルで、DShotに対してスケーラビリティ(多発機への対応)、コモンモードノイズ耐性、フォールトトレランス(冗長バス、ノード監視、エラー回復)で優位性を持ちます。一方でレイテンシ(1ms前後 vs DShotの26.7µs)とESC指令更新レート(100〜500Hz vs DShotの数kHz)はDShotより劣るため、超高応答性より信頼性を優先する産業用ドローンに特に適した選択です。終端抵抗の正しい配置とノードID管理がDroneCAN導入時の重要な実装ポイントで、Mission PlannerのDroneCAN画面とArduPilotのデータログが実機デバッグの主要ツールです。次回ESC34ではCAN FD——DroneCAN 2.0対応の高速CANバリアントと、大型機・高頻度テレメトリへの対応を解説します。