Sisällysluettelo:

Arduino UNO Logic Sniffer: 8 vaihetta (kuvilla)
Arduino UNO Logic Sniffer: 8 vaihetta (kuvilla)

Video: Arduino UNO Logic Sniffer: 8 vaihetta (kuvilla)

Video: Arduino UNO Logic Sniffer: 8 vaihetta (kuvilla)
Video: Could this tiny tube of metal fix our broken suspension? - Edd China's Workshop Diaries 28 2024, Heinäkuu
Anonim
Arduino UNO Logic Sniffer
Arduino UNO Logic Sniffer

Tämä projekti alkoi yksinkertaisena kokeiluna. Tutkiessani ATMEGA328P: n tietolomaketta toiseen projektiin löysin jotain melko mielenkiintoista. Ajastimen 1 tulon sieppausyksikkö. Sen avulla Arduino UNO: n mikro -ohjain voi havaita signaalin reunan, tallentaa aikaleiman ja laukaista keskeytyksen, kaikki laitteistossa.

Mietin sitten, missä sovelluksessa se voisi olla hyödyllinen ja kuinka testata sitä. Koska haluan hankkia logiikka -analysaattorin jo jonkin aikaa, päätin kokeilla ottaa sellaisen käyttöön Arduino UNO -levylläni vain testataksesi ominaisuutta ja katsoaksemme, saammeko siitä hyviä tuloksia.

En ole ainoa, jolla oli tämä idea, ja löydät paljon niitä vain googlaamalla "Arduino Logic Analyzer". Hankkeen alussa, koska se alkoi juuri kokeiluna, en edes tiennyt, että ihmiset olivat jo tehneet sen, ja olin vaikuttunut hyvistä tuloksista, joita he saivat tällä pienellä laitteistolla. En kuitenkaan löytänyt toista projektia syötteen sieppausyksikön avulla, joten jos olet jo nähnyt tämän, kerro siitä minulle!

Yhteenvetona voin sanoa, että logiikka -analysaattorini:

  • On yksi kanava,
  • Onko sinulla graafinen käyttöliittymä,
  • Kommunikoi käyttöliittymän kanssa USB: n kautta,
  • Aja Arduino UNO -levyllä.

Siinä on lopulta 800 näytteen muistisyvyys ja se pystyi kaappaamaan onnistuneesti 115200 baudin UART -viestin (en todellakaan testannut sitä suuremmilla nopeuksilla).

Tämä opas sisältää sekä "miten se toimii" että "miten sitä käytetään" osia tästä projektista, joten niille, jotka eivät ole kiinnostuneita teknisestä puolesta, voit siirtyä suoraan vaiheeseen 4.

Tarvikkeet

Halusin pitää analysaattorin mahdollisimman yksinkertaisena, joten tarvitsin hyvin vähän laitteistoa.

Tarvitset:

  • Arduino UNO -levy (tai vastaava, kunhan se perustuu ATMEGA328P MCU -laitteeseen),
  • Tietokone,
  • Jotain virheenkorjausta (toinen Arduino UNO -levy toimii hyvin testien tekemiseksi).

Sekä Arduino UNO: n että web -käyttöliittymän koodi löytyvät täältä. Tarvitset myös p5.serialcontrol- ja PulseView -ohjelmiston.

Vaihe 1: Toimintaperiaate

Toimintaperiaate
Toimintaperiaate

Idea on yksinkertainen. Valitset kaappausasetukset ja napsautat "hanki". Web -käyttöliittymä lähettää ne p5.serialcontrol -ohjelmistolle, jonka avulla voimme käyttää sarjaliitäntää selaimesta, koska se ei voi käyttää sitä suoraan. Tämän jälkeen p5.serialcontrol -ohjelmisto välittää tiedot Arduino UNO -levylle, joka kerää tiedot, ja lähettää ne takaisin käyttöliittymään samaa polkua pitkin.

Helppo! No… Koska en ole kovin hyvä ihmisen/koneen käyttöliittymän ohjelmoinnissa tai verkkotekniikoissa, omani on varmasti hieman ruma ja buginen. Mutta sen avulla voin aloittaa kaappauksen ja hakea tietoni takaisin, mitä varten se on suunniteltu, joten mielestäni se on hieno. Vakavampaa analyysityötä varten tuon tietueeni PulseView -ohjelmaan, joka on helppokäyttöinen ja tarjoaa hyvät ominaisuudet ja protokolladekooderit, kuten näemme myöhemmin.

Arduino UNO: n sisääntulon sieppausyksikkö voidaan konfiguroida käyttämään erilaisia kellojakoja, mikä vähentää tarkkuutta, mutta lisää viivettä ennen ylivuotoa. Se voi myös laukaista nousussa, laskussa tai molemmissa reunoissa tietojen sieppaamisen aloittamiseksi.

Vaihe 2: Arduino UNO Sketch

Arduino UNO Sketch
Arduino UNO Sketch

Kirjoitin ja koonnin luonnoksen Arduino IDE: n avulla. Aloitin ensin asettamalla ajastimen1 "normaaliin" toimintatilaan kirjoittamalla sen TCCR1A- ja TCCR1B -rekistereihin asetuksissa (). Tein sitten joitain toimintoja helpottaakseni sen käyttöä tulevaisuudessa, kuten toiminto, joka asetti kello -osion nimeltä "setTim1PSC ()". Kirjoitin myös toimintoja aktivoimaan ja deaktivoimaan Timer1 -tulon sieppausyksikön ja ylivuotokeskeytykset.

Lisäsin "näytteet" -matriisin, joka säilyttää kerätyt tiedot. Se on globaali ryhmä, jonka asetin "haihtuvaksi" estääkseni kääntäjää tekemästä optimointeja ja laittamaan sen salamaan, kuten se teki ensimmäisten kokoamisteni aikana. Määritin sen "uint16_t" -matriisiksi, koska Timer1 on myös 16 -bittinen ja sen pituus on 810. Lopetamme tallentamisen 800 arvolla, mutta koska testi tehdään keskeytysten ulkopuolella ilmeisistä nopeussyistä, päätin pitää 10 lisää arvoja ylivuodon estämiseksi. Luonnos käyttää muutamia muita muuttujia muulle koodille, ja se käyttää 1313 tavua (88%) muistia, jolloin meille jää 235 tavua vapaata RAM -muistia. Meillä on jo korkea muistin käyttö, enkä halunnut lisätä näytekapasiteettia, koska se voi aiheuttaa outoja käyttäytymismalleja liian vähän muistitilaa vuoksi.

Kun pyrin aina lisäämään suoritusnopeutta, käytin funktio -osoittimia sen sijaan, että lausekkeet keskeytysten sisällä, vähentääkseni niiden suoritusajan minimiin. Sieppaustappi on aina Arduino UNO numero 8, koska se on ainoa kytketty Timer1: n tulon sieppausyksikköön.

Tallennusprosessi näkyy yllä olevassa kuvassa. Se alkaa, kun Arduino UNO vastaanottaa kelvollisen UART -datakehyksen, joka sisältää halutut sieppausasetukset. Käsittelemme sitten nämä asetukset määrittämällä oikeat rekisterit kaappaamaan valitulle reunalle ja käyttämään oikeaa kellojakoa. Otamme sitten PCINT0 (pin change) keskeytyksen käyttöön havaitsemaan ensimmäisen signaalin reunan. Kun saamme sen, nollaamme Timer1 -arvon, poistamme PCINT0 -keskeytyksen käytöstä ja otamme käyttöön ICU (Input Capture Unit) -katkon. Siitä hetkestä lähtien mikä tahansa signaalin putoava/nouseva reuna (valitusta kokoonpanosta riippuen) laukaisee tulon sieppausyksikön, mikä tallentaa tapahtuman aikaleiman ICR1 -rekisteriin ja suorittaa keskeytyksen. Tässä keskeytyksessä laitamme ICR1 -rekisteriarvon "näytteitä" -ryhmään ja kasvatamme seuraavan kaappauksen indeksiä. Kun ajastin1 tai ryhmä ylivuotaa, poistamme kaappauksen keskeytyksen käytöstä ja lähetämme tiedot takaisin verkkokäyttöliittymään UARTin kautta.

Päätin käyttää nastanvaihdon keskeytystä kaappauksen käynnistämiseksi, koska tulon sieppausyksikkö sallii kaappauksen vain yhdestä tai toisesta reunasta, ei molemmista. Se aiheuttaa myös ongelmia, kun haluat kaapata molemmat reunat. Ratkaisuni on sitten kääntää bitti, joka ohjaa reunanvalintaa tulon sieppausohjausrekisterissä jokaisella otetulla näytteellä. Näin menetämme suoritusnopeutta, mutta voimme silti käyttää tulon sieppausyksikön toimintoja.

Joten, kuten olette ehkä huomanneet, emme todellakaan ota jokaista näytettä tietyin aikavälein, mutta sieppaamme hetken, jolloin signaalin siirtyminen tapahtuu. Jos olisimme ottaneet yhden näytteen jokaisessa kellojaksossa, jopa korkeimmalla kellojakaumalla, olisimme täyttäneet puskurin noin 0,1 sekunnissa olettaen, että käytimme uint8_t -tyyppiä, joka on muistin pienin ilman rakenteita.

Vaihe 3: Web -käyttöliittymä ja P5.js

Web -käyttöliittymä ja P5.js
Web -käyttöliittymä ja P5.js

Kuten otsikko viittaa, web -käyttöliittymä tehtiin p5.js: n avulla. Niille, jotka eivät vielä tiedä sitä, suosittelen lämpimästi tarkistamaan verkkosivuston, koska se on todella hyvä kirjasto. Se perustuu käsittelyyn, on helppokäyttöinen, mahdollistaa hyvien tulosten saamisen erittäin nopeasti ja on hyvin dokumentoitu. Näistä syistä valitsin tämän kirjaston. Käytin myös valikossa quicksettings.js -kirjastoa, grafica.js -kirjaa tietojeni piirtämiseen ja p5.serialport -kirjastoa kommunikoimaan Arduino UNO: n kanssa.

En käytä liikaa käyttöliittymää, koska suunnittelin sen juuri tietojen esikatseluun ja asetusten hallintaan sekä siksi, että se ei ollut lainkaan kokeiluni aihe. Selitän kuitenkin seuraavissa osissa koko järjestelmän käytön eri vaiheet ja selitän eri käytettävissä olevat säätimet.

Vaihe 4: Järjestelmän asennus

Ensimmäinen asia on ladata Arduino UNO ja käyttöliittymäkoodi täältä, jos et ole jo tehnyt sitä. Voit sitten ohjelmoida Arduino UNO -korttisi uudelleen "UNO_LS.ino" -luonnoksella Arduino IDE: n kautta.

Sinun olisi pitänyt ladata p5.serialcontrol -ohjelmisto sen github -arkistosta. Sinun on saatava käyttöjärjestelmääsi vastaava zip -tiedosto (testasin sitä vain Windowsissa). Pura zip kansioon, käynnistä siinä oleva suoritettava tiedosto ja jätä se sellaiseksi. Älä yritä muodostaa yhteyttä mihinkään sarjaporttiin, vaan jätä se toimimaan taustalla, sitä käytetään releenä.

Avaa "Interface" -kansio. Sinun pitäisi löytää tiedosto nimeltä "index.html". Avaa selaimessasi, se on verkkokäyttöliittymä.

Ja siinä se! Sinun ei tarvitse ladata ylimääräisiä kirjastoja, kaiken pitäisi sisältyä antamaani pakettiin.

Vaihe 5: Yhteys, kokoonpano ja hankinta

Yhteys, kokoonpano ja hankinta
Yhteys, kokoonpano ja hankinta

Liittääksesi käyttöliittymän Arduino UNO -levyyn, valitse vain vastaava portti luettelosta ja paina "Avaa" -painiketta. Jos toimenpide onnistui, "tila" -viestin pitäisi näyttää jotain "COMX avattu".

Voit nyt valita kuvausvaihtoehdot. Ensimmäinen on reunojen valinta. Suosittelen aina käyttämään molempia, koska se antaa parhaan kuvan todellisesta signaalista. Jos "Molemmat" -asetus ei pysty sieppaamaan signaalia (jos esimerkiksi signaalin taajuus on liian korkea), voit kokeilla joko "Nouseva" tai "Putoava" reuna -asetusta riippuen siitä, minkä signaalin yrität nähdä.

Toinen asetus on kellon jako. Se antaa sinulle resoluution, jolla voit kaapata signaalin. Voit valita jakokerroimen joko "8", "64", "256" ja "1024". Arduino UNO -levy käyttää 16 MHz: n kvartsia mikrokontrollerin kelloon, joten näytteenottotaajuus on "16 MHz/jakokerroin". Ole varovainen tämän asetuksen kanssa, sillä se myös määrittää, kuinka kauan pystyt sieppaamaan signaalin. Koska Timer1 on 16 -bittinen ajastin, sallittu sieppausaika ennen ylivuotoa on "(2^16)*(jakautumiskerroin)/16 MHz". Valitsemastasi asetuksesta riippuen se on ~ 33 ms - 4,2 s. Pidä valintasi mielessäsi, tarvitset sitä myöhemmin.

Viimeinen asetus on melunvaimennin. En suorittanut paljon testejä, etkä tarvitse sitä 99%: ssa tapauksista, joten jätä se tarkistamatta. Niille, jotka ovat edelleen uteliaita siitä, voit etsiä melunvaimenninta ATMEGA328P: n tietolomakkeen Ajastin/laskuri1 -osasta.

Älä unohda kytkeä Arduino UNO -levyn nasta 8 signaaliin ja kytkeä maadoitukset yhteen saadaksesi saman jänniteohjeen sekä testauspiirille että logiikka -analysaattorille. Jos tarvitset maadoituseristystä tai jos haluat mitata signaaleja, joiden taso on erilainen kuin 5 V, sinun on luultavasti lisättävä virtapiiriin optoeristin.

Kun kaikki on määritetty oikein, voit painaa "Hanki" -painiketta.

Vaihe 6: Tulosten tallentaminen ja CSV -tietojen vienti

Tallenna tulokset ja CSV -tietojen vienti
Tallenna tulokset ja CSV -tietojen vienti

Kun Arduino UNO lopettaa sieppauksen, se lähettää tiedot automaattisesti takaisin verkkokäyttöliittymään, joka piirtää ne. Voit suurentaa tai loitontaa oikeaa liukusäädintä ja kulkea näytteitä alemman liukusäätimen avulla.

Kaavio antaa vain esikatselun, eikä sillä ole mitään tietojen analysointityökaluja. Jotta voit analysoida tietojasi tarkemmin, sinun on tuotava ne PulseView -palveluun.

Ensimmäinen vaihe on viedä csv -tiedosto, joka sisältää kaikki tietosi. Tätä varten sinun tarvitsee vain napsauttaa "Vie" -painiketta verkkokäyttöliittymässä. Tallenna tiedosto tunnettuun paikkaan pyydettäessä.

Avaa nyt PulseView. Napsauta ylävalikkorivillä "Avaa" (kansion kuvake) ja valitse "Tuo pilkuilla erotetut arvot …". Valitse aiemmin luotu csv -tiedosto, joka sisältää tietosi.

Pieni ikkuna tulee näkyviin. Jätä kaikki ennalleen, sinun tarvitsee vain muuttaa "Samplerate" -asetusta kaappaukseen valitun kellojakautumistekijän mukaan. Näytteenottotaajuutesi on "16MHz/(jakautumistekijä)". Napsauta sitten "Ok", signaalisi pitäisi näkyä näytöllä.

Vaihe 7: PulseView -signaalianalyysi

PulseView -signaalianalyysi
PulseView -signaalianalyysi

PulseView sisältää paljon protokollan dekoodereita. Pääset niihin napsauttamalla "Lisää protokollan dekooderi" ylävalikkorivillä (oikein työkalu). Kokeilua varten lähetin juuri yksinkertaisen UART -viestin 9600 baudilla, joten etsin "UART".

Se lisää kanavan, jonka vasemmalla puolella on tunniste (aivan kuten tietosi). Napsauttamalla tunnistetta voit muuttaa dekooderin asetuksia. Kun olin valinnut oikeat viestit, pystyin noutamaan saman viestin kuin testilaitteeni lähettämä viesti. Tämä osoittaa, että koko järjestelmä toimii odotetulla tavalla.

Vaihe 8: Johtopäätös

Johtopäätös
Johtopäätös

Vaikka projekti oli alussa kokeilu, olen tyytyväinen tuloksiin. Pystyin näyttelemään UART -signaaleja jopa 115200 baudilla "Both" -reunatilassa ilman ongelmia, ja onnistuin jopa nousemaan jopa 230400 baudiin "Falling" -reunatilassa. Näet testiasetukseni yllä olevasta kuvasta.

Toteutuksessani on useita haittoja, alkaen siitä, että se voi kaapata vain yhden signaalin kerrallaan, koska vain Arduino UNO: n nasta 8 on "sisääntulon sieppauskykyinen". Jos etsit Arduino -logiikka -analysaattoria, jossa on enemmän kanavia, tarkista Catoblepas.

Et voi odottaa, että Arduino UNO pystyy sieppaamaan signaaleja korkeilla taajuuksilla (jotkut MHz), koska se on kellotettu vain 16 MHz: llä (jos joku tekisi sen, olisin kiinnostunut näkemään sen menetelmän). Olen kuitenkin edelleen vaikuttunut tuloksista, joita voimme saada tästä ATMEGA328P -mikrokontrollerista.

En usko, että teen paljon työtä koodin parissa. Tein kokeita ja sain etsimäni tulokset. Mutta jos joku haluaa osallistua, voit vapaasti muokata ja jakaa uudelleen koodiani tai sen osaa.

Se oli ensimmäinen Instructable, ja mielestäni pitkä. Toivottavasti tämä on ollut mielenkiintoista luettavaa sinulle.

Kerro minulle, jos löydät virheitä tai jos sinulla on kysyttävää!

Suositeltava: