Obsah:

Logický sniper Arduino UNO: 8 krokov (s obrázkami)
Logický sniper Arduino UNO: 8 krokov (s obrázkami)

Video: Logický sniper Arduino UNO: 8 krokov (s obrázkami)

Video: Logický sniper Arduino UNO: 8 krokov (s obrázkami)
Video: 💡 📦 Arduino стрим - что нового из Китая? - EP1 2024, November
Anonim
Logický sniper Arduino UNO
Logický sniper Arduino UNO

Tento projekt sa začal ako jednoduchý experiment. Počas môjho výskumu v technickom liste ATMEGA328P pre iný projekt som zistil niečo celkom zaujímavé. Jednotka zachytávania vstupu Timer1. Umožňuje mikrokontroléru nášho Arduino UNO detekovať hranu signálu, uložiť časovú pečiatku a spustiť prerušenie, všetko v hardvéri.

Potom ma napadlo, v ktorej aplikácii by to mohlo byť užitočné a ako to otestovať. Keďže chcem už nejaký čas získať logický analyzátor, rozhodol som sa skúsiť ho implementovať do svojej dosky Arduino UNO, len aby som otestoval túto funkciu a zistil, či z nej dokážeme získať dobré výsledky.

Nie som jediný, kto mal tento nápad, a nájdete ich veľa, keď si vygooglite „Arduino Logic Analyzer“. Na začiatku projektu, keď sa to len začalo ako experiment, som si ani neuvedomoval, že ľudia to už urobili, a bol som ohromený dobrými výsledkami, ktoré dosiahli s týmto malým kúskom hardvéru. Nenašiel som však iný projekt pomocou vstupnej zachytávacej jednotky, takže ak ste to už videli, dajte mi vedieť!

Aby som to zhrnul, môj logický analyzátor bude:

  • Mať jeden kanál,
  • Majú grafické rozhranie,
  • Komunikujte s rozhraním cez USB,
  • Beží na doske Arduino UNO.

Konečne bude mať hĺbku pamäte 800 vzoriek a bol schopný úspešne zachytiť správu UART s 115 200 baudmi (vo vyšších rýchlostiach som to naozaj netestoval).

Tento návod obsahuje časti „ako to funguje“a „ako to používať“tohto projektu, takže pre tých, ktorých nezaujíma technická stránka, môžete priamo prejsť na krok 4.

Zásoby

Chcel som, aby bol analyzátor čo najjednoduchší, aby vyžadoval veľmi málo hardvéru.

Budete potrebovať:

  • Doska Arduino UNO (alebo ekvivalent, pokiaľ sa spolieha na MCU ATMEGA328P),
  • Počítač,
  • Niečo na ladenie (iná doska Arduino UNO funguje dobre na vykonanie niektorých testovaní).

Tu nájdete kód pre Arduino UNO a webové rozhranie. Budete tiež potrebovať softvér p5.serialcontrol a PulseView.

Krok 1: Princíp práce

Pracovný princíp
Pracovný princíp

Myšlienka je jednoduchá. Vyberiete nastavenia snímania a kliknete na „získať“. Webové rozhranie ich odošle do softvéru p5.serialcontrol, ktorý nám umožňuje používať sériové rozhranie z prehliadača, pretože k nemu nemá priamy prístup. Softvér p5.serialcontrol potom informácie odovzdá doske Arduino UNO, ktorá údaje zachytí a rovnakou cestou ich pošle späť do rozhrania.

Ľahko! No … Pretože nie som dobrý v programovaní rozhrania človek/stroj alebo vo webových technológiách, moja je určite trochu škaredá a chybná. Umožňuje mi to však začať zachytávanie a získavať údaje späť, na čo bolo navrhnuté, takže si myslím, že je to v poriadku. Pre serióznejšie analytické práce importujem svoje záznamy do programu PulseView, ktorý sa ľahko používa a ponúka dobrú sadu funkcií a dekodérov protokolov, ako uvidíme neskôr.

Vstupnú zachytávaciu jednotku Arduino UNO je možné nakonfigurovať tak, aby používala rôzne delenie hodín, čím sa zníži rozlíšenie, ale zvýši sa oneskorenie pred pretečením. Údaje sa môžu spustiť aj pri stúpaní, klesaní alebo na oboch hranách.

Krok 2: Skica Arduino UNO

Skica Arduino UNO
Skica Arduino UNO

Skicu som napísal a zostavil pomocou Arduino IDE. Najprv som začal nastavením časovača 1 v prevádzkovom režime „Normálne“zápisom do jeho registrov TCCR1A a TCCR1B v nastavení (). Potom som urobil niekoľko funkcií, ktoré v budúcnosti trochu uľahčia jeho používanie, napríklad funkciu na nastavenie delenia hodín s názvom „setTim1PSC ()“. Tiež som napísal funkcie na aktiváciu a deaktiváciu jednotky zachytávania vstupu Timer1 a prerušenia pretečenia.

Pridal som pole „vzorky“, ktoré bude uchovávať získané údaje. Je to globálne pole, ktoré som nastavil na „volatile“, aby som kompilátoru znemožnil optimalizáciu a vložil ho do formátu flash, ako to robil počas mojich prvých kompilácií. Definoval som to ako pole „uint16_t“, pretože Timer1 je tiež 16bitový, s dĺžkou 810. Zastavujeme snímanie na 800 hodnotách, ale keďže sa test robí mimo prerušenia zo zrejmých dôvodov rýchlosti, rozhodol som sa ponechať 10 viac hodnôt, aby sa zabránilo pretečeniu. S niekoľkými ďalšími premennými pre zvyšok kódu skica používa 1313 bajtov (88%) pamäte, takže nám zostáva 235 bajtov voľnej pamäte RAM. Už sme veľmi vyťažení pamäťou a nechcel som pridať väčšiu kapacitu vzorky, pretože by to mohlo spôsobiť podivné správanie kvôli príliš malému priestoru v pamäti.

V snahe vždy zvýšiť rýchlosť vykonávania som namiesto príkazov if vo vnútri prerušení používal ukazovatele funkcií, aby som skrátil čas ich vykonania na minimum. Zachycovacím kolíkom bude vždy Arduino UNO číslo 8, pretože je jediný, ktorý je pripojený k vstupnej zachytávacej jednotke Timer1.

Proces snímania je zobrazený na obrázku vyššie. Začína sa, keď Arduino UNO dostane platný dátový rámec UART obsahujúci požadované nastavenia snímania. Tieto nastavenia potom spracujeme konfiguráciou správnych registrov na zachytenie na zvolenom okraji a použijeme správne rozdelenie hodín. Potom povolíme prerušenie PCINT0 (zmena kolíka), aby zistil prvú hranu signálu. Keď ho dostaneme, vynulujeme hodnotu Timer1, deaktivujeme prerušenie PCINT0 a povolíme prerušenie ICU (Input Capture Unit). Od toho momentu akákoľvek klesajúca/stúpajúca hrana signálu (v závislosti od zvolenej konfigurácie) spustí jednotku zachytávania vstupu, čím uloží časovú pečiatku tejto udalosti do registra ICR1 a vykoná prerušenie. V tomto prerušení vložíme hodnotu registra ICR1 do nášho poľa „vzorky“a zvýšime index pre ďalšie zachytenie. Keď pretečie časovač1 alebo pole, deaktivujeme prerušenie zachytávania a odošleme údaje späť do webového rozhrania prostredníctvom systému UART.

Rozhodol som sa použiť prerušenie zmeny pinov na spustenie snímania, pretože vstupná zachytávacia jednotka umožňuje zachytávať iba na jednom alebo druhom okraji, nie na oboch. Tiež to spôsobuje problém, keď chcete zachytiť obe hrany. Mojim riešením potom bolo invertovať bit, ktorý riadi výber okraja v registri riadenia zachytávania vstupu pri každej načítanej vzorke. Tým stratíme rýchlosť vykonávania, ale stále môžeme používať funkcie vstupnej zachytávacej jednotky.

Ako ste si teda mohli všimnúť, skutočne nezachytávame každú vzorku v pevných časových intervaloch, ale zachytávame okamih, kedy dôjde k prechodu signálu. Ak by sme zachytili jednu vzorku v každom hodinovom cykle, dokonca aj s najvyšším hodinovým delením, vyrovnávaciu pamäť by sme naplnili približne za 0,1 s za predpokladu, že používame typ uint8_t, ktorý je najmenším v pamäti bez použitia štruktúr.

Krok 3: Webové rozhranie a P5.js

Webové rozhranie a P5.js
Webové rozhranie a P5.js

Ako naznačuje názov, webové rozhranie bolo vytvorené pomocou súboru p5.js. Tí, ktorí to ešte nevedia, vrelo odporúčam navštíviť webovú stránku, pretože je to skutočne dobrá knižnica. Je založený na spracovaní, ľahko sa používa, umožňuje veľmi rýchlo dosiahnuť dobré výsledky a je dobre zdokumentovaný. Preto som si vybral túto knižnicu zo všetkých týchto dôvodov. Tiež som použil knižnicu quicksettings.js pre ponuky, grafica.js na vykreslenie svojich údajov a knižnicu p5.serialport na komunikáciu s Arduino UNO.

Nebudem tráviť príliš veľa času nad rozhraním, pretože som ho len navrhol na náhľad údajov a kontrolu nastavení, a tiež preto, že vôbec nebol predmetom môjho experimentu. V nasledujúcich častiach však vysvetlím rôzne kroky pri používaní celého systému, a tým vysvetlím rôzne dostupné ovládacie prvky.

Krok 4: Nastavenie systému

Prvá vec je stiahnuť kód Arduino UNO a kód rozhrania tu, ak to ešte nie je urobené. Potom môžete svoju dosku Arduino UNO preprogramovať pomocou náčrtu „UNO_LS.ino“prostredníctvom Arduino IDE.

Mali ste si stiahnuť softvér p5.serialcontrol z jeho úložiska github. Musíte získať súbor zip zodpovedajúci vášmu operačnému systému (testoval som ho iba na systéme Windows). Rozbaľte zip do priečinka, spustite v ňom nájdený spustiteľný súbor a nechajte ho tak. Nepokúšajte sa pripojiť k žiadnemu sériovému portu, nechajte ho bežať na pozadí, bude slúžiť ako relé.

Otvorte priečinok „Rozhranie“. Mali by ste nájsť súbor s názvom „index.html“. Otvorte ho vo svojom prehliadači, jedná sa o webové rozhranie.

A je to! Nie je potrebné sťahovať ďalšie knižnice, všetko by malo byť súčasťou balíka, ktorý som poskytol.

Krok 5: Pripojenie, konfigurácia a akvizícia

Pripojenie, konfigurácia a akvizícia
Pripojenie, konfigurácia a akvizícia

Ak chcete pripojiť rozhranie k doske Arduino UNO, stačí vybrať príslušný port v zozname a kliknúť na tlačidlo „Otvoriť“. Ak bola operácia úspešná, správa „stav“by mala zobrazovať niečo ako „COMX otvorený“.

Teraz si môžete vybrať možnosti snímania. Prvým je výber okraja. Odporúčam vám vždy používať funkciu „Both“, pretože vám poskytne najlepšiu reprezentáciu skutočného signálu. Ak sa nastavenie „Oba“nepodarí zachytiť signál (ak je napríklad frekvencia signálu príliš vysoká), môžete to skúsiť buď s nastavením „stúpajúceho“alebo „klesajúceho“okraja v závislosti od signálu, ktorý sa pokúšate vidieť.

Druhým nastavením je rozdelenie hodín. Poskytne vám rozlíšenie, v ktorom budete môcť zachytiť signál. Faktor rozdelenia môžete nastaviť buď na „8“, „64“, „256“a „1024“. Doska Arduino UNO používa na taktovanie mikrokontroléra kremeň 16 MHz, takže vzorkovacia frekvencia bude „16 MHz/deliaci faktor“. S týmto nastavením buďte opatrní, pretože to tiež určí, ako dlho budete schopní zachytiť signál. Pretože Timer1 je 16 -bitový časovač, povolený čas zachytenia pred pretečením bude „(2^16)*(faktor delenia)/16 MHz“. V závislosti od zvoleného nastavenia sa bude pohybovať v rozsahu ~ 33 ms až 4,2 s. Svoj výber si zapamätajte, budete ho potrebovať neskôr.

Posledným nastavením je tlmič hluku. Nevykonal som na ňom veľa testovaní a v 99% prípadov ho nebudete potrebovať, takže ho nechajte nezaškrtnutý. Tí, ktorí sú na to ešte zvedaví, môžu vyhľadať spomalenie hluku v sekcii Timer/Counter1 v dátovom liste ATMEGA328P.

Nezabudnite pripojiť pin 8 dosky Arduino UNO k svojmu signálu a prepojiť uzemnenie, aby mala rovnakú referenciu napätia pre testovací obvod aj logický analyzátor. Ak potrebujete izoláciu zeme alebo potrebujete merať signály s úrovňou odlišnou od 5 V, pravdepodobne budete musieť do svojho obvodu pridať optoizolátor.

Keď je všetko správne nakonfigurované, môžete stlačiť tlačidlo „Získať“.

Krok 6: Zachytenie výsledkov a export údajov CSV

Zachytávanie výsledkov a export údajov CSV
Zachytávanie výsledkov a export údajov CSV

Akonáhle váš Arduino UNO dokončí zachytávanie, automaticky pošle údaje späť do webového rozhrania, ktoré ich vykreslí. Pravým posúvačom môžete približovať alebo odďaľovať snímky a spodným cestovať po vzore.

Zápletka ponúka iba ukážku a neobsahuje žiadne nástroje na analýzu údajov. Aby ste mohli vykonať ďalšiu analýzu svojich údajov, budete ich musieť importovať do programu PulseView.

Prvým krokom je export súboru CSV obsahujúceho všetky vaše údaje. Ak to chcete urobiť, stačí kliknúť na tlačidlo "Exportovať" z webového rozhrania. Po výzve uložte súbor na známe miesto.

Teraz otvorte PulseView. Na hornom paneli s ponukami kliknite na „Otvoriť“(ikona priečinka) a vyberte „Importovať hodnoty oddelené čiarkami …“. Vyberte predtým vygenerovaný súbor CSV obsahujúci vaše údaje.

Zobrazí sa malé okno. Nechajte všetko tak, stačí zmeniť nastavenie „Samplerate“podľa faktora rozdelenia hodín zvoleného pre snímanie. Vaša vzorkovacia frekvencia bude „16 MHz/(faktor rozdelenia)“. Potom kliknite na „Ok“, váš signál by sa mal objaviť na obrazovke.

Krok 7: Analýza signálu PulseView

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

PulseView obsahuje množstvo dekodérov protokolov. Ak sa k nim chcete dostať, kliknite na „Pridať dekodér protokolu“v hornom paneli s ponukami (nástroj najviac vpravo). Pre môj experiment som odoslal jednoduchú správu UART na 9600 baudov, a tak som hľadal „UART“.

Pridá kanál so značkou naľavo (rovnako ako ten pre vaše údaje). Kliknutím na značku môžete zmeniť nastavenia dekodéra. Po výbere tých správnych sa mi podarilo načítať rovnakú správu, akú mi odoslalo moje testovacie zariadenie. To ukazuje, že celý systém funguje podľa očakávania.

Krok 8: Záver

Záver
Záver

Aj keď bol projekt na začiatku experimentom, som spokojný s výsledkami, ktoré som dosiahol. Bol som schopný bez problémov vzorkovať signály UART až do 115 200 baudov v režime „Both“na hrane a dokonca som dokázal v režime „Falling“edge dosiahnuť až 230 400 baudov. Moje nastavenie testu môžete vidieť na obrázku vyššie.

Moja implementácia má niekoľko nevýhod, počnúc skutočnosťou, že súčasne môže zachytávať iba jeden signál, pretože iba pin 8 Arduino UNO „podporuje zachytávanie vstupu“. Ak hľadáte logický analyzátor Arduino s viacerými kanálmi, navštívte ten Catoblepas.

Nemôžete čakať, že Arduino UNO bude schopné zachytávať signály s vysokými frekvenciami (niektoré MHz), pretože je taktovaný iba na 16MHz (ak by to niekto robil, zaujímalo by ma, ako sa jeho metóda prejavuje). Stále som však ohromený výsledkami, ktoré môžeme získať z tohto mikrokontroléra ATMEGA328P.

Nemyslím si, že budem s kódom veľa pracovať. Vykonal som svoje experimenty a dosiahol som výsledky, ktoré som hľadal. Ak však niekto chce prispieť, neváhajte upraviť alebo znova distribuovať celý môj kód alebo jeho časť.

To bol môj prvý inštruovateľný a myslím si, že aj dlhý. Dúfam, že to bolo pre vás zaujímavé čítanie.

Dajte mi vedieť, ak nájdete chyby alebo máte otázky!

Odporúča: