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統合手順¶
- 電源を切って指定SPIとGNDを配線します。UART1からSPI ArduPilot、Mode 3、RATE 1000 Hzを設定して適用・SAVEします。
- 飛行制御接続時はOUT,none・AHRS,0・U2OUT,noneでUART負荷を減らし、STAT診断を残します。観測時のみ帯域を確認して出力を有効にします。
- 適合するSparkNavi-Blue2-IMU600 FWを使用します(資料の検証条件:Copter 4.7.1、SPI 2 MHz/Mode 3、専用CS)。この構成でIMU600は3番目のIMU backendです。
- EK3_IMU_MASK = 7で3個のIMU backendをEKF3で使用します。IMU600優先は任意でEK3_PRIMARY = 2、INS_USE3 = 1を確認します。番号は0始まりです。
- Mission Plannerで3個のIMUをまとめて6面校正します。資料に従いモジュール側または制御側の一貫した校正工程を選び、本統合ではMission Plannerを使用して任意の重複補正を避けます。後でモジュール校正を変えた場合は制御側を再校正します。
- 再起動後に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