Obsah:

Arduino UNO Logic Sniffer: 8 kroků (s obrázky)
Arduino UNO Logic Sniffer: 8 kroků (s obrázky)

Video: Arduino UNO Logic Sniffer: 8 kroků (s obrázky)

Video: Arduino UNO Logic Sniffer: 8 kroků (s obrázky)
Video: Декодер протоколов | Часть первая I2C сниффер 2024, Listopad
Anonim
Logický sniper Arduino UNO
Logický sniper Arduino UNO

Tento projekt začal jako jednoduchý experiment. Během svého výzkumu nad datovým listem ATMEGA328P pro jiný projekt jsem našel něco docela zajímavého. Jednotka zachycení vstupu Timer1. Umožňuje mikrokontroléru našeho Arduino UNO detekovat hranu signálu, uložit časové razítko a spustit přerušení, vše v hardwaru.

Pak mě napadlo, ve které aplikaci by to mohlo být užitečné a jak to otestovat. Protože již nějakou dobu chci získat logický analyzátor, rozhodl jsem se zkusit jej implementovat do své desky Arduino UNO, abych tuto funkci otestoval a zjistil, zda z ní můžeme získat dobré výsledky.

Nejsem jediný, kdo měl tento nápad, a najdete jich spoustu, když si jen vygooglíte „Arduino Logic Analyzer“. Na začátku projektu, který právě začínal jako experiment, jsem si ani neuvědomoval, že už ho lidé zvládli, a byl ohromen dobrými výsledky, kterých s tímto malým kusem hardwaru dosáhli. Nemohl jsem však najít jiný projekt pomocí vstupní zachytávací jednotky, takže pokud jste to již viděli, dejte mi vědět!

Abych to shrnul, můj logický analyzátor:

  • Mít jeden kanál,
  • Mít grafické rozhraní,
  • Komunikace s rozhraním přes USB,
  • Spusťte na desce Arduino UNO.

Konečně bude mít hloubku paměti 800 vzorků a byl schopen úspěšně zachytit zprávu UART o 115200 baudech (ve vyšších rychlostech jsem to opravdu netestoval).

Tento návod obsahuje jak části „jak to funguje“, tak „jak to používat“tohoto projektu, takže pro ty, které nezajímá technická stránka, můžete přímo přejít ke kroku 4.

Zásoby

Chtěl jsem, aby byl analyzátor co nejjednodušší, aby vyžadoval velmi málo hardwaru.

Budete potřebovat:

  • Deska Arduino UNO (nebo ekvivalent, pokud závisí na MCU ATMEGA328P),
  • Počítač,
  • Něco k ladění (jiná deska Arduino UNO funguje dobře, když děláte nějaké testy).

Zde najdete kód pro Arduino UNO i webové rozhraní. Budete také potřebovat software p5.serialcontrol a PulseView.

Krok 1: Pracovní princip

Pracovní princip
Pracovní princip

Myšlenka je jednoduchá. Vyberete nastavení snímání a kliknete na „získat“. Webové rozhraní je odešle do softwaru p5.serialcontrol, který nám umožňuje používat sériové rozhraní z prohlížeče, protože k němu nemá přímý přístup. Software p5.serialcontrol poté předá informace na desku Arduino UNO, která data zachytí a stejnou cestou je odešle zpět do rozhraní.

Snadný! No … Protože nejsem opravdu dobrý v programování rozhraní člověk/stroj nebo ve webových technologiích, moje je určitě trochu ošklivá a buggy. Ale umožňuje mi to zahájit sběr a získat zpět data, k čemuž byla navržena, takže si myslím, že je to v pořádku. Pro serióznější analytické práce importuji své záznamy do PulseView, který se snadno používá a nabízí dobrou sadu funkcí a dekodérů protokolu, jak uvidíme později.

Vstupní zachycovací jednotku Arduino UNO lze nakonfigurovat tak, aby používala různé dělení hodin, čímž se sníží rozlišení, ale zvýší se zpoždění před přetečením. Může také spustit spouštění při stoupání, klesání nebo na obou hranách a zahájit zaznamenávání dat.

Krok 2: Arduino UNO Sketch

Skica Arduino UNO
Skica Arduino UNO

Skicu jsem napsal a sestavil pomocí Arduino IDE. Nejprve jsem začal nastavením časovače 1 v provozním režimu "Normální" zápisem do jeho registrů TCCR1A a TCCR1B v nastavení (). Potom jsem vytvořil některé funkce, abych trochu usnadnil jeho použití v budoucnosti, jako je ta, která nastavuje rozdělení hodin s názvem „setTim1PSC ()“. Také jsem napsal funkce pro aktivaci a deaktivaci jednotky pro zachycení vstupu Timer1 a přetečení.

Přidal jsem pole „sample“, které bude uchovávat získaná data. Jedná se o globální pole, které jsem nastavil na „volatile“, aby kompilátor nemohl provádět optimalizace a dávat jej do formátu flash, jak to dělal během mých prvních kompilací. Definoval jsem to jako pole „uint16_t“, protože Timer1 je také 16bitový, s délkou 810. Zastavujeme snímání na 800 hodnotách, ale jelikož se test provádí mimo přerušení ze zřejmých důvodů rychlosti, rozhodl jsem se ponechat 10 více hodnot, aby se zabránilo přetečení. S několika dalšími proměnnými pro zbytek kódu skica využívá 1313 bajtů (88%) paměti, takže nám zbývá 235 bajtů volné paměti RAM. Už jsme ve vysokém využití paměti a nechtěl jsem přidat další ukázkovou kapacitu, protože by to mohlo způsobit divné chování kvůli příliš malému místu v paměti.

Ve své snaze vždy zvýšit rychlost provádění jsem použil příkazy funkcí namísto příkazů if uvnitř přerušení, abych zkrátil dobu jejich provádění na minimum. Zachycovacím pinem bude vždy Arduino UNO číslo 8, protože je jediným připojeným k vstupní zachytávací jednotce Timer1.

Proces zachycení je zobrazen na obrázku výše. Spustí se, když Arduino UNO obdrží platný datový rámec UART obsahující požadované nastavení snímání. Potom tato nastavení zpracujeme konfigurací správných registrů pro zachycení na zvolené hraně a použijeme správné rozdělení hodin. Poté povolíme přerušení PCINT0 (změna pinů), abychom detekovali první hranu signálu. Když to dostaneme, resetujeme hodnotu Timer1, deaktivujeme přerušení PCINT0 a povolíme přerušení ICU (Input Capture Unit). Od tohoto okamžiku jakákoli sestupná/stoupající hrana signálu (v závislosti na zvolené konfiguraci) spustí jednotku pro zachycení vstupu, čímž uloží časové razítko této události do registru ICR1 a provede přerušení. V tomto přerušení vložíme hodnotu registru ICR1 do našeho pole „sample“a zvýšíme index pro další zachycení. Když časovač 1 nebo pole přeteče, deaktivujeme přerušení snímání a odešleme data zpět do webového rozhraní prostřednictvím UART.

Rozhodl jsem se použít přerušení změny pinů ke spuštění zachycení, protože vstupní zachytávací jednotka umožňuje zachytit pouze na jednom nebo druhém okraji, ne na obou. To také způsobuje problém, když chcete zachytit obě hrany. Mým řešením pak bylo invertovat bit, který řídí výběr hran ve vstupním ovládacím registru zachycení při každém načteném vzorku. Tímto způsobem ztrácíme rychlost provádění, ale stále můžeme používat funkce vstupní zachytávací jednotky.

Jak jste si tedy mohli všimnout, opravdu nezachytáváme každý vzorek v pevných časových intervalech, ale zachycujeme okamžik, kdy dochází k přechodu signálu. Pokud bychom zachytili jeden vzorek v každém hodinovém cyklu, dokonce s nejvyšším dělením hodin, naplnili bychom vyrovnávací paměť přibližně za 0,1 s za předpokladu, že používáme typ uint8_t, který je nejmenším v paměti bez použití struktů.

Krok 3: Webové rozhraní a P5.js

Webové rozhraní a P5.js
Webové rozhraní a P5.js

Jak naznačuje název, webové rozhraní bylo vytvořeno pomocí p5.js. Pro ty, kteří to ještě nevědí, vřele doporučuji, abyste si web navštívili, protože je to opravdu dobrá knihovna. Je založen na zpracování, snadno se používá, umožňuje velmi rychle dosáhnout dobrých výsledků a je dobře zdokumentován. Ze všech těchto důvodů jsem si vybral tuto knihovnu. Pro nabídky jsem také použil knihovnu quicksettings.js, grafiku.js pro vykreslení mých dat a knihovnu p5.serialport pro komunikaci s Arduino UNO.

Nebudu trávit příliš mnoho času nad rozhraním, protože jsem ho právě navrhl pro náhled dat a ovládání nastavení, a také proto, že vůbec nebyl předmětem mého experimentu. V následujících částech však vysvětlím různé kroky k použití celého systému, a vysvětlím tak různé dostupné ovládací prvky.

Krok 4: Nastavení systému

První věcí je stáhnout si Arduino UNO a kód rozhraní zde, pokud to již není provedeno. Poté můžete desku Arduino UNO přeprogramovat pomocí skici „UNO_LS.ino“prostřednictvím Arduino IDE.

Měli jste si stáhnout software p5.serialcontrol z jeho úložiště github. Musíte získat soubor zip odpovídající vašemu operačnímu systému (testoval jsem ho pouze na Windows). Rozbalte zip ve složce, spusťte v něm nalezený spustitelný soubor a nechte jej tak. Nepokoušejte se připojit k žádnému sériovému portu, ponechte jej spuštěný na pozadí, bude použit jako relé.

Otevřete složku „Rozhraní“. Měli byste najít soubor s názvem "index.html". Otevřete jej ve svém prohlížeči, jedná se o webové rozhraní.

A to je vše! Nemusíte stahovat další knihovny, vše by mělo být součástí balíčku, který jsem poskytl.

Krok 5: Připojení, konfigurace a akvizice

Připojení, konfigurace a akvizice
Připojení, konfigurace a akvizice

Chcete -li připojit rozhraní k desce Arduino UNO, stačí vybrat odpovídající port v seznamu a kliknout na tlačítko „Otevřít“. Pokud byla operace úspěšná, měla by zpráva „stav“zobrazit něco jako „COMX otevřen“.

Nyní si můžete vybrat možnosti zachycení. První je výběr hran. Doporučuji vám vždy používat „Oba“, protože vám to poskytne nejlepší reprezentaci skutečného signálu. Pokud se nastavení „Oba“nepodaří zachytit signál (pokud je například frekvence signálu příliš vysoká), můžete to zkusit buď s nastavením „stoupající“nebo „klesající“hrany, v závislosti na signálu, který se snažíte vidět.

Druhým nastavením je rozdělení hodin. Poskytne vám rozlišení, při kterém budete schopni zachytit signál. Faktor dělení můžete nastavit buď na „8“, „64“, „256“a „1024“. Deska Arduino UNO používá k taktování mikrokontroléru 16MHz křemen, takže vzorkovací frekvence bude „16MHz/dělící faktor“. S tímto nastavením buďte opatrní, protože to také určuje, jak dlouho budete schopni zachytit signál. Protože Timer1 je 16bitový časovač, doba zachycení povolená před přetečením bude „(2^16)*(faktor dělení)/16 MHz“. V závislosti na zvoleném nastavení se bude pohybovat mezi ~ 33 ms a 4,2 s. Svou volbu si pamatujte, budete ji potřebovat později.

Posledním nastavením je potlačení hluku. Neprováděl jsem na něm mnoho testů a v 99% případů jej nebudete potřebovat, takže jej nechte nezaškrtnutý. Pro ty, kteří jsou na to stále zvědaví, můžete hledat redukci šumu v sekci Timer/Counter1 v datovém listu ATMEGA328P.

Nezapomeňte připojit pin 8 desky Arduino UNO k vašemu signálu a propojit uzemnění, aby měla stejnou referenci napětí pro testovací obvod i logický analyzátor. Pokud potřebujete izolaci země nebo potřebujete měřit signály s úrovněmi odlišnými od 5V, budete pravděpodobně muset do svého obvodu přidat optoizolátor.

Jakmile je vše správně nakonfigurováno, můžete stisknout tlačítko „Získat“.

Krok 6: Zachycení výsledků a export dat CSV

Zachyťte výsledky a exportujte data CSV
Zachyťte výsledky a exportujte data CSV

Jakmile váš Arduino UNO dokončí snímání, automaticky odešle data zpět do webového rozhraní, které je vykreslí. Pravým posuvníkem můžete přiblížit nebo oddálit a dolním procházet vzorky.

Děj vám poskytuje pouze náhled a nemá žádné nástroje pro analýzu dat. Chcete -li tedy provést další analýzu svých dat, budete je muset importovat do PulseView.

Prvním krokem je export souboru CSV obsahující všechna vaše data. Chcete -li to provést, stačí kliknout na tlačítko „Exportovat“z webového rozhraní. Po výzvě uložte soubor na známé místo.

Nyní otevřete PulseView. Na horním panelu nabídek klikněte na „Otevřít“(ikona složky) a vyberte „Importovat hodnoty oddělené čárkami…“. Vyberte dříve vygenerovaný soubor CSV obsahující vaše data.

Zobrazí se malé okno. Nechte vše tak, jak je, stačí upravit nastavení „Samplerate“podle faktoru rozdělení hodin zvoleného pro zachycení. Vaše vzorkovací frekvence bude „16 MHz/(faktor dělení)“. Poté klikněte na „Ok“, váš signál by se měl objevit na obrazovce.

Krok 7: Analýza signálu PulseView

Analýza signálu PulseView
Analýza signálu PulseView

PulseView je vybaven mnoha dekodéry protokolů. Chcete -li se k nim dostat, klikněte na „Přidat dekodér protokolu“v horním panelu nabídek (nástroj nejvíce vpravo). Pro svůj experiment jsem právě odeslal jednoduchou zprávu UART na 9600 baudů, takže jsem hledal „UART“.

Přidá kanál se značkou vlevo (stejně jako ten pro vaše data). Kliknutím na značku můžete změnit nastavení dekodéru. Po výběru těch správných se mi podařilo načíst stejnou zprávu, jakou poslala moje testovací zařízení. To ukazuje, že celý systém funguje podle očekávání.

Krok 8: Závěr

Závěr
Závěr

I když byl projekt na začátku experimentem, jsem spokojený s výsledky, kterých jsem dosáhl. Byl jsem schopen bez problémů vzorkovat signály UART až na 115200 baudů v režimu „Both“na hraně a dokonce jsem dokázal dosáhnout až 230400 baudů v režimu „Falling edge. Moje nastavení testu můžete vidět na obrázku výše.

Moje implementace má několik nevýhod, počínaje skutečností, že může zachytit pouze jeden signál najednou, protože pouze pin 8 Arduino UNO je „schopný zachytit vstup“. Pokud hledáte logický analyzátor Arduino s více kanály, podívejte se na jeden Catoblepas.

Nemůžete očekávat, že Arduino UNO bude schopné zachytit signály s vysokými frekvencemi (některé MHz), protože je taktováno pouze na 16MHz (kdyby to někdo udělal, zajímalo by mě, jak to funguje). Stále mě však ohromují výsledky, které můžeme z tohoto mikrokontroléru ATMEGA328P získat.

Nemyslím si, že bych na kódu udělal hodně práce. Prováděl jsem své experimenty a dostal jsem výsledky, které jsem hledal. Pokud však někdo chce přispět, můžete upravit nebo znovu distribuovat celý můj kód nebo jeho část.

To byl můj první Instructable a myslím, že dlouhý. Doufám, že to pro vás bylo zajímavé čtení.

Dejte mi vědět, pokud najdete chyby, nebo pokud máte nějaké dotazy!

Doporučuje: