SPI 輸出與 ArduPilot 整合

適用於 IMU600-V2/韌體 0.11.2/GUI v1.6.1。

以下步驟依使用手冊 v1.1 整理,使用的韌體為:SparkNavi 提供的 Copter 4.7.1、自訂板型 SparkNavi-Blue2-IMU600。手冊註明該驅動尚未併入 ArduPilot 主線;一般 Blue/Blue2 韌體或任意 SPI 埠不會自動支援。請向 SparkNavi 取得相符韌體及接線配置。

SPI 接線與讀取

項目 設定
Pins 6 CS / 8 SCK / 10 MOSI / 12 MISO + GND
電氣 3.3 V;模組為從機;CS 低態有效且內部上拉;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 三顆溫度,0.01 °C
122 u8 ×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 起的有效資料依序串接,再按 ASCII/D6 44 解析;內容與格式由 SPIOUT/SPIMODE 控制。收到 type 2 時,請按串流格式解析,不要使用上方 type 1 的 IMU 欄位表。

Blue2 整合步驟

  1. 斷電後按指定接線連接 SPI 與共地,先以 UART1 GUI 設定 IMU600。SPI 用途選 ArduPilot、時脈模式 3、RATE 1000 Hz,套用並 SAVE。
  2. 接飛控運作時,建議 OUT,none、AHRS,0、U2OUT,none 以減少 UART 負載,保留 STAT 診斷;需要觀察資料時再配合頻寬暫時啟用。
  3. 安裝相符的 SparkNavi-Blue2-IMU600 韌體(手冊驗證 Copter 4.7.1、SPI 2 MHz/Mode 3、獨立 CS)。在這個配置中,飛控將 IMU600 當作第三組 IMU 輸入(backend)。
  4. 確認 EK3_IMU_MASK = 7,使三個 IMU backend 都可供 EKF3 使用。若要優先使用 IMU600,可選設 EK3_PRIMARY = 2,並確認 INS_USE3 = 1;索引從 0 起算。
  5. 在 Mission Planner 對三個 IMU 一起做六面校正。依手冊,模組端與飛控端加速度校正擇一作為校正流程,避免任意重複套用;整合時以 Mission Planner 為主。若之後改了模組校正,必須重做飛控校正。
  6. 重新啟動,Messages 應出現 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 主迴圈的起飛前檢查要求陀螺 backend 至少 1.8 × 400 = 720 Hz,因此此整合採 RATE = 1000;200/400/500 Hz 會觸發速率不足警告。
  • 保留 EKF3 自動 lane switch;不要為強制固定 IMU600 而關閉備援切換。飛行中若目前使用的 EKF 核心狀態變差,系統仍可能切換到狀態較好的核心。
  • CFG 的 SPNVSPI 中 txn 與 delivered 應持續增加,主機開始讀取後 drop 不應持續增加。大量錯誤時 Messages 可能顯示 IMU600: SPI link errors,檢查接線、共地、模式與供電。
  • 由飛控 5 V 供電時,飛控重啟可能短暫中斷供電。韌體 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 交易累計;手冊驗證約每秒 1190 次(RATE=1000)
ok 讀滿 128 bytes 的次數,通常接近 txn,可能包含空包
short 不足 128 bytes 的讀取累計,下次仍提供同包;持續增加查 CS/SCK
delivered 完整交付的資料包數,每秒增量應接近 RATE
drop 16 包佇列滿時丟棄最舊包;判讀時請分開看主機尚未開始讀取前,以及正常運作後的增加量
dmaerr 0/1,是否曾發生 DMA 錯誤,正常 0
dma / lf / lt / ls / ks / kr / sp 原廠診斷欄位,一般解析器可略過並容許新增欄位

主機讀取與序號

  • RATE=1000 時約每 0.9 ms 讀取;pending>0 立即續讀,但單次最多連讀 5 包,避免長時間占用主機。CS 拉高後模組準備下包。
  • 檢查 SN、版本 1、CRC;type0 空包略過。seq 為 u16,以循環差值比較:gap=0 重複,gap>1 可能漏包;stream 的 seq 按分段計,空包沿用最後完成讀取的 seq。
  • CRC 錯誤時,丟棄這次讀到的內容並重新讀取;未讀滿的封包會保留,供下次再讀,fw 0.10.8 起疑似未完成交易也可能重送相同 seq。手冊已驗證 2 MHz;8 MHz 尚未驗證。

ArduPilot 驅動與 hwdef

文件所列發行包為 ArduPilot-4.7.1-SparkNavi-IMU600.zip,包含 AP_InertialSensor_SparkNavi、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 s;取得 50 包,以 dt 中位數估輸出率,運作中每 2 s 再核對
成功/失敗 成功顯示 IMU600 found, 1000 Hz;失敗顯示 probe: rd/hdr/crc。未接模組則略過,內建兩顆仍可使用
資料送入 INS 合併 Δθ/Δv 送 _notify_new_delta_angle/_velocity,使用封包 dt;used_mask=0 或 NaN 則記錯誤、不送 INS;SATURATED 增加 accel clip
溫度與單位 三顆溫度平均約 10 Hz 發布。Mission Planner 加速度為 mG、角速度為 mrad/s;SCALED_IMU2/3 分別傳送,畫面時間戳可能不同

SNV6 日誌與錯誤門檻

序號 gap>1 累計 Lost,CRC 失敗累計 Bad;偶發錯誤不直接在地面站顯示。最近 10 s 有錯誤時記錄 SNV6:TimeUS、Lost、Bad、Pkts。10 s 內 Lost ≥20 或 Bad ≥100,才顯示 IMU600: SPI link errors (...)。桌面驗證可設定 LOG_DISARMED=1,在未解鎖時錄製並查看 SNV6。

文件中的實機驗證條件

條件/項目 文件紀錄
日期與版本 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 只納入前兩個 backend;本專用板型預設為 7。EK3_PRIMARY=2 是第 3 個 backend 的索引,需同時有 EK3_IMU_MASK=7 與 INS_USE3=1。尚未解鎖時會使用指定的核心;飛行中仍可依狀態自動切換,Messages 會顯示 EKF3 lane switch n。


原始文件:IMU600-V2 User Manual v1.1 · PDF 頁 32–35

原文件逐頁閱讀 · 三份文件逐章對照與差異說明

回到本分類總覽 · 全部設定指南