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 整合步驟¶
- 斷電後按指定接線連接 SPI 與共地,先以 UART1 GUI 設定 IMU600。SPI 用途選 ArduPilot、時脈模式 3、RATE 1000 Hz,套用並 SAVE。
- 接飛控運作時,建議 OUT,none、AHRS,0、U2OUT,none 以減少 UART 負載,保留 STAT 診斷;需要觀察資料時再配合頻寬暫時啟用。
- 安裝相符的 SparkNavi-Blue2-IMU600 韌體(手冊驗證 Copter 4.7.1、SPI 2 MHz/Mode 3、獨立 CS)。在這個配置中,飛控將 IMU600 當作第三組 IMU 輸入(backend)。
- 確認 EK3_IMU_MASK = 7,使三個 IMU backend 都可供 EKF3 使用。若要優先使用 IMU600,可選設 EK3_PRIMARY = 2,並確認 INS_USE3 = 1;索引從 0 起算。
- 在 Mission Planner 對三個 IMU 一起做六面校正。依手冊,模組端與飛控端加速度校正擇一作為校正流程,避免任意重複套用;整合時以 Mission Planner 為主。若之後改了模組校正,必須重做飛控校正。
- 重新啟動,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