Arduino UNO Logic Sniffer: 8 korakov (s slikami)
Arduino UNO Logic Sniffer: 8 korakov (s slikami)
Anonim
Arduino UNO Logic Sniffer
Arduino UNO Logic Sniffer

Ta projekt se je začel kot preprost poskus. Med raziskovanjem podatkovnega lista ATMEGA328P za drug projekt sem našel nekaj precej zanimivega. Enota za zajem vhoda Timer1. Omogoča, da mikrokrmilnik našega Arduino UNO zazna rob signala, shrani časovni žig in sproži prekinitev, vse v strojni opremi.

Nato sem se vprašal, v kateri aplikaciji bi lahko bila koristna in kako jo preizkusiti. Ker že nekaj časa želim dobiti logični analizator, sem se odločil, da ga poskusim implementirati v svojo ploščo Arduino UNO, samo da preizkusim funkcijo in preverim, ali lahko iz nje dobimo dobre rezultate.

Nisem edini, ki je imel to idejo, in veliko jih boste našli le s googlom "Arduino Logic Analyzer". Na začetku projekta, ki se je šele začel kot poskus, se sploh nisem zavedal, da so ljudje že uspeli, in bil sem navdušen nad dobrimi rezultati, ki so jih dosegli s tem majhnim kosom strojne opreme. Vendar pa z enoto za zajem vhoda nisem našel drugega projekta, zato, če ste to že videli, mi to sporočite!

Če povzamem, bo moj logični analizator:

  • Imeti en kanal,
  • Imeti grafični vmesnik,
  • Komunicirajte z vmesnikom prek USB -ja,
  • Zaženite na plošči Arduino UNO.

Končno bo imel globino pomnilnika 800 vzorcev in lahko je uspešno zajel sporočilo UART 115200 baudov (nisem ga preizkusil pri višjih hitrostih).

Ta navodila vsebujejo dela tega projekta "kako deluje" in "kako ga uporabljati", zato lahko tiste, ki jih tehnična stran ne zanima, neposredno skočite na 4. korak.

Zaloge

Analizator sem želel ohraniti čim bolj preprost, zato je bilo potrebno zelo malo strojne opreme.

Boste potrebovali:

  • Plošča Arduino UNO (ali enakovredna, če se opira na MCU ATMEGA328P),
  • Računalnik,
  • Nekaj za odpravljanje napak (druga plošča Arduino UNO deluje dobro, da naredi nekaj preskusov).

Kodo za Arduino UNO in spletni vmesnik najdete tukaj. Potrebovali boste tudi programsko opremo p5.serialcontrol in PulseView.

1. korak: Načelo delovanja

Načelo delovanja
Načelo delovanja

Ideja je preprosta. Izberete nastavitve zajemanja in kliknete »pridobi«. Spletni vmesnik jih bo poslal v programsko opremo p5.serialcontrol, ki nam omogoča uporabo serijskega vmesnika iz brskalnika, saj do njega ne more dostopati neposredno. Programska oprema p5.serialcontrol nato posreduje informacije na ploščo Arduino UNO, ki zajame podatke in jih po isti poti pošlje nazaj na vmesnik.

Enostavno! No… Ker nisem ravno dober v programiranju vmesnika človek/stroj ali v spletnih tehnologijah, je moje vsekakor nekoliko grdo in napak. Vendar mi omogoča, da začnem zajemati in pridobim svoje podatke nazaj, za kar je bil zasnovan, zato mislim, da je v redu. Za resnejše analizo uvozim svoje zapise v PulseView, ki je enostaven za uporabo in ponuja dober nabor funkcij in dekoderjev protokolov, kot bomo videli kasneje.

Enoto za zajem vhoda Arduino UNO je mogoče konfigurirati tako, da uporablja različne delitve ure, s čimer se zmanjša ločljivost, vendar poveča zamuda pred prelivom. Prav tako lahko sproži dvig, padec ali oba roba, da začne zajemati podatke.

2. korak: Arduino UNO skica

Arduino UNO skica
Arduino UNO skica

Skico sem napisal in sestavil z Arduino IDE. Najprej sem začel z nastavitvijo Timer1 v "normalnem" načinu delovanja s pisanjem v njegova registra TCCR1A in TCCR1B v setup (). Nato sem naredil nekaj funkcij za lažjo uporabo v prihodnosti, na primer tisto, ki je nastavila delitev ure z imenom "setTim1PSC ()". Napisal sem tudi funkcije za vklop in izklop enote za zajem vhoda Timer1 in prelive.

Dodal sem matriko "vzorci", ki bo vsebovala pridobljene podatke. Gre za globalno matriko, ki sem jo nastavil na "volatile", da prevajalnik ne bi optimiziral in ga dal v flash, kot je to počel med mojimi prvimi kompilacijami. Opredelil sem ga kot matriko "uint16_t", saj je tudi Timer1 16bit, z dolžino 810. Zajem nehamo pri 800 vrednostih, a ker se test zaradi očitnih razlogov hitrosti opravi zunaj prekinitev, sem se odločil, da ohranim 10 več vrednosti za preprečitev prelivanja. Z nekaj dodatnimi spremenljivkami za preostalo kodo skica uporablja 1313 bajtov (88%) pomnilnika, kar nam daje 235 bajtov prostega RAM -a. Že imamo veliko porabo pomnilnika in nisem želel dodati več vzorčne zmogljivosti, saj bi to lahko povzročilo čudno vedenje zaradi premajhnega pomnilniškega prostora.

Pri svojem prizadevanju, da bi vedno povečal hitrost izvajanja, sem namesto stavkov if v prekinitvah uporabil kazalce funkcij, da skrajšam njihov čas izvajanja na minimum. Zajemni zatič bo vedno Arduino UNO številka 8, saj je edini povezan z vhodno enoto za zajem Timer1.

Postopek zajemanja je prikazan na zgornji sliki. Začne se, ko Arduino UNO prejme veljaven podatkovni okvir UART, ki vsebuje želene nastavitve zajema. Te nastavitve nato obdelamo tako, da konfiguriramo desne registre za zajem na izbranem robu in uporabimo deljenje desne ure. Nato omogočimo prekinitev PCINT0 (menjava pin), da zazna prvi rob signala. Ko ga dobimo, ponastavimo vrednost Timer1, onemogočimo prekinitev PCINT0 in omogočimo prekinitev ICU (Input Capture Unit). Od tega trenutka bo vsak padajoči/naraščajoči rob signala (odvisno od izbrane konfiguracije) sprožil enoto za zajem vhoda in tako shranil časovni žig tega dogodka v register ICR1 ter izvedel prekinitev. V tem prekinitvi vnesemo vrednost registra ICR1 v matriko "vzorcev" in povečamo indeks za naslednji zajem. Ko se Timer1 ali matrika preplavijo, onemogočimo prekinitev zajema in podatke pošljemo nazaj v spletni vmesnik prek UART.

Odločil sem se, da bom za sprožitev zajema uporabil prekinitev menjave zatičev, saj vhodna enota za zajem omogoča samo zajem na enem ali drugem robu, ne na obeh. Prav tako povzroča težave, če želite zajeti oba roba. Moja rešitev je bila nato obrniti bit, ki nadzoruje izbiro roba v vhodnem registrskem registru zajema pri vsakem pridobljenem vzorcu. Na ta način izgubljamo hitrost izvajanja, vendar lahko še vedno uporabljamo funkcije enote za zajem vhoda.

Kot ste morda opazili, v resnici ne zajamemo vsakega vzorca v določenih časovnih intervalih, ampak zajamemo trenutek, ko pride do prehoda signala. Če bi pri vsakem ciklu ure zajeli en vzorec, tudi z najvišjo delitvijo ure, bi medpomnilnik napolnili v približno 0,1 s, ob predpostavki, da uporabljamo tip uint8_t, ki je najmanjši v pomnilniku brez uporabe struktur.

3. korak: Spletni vmesnik in P5.js

Spletni vmesnik in P5.js
Spletni vmesnik in P5.js

Kot pove že naslov, je bil spletni vmesnik izdelan s pomočjo p5.js. Tistim, ki tega še ne poznate, toplo priporočam, da obiščejo spletno stran, saj je res dobra knjižnica. Temelji na obdelavi, je enostaven za uporabo, omogoča zelo hitre rezultate in je dobro dokumentiran. Iz vseh teh razlogov sem se odločil za to knjižnico. Za menije sem uporabil tudi knjižnico quicksettings.js, eno za grafico.js za risanje podatkov in knjižnico p5.serialport za komunikacijo z Arduino UNO.

Ne bom porabil preveč časa za vmesnik, saj sem ga pravkar zasnoval za predogled podatkov in nadzor nastavitev, pa tudi zato, ker sploh ni bil predmet mojega poskusa. Vendar bom v naslednjih delih razložil različne korake za uporabo celotnega sistema, s čimer bom razložil različne razpoložljive kontrole.

4. korak: Nastavitev sistema

Najprej morate tukaj prenesti Arduino UNO in kodo vmesnika, če tega še niste storili. Nato lahko svojo ploščo Arduino UNO reprogramirate s skico "UNO_LS.ino" skozi Arduino IDE.

Programsko opremo p5.serialcontrol bi morali prenesti iz njenega skladišča github. Zip datoteko morate ujemati z vašim operacijskim sistemom (preizkusil sem jo samo v sistemu Windows). Izvlecite zip v mapo, zaženite izvršljivo datoteko, ki jo najdete, in jo pustite tako. Ne poskušajte se povezati z nobenim serijskim vhodom, pustite ga delovati v ozadju. Uporabil se bo kot rele.

Odprite mapo "Vmesnik". Morali bi najti datoteko z imenom "index.html". Odprite ga v brskalniku, to je spletni vmesnik.

In to je to! Ni vam treba nalagati dodatnih knjižnic, vse mora biti vključeno v paket, ki sem ga dal.

5. korak: Povezava, konfiguracija in pridobitev

Povezava, konfiguracija in pridobitev
Povezava, konfiguracija in pridobitev

Če želite vmesnik povezati s ploščo Arduino UNO, samo izberite ustrezna vrata na seznamu in pritisnite gumb "Odpri". Če je bila operacija uspešna, mora sporočilo "stanje" prikazati nekaj takega kot "COMX odprt".

Zdaj lahko izberete možnosti zajemanja. Najprej je izbira roba. Priporočam vam, da vedno uporabljate "oboje", saj bo tako najbolje predstavljen pravi signal. Če nastavitev "Oboje" ne uspe zajeti signala (če je na primer frekvenca signala previsoka), lahko poskusite z nastavitvijo "Rising" ali "Falling", odvisno od signala, ki ga želite videti.

Druga nastavitev je deljenje ure. To vam bo dalo ločljivost, pri kateri boste lahko zajeli signal. Faktor delitve lahko nastavite na "8", "64", "256" in "1024". Plošča Arduino UNO uporablja 16 MHz kremen za urejanje mikrokrmilnika, zato bo frekvenca vzorčenja "16MHz/faktor delitve". Pri tej nastavitvi bodite previdni, saj bo tudi določila, kako dolgo boste lahko zajemali signal. Ker je Timer1 16 -bitni časovnik, bo čas zajema pred prelivom "(2^16)*(faktor delitve)/16MHz". Odvisno od izbrane nastavitve se bo gibala med ~ 33ms in 4.2s. Imejte v mislih svojo izbiro, kasneje jo boste potrebovali.

Zadnja nastavitev je odprava hrupa. Nisem ga veliko testiral in ga ne boste potrebovali v 99% primerov, zato ga pustite brez nadzora. Za tiste, ki jih to še zanima, lahko poiščete odpravljalec hrupa v razdelku Časovnik/števec1 v podatkovnem listu ATMEGA328P.

Ne pozabite priključiti nožice 8 plošče Arduino UNO na vaš signal in ozemljiti ozemljitve skupaj tako, da imata enako referenčno napetost tako za preskusno vezje kot za logični analizator. Če potrebujete izolacijo tal ali morate izmeriti signale z različnimi nivoji od 5V, boste verjetno morali v svoj tokokrog dodati opto-izolator.

Ko je vse pravilno konfigurirano, lahko pritisnete gumb "Pridobi".

6. korak: Zajemite rezultate in izvoz podatkov CSV

Zajem rezultatov in izvoz podatkov CSV
Zajem rezultatov in izvoz podatkov CSV

Ko vaš Arduino UNO konča zajem, bo samodejno poslal podatke nazaj na spletni vmesnik, ki jih bo narisal. Z desnim drsnikom lahko povečate ali pomanjšate, z spodnjim pa potujete po vzorcih.

Načrt vam omogoča le predogled in nima nobenih orodij za analizo podatkov. Za nadaljnjo analizo vaših podatkov jih boste morali uvoziti v PulseView.

Prvi korak je izvoz datoteke csv, ki vsebuje vse vaše podatke. To storite tako, da na spletnem vmesniku kliknete gumb »Izvozi«. Ko boste pozvani, datoteko shranite na znano mesto.

Zdaj odprite PulseView. V zgornji menijski vrstici kliknite »Odpri« (ikona mape) in izberite »Uvozi vrednosti, ločene z vejico …«. Izberite predhodno ustvarjeno datoteko csv, ki vsebuje vaše podatke.

Prikaže se majhno okno. Pustite vse tako, kot je, samo spremenite nastavitev "Samplerate" glede na faktor deljenja ure, izbran za zajem. Frekvenca vzorčenja bo "16MHz/(faktor delitve)". Nato kliknite »V redu«, vaš signal bi se moral pojaviti na zaslonu.

7. korak: Analiza signala PulseView

Analiza signala PulseView
Analiza signala PulseView

PulseView vsebuje veliko dekodirnikov protokolov. Za dostop do njih kliknite »Dodaj dekoder protokola« v zgornji menijski vrstici (najbolj desno orodje). Za svoj poskus sem poslal preprosto sporočilo UART pri 9600 baudih, zato sem iskal "UART".

Dodal bo kanal z oznako na levi strani (tako kot tista za vaše podatke). S klikom na oznako lahko spremenite nastavitve dekoderja. Po izbiri pravih sem lahko dobil isto sporočilo kot tisto, ki ga je poslala moja testna naprava. To kaže, da celoten sistem deluje po pričakovanjih.

8. korak: Zaključek

Zaključek
Zaključek

Tudi če je bil projekt na začetku poskus, sem zadovoljen z rezultati, ki sem jih dobil. Brez težav sem lahko vzorčil signale UART pri do 115200 baudih v robnem načinu "Oba", v načinu "Padajoči" rob pa sem uspel celo do 230400 baudov. Na zgornji sliki si lahko ogledate moje preskusne nastavitve.

Moja izvedba ima več pomanjkljivosti, začenši z dejstvom, da lahko lovi samo en signal naenkrat, saj je le pin 8 Arduino UNO "sposoben zajeti vhod". Če iščete logični analizator Arduino z več kanali, preverite enega Catoblepasovega.

Ne morete pričakovati, da bo Arduino UNO sposoben zajeti signale z visokimi frekvencami (nekaj MHz), saj deluje le pri 16MHz (če bi kdo to počel, bi bil zainteresiran videti njegovo metodo). Kljub temu sem še vedno navdušen nad rezultati, ki jih lahko dobimo iz tega mikrokontrolerja ATMEGA328P.

Mislim, da ne bom veliko delal na kodi. Izvedel sem svoje poskuse in dobil rezultate, ki sem jih iskal. Če pa želi kdo prispevati, lahko spremeni ali razdeli vso ali del moje kode.

To je bil moj prvi Instructable in mislim, da je bil dolg. Upam, da je bilo za vas zanimivo branje.

Sporočite mi, če odkrijete napake ali če imate kakršno koli vprašanje!

Priporočena: