CAN w UAV może jednocześnie przenosić dane GNSS, magnetometru, airspeed, baterii, serw i ESC. Jego sygnał różnicowy, arbitraż i fault confinement są znacznie odporniejsze niż długa magistrala I²C, ale nie eliminują błędów instalacji. Jedna dodatkowa terminacja, gwiazda z długimi odgałęzieniami, wspólny spadek zasilania albo konflikt node ID może dać objawy od pojedynczych retransmisji po utratę wszystkich węzłów i stan bus-off.[1][2][6]
Diagnostyka ma dwie odrębne warstwy. CAN odpowiada za bity, ramki, ACK, CRC i liczniki błędów. DroneCAN/Cyphal odpowiadają za identyfikatory transferów, typy danych, node status, dynamic allocation, subskrypcje i konfigurację węzłów. Poprawna ramka CAN nie gwarantuje, że autopilot subskrybuje właściwą wiadomość; widoczny węzeł DroneCAN nie gwarantuje, że jego sensor publikuje poprawne dane.
Spis treści#
- Warstwy problemu
- Sygnał różnicowy
- CAN H, CAN L i common-mode
- Terminacja
- Topologia i stuby
- Przewody i złącza
- Bitrate i sample point
- Arbitraż
- ACK i retransmisja
- Error frames
- TEC, REC i fault confinement
- Error-active, error-passive i bus-off
- Obciążenie magistrali
- DroneCAN node ID
- Dynamic node allocation
- NodeStatus
- Subskrypcje i publikacje
- Firmware i bootloader
- Redundancja CAN
- Objaw: zero węzłów
- Objaw: jeden węzeł znika
- Objaw: działa na stole, nie działa z napędem
- Objaw: rosną błędy bez utraty danych
- Objaw: bus-off
- Objaw: węzeł jest online, danych brak
- Objaw: konflikt node ID
- Narzędzia
- Multimetr
- Oscyloskop różnicowy
- Interfejs CAN i sniffer
- Procedura diagnostyczna
- Recovery
- Testy fault injection
- Logowanie i maintenance
- Typowe błędy
- Powiązane tematy
- Przypisy
Warstwy problemu#
Praktyczny stos:
funkcja UAV: GNSS / ESC / bateria / airspeed
DroneCAN: typ danych, transfer-ID, node status, usługi
CAN 2.0B: ID, DLC, dane, CRC, ACK, error frames
kontroler CAN: FIFO, filtry, TEC/REC, bus-off
transceiver: dominant/recessive, common-mode, standby
wiązka: CAN_H, CAN_L, masa/zasilanie, terminatory
Każdy objaw przypisuje się do najniższej warstwy, na której dowody przestają być poprawne. Jeżeli między H i L przy wyłączonym zasilaniu nie ma oczekiwanej rezystancji, nie zaczyna się od zmiany subskrypcji GPS. Jeżeli sygnał i ramki są poprawne, a NodeStatus przychodzi, wtedy analizuje się typ publikowanych wiadomości i konfigurację autopilota.
Ważne rozróżnienia:
- node offline — brak aktualnego statusu/transferów;
- node online, health warning/error — komunikacja działa, urządzenie zgłasza problem;
- node online, sensor absent — warstwa protokołu działa, ale funkcja nie publikuje lub nie jest subskrybowana;
- bus-off kontrolera — transceiver/controller wycofał się po nadmiarze błędów;
- brak ACK — nadajnik może być jedynym aktywnym uczestnikiem lub inni nie rozpoznają ramek z powodu bit timingu/fizyki.
Sygnał różnicowy#
CAN reprezentuje stan dominant i recessive przez różnicę między CAN_H i CAN_L. Odbiornik reaguje głównie na:
[ V{diff} = V{CANH} - V_{CANL} ]
Zakłócenie wspólne podnoszące obie linie podobnie powinno częściowo się skasować. To wymaga skręconej pary, właściwego transceivera i utrzymania common-mode w zakresie odbiornika.
Sygnał różnicowy nie znosi dowolnej różnicy potencjałów mas. Transceiver ma dopuszczalny common-mode. Długi UAV z silnymi prądami może mieć spadek masy między końcami; przewód odniesienia/ekran i architektura zasilania muszą być zgodne z zaleceniami hardware DroneCAN.[5]
CAN nie używa modelu „jeden TX, jeden RX” jak UART. Wszystkie węzły słuchają wspólnej pary, a dominant wygrywa nad recessive. Zwarcie jednej linii, uszkodzony transceiver albo stale dominant może wyłączyć całą domenę.
CAN H, CAN L i common-mode#
W typowym high-speed CAN stan recessive ma obie linie blisko wspólnego poziomu, a dominant rozsuwa je: CAN_H rośnie, CAN_L maleje. Dokładne poziomy i progi bierze się z datasheet transceivera, nie z jednego wykresu internetowego.
Mierzy się:
- napięcie każdej linii do lokalnej masy;
- sygnał różnicowy H–L;
- common-mode ((V_H+V_L)/2);
- overshoot i undershoot;
- ringing po zboczu;
- różnicę między początkiem i końcem wiązki;
- napięcie zasilania transceiverów.
Multimetr na aktywnym busie pokazuje wartości uśrednione. Dwie „sensowne” wartości nie dowodzą poprawnego różnicowego przebiegu. Oscyloskop z matematycznym CH1–CH2 albo sondą różnicową jest właściwym narzędziem.
Terminacja#
Klasyczna magistrala liniowa ma 120 Ω na obu fizycznych końcach, co przy wyłączonym zasilaniu daje około:
[ R_{HL} = 120\,\Omega \parallel 120\,\Omega \approx 60\,\Omega ]
PX4 również opisuje dwa terminatory 120 Ω na końcach łańcucha.[6] Niektóre FC i GNSS mają terminację wbudowaną, czasem konfigurowalną. Należy zinwentaryzować faktyczny stan, nie liczbę wtyczek.
Interpretacja pomiaru orientacyjnego:
| CAN_H–CAN_L, power off | Możliwa sytuacja |
|---|---|
| około 60 Ω | dwa terminatory 120 Ω |
| około 120 Ω | jeden terminator |
| około 40 Ω | trzy terminatory |
| bardzo wysoko/open | brak terminacji lub przerwa |
| blisko 0 Ω | zwarcie albo nietypowy układ ochronny |
Pomiar może być zmieniony przez aktywne terminatory, transceivery, TVS i inne ścieżki. Dokumentacja urządzeń rozstrzyga. Terminator nie powinien znajdować się „przy każdym urządzeniu”.
Brak terminacji powoduje odbicia; za dużo terminacji nadmiernie obciąża nadajniki i zmniejsza amplitudę. Oba przypadki mogą działać na krótkim stole przy małym bitrate, a zawodzić po dodaniu wiązki.
Topologia i stuby#
CAN projektuje się jako liniowy trunk z krótkimi odgałęzieniami. Dwa porty w peryferium ułatwiają daisy-chain, ale elektrycznie są zwykle połączone równolegle. Gwiazda ze splittera tworzy kilka stubów i punkty odbicia.
Znaczenie długości stubu rośnie z bitrate i szybkością zbocza. Nie wystarczy porównać z długością całej ramy; ważny jest czas propagacji względem bit time oraz położenie sample point. Zalecenia DroneCAN ograniczają topologię i wymagają terminacji końców.[5]
Typowe błędy:
- FC w środku ma wbudowany terminator, a oba końce również;
- GNSS z włączonym terminatorem jest bocznym stubem, nie końcem;
- pasywny hub tworzy gwiazdę;
- redundantne CAN1 i CAN2 przypadkowo zwarte przez adapter;
- długi odcinek do payloadu kończy się bez terminacji;
- ekran podłączony w sposób tworzący pętlę prądową.
Przewody i złącza#
CAN_H i CAN_L powinny tworzyć kontrolowaną skręconą parę. Zasilanie urządzeń może iść tym samym złączem, lecz prąd zasilania nie powinien płynąć sygnałową parą ani powodować dużej różnicy mas.
JST-GH w standardzie Pixhawk ma mały rozmiar i blokadę, ale jakość zacisku jest krytyczna. Pojedyncza żyła częściowo wyrwana może dawać błędy tylko przy drganiach. Test ciągłości bez poruszania wiązką nie wykrywa tego.
Kontrola:
- pinout obu końców — różni producenci mogą użyć innej kolejności;
- skręt nieprzerwany długo przy złączu;
- strain relief;
- brak równoległego prowadzenia przy fazach silnika;
- promień gięcia i ścieranie;
- ekran zgodny z projektem EMC;
- prąd i spadek napięcia zasilania peryferiów;
- brak zasilania wstecznego przez CAN/ESD.
Bitrate i sample point#
Wszystkie węzły na jednym segmencie muszą używać zgodnego nominalnego bitrate. CAN nie przesyła zegara osobną linią; odbiorniki synchronizują się ze zboczami. Bit timing obejmuje prescaler, segmenty czasowe, sample point i SJW.[1][2]
Zły bitrate zwykle daje lawinę error frames, brak ACK i wzrost liczników. Zbliżony, ale niezgodny sample point może działać na krótkiej wiązce, a zawodzić przy temperaturze lub długości.
Autobaud w bootloaderze DroneCAN może dobrać prędkość na podstawie ruchu, ale pusty bus bez nadajnika nie daje wzorca. Bootloader i aplikacja mogą mieć różne zachowanie. Przy diagnostyce zapisuje się bitrate na FC, węzłach i narzędziu sniffera.
CAN FD dodaje data phase bitrate i inne wymagania transceivera. DroneCAN v0 używa klasycznego CAN 2.0B; nie zakłada się FD tylko dlatego, że kontroler MCU je obsługuje.
Arbitraż#
Węzły mogą rozpocząć transmisję jednocześnie. Dominant bit o niższym numerycznie ID wygrywa, a przegrywający przestaje nadawać bez uszkodzenia ramki zwycięzcy.[1]
Konsekwencje:
- ID pełni funkcję priorytetu;
- wysoki bus load zwiększa latency ramek o niższym priorytecie;
- „brak kolizji” nie oznacza stałego czasu dostarczenia;
- błędny flood wysokopriorytetowych ramek może zagłodzić inne funkcje;
- sniffer musi rejestrować timestampy i rozkład ID.
DroneCAN koduje priorytet i informacje transferu w 29-bitowym identyfikatorze. Nie przypisuje się dowolnych CAN ID bez rozumienia transport layer.[4]
ACK i retransmisja#
Nadajnik wysyła recessive w ACK slot, a co najmniej jeden poprawnie odbierający węzeł ściąga dominant. Brak ACK nie oznacza, że odbiornik aplikacyjny „nie lubi wiadomości”; ACK jest na warstwie CAN i potwierdza poprawną ramkę.
Jeżeli na busie jest tylko jeden aktywny węzeł, jego ramki nie dostaną ACK. Controller retransmituje, zwiększa TEC i może wejść bus-off. Pasywny sniffer w silent/listen-only nie ACKuje — to celowe, ale nadajnik potrzebuje innego aktywnego uczestnika.
Brak ACK może wynikać z:
- inne węzły bez zasilania/standby;
- zły bitrate;
- uszkodzona para/terminacja;
- filtr/tryb transceivera nie ma wpływu na podstawowy ACK, ale listen-only ma;
- jedyny drugi węzeł również nie rozpoznaje ramek;
- złe FD/classic mode.
Error frames#
CAN wykrywa bit error, stuff error, CRC error, form error i ACK error.[1] Węzeł error-active sygnalizuje active error flag, przerywając błędną ramkę. Nadajnik spróbuje ponownie.
Sniffer może pokazać:
- pojedyncze error frames po uruchomieniu;
- regularne błędy przy konkretnym ID;
- burst errors po włączeniu ESC;
- ciąg ACK errors bez innych węzłów;
- stuff/form errors przy złym bitrate/EMI.
Sam licznik ramek poprawnych może pozostać wysoki mimo rosnącej liczby retransmisji. Latency i bus occupancy pogarszają się zanim funkcja przestanie działać. Dlatego error counters są metryką zdrowia.
TEC, REC i fault confinement#
Kontroler utrzymuje Transmit Error Counter i Receive Error Counter. Reguły przyrostu/spadku zależą od rodzaju błędu i roli węzła; Bosch M_CAN implementuje te stany i raportuje liczniki/status.[2]
Interpretacja:
- rośnie głównie TEC jednego węzła — jego transmisje nie są ACKowane lub sam wysyła błędnie;
- rośnie REC wielu węzłów równocześnie — wspólna fizyka/EMI/bit timing;
- jeden węzeł ma REC, inne czyste — lokalny transceiver/odgałęzienie;
- counters wracają po poprawnych ramkach — transient, ale trend nadal istotny;
- TEC osiąga próg bus-off — węzeł odłącza transmisję, by nie niszczyć sieci.
Warto logować maksimum i przyrost na minutę, nie tylko stan końcowy. Reset kontrolera zeruje liczniki i może ukryć historię.
Error-active, error-passive i bus-off#
Fault confinement ogranicza wadliwy węzeł:
ERROR_ACTIVE -> ERROR_PASSIVE -> BUS_OFF
Error-passive nadal uczestniczy, ale używa passive error flag i ma ograniczenia. Bus-off przestaje zakłócać sieć. Powrót wymaga warunków określonych przez kontroler/firmware i obserwacji wystarczającej liczby recessive bitów.[1][2]
Automatyczny natychmiastowy restart po bus-off może stworzyć pętlę reset–błąd–reset. Lepsza polityka:
- zapisać przyczynę, TEC/REC i timestamp;
- odczekać kontrolowany czas bus idle;
- wykonać limitowaną liczbę prób;
- po powtórzeniu oznaczyć interfejs failed;
- przełączyć redundancję lub failsafe zależnie od funkcji;
- utrzymać maintenance flag po lądowaniu.
Obciążenie magistrali#
Bus load obejmuje nie tylko payload bytes, ale ID, control, CRC, ACK, intermission, bit stuffing i retransmisje. Przybliżenie liczy liczbę bitów wszystkich ramek w oknie do bitrate.
Wysokie obciążenie powoduje:
- większe opóźnienie niskopriorytetowych transferów;
- kolejki TX/FIFO overflow;
- utratę deadline sensorów;
- dłuższe aktualizacje firmware;
- większy koszt każdej retransmisji;
- zagłodzenie NodeStatus/diagnostyki.
PX4 zaleca osobny interfejs dla DroneCAN ESC, ponieważ ruch sterujący i telemetria mogą nasycać bus i zagłodzić inne węzły.[7] Krytyczne komendy napędu nie powinny dzielić niezaplanowanego bandwidth z dużym streamem danych payloadu.
DroneCAN node ID#
Node ID identyfikuje uczestnika w transferach DroneCAN. Statyczne ID muszą być unikalne. Dwa węzły o tym samym ID mogą generować niepoprawne sekwencje transfer-ID, konflikty usług i pozornie „migające” dane.
Node ID nie jest tożsamy z fizycznym portem ani numerem silnika. ESC mapping ma osobną semantykę. Nie zmienia się ID, by „dopasować kolejność”, jeśli protokół/firmware ma właściwy parametr indeksu aktora.
Inwentaryzacja floty powinna przechowywać:
- node ID;
- unikalny hardware UID/serial;
- vendor/model;
- hardware/firmware version;
- funkcje (GPS, mag, ESC itd.);
- port CAN1/CAN2;
- stan terminacji.
PX4 potrafi logować device information, w tym serial i wersje, co wspiera traceability i diagnostykę.[6]
Dynamic node allocation#
Węzeł z ID 0 może poprosić allocator o przydział na podstawie unikalnego ID. Bootloader DroneCAN często również korzysta z dynamic allocation.[7]
Problemy:
- allocator nie działa/nie ma wymaganej pamięci;
- dwa allocatory lub błędna konfiguracja;
- węzeł nie ma poprawnego unique ID;
- bus load/opóźnienie przerywa sekwencję;
- bootloader dostaje ID, aplikacja startuje inaczej;
- statyczny konflikt po migracji z dynamic.
PX4 w starszych konfiguracjach wymagał sprawnej karty SD dla DNA i aktualizacji; stan należy sprawdzać dla używanej wersji. Nie przenosi się ślepo instrukcji v1.14 na main/stable.
NodeStatus#
DroneCAN uavcan.protocol.NodeStatus niesie uptime, health, mode, submode i vendor-specific status. PX4 mapuje to na DronecanNodeStatus z poziomami OK/WARNING/ERROR/CRITICAL oraz trybami OPERATIONAL, INITIALIZATION, MAINTENANCE, SOFTWARE_UPDATE i OFFLINE.[8]
Diagnostyczne wzorce:
- uptime regularnie wraca do zera → reset/power dip/watchdog;
- health WARNING przy ciągłej komunikacji → błąd funkcjonalny, nie bus;
- node zostaje w INITIALIZATION → brak konfiguracji/sensora;
- MAINTENANCE po locie → tryb kalibracji/bootloader;
- status znika, inne węzły działają → lokalna gałąź/zasilanie;
- wszystkie statusy znikają → wspólny bus/FC.
Vendor-specific code trzeba dekodować z dokumentacji producenta. Nie prezentuje się go jako uniwersalnego błędu DroneCAN.
Subskrypcje i publikacje#
W PX4 podłączenie węzła nie automatycznie włącza wszystkie strumienie. Parametry UAVCAN_SUB_* i UAVCAN_PUB_* kontrolują subskrypcje/publikacje; dokumentacja wskazuje m.in. GPS, MAG, BARO, range, flow, battery, RTCM i arming status.[7]
Objaw „węzeł widać w uavcan status, ale GPS nie działa” może oznaczać:
- subskrypcja GPS wyłączona;
- node publikuje inny typ;
- sensor wewnątrz node nie wystartował;
- data rate zero;
- instance mapping odrzuca źródło;
- estimator nie fuzuje mimo poprawnego topicu.
Kolejność dowodów:
- NodeStatus online;
- transfery odpowiedniego data type na busie;
- topic w autopilocie aktualizuje się;
- sensor health poprawny;
- estimator source/fusion aktywna.
Firmware i bootloader#
DroneCAN wspiera aktualizacje firmware po busie. Bootloader musi rozpoznać bitrate, uzyskać node ID, znaleźć plik i uruchomić zweryfikowaną aplikację.[7]
Problemy:
- node pozostaje w bootloaderze;
- plik dla złego hardware ID;
- update zapętla się po utracie zasilania;
- aplikacja i bootloader mają niezgodne parametry CAN;
- flota ma różne wersje publikujące inne message semantics;
- jednoczesny update zwiększa bus load.
Nie aktualizuje się wszystkich ESC przed lotem bez planu rollback i testu pojedynczej sztuki. Asset tracking pozwala wykryć niespójność wersji.[6]
Redundancja CAN#
Drugi CAN zwiększa odporność tylko wtedy, gdy urządzenia mają dwa niezależne interfejsy/transceivery, wiązki i sensowną logikę failover. PX4 opisuje opcjonalną redundantną sieć na CAN2.[6]
Wspólne przyczyny nadal mogą obejmować:
- jedno zasilanie wszystkich węzłów;
- wspólny MCU aplikacyjny w urządzeniu;
- przewody CAN1/CAN2 w tej samej uszkodzonej wiązce;
- ten sam błąd firmware;
- obie terminacje skonfigurowane niepoprawnie;
- jedna wtyczka łącząca obie domeny.
Test failover fizycznie rozłącza jedną parę i sprawdza ciągłość danych/latency. Sam fakt obecności dwóch portów nie jest dowodem.
Objaw: zero węzłów#
Sprawdź w kolejności:
- czy driver CAN/DroneCAN jest włączony na właściwym porcie;
- zasilanie FC i peryferiów z baterii, nie tylko USB;
- pinout i zamianę H/L;
- rezystancję H–L przy power off;
- idle/common-mode i aktywność oscyloskopem;
- bitrate;
- standby/enable transceivera;
- czy controller nie jest bus-off;
uavcan status/ bus monitor;- jeden znany węzeł na krótkiej wiązce.
Zamiana H/L w high-speed CAN zwykle uniemożliwia komunikację, choć poziomy do masy mogą wyglądać „żywo”. Pomiar różnicowy i dokumentacja pinów rozstrzygają.
Jeśli FC wysyła, ale nie ma drugiego aktywnego węzła, zobaczysz ACK errors i retransmisje. Jeśli nie wysyła nic, problem jest w konfiguracji/driverze/trybie transceivera.
Objaw: jeden węzeł znika#
Porównaj NodeStatus uptime przed zniknięciem. Jeśli po powrocie uptime jest niski, node się zresetował. Jeśli uptime kontynuuje, możliwy jest transient bus, queue lub filtr.
Testy:
- zamiana portów/przewodu z działającym węzłem;
- pomiar rail przy węźle;
- poruszanie złączem pod monitoringiem;
- lokalny terminator off/on zgodnie z pozycją;
- error counters transceivera/controllera;
- temperatura i reset reason;
- firmware version.
Nie zakładaj, że „CAN jest wspólny, więc wszystkie muszą znikać”. Uszkodzony stub może odcinać lokalny węzeł bez pełnego collapse, zwłaszcza przy przerwie, a nie zwarciu.
Objaw: działa na stole, nie działa z napędem#
Równocześnie rejestruj:
- CAN_H/L i różnicę;
- common-mode;
- rail zasilający node/transceiver;
- throttle/RPM/prąd;
- TEC/REC/error frames;
- NodeStatus uptime.
Jeśli uptime resetuje się — zasilanie/watchdog. Jeśli uptime trwa, ale error frames rosną z RPM — EMC/topologia. Jeśli tylko jeden node ma problem — lokalna gałąź/masa. Jeśli wszystkie — trunk/common power.
Zmniejszenie bitrate może chwilowo zwiększyć margines, ale nie jest wystarczającą naprawą dla zwarcia, złej terminacji czy rail dip. Wynik służy jako eksperyment diagnostyczny.
Objaw: rosną błędy bez utraty danych#
To wczesne ostrzeżenie. Retransmisja ukrywa błąd przed aplikacją, ale zwiększa latency i bus load. Ustal:
- typ error frame;
- które ID/transmitter;
- położenie w czasie;
- TEC/REC per controller;
- zależność od temperatury/RPM;
- margines amplitudy i ringing.
Acceptance criteria powinny określać maksymalny error rate w teście, a nie tylko „brak utraty node”. Dla krytycznej sieci nieoczekiwane błędy w nominalnych warunkach wymagają wyjaśnienia.
Objaw: bus-off#
Bus-off jest skutkiem, nie przyczyną. Przed resetem zachowaj:
- last error code/protocol status;
- TEC/REC;
- timestamp i tryb lotu;
- bitrate i controller instance;
- error frame trace;
- rail/min voltage;
- lista online nodes.
Jeżeli natychmiastowy restart wraca bus-off, odłącz transmisję i przejdź do failover/failsafe. W locie nie można bez końca restartować CAN sterującego ESC. Polityka zależy od tego, czy napęd ma redundancję i jak zachowa się po utracie komend.
Po lądowaniu sprawdź 60 Ω, wiązkę i jeden węzeł. Reset logu bez danych pre-fault uniemożliwia RCA.
Objaw: węzeł jest online, danych brak#
NodeStatus dowodzi tylko warstwy zarządzania. Sprawdź:
healthimode;- czy node publikuje oczekiwany data type ID;
- częstotliwość transferów;
- transfer-ID rośnie;
- multi-frame CRC poprawny;
- subskrypcja autopilota;
- instance/device ID;
- sensor status w node;
- estimator fusion.
PX4 nie subskrybuje wszystkich message types domyślnie, by nie obciążać busu.[7] Włączenie subskrypcji może ujawnić parametry/funkcję dopiero po reboot.
Objaw: konflikt node ID#
Możliwe symptomy:
- jedna pozycja w liście z danymi dwóch modeli;
- uptime skacze wstecz bez resetu zasilania;
- service response trafia do złego urządzenia;
- transfer-ID discontinuities;
- aktualizacja firmware niewłaściwego node;
- naprzemienne serial numbers.
Rozwiązanie: odłączać urządzenia pojedynczo, odczytać UID i ustawić unikalne static ID lub wrócić do sprawnego dynamic allocation. PX4 dokumentuje zakres 1–127 i ostrzega przed duplikatami static ID.[7]
Narzędzia#
- schemat i pinout całej sieci;
- multimetr;
- oscyloskop 2–4 kanały/sonda różnicowa;
- aktywny interfejs CAN z możliwością listen-only;
- DroneCAN GUI/bus monitor lub narzędzia autopilota;
- zasilacz z limitem prądu;
- breakout JST-GH;
- terminatory 120 Ω o znanej wartości;
- fixture do przerwy/zwarcia/fault injection;
- logger NodeStatus/device info/error counters.
Interfejs USB-CAN nie może dodawać trzeciej terminacji bez świadomości. Wiele adapterów ma przełączany terminator. Tryb listen-only nie ACKuje; tryb normalny wpływa na sieć i może maskować brak innych odbiorników.
Multimetr#
Przy power off:
- H–L resistance;
- H/GND, L/GND pod kątem zwarć;
- ciągłość trunk i stubów;
- izolacja CAN1/CAN2.
Przy power on:
- rail na każdym końcu;
- idle H/L do masy;
- spadek masy między końcami (ostrożnie i zgodnie z architekturą);
- prąd segmentu.
Nie mierzy się rezystancji na zasilonym busie. Kondensatory/TVS mogą chwilowo zmieniać wskazanie; poczekaj na stabilizację i porównaj z dokumentacją.
Oscyloskop różnicowy#
Najlepiej mierzyć H, L, H–L i rail. Punkty przy obu końcach ujawniają odbicia. Trigger:
- amplituda poniżej progu;
- długi dominant;
- rail dip;
- error flag pattern;
- burst po włączeniu ESC.
Sonda różnicowa musi mieć właściwy common-mode i bandwidth. Dwie sondy pasywne wymagają identycznych ustawień oraz krótkich mas; funkcja odejmowania może wzmacniać błąd niezrównoważonych kanałów.
Ocenia się:
- amplitudę dominant;
- poziom recessive;
- crossing/symetrię;
- ringing do sample point;
- czas propagacji;
- common-mode shift;
- zbocza przy różnych node/transmitter.
Interfejs CAN i sniffer#
Capture powinien zawierać raw CAN ID, DLC, payload, timestamp, error frames i bus load. Następnie dekoder DroneCAN interpretuje transfery.
Tryby:
- listen-only — brak ACK i transmisji, minimalny wpływ;
- normal — ACKuje i może wysyłać usługi;
- loopback — test lokalnego kontrolera, nie wiązki;
- silent loopback — zależny od kontrolera.
Jeżeli jedyny node nadaje i sniffer jest listen-only, zobaczysz retransmisje/ACK error. Dodanie normalnego adaptera „naprawi” ACK, ale nie dowiedzie obecności docelowego odbiornika.
Procedura diagnostyczna#
1. Inwentaryzacja#
Narysuj fizyczny trunk, stuby, terminatory, porty, zasilanie, node ID, wersje firmware i bitrate.
2. Power-off checks#
R_HL, przerwy, H/L swap, CAN1–CAN2 isolation.
3. Minimalna sieć#
FC + jeden znany node + dwa właściwe terminatory + krótka para.
4. Warstwa fizyczna#
Oscyloskop: dominant/recessive, common-mode, ringing, ACK/error frames.
5. Kontroler#
Driver enabled, bitrate, TEC/REC, protocol status, bus-off state.
6. CAN trace#
Czy są poprawne ramki, jakie ID, bus load i retransmisje.
7. DroneCAN#
NodeStatus, node ID, uptime, health, mode, data types, transfer rates.
8. Autopilot#
Subskrypcje, topics, sensor health, estimator/actuator mapping.
9. Skalowanie#
Dodawaj węzły i docelowy ruch. Mierz load i latency.
10. Środowisko#
Napęd, wibracje, temperatura, RF i movement wiązki.
11. Fault injection#
Przerwa, node reset, odłączenie CAN1, bus-off w symulatorze/fixture — zgodnie z safety plan.
Recovery#
Recovery CAN jest inny niż I²C. Nie generuje się „dziewięciu zegarów”. Controller wykonuje procedurę wyjścia bus-off po spełnieniu warunków idle, ponownie inicjalizuje filtry/FIFO i weryfikuje NodeStatus.
Maszyna stanów:
ACTIVE
-> ERROR_WARNING
-> ERROR_PASSIVE
-> BUS_OFF
-> WAIT_IDLE
-> REINIT_ATTEMPT_n
-> ACTIVE or FAILED
Każde przejście loguje counters. Po powrocie:
- nie uznawaj danych za healthy po jednej ramce;
- wymagaj stabilnego NodeStatus i streamu przez czas;
- sprawdź uptime, wersję i mapping;
- wykonaj bumpless source/actuator reintegration;
- utrzymaj maintenance alert.
Testy fault injection#
Bezpieczne stanowisko/HIL:
- odłączenie jednego node;
- reset/power-cycle node;
- przerwa CAN_H lub CAN_L;
- usunięcie terminatora;
- dodatkowy terminator;
- konflikt static node ID;
- flood niskopriorytetowych ramek;
- flood wysokopriorytetowych ramek;
- zły bitrate jednego node;
- bus-off controllera przez kontrolowany fixture;
- utrata CAN1 przy redundant CAN2;
- update firmware przerwany zasilaniem na development node.
Nie zwiera się losowo aktywnej magistrali latającego statku. Fixture ma ograniczenie prądu i odseparowane aktory. Celem jest sprawdzenie logiki, nie narażenie ludzi.
Kryteria:
- czas detekcji;
- poprawny failsafe/failover;
- brak blokady scheduler;
- bounded recovery;
- identyfikowalny log;
- brak automatycznego ponownego uzbrojenia aktora;
- powtarzalność po N cyklach.
Logowanie i maintenance#
Per interface:
- TEC/REC/current error state;
- bus-off count;
- last error code;
- RX/TX/error frame counts;
- FIFO overflow;
- bus load/max latency;
- recovery count/result;
- bitrate i interface ID.
Per node:
- node ID i unique hardware ID;
- uptime, health, mode, vendor code;
- last-seen age;
- firmware/hardware version;
- expected vs actual publications;
- reset count;
- sensor/ESC-specific fault codes.
Fleet maintenance porównuje wersje i trendy. Jeden node z rosnącym REC może mieć pogarszający się transceiver/złącze, zanim zacznie znikać. PX4 device information może utrwalać serial/wersje w logach.[6]
Typowe błędy#
- Terminator przy każdym urządzeniu. Efektywna rezystancja jest za niska.
- Jeden terminator, bo „bus jest krótki”. Margines zależy od topologii i bitrate.
- Gwiazda z długich stubów. Odbicia trafiają w sample point.
- Pomiar tylko multimetrem. Nie pokazuje różnicowego przebiegu i error frames.
- Listen-only sniffer jako jedyny drugi node. Nie daje ACK.
- NodeStatus = poprawne dane. To tylko health/mode warstwy node.
- Węzeł online, subskrypcja wyłączona. Autopilot nie tworzy funkcji automatycznie.[7]
- Dwa static node ID takie same. Transfery i usługi konfliktują.
- ESC i wszystkie sensory na nasyconym busie. Krytyczne ramki mają latency.
- Natychmiastowy reset po bus-off bez limitu. Powstaje pętla awarii.
- CAN1 i CAN2 w jednej wspólnej parze. Redundancja jest pozorna.
- Zasilanie node tylko z USB FC. Peryferia mogą nie mieć rail podczas testu.
- Zamiana H/L. Aktywność napięciowa nie oznacza dekodowalnej ramki.
- Firmware update całej floty bez inventory/rollback. Utrata zgodności funkcji.
- Brak logowania TEC/REC. Retransmisje ukrywają rozwijającą się usterkę.
Powiązane tematy#
- CAN i CAN FD w UAV
- DroneCAN, UAVCAN v0 i Cyphal
- Diagnostyka I²C
- Redundancja sensorów FC
- Przewody i złącza UAV
- EMC/EMI flight controllera
- Architektura zasilania FC
- Diagnostyka logów i wibracji
Przypisy#
- Bosch, „CAN Specification Version 2.0” — ramki, arbitraż, ACK, wykrywanie błędów i fault confinement.
- Bosch, „M_CAN Controller Area Network User’s Manual” — liczniki błędów, protocol status, error-passive i bus-off kontrolera.
- DroneCAN, „Specification” — model node, wiadomości i usługi.
- DroneCAN, „CAN bus transport layer” — 29-bit ID, transfer-ID, ramki wieloczęściowe i CRC.
- DroneCAN, „Hardware design recommendations” — transceivery, topologia, terminacja i okablowanie.
- PX4, „CAN (DroneCAN & Cyphal)” — bieżąca architektura portów, daisy-chain, dwa terminatory i redundancja; sprawdzono 16 sierpnia 2026 r.
- PX4, „DroneCAN” — subskrypcje/publikacje, konfiguracja urządzeń, oddzielny bus ESC i firmware node; sprawdzono 16 sierpnia 2026 r.
- PX4,
DronecanNodeStatus— pola uptime, health, mode, submode i vendor-specific status.
Źródła z centralnego rejestru
- Bosch: CAN Specification Version 2.0 [specyfikacja protokołu]
- Bosch M_CAN Controller Area Network User’s Manual [dokumentacja kontrolera CAN/CAN FD]
- DroneCAN Specification [specyfikacja protokołu]
- DroneCAN: CAN bus transport layer [specyfikacja transportu]
- DroneCAN: Hardware design recommendations [zalecenia sprzętowe protokołu]
- PX4 Guide: CAN (DroneCAN & Cyphal) [dokumentacja projektu open source]
- PX4 Guide: DroneCAN configuration and subscriptions [dokumentacja projektu open source]
- PX4 uORB: DronecanNodeStatus message [dokumentacja modelu danych projektu]