SPI出力とArduPilot統合

対象:IMU600-V2/FW 0.11.2/GUI v1.6.1。

本統合はマニュアルv1.1の SparkNavi提供Copter 4.7.1/SparkNavi-Blue2-IMU600専用ビルドが対象です。資料によると、このドライバーはArduPilotの公式ソースにはまだ取り込まれていません。通常のBlue/Blue2 FWや任意SPIポートが自動対応するわけではありません。SparkNaviから適合FWと配線情報を取得してください。

SPI配線と読み出し

項目 設定
Pins 6 CS / 8 SCK / 10 MOSI / 12 MISO + GND
電気 3.3 V;モジュールはスレーブ、CSはLow有効・内部プルアップ、MOSIはホストから0送信
クロック Mode 3 (SPICK,3) / Mode 0 (SPICK,0); MSB first; 2 MHz
読取長 CSごとに128 bytes;短い読み出しは次回同じパケット、128超は0
ポーリング DRDYなし;約0.9出力周期で読み、pending >0なら続けて読む
キュー 16パケット(1000 Hzで16 ms);満杯時は最古を破棄

128-byteパケット

SPI,ardupilotはlittle-endianです。magic・版・型・CRCを確認し、seqで重複除外と欠落検出を行います。型0は空パケットで、新規IMUデータではありません。

Offset Type 内容
0 u8 ×2 0x53 0x4E (SN)
2 u8 版1
3 u8 0 empty / 1 IMU / 2 stream
4 u16 seq:出力区間ごとに+1
6 u8 pending:後続の残りパケット数
7 u8 used_mask
8 u64 ts_us
16 f32 dt (s)
20 f32 ×6 合成Δθ[3] rad、Δv[3] m/s、FRD
44 / 68 / 92 f32 ×6 each IMU 1/2/3個別Δθ・Δv;欠落は0、対応status = 0xFF
116 i16 ×3 3個の温度、0.01 °C
122 u8 ×3 3個のstatus;bit7 = PPS
125 u8 合成flags
126 u16 CRC-16/CCITT-FALSE, bytes 0–125

stream(type 2)ではbyte 7が有効長0–118となり、byte 8以降の有効データを連結してSPIOUT/SPIMODEに従いASCII/D6 44解析します。type 1用のIMUフィールドでtype 2を解釈しないでください。

Blue2統合手順

  1. 電源を切って指定SPIとGNDを配線します。UART1からSPI ArduPilot、Mode 3、RATE 1000 Hzを設定して適用・SAVEします。
  2. 飛行制御接続時はOUT,none・AHRS,0・U2OUT,noneでUART負荷を減らし、STAT診断を残します。観測時のみ帯域を確認して出力を有効にします。
  3. 適合するSparkNavi-Blue2-IMU600 FWを使用します(資料の検証条件:Copter 4.7.1、SPI 2 MHz/Mode 3、専用CS)。この構成でIMU600は3番目のIMU backendです。
  4. EK3_IMU_MASK = 7で3個のIMU backendをEKF3で使用します。IMU600優先は任意でEK3_PRIMARY = 2、INS_USE3 = 1を確認します。番号は0始まりです。
  5. Mission Plannerで3個のIMUをまとめて6面校正します。資料に従いモジュール側または制御側の一貫した校正工程を選び、本統合ではMission Plannerを使用して任意の重複補正を避けます。後でモジュール校正を変えた場合は制御側を再校正します。
  6. 再起動後にIMU600 found, 1000 HzとINS_ACC3_ID/INS_GYR3_IDを確認します。水平静止でAccel3 Z約−1000 mG、X/Y約0、回転方向が内蔵IMUと一致することを確認し、EKFとPreArmを検証します。
$SPNVCMD,SPI,ardupilot
$SPNVCMD,SPICK,3
$SPNVCMD,RATE,1000
$SPNVCMD,OUT,none
$SPNVCMD,AHRS,0
$SPNVCMD,U2OUT,none
$SPNVCMD,SAVE,1
$SPNVCMD,CFG,1

レートと動作確認

  • 400 HzループのPreArm条件はジャイロbackendが1.8 × 400 = 720 Hz以上のため、RATE = 1000を使用します。200/400/500 Hzでは不足します。
  • EKF3自動lane switchを維持し、IMU600固定のために切り替えを無効化しないでください。飛行中に主レーンが劣化すると、より健全なレーンへ移る場合があります。
  • SPNVSPIのtxnとdeliveredが増加し、ホストが継続読み出しを始めた後はdropが増え続けないことを確認します。大量エラーでIMU600: SPI link errorsが出たら配線・GND・モード・電源を確認します。
  • 制御器5 Vから給電する場合、再起動時に電源が瞬断することがあります。fw 0.10.1以降は電源安定待ちと持続SPIエラー時の自動再初期化(SPNVHEAL)がありますが、電圧低下原因も調査してください。

SPNVSPI状態フィールド

$SPNVSPI,mode=ardupilot,out=none,fmt=binary,ck=3,txn=...,ok=...,short=...,delivered=...,drop=...,dma=1,dmaerr=0,...*XX
フィールド 定義と判定
mode / out / fmt / ck SPI / SPIOUT / SPIMODE / SPICK
txn CS取引累計。資料の検証はRATE=1000で約1190/s
ok 128 bytes完全読取数、通常txn付近、空パケットも含み得る
short 128 bytes未満読取累計、次も同じパケット。増え続けるならCS/SCK確認
delivered 交付済みデータ数、毎秒増加量はRATE付近
drop 16個キュー満杯で最古を破棄。ホスト待ち中の累計と運転中増加を分ける
dmaerr DMAエラー発生有無0/1、通常0
dma / lf / lt / ls / ks / kr / sp メーカー診断、一般解析では無視可。追加フィールドを許容

ホスト読み出しと連番

  • RATE=1000で約0.9 msごとに読み、pending>0なら最大5パケットまで連読します。CS High後に次パケットを準備します。
  • SN・版1・CRCを確認しtype0は無視します。u16 seqは循環差分でgap=0重複、gap>1欠落の可能性。stream seqは分割単位、空パケットは最後の完了seqを保持します。
  • CRCが一致しないデータは破棄して読み直します。128 bytes未満の読み取りではパケットを消費しません。fw 0.10.8以降は、転送が完了していない可能性がある場合も同じseqを再送することがあります。資料で検証されているのは2 MHzで、8 MHzは未検証です。

ArduPilotドライバーとhwdef

資料のArduPilot-4.7.1-SparkNavi-IMU600.zipにはドライバー、patch、専用ボード構成、試験.apj、bootloaderが含まれ、SparkNaviから取得します。以下hwdefは専用Blue2構成用で、対応するEXTERNAL_CSピン定義が必要です。

SPIDEV imu600 SPI6 DEVID1 EXTERNAL_CS MODE3 2*MHZ 2*MHZ
IMU SparkNavi SPI:imu600 ROTATION_NONE
ドライバー動作 詳細
起動検出 最低500 ms、飛行制御起動後5秒まで待ち、50パケットのdt中央値でレート推定、動作中2秒ごと再確認
成功/失敗 成功はIMU600 found, 1000 Hz、失敗はprobe rd/hdr/crc。未接続はスキップし内蔵2個は維持
INSへの入力 合成Δθ/Δvを_notify_new_delta_angle/_velocityへpacket dtで渡す。used_mask=0/NaNは除外・計数、SATURATEDはaccel clip加算
温度と単位 3個平均温度を約10 Hzで通知。Mission PlannerはmG・mrad/sで、SCALED_IMU2/3別送のため表示時刻は異なり得る

SNV6ログとエラーしきい値

seq gap>1でLost、CRC失敗でBadを累積し、単発エラーはGCSへ直接表示しません。直近10秒のエラーはSNV6(TimeUS・Lost・Bad・Pkts)へ記録し、10秒内Lost ≥20またはBad ≥100でIMU600: SPI link errors (...)を表示します。LOG_DISARMED=1で非アーム時の机上ログを取れます。

資料記載の実機検証条件

条件/項目 資料の記録
日付・版 2026-10-15 · Blue2 + ArduPilot 4.7.1 · IMU fw 0.10.8
SPI SPI6 + external CS · 2 MHz · Mode 3
RATE / delivered / txn 1000 Hz / ≈1000 packets/s / ≈1190 transactions/s
7.6 min short=4 · dmaerr=0 · no runtime drop increase
IMU / EKF Accel Z ≈−1000 mG · ROTATION_NONE · EK3_IMU_MASK=7

これはPDFの検証記録で、全配線の保証値ではありません。専用Blue2 bootloader hwdefは対応電源制御のPE2/PE3をOUTPUT HIGHに設定します。適合.apj書込後もMission PlannerのFlash bootloaderで新bootloaderを書き込みます。専用手順のためボード構成とメーカー配布版を確認します。

通信詳細はプロトコルv1.1、29–33ページにも基づきます。プロトコル概要を参照。

EKFコア選択補足

資料では、通常のEK3_IMU_MASK=3は最初の2個のIMUだけを対象とし、専用ボードでは7を初期値としています。EK3_PRIMARY=2を使用する場合は、EK3_IMU_MASK=7とINS_USE3=1も確認してください。ディスアーム中は指定したコアが使われ、飛行中に自動で切り替わるとEKF3 lane switch nと表示されます。


原資料:IMU600-V2 User Manual v1.1 · PDFページ 32–35

原ページを読む · 3資料の章対応と相違点

このカテゴリの概要 · 設定ガイド一覧