Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

SmartESAD

Overview

SmartESAD (Electronic Safe-Arm Device protocol) — двосторонній послідовний протокол між польотним контролером і піротехнічним пристроєм, який замінює класичну пару PWM-сигналів ARM/FIRE. Замість двох односпрямованих ліній SmartESAD дає польотному контролеру повний контроль над послідовністю безпеки, а у відповідь отримує стан пристрою, залишок таймерів і телеметрію.

SmartESAD is a bidirectional serial protocol between the flight controller and pyrotechnic device, replacing the classic PWM ARM/FIRE signal pair. Instead of two one-way lines, SmartESAD gives the FC full control of the safety sequence and returns the device’s live state, remaining timer counts, and telemetry.

Ця сторінка описує протокол smartESAD v1.1 (іменування станів Cold/Timer/Safe) та прошивку KIWI Betaflight гілки 2025.12. This page covers smartESAD v1.1 and the KIWI Betaflight 2025.12 firmware line.


Переваги над PWM / Advantages over PWM

PWMSmartESAD
Одностороннє керуванняДвосторонній зв’язок
Немає зворотного зв’язку про станСтан пристрою на OSD у реальному часі
2 дроти (ARM + FIRE)UART, 2 дроти (TX/RX)
Контроль цілісності відсутнійCRC-16 на кожному кадрі, відхиляє пошкоджені
Сплутування ARM/FIRE можливеКожна команда має власний 4-байтовий ASCII-код (ARM!, FIRE, COLD…)
Втрата сигналу — невизначена поведінкаLink-watchdog блокує постріл; опційне автоповернення у безпечний стан (safe_on_lostconnection)
Фіксовані інтервалиНалаштовувані таймери (timer, self-destruct, поріг удару), зберігаються у флеші пристрою
Тільки одна гілка спрацюванняДубльовані канали FIRE1+FIRE2 синхронно ведуть незалежні підривники

Архітектура безпеки / Safety architecture

SmartESAD реалізує модель з кількома незалежними рівнями захисту. Щоб підривник отримав напругу, усі перелічені умови мають бути виконані одночасно. Бажано прочитати MIL-STD-1316F для розуміння принципів.

SmartESAD implements a defence-in-depth model. All the conditions below must hold simultaneously for the initiator to receive energy.

Гейт / GateЩо гарантує / What it guarantees
Стан машини станів = ArmedКоманди надходили у правильному порядку (TimerSafeArm)
4-байтовий ASCII-код у кожній safety-командіІмовірність випадкового збігу через бітовий шум ~2⁻³² на команду
CRC-16-CCITT по всьому кадруСпотворені кадри відхиляються до обробки
Версія протоколу (Ver byte) збігаєтьсяНесумісні FC отримують Fault::BadVersion до досягнення SM
Link-watchdogПостріл не вмикається, якщо UART мовчав довше за watchdog-вікно
Окремі fire_command_latched і stateПомилка пам’яті, що псує одне з двох, не призводить до пострілу
Дубльовані лінії FIRE1+FIRE2Один обірваний/закорочений драйвер не вимикає весь пристрій
FC-side FIRE gateBetaflight не відправляє Fire, поки стан пристрою ≠ Armed (ешелонований захист: FC не покладається лише на те, що пристрій відхилить команду)

Протокол додатково передбачає GPIO co-sign (IN_ARM, IN_BLAST) — окрему фізичну лінію підтвердження. На платах KIWI підключення суто послідовне (без GPIO), тому цей гейт опційний і залежить від конкретного виробу.


Стани системи / System States

SmartESAD керує пристроєм через послідовність станів безпеки. Перехід між основними станами — лише вперед:

The FC drives SmartESAD through this safety state progression. Forward transitions only:

START ──Version──▶ DEACTIVATED ──Activate──▶ COLD ──Timer──▶ TIMER
                        ▲                     ▲                │ (auto, after
                        │                     │                │  countdown)
                   Deactivate            Cold cmd*             ▼
                 (з будь-якого       (*таймер продовжує      SAFE ──Arm──▶ [CHARGE_UP] ──▶ ARMED ──Fire──▶ FIRED
                  стану крім Fired)    цокати, правило R1)         (лише плати з                (термінальний
                                                                    конденсатором)               стан)
Стан / StateOSDОпис / Description
StartESAD INITПристрій щойно завантажився, мовчить. Чекає на Version від FC.
DeactivatedESAD CFG.Конфігураційний / maintenance режим. Set*/Save приймаються, arm/fire відхиляються. Вихід — лише команда Activate.
ColdESAD COLDПередпольотне очікування. Ланцюг озброєння скинуто, Arm відхиляється. Приймаються налаштування.
TimerESAD T-NNЙде countdown. Не скасовується (правило R1): команда Cold повертає стан, але таймер цокає далі (OSD: COLD T-NNN). Автоматичний перехід у Safe при нулі.
SafeESAD SAFE / SD T-NNNNCountdown вичерпано, self-destruct таймер запущено. Готовий приймати Arm. OSD чергує напис стану та SD-countdown з частотою 1 Гц.
ChargeUpESAD CHRGТранзит Safe → Armed на платах з конденсатором (заряджання 1–3 с). Якщо заряд застряг — авто-повернення у Safe через ~10 с.
ArmedESAD !ARMЗаряджено. Команда Fire ініціює постріл. Імпакт-детектор активний.
FiredESAD !FIRПостріл відбувся. Термінальний стан — повернення лише через перезавантаження пристрою.
SafetyPinESAD PIN.Зарезервовано: фізичний запобіжник вставлено. Поточні плати цей стан не повідомляють.

Захисні таймери / Safety timers

SmartESAD веде два незалежні таймери:

Таймер / TimerЗа замовч. / DefaultПризначення / Purpose
Timer (pre-arm countdown)420 с (7 хв)Обов’язкова затримка між командою Timer і станом Safe. Не скасовується командою Cold (правило R1).
Self-destruct7200 с (2 год)Час від Safe до автоматичного пострілу. Failure-mode-of-last-resort: пристрій, що перетнув лінію бойового зіткнення, не має лишитися у руках супротивника.

Обидва налаштовуються через CLI (kiwi_esad set timer / kiwi_esad set destruct_delay), зберігаються у флеш пристрою командою kiwi_esad save і переживають перезавантаження.


Налаштування пристрою / Device persistent settings

Зберігаються у флеші пристрою (не польотного контролера) у двосторінковому буфері з CRC-32. При пошкодженні — fallback на заводські значення, ніколи на Armed. Змінюються через kiwi_esad set <name> <N> + kiwi_esad save (див. довідник команд).

Stored in the device’s flash (not the FC). On corruption the device falls back to compiled defaults — never to Armed.

Параметр / SettingДіапазон / RangeЗа замовч. / DefaultОпис / Purpose
timer1…65535 с420Pre-arm countdown (TimerSafe)
destruct_delay2…65535 с7200Self-destruct: час від Safe до автопострілу. Має бути > timer.
impact_threshold50…32767120 (~15 g)Поріг імпакт-пострілу в стані Armed (метрика |a|²×64)
takeoff_required0 / 10Arm приймається лише після детекції зльоту акселерометром (AOP-4187 §3.1.2.d)
safe_on_lostconnection0 / 10Автоповернення Timer/Safe/Armed → Cold після ~1 с тиші на UART
det_check0 / 11Перевірка цілісності ланцюга підривника перед Arm (плати з det-check апаратурою)
accel_rate400 / 800 / 1600 / 3300 Гц400Частота вибірки акселерометра. Застосовується після save (перезавантаження пристрою).

Опційний імпакт-постріл працює завжди, коли пристрій у стані Armed: акселерометр виявляє удар понад поріг і пристрій переходить Armed → Fired без жодної команди з UART.


Швидке налаштування / Quick setup

1. Підключення / Wiring

Один UART (TX, RX, GND) від польотного контролера до ESAD:

  • FC TX → ESAD RX
  • FC RX → ESAD TX
  • спільний GND

Швидкість фіксована: 57600 8N1, без апаратного керування потоком.

2. CLI у Betaflight

# Призначити UART для SmartESAD (приклад: UART1 = serial 0)
serial 0 1048576 57600 57600 0 57600

# Налаштування пристрою (зберігаються у флеші ESAD)
kiwi_esad deactivate
kiwi_esad set timer 420
kiwi_esad set destruct_delay 7200
kiwi_esad set impact_threshold 120
kiwi_esad set takeoff_required 0
kiwi_esad set safe_on_lostconnection 0
kiwi_esad save
kiwi_esad activate

# Налаштування польотного контролера
set kiwi_esad_poll_interval_ms = 100
set kiwi_esad_fault_threshold = 3
set kiwi_esad_activate_on_boot = 0
set kiwi_esad_activation_delay_s = 0

# Позиція OSD елементів
set kiwi_osd_esad_status_pos = 2242
set kiwi_osd_esad_debug_pos  = 2498   # 2498 = bottom-left; 341 = hidden

# Перемикачі RC
aux 1 57 2 1725 2100 0 0     # ATAK on AUX3 — momentary, OR logic, no link
aux 2 58 3 1725 2100 0 0     # FIRE on AUX4 — momentary, OR logic, no link

save

Формула позиції OSD: pos = x + (y * 32) + 2048 (2048 = видимий у профілі 1). Значення 341 ховає елемент.

Примітка про маску serial: у прошивках гілки 2025.12 FUNCTION_KIWI_ESAD = 1048576 (біт 20). У збірках на базі 2026.6+ маска змінена на 2097152 (біт 21), а permanentId боксів зсунуто 56/57/58/62 → 57/58/59/63.

3. Betaflight Configurator

  1. Ports → оберіть UART і увімкніть KIWI ESAD.
  2. Modes → призначте KIWI ESAD ACTIVE / ATAK / FIRE на перемикачі пульта.
  3. OSD → розмістіть елемент ESAD Status на екрані.

Перемикачі RC / RC mode boxes

Бокси спрацьовують по фронту (edge-triggered): на кожному rising/falling фронті прошивка один раз відправляє відповідну команду. Між подіями FC опитує стан пристрою кожні kiwi_esad_poll_interval_ms.

Boxes are edge-triggered: each rising/falling edge emits the command once; between events the FC polls device state.

Бокс / BoxpermanentIdФронт / EdgeКоманда / EmitsПотрібний стан пристрою / Device state
KIWI ESAD ACTIVE56risingTimer (TIMR)Cold
KIWI ESAD ATAK57risingArm (ARM!)Safe
KIWI ESAD ATAK57fallingCold (COLD)будь-який крім Deactivated
KIWI ESAD FIRE58risingFire (FIRE)Armed (FC додатково блокує Fire, поки стан ≠ Armed)
KIWI ESAD CFG62risingDeactivate (DACT)будь-який крім Fired
KIWI ESAD CFG62fallingActivate (ACTV)Deactivated

Приклад прив’язки (FC ARM на AUX1, ESAD на AUX2/3/4, CFG на AUX5):

aux 0  0 0 1300 2100 0 0     # FC ARM           on AUX1
aux 1 56 1 1725 2100 0 0     # KIWI ESAD ACTIVE on AUX2
aux 2 57 2 1725 2100 0 0     # KIWI ESAD ATAK   on AUX3
aux 3 58 3 1725 2100 0 0     # KIWI ESAD FIRE   on AUX4
aux 4 62 4 1725 2100 0 0     # KIWI ESAD CFG    on AUX5 (ON=DACT, OFF=ACTV)
save

Формат: aux <slot> <permanentId> <auxChannel_0based> <startUs> <endUs> <modeLogic> <linkedTo>. Поріг 1725 мкс дає мертву зону вище середини стіка.

Двоключовий інтерлок / two-key interlock: прив’яжіть FIRE так, щоб він працював лише коли ATAK теж активний — останнє поле 57 у рядку FIRE:

aux 3 58 3 1725 2100 0 57    # FIRE діє лише поки ATAK (57) теж HIGH

Рекомендовано для бойового спорядження. Recommended for live ordnance.

CFG-бокс (maintenance): поки утримується HIGH, FC призупиняє автоактиваційні цикли, щоб оператор міг заливати налаштування (kiwi_esad set …, kiwi_esad save) навіть при kiwi_esad_activate_on_boot = 1. Автоцикли поновлюються після disarm польотного контролера.


Налаштування польотного контролера / FC-side settings

Звичайні змінні Betaflight CLI (set <name> = <value>, потім save):

Змінна / SettingДіапазон / RangeЗа замовч. / DefaultОпис / Purpose
kiwi_esad_poll_interval_ms20…1000100Період опитування стану пристрою (keep-alive)
kiwi_esad_fault_threshold1…503Кількість пропущених відповідей поспіль до статусу ESAD LOST
kiwi_esad_activate_on_boot0 / 10Автоматично відправити Timer щойно з’явився зв’язок; тримається доки пристрій не повернеться у Cold
kiwi_esad_activation_delay_s0…6000Вікно скасування на боці FC: після ARM польотника — countdown на OSD, потім авто-Timer. 0 = вимкнено
kiwi_esad_expected_identifierрядок ≤ 4“”Перевірка ідентифікатора пристрою для boot-latch
kiwi_osd_esad_status_posПозиція основного OSD елемента стану
kiwi_osd_esad_debug_pos341 (сховано)Позиція діагностичного OSD рядка (телеметрія: det-check, напруги, peak-metric)

Таблиця автоактивації / Auto-activation matrix

activate_on_bootactivation_delay_sПоведінка / Behaviour
00Повністю ручне керування (бокси / CLI). Найсуворіший контроль — за замовчуванням.
0>0ARM польотника → countdown на OSD → авто-Timer. Disarm → Cold.
10Фіксується з увімкнення: щойно зв’язок живий, FC відправляє Timer і далі не втручається.
1>0Обидва шляхи працюють одночасно.

Довідник CLI команд / CLI command reference

Прошивка KIWI має вбудовану CLI команду kiwi_esad для керування та діагностики пристрою прямо з CLI Betaflight (Configurator → CLI, або термінал на USB-порту, 115200, символ # вмикає CLI).

The KIWI firmware ships a kiwi_esad CLI command for driving and debugging the device straight from the Betaflight CLI.

Команди стану / Status commands

Команда / CommandДія / Effect
kiwi_esad або kiwi_esad statusПовний рантайм-статус: стан, залишок таймера, зв’язок, остання відмова, версія прошивки пристрою, фази автоактивації, телеметрія (det_check, напруги, peak-metric).
kiwi_esad settingsЖивий запит GetSettings до пристрою (~100 мс). Друкує блок готових kiwi_esad set … рядків — можна скопіювати з однієї плати і вставити на іншу.

Приклад виводу kiwi_esad status:

# kiwi_esad status
state: COLD
remaining_secs: 420
status_byte: 0x01
det_check_ok: yes
pin_present: no
vcap_mv: 0
vbat_mv: 12600
peak_metric: 64
link_alive: yes
misses: 0
last_fault: code=0x00 subcode=0x00
firmware_version: 0x01010000
reset_cause: 0x00
auto_phase: IDLE
countdown_remaining_ms: 0
boot_phase: DISABLED
cfg_mode: off

Поля / Fields:

Поле / FieldЗначення / Meaning
stateПоточний стан пристрою: UNKNOWN, START, COLD, TIMER, SAFE, CHARGE_UP, ARMED, FIRED, FAULT, DEACTIVATED, SAFETY_PIN
remaining_secsЗалишок активного countdown (pre-arm або self-destruct, залежно від стану)
configured_timer_s(лише у DEACTIVATED) значення таймера, з яким Activate продовжить роботу
det_check_okЛанцюг підривника цілий (плати з det-check)
vcap_mv / vbat_mvНапруга конденсатора пострілу та напруга батареї, мВ. 0 — на платі немає відповідного вимірювання
peak_metricПікова метрика прискорення |a|²×64 від останнього Arm (~64 = 1 g спокою; обмежується ±16 g)
link_alive / missesСтан UART-зв’язку і лічильник пропущених відповідей
last_faultОстання зафіксована відмова. Код зберігається для діагностики і не відображає поточний стан — розшифровка у довіднику кодів відмов
firmware_versionВерсія прошивки пристрою (u32; 0x01010000 = v1.1.0.0)
auto_phase / boot_phase / cfg_modeСтан циклів автоактивації та CFG-режиму на боці польотного контролера

Команди керування / Action commands

Кожна команда чекає відповідь пристрою до 500 мс і друкує результат:

-> OK  state: TIMER  fault: 0x00/0x00
Результат / ResultЗначення / Meaning
OKПристрій відповів звичайним кадром стану
FAULTПристрій відповів StateFault — причина у fault: 0xCC/0xSS
TIMEOUTЗапит відправлено, відповіді немає протягом 500 мс
BUSYНе вдалося відправити (порт зайнятий попереднім запитом)
Команда / CommandWire cmdПотрібний стан / Required stateДія / Effect
kiwi_esad versionVersionбудь-якийХендшейк. Перший Version після ввімкнення переводить пристрій Start → Deactivated.
kiwi_esad activateActivate (ACTV)DeactivatedВихід з maintenance у Cold.
kiwi_esad deactivateDeactivate (DACT)будь-який крім FiredВхід у maintenance (CFG). Скидає countdown до налаштованих значень і знімає всі фіксатори пострілу.
kiwi_esad timerTimer (TIMR)ColdСтарт pre-arm countdown.
kiwi_esad coldCold (COLD)будь-який крім DeactivatedПовернення у Cold. Запущений countdown продовжує цокати (правило R1). З Deactivated відхиляється — використовуйте activate.
kiwi_esad safeПсевдонім cold (ті самі байти на дроті).
kiwi_esad disarmПсевдонім cold.
kiwi_esad armArm (ARM!)SafeОзброєння. На платах з конденсатором — через транзит ChargeUp.
kiwi_esad fireFire (FIRE)ArmedПостріл. Термінальний.

Команди налаштувань / Settings commands

set пише значення у RAM пристрою; зберігає лише kiwi_esad save. Пристрій приймає set/save у станах Cold або Deactivated (save — Safe або Deactivated).

set writes device RAM; only kiwi_esad save persists. Accepted in Cold / Deactivated.

Команда / CommandДіапазон / RangeДія / Effect
kiwi_esad set timer <N>1…65535 сPre-arm countdown
kiwi_esad set destruct_delay <N>2…65535 сSelf-destruct таймер
kiwi_esad set impact_threshold <N>50…32767Поріг імпакт-пострілу
kiwi_esad set takeoff_required <0|1>0/1Arm лише після детекції зльоту
kiwi_esad set safe_on_lostconnection <0|1>0/1Автоповернення у Cold при втраті зв’язку
kiwi_esad set det_check <0|1>0/1Перевірка цілісності ланцюга підривника
kiwi_esad set accel_rate <N>400, 800, 1600, 3300Частота акселерометра (застосовується після save)
kiwi_esad saveЗапис у флеш пристрою. Пристрій м’яко перезавантажується (~50 мс): -> OK saved, device rebooting (~50 ms)

Якщо set/save відхилено з fault: 0x06/0x01 (WrongState), CLI підкаже правильний шлях:

tip: Set/Save accept state in {Safe, Deactivated}. Use
`kiwi_esad deactivate` to enter CFG, push, then `kiwi_esad activate`.

Приклад повної сесії / Full bench session

# kiwi_esad status
state: COLD  remaining_secs: 7
link_alive: yes  misses: 0
...

# kiwi_esad timer
-> OK  state: TIMER  fault: 0x00/0x00

# kiwi_esad status
state: SAFE  remaining_secs: 7189

# kiwi_esad arm
-> OK  state: ARMED  fault: 0x00/0x00

# kiwi_esad fire
-> OK  state: FIRED  fault: 0x00/0x00

Довідник кодів відмов / Fault code reference

last_fault: code=0xCC subcode=0xSS у виводі kiwi_esad status та fault: 0xCC/0xSS після команд. Код не скидається автоматично — тримає останню причину відмови, а не поточний стан.

Top-level codes:

Код / CodeНазва / NameЗначення / Meaning
0x00(none)Відмов немає
0x01BadCrcCRC-16 кадру не зійшовся
0x02BadVersionБайт версії кадру ≠ 0x01 — несумісна прошивка FC або пристрою
0x03UnknownCommandНевідомий байт команди (напр., нова команда до старої прошивки пристрою)
0x04BadMagicНевірний 4-байтовий ASCII-код команди (напр., FC зі старим протоколом v1.0)
0x05BadLengthДовжина payload не відповідає специфікації команди
0x06PreconditionFailedУмови не виконані — справжня причина у subcode, див. нижче
0x07InternalErrorВнутрішня помилка кодека / машини станів пристрою

Subcodes для PreconditionFailed (0x06):

SubcodeНазва / NameЗначення / Meaning
0x01WrongStateКоманда не дозволена у поточному стані (напр., arm з Cold)
0x02InArmLowArm відхилено — GPIO IN_ARM низький (плати з co-sign)
0x03InBlastLowFire відхилено — GPIO IN_BLAST низький (плати з co-sign)
0x04TimerRunningОперація заблокована — pre-arm countdown ще цокає
0x05SelfDestructRunningОперація заблокована — self-destruct countdown цокає
0x06OutOfBoundsЗначення set поза діапазоном, або порушено інваріант destruct_delay > timer
0x07PreLaunchNotDetectedArm відхилено — takeoff_required=1, а зльоту ще не зафіксовано. OSD: ESAD NOLT
0x08DetCheckOpenArm відхилено — ланцюг підривника розімкнутий. OSD: ESAD NODT

OSD-індикація / OSD display

Основний елемент (kiwi_osd_esad_status_pos), 9 символів:

Умова / ConditionТекст / Text
Зв’язку ще не булоESAD....? (анімований ?)
Зв’язок був і зник (misses ≥ fault_threshold)ESAD LOST
ХендшейкESAD INIT
Cold, без countdownESAD COLD
Cold, countdown ще цокає (R1)COLD T-NNN
TimerESAD T-NN / ESD T-NNN / ESDT-NNNN (префікс скорочується зі зростанням цифр)
SafeESAD SAFESD T-NNNN чергуються з частотою 1 Гц. Чергування — сигнал безпеки: оператор кожні пів секунди бачить і стан, і SD-countdown до автономного пострілу.
ChargeUpESAD CHRGSD T-NNNN (1 Гц)
ArmedESAD !ARMSD T-NNNN (1 Гц, обидві половини без блимання)
FiredESAD !FIR (блимає 4 Гц)
FaultESAD F-NN (hex-код відмови)
DeactivatedESAD CFG.
SafetyPin (зарезервовано)ESAD PIN.
Останній Arm відхилено DetCheckOpenESAD NODT (блимає 4 Гц; тримається до успішного Arm або скидання хендшейком)
Останній Arm відхилено PreLaunchNotDetectedESAD NOLT (блимає 4 Гц; та сама логіка)
FC-side activation countdownESAD T-NN (перекриває стан пристрою)

Діагностичний рядок (kiwi_osd_esad_debug_pos, за замовчуванням схований) показує телеметрію: ED+ V24.1 B12.4 P- M64 — det-check, напруга конденсатора, напруга батареї, шунт-пін, peak-metric акселерометра. Для стендів і демонстрацій; у польових збірках ховайте (341).


  • Disarm польотника повертає пристрій у безпечний стан (якщо boot-latch не активний). Запущені countdown при цьому не скасовуються — правило R1.
  • FC-side watchdog: misses ≥ kiwi_esad_fault_threshold → OSD ESAD LOST, стан UNKNOWN. Опитування продовжується; перша успішна відповідь відновлює все.
  • Device-side safe_on_lostconnection: коли увімкнено, пристрій сам переводить Timer/Safe/ArmedCold після ~1 с тиші від FC.
  • Відкат стану (пристрій перезавантажився, стан опустився нижче попереднього): FC скидає фіксатори автоактивації — оператор мусить явно повторити послідовність озброєння.
  • FC ніколи не стріляє сам. Прошивка лише передає намір оператора; фінальний гейт пострілу — власна логіка пристрою.

Діагностика / Troubleshooting

Усе через CLI Betaflight (Configurator → CLI). Перший крок завжди — kiwi_esad status.

Симптом / SymptomПричина і рішення / Fix
OSD: ESAD....? назавжди, kiwi_esad status показує link_alive: no, state: UNKNOWNTX/RX переплутано — поміняйте місцями. Перевірте спільний GND і що обрано правильний UART у serial.
OSD: ESAD LOST через кілька секунд після стартуЗв’язок був і зник: кабель, живлення пристрою або його зависання. kiwi_esad status → дивіться misses. Пересадіть роз’єм.
kiwi_esad: command not foundПрошивка без підтримки ESAD CLI — оновіться на актуальну KIWI прошивку.
set kiwi_esad_* = … → unknown settingПрошивка зібрана без USE_KIWI_ESAD — це не KIWI збірка.
set kiwi_esad_arm_delay / kiwi_esad_sd_delay не існуютьЗастаріла інструкція: ці параметри переїхали у флеш пристрою. Використовуйте kiwi_esad set timer … / kiwi_esad set destruct_delay … + kiwi_esad save.
-> TIMEOUT після кожної командиПристрій не відповідає: перевірте живлення ESAD і проводку; kiwi_esad statuslink_alive.
-> BUSYПопередній запит ще виконується — зачекайте пів секунди і повторіть.
-> FAULT … 0x04/… (BadMagic)Несумісні версії протоколу FC ↔ пристрій (напр., прошивка пристрою давніша за v1.1). Оновіть прошивку пристрою.
-> FAULT … 0x06/0x01 (WrongState) після armПристрій ще у TIMER — дочекайтеся стану SAFE (kiwi_esad status) і повторіть.
-> FAULT … 0x06/0x01 після set/saveПристрій не у Cold/Deactivated. Шлях: kiwi_esad deactivateset …saveactivate.
-> FAULT … 0x06/0x06 (OutOfBounds)Значення поза діапазоном, або destruct_delay ≤ timer. Спершу збільште destruct_delay.
-> FAULT … 0x06/0x08, OSD ESAD NODTЛанцюг підривника розімкнутий — перевірте лінії і контакт. Для стенду без підривника: kiwi_esad deactivatekiwi_esad set det_check 0saveactivate.
OSD ESAD NOLT, -> FAULT … 0x06/0x07takeoff_required=1, а зльоту не було. Для стенду: kiwi_esad set takeoff_required 0 (у Cold/Deactivated) + save.
OSD ESAD CHRG висить > 5 сЗаряд конденсатора застряг (низька батарея, несправність). Пристрій сам повернеться у SAFE через ~10 с; повторіть arm.
OSD ESAD PIN.Зарезервований стан фізичного запобіжника. Поточні плати його не повідомляють — якщо бачите, вважайте пристрій механічно заблокованим і огляньте апаратуру.
Бокс ACTIVE не дієБокс не прив’язаний — перевірте aux (permanentId 56) і вкладку Modes.
Команди боксів ігноруються, OSD ESAD CFG.Пристрій у Deactivated (CFG-бокс тримається HIGH?). Опустіть CFG-бокс або kiwi_esad activate.
kiwi_esad settingsGetSettings timed outТе саме, що TIMEOUT: немає зв’язку з пристроєм.
Налаштування «не збереглися» після перезавантаженняЗабули kiwi_esad saveset пише лише у RAM пристрою.

Прослуховування шини / Sniffing the wire

Для глибокої діагностики можна дивитися сирі кадри:

  1. Зовнішній USB-TTL адаптер паралельно на лінію TX або RX (спільний GND) — FC продовжує працювати з ESAD, ви бачите трафік.

  2. serialpassthrough: звільніть порт і прокиньте його на USB:

    serial 0 0 57600 57600 0 57600     # зняти FUNCTION_KIWI_ESAD з UART1
    save
    # після перезавантаження:
    serialpassthrough usart1 57600
    

    Зверніть увагу: serialpassthrough приймає ім’я порту (usart1, usart2…), а не числовий індекс. Поверніть функцію назад (serial 0 1048576 … + save) після діагностики.


Протокол / Protocol summary

Нижче — стислий підсумок. Повна специфікація інтерфейсу: smartESAD v1.2 Protocol Specification. Full interface specification linked above.

Параметр / PropertyЗначення / Value
Транспорт / TransportUART, 57600 8N1, без керування потоком
Кадр / FrameAA 55 VER CMD SEQ LEN DATA[…] CRC_hi CRC_lo
Цілісність / IntegrityCRC-16-CCITT-FALSE (poly 0x1021, init 0xFFFF); тест-вектор crc16("123456789") == 0x29B1
Replay-захист / Replay protection8-бітний seq nonce, відповідь повертає (seq+1) mod 256
Каденс / CadenceFC опитує кожні poll_interval_ms (за замовч. 100 мс = 10 Гц); пристрій відповідає за ~10 мс
Boot-handshakeПристрій після ввімкнення мовчить; FC надсилає Version (Start → Deactivated), потім Activate (→ Cold)
Безпекові команди / Safety commandsКожна має власний 4-байтовий ASCII-код: COLD, TIMR, ARM!, FIRE, DACT, ACTV, SAV!
Config-команди / Config commandsSetTimer, SetSelfDestructDelay, SetImpactThreshold, SetTakeoffRequired, SetSafeOnLostLink, SetDetCheckEnabled, SetAccelRate, SaveSettings, GetSettings
Версія пристрою / Device firmwareStateStart повертає FW_VERSION (u32 BE; v1.1.0.0 = 0x01010000)

Сумісні плати / Compatible boards

SmartESAD вбудовано у прошивку KIWI Betaflight для всіх плат KIWI:


Стандарти / Standards

SmartESAD спроектовано на принципах:

  • MIL-STD-1316F — Fuze Design Safety Criteria (DoD)
  • STANAG 4560 ed 3 — EED Assessment & Test Methods (NATO)
  • NAWCWD TP 8504 — Design Methodology for Safe and Arm Devices (US Navy)
  • AOP-4187 Ed A v1 — Fuzing System Safety Design (NATO)

Це не сертифікація; зазначені стандарти — джерело правил дизайну. Цільовий ризик передчасного озброєння — менше 1 на 1 000 000 пристроїв (MIL-STD-1316F §4.3).