Sisukord:

Arduino UNO Logic Sniffer: 8 sammu (piltidega)
Arduino UNO Logic Sniffer: 8 sammu (piltidega)

Video: Arduino UNO Logic Sniffer: 8 sammu (piltidega)

Video: Arduino UNO Logic Sniffer: 8 sammu (piltidega)
Video: Using an Arduino Uno as Logical Analyzer 2024, November
Anonim
Arduino UNO loogiline nuusutaja
Arduino UNO loogiline nuusutaja

See projekt sai alguse lihtsa eksperimendina. Uurides teise projekti ATMEGA328P andmelehte, leidsin midagi üsna huvitavat. Taimeri 1 sisendi püüdmise seade. See võimaldab meie Arduino UNO mikrokontrolleril tuvastada signaali serva, salvestada ajatempli ja käivitada katkestuse, kõik riistvaras.

Mõtlesin siis, millises rakenduses see võiks olla kasulik ja kuidas seda testida. Kuna ma tahan juba mõnda aega loogikaanalüsaatorit hankida, otsustasin selle funktsiooni testimiseks oma Arduino UNO tahvlisse rakendada ja vaadata, kas saame sellest häid tulemusi.

Ma pole ainus, kellel see mõte tekkis, ja leiate neid palju, lihtsalt googeldades "Arduino loogikaanalüsaatorit". Projekti alguses, kuna see algas alles eksperimendina, ei teadnud ma isegi, et inimesed on selle juba teinud, ja avaldasin muljet selle väikese riistvaraga saavutatud headest tulemustest. Siiski ei leidnud ma sisendipüüdmisseadet kasutades teist projekti, nii et kui olete seda juba näinud, andke mulle sellest teada!

Kokkuvõttes teeb minu loogikaanalüsaator järgmist:

  • Kas teil on üks kanal,
  • Omada graafilist liidest,
  • Liidesega USB kaudu suhelda,
  • Töötage Arduino UNO tahvlil.

Sellel on lõpuks 800 proovi mälusügavus ja see suutis edukalt jäädvustada 115200 baudise UART -sõnumi (ma ei testinud seda suurematel kiirustel).

See juhend sisaldab nii selle projekti osi "kuidas see töötab" kui ka "kuidas seda kasutada", nii et neile, keda tehniline pool ei huvita, saate otse 4. sammu juurde liikuda.

Tarvikud

Tahtsin hoida analüsaatorit võimalikult lihtsana, nõudes seega väga vähe riistvara.

Sa vajad:

  • Arduino UNO plaat (või samaväärne, kui see tugineb ATMEGA328P MCU -le),
  • Arvuti,
  • Midagi siluda (mõni muu Arduino UNO plaat töötab mõne testi tegemiseks hästi).

Nii Arduino UNO kui ka veebiliidese koodi leiate siit. Teil on vaja ka p5.serialcontrol ja PulseView tarkvara.

Samm: tööpõhimõte

Tööpõhimõte
Tööpõhimõte

Idee on lihtne. Valite pildistamise seaded ja klõpsate nupul „Hangi”. Veebiliides saadab need tarkvarale p5.serialcontrol, mis võimaldab meil kasutada jadaliidest brauserist, kuna see ei pääse sellele otse juurde. Tarkvara p5.serialcontrol edastab seejärel teabe Arduino UNO tahvlile, mis andmed hõivab, ja saadab need sama tee kaudu liidesesse tagasi.

Lihtne! Noh … Kuna ma ei ole eriti hea inimese/masina liidese programmeerimisel ega veebitehnoloogiates, on minu oma kindlasti natuke kole ja lollakas. Kuid see võimaldab mul alustada jäädvustamist ja oma andmeid tagasi hankida, milleks see on mõeldud, seega arvan, et see sobib. Tõsisemate analüüsitööde jaoks impordin oma kirjed PulseView -sse, mida on lihtne kasutada ning mis pakub häid funktsioone ja protokollide dekoodreid, nagu hiljem näeme.

Arduino UNO sisendi püüdmise seadet saab konfigureerida kasutama erinevaid kellajaotusi, vähendades seega eraldusvõimet, kuid suurendades viivitust enne ülevoolu. See võib käivitada ka tõusu, languse või mõlema serva, et alustada andmete salvestamist.

2. samm: Arduino UNO visand

Arduino UNO visand
Arduino UNO visand

Kirjutasin ja koostasin eskiisi Arduino IDE abil. Alustasin kõigepealt Timer1 seadistamisega töörežiimis "Normal", kirjutades seadistuses selle TCCR1A ja TCCR1B registritesse (). Seejärel tegin mõningaid funktsioone, et hõlbustada selle kasutamist tulevikus, näiteks kellajaotuse määramiseks nimega "setTim1PSC ()". Kirjutasin ka funktsioonid, et aktiveerida ja deaktiveerida sisenditõmbeüksus Timer1 ja ülevoolu katkestused.

Lisasin massiivi "proovid", mis hoiab saadud andmeid. See on ülemaailmne massiiv, mille määrasin „lenduvaks”, et takistada kompilaatoril optimeerimisi tegemast ja välklampi panna, nagu seda tehti minu esimeste kompileerimiste ajal. Ma määratlesin selle massiivina "uint16_t", kuna taimer1 on samuti 16 -bitine, pikkusega 810. Lõpetame jäädvustamise 800 väärtuse juures, kuid kuna test tehakse ilmselgetel kiiruse põhjustel väljaspool katkestusi, otsustasin säilitada 10 rohkem väärtusi, et vältida ületäitumist. Mõne lisamuutujaga ülejäänud koodi jaoks kasutab visand 1313 baiti (88%) mälu, jättes meile vaba RAM -i 235 baiti. Meil on juba suur mälukasutus ja ma ei tahtnud rohkem proovimahtu lisada, kuna see võib liiga vähese mäluruumi tõttu põhjustada kummalist käitumist.

Püüdes alati täitmiskiirust suurendada, kasutasin katkestuste sees olevate avalduste asemel funktsiooninäidikuid, et vähendada nende täitmise aega miinimumini. Pildistamisnööp on alati Arduino UNO number 8, kuna see on ainus, mis on ühendatud Timer1 sisendi püüdmisseadmega.

Pildistusprotsess on näidatud ülaltoodud pildil. See algab siis, kui Arduino UNO saab kehtiva UART -andmeraami, mis sisaldab soovitud jäädvustusseadeid. Seejärel töötleme neid seadeid, seadistades õiged registrid valitud servale jäädvustamiseks ja kasutame õiget kellajaotust. Seejärel lubame esimese signaali serva tuvastamiseks PCINT0 (tihvti vahetus) katkestuse. Kui saame selle, lähtestame väärtuse Timer1, keelame PCINT0 katkestuse ja lubame ICU (Input Capture Unit) katkestuse. Sellest hetkest alates käivitab signaali kõik langevad/tõusvad servad (sõltuvalt valitud konfiguratsioonist) sisendi püüdmise üksuse, salvestades seega selle sündmuse ajatempli ICR1 registrisse ja sooritades katkestuse. Selle katkestuse korral paneme ICR1 registri väärtuse meie "proovide" massiivi ja suurendame järgmise võtte indeksit. Kui taimer1 või massiiv ületab, keelame püüdmise katkestamise ja saadame andmed UART -i kaudu tagasi veebiliidesesse.

Otsustasin püüdmise käivitamiseks kasutada nööpnõelte vahetamise katkestust, kuna sisendi püüdmise üksus võimaldab pildistada ainult ühel või teisel serval, mitte mõlemal. See tekitab probleemi ka siis, kui soovite jäädvustada mõlemad servad. Minu lahendus on siis pöörata ümber bitti, mis kontrollib serva valikut sisendi püüdmise juhtregistris iga allalaaditud proovi korral. Nii kaotame täitmiskiiruse, kuid saame siiski kasutada sisendi püüdmise üksuse funktsioone.

Niisiis, nagu olete ehk märganud, ei võta me tegelikult iga proovi kindlate ajavahemike järel, vaid jäädvustame hetke, kus toimub signaali üleminek. Kui oleksime iga kelltsükli ajal kogunud ühe proovi, isegi kõrgeima kellajaotuse korral, oleksime puhvri täitnud umbes 0,1 sekundiga, eeldades, et kasutasime tüüpi uint8_t, mis on mälus väikseim, ilma struktuure kasutamata.

3. samm: veebiliides ja P5.js

Veebiliides ja P5.js
Veebiliides ja P5.js

Nagu pealkirjast selgub, tehti veebiliides p5.js abil. Neile, kes seda veel ei tea, soovitan soojalt veebisaiti vaadata, sest see on tõesti hea raamatukogu. See põhineb töötlemisel, seda on lihtne kasutada, see võimaldab teil väga kiiresti häid tulemusi saavutada ja on hästi dokumenteeritud. Kõigil neil põhjustel valisin selle raamatukogu. Kasutasin menüüde jaoks ka teeki quicksettings.js, oma andmete joonistamiseks grafica.js ja raamatukogu p5.serialport, et suhelda Arduino UNO -ga.

Ma ei kuluta liidesele liiga palju aega, kuna kujundasin selle just andmete eelvaateks ja seadete juhtimiseks ning ka seetõttu, et see ei olnud minu katse teema. Siiski selgitan järgmistes osades kogu süsteemi kasutamise erinevaid samme, selgitades seega erinevaid saadaolevaid juhtelemente.

Samm: süsteemi seadistamine

Esimene asi on alla laadida Arduino UNO ja liidesekood siit, kui see pole juba tehtud. Seejärel saate oma Arduino UNO plaadi ümber programmeerida visandiga "UNO_LS.ino" läbi Arduino IDE.

Oleksite pidanud alla laadima tarkvara p5.serialcontrol selle githubi hoidlast. Peate hankima oma operatsioonisüsteemile vastava zip -faili (testisin seda ainult Windowsis). Eemaldage ZIP -fail kaustast, käivitage selles leiduv käivitatav fail ja jätke see selliseks. Ärge proovige ühendada ühegi jadapordiga, jätke see lihtsalt taustal töötama, seda kasutatakse releena.

Avage kaust "Liides". Peaksite leidma faili nimega "index.html". Avage see oma brauseris, see on veebiliides.

Ja see ongi kõik! Te ei pea lisateeke alla laadima, kõik peaks sisalduma minu pakutud paketis.

Samm 5: Ühendamine, seadistamine ja hankimine

Ühendus, konfigureerimine ja omandamine
Ühendus, konfigureerimine ja omandamine

Liidese ühendamiseks Arduino UNO plaadiga valige lihtsalt loendist vastav port ja klõpsake nuppu "Ava". Kui toiming õnnestus, peaks teade "olek" kuvama midagi sellist nagu "COMX avatud".

Nüüd saate valida pildistamisvalikud. Esiteks on servade valik. Soovitan teil alati kasutada mõlemat, kuna see annab teile parima signaali. Kui seade "Mõlemad" ei suuda signaali jäädvustada (näiteks kui signaali sagedus on liiga kõrge), võite proovida kas serva "Tõusev" või "Langev", sõltuvalt signaalist, mida proovite näha.

Teine seadistus on kellajaotus. See annab teile eraldusvõime, mille abil saate signaali jäädvustada. Jaotusteguri saate valida kas "8", "64", "256" ja "1024". Arduino UNO plaat kasutab mikrokontrolleri kellaks 16MHz kvartsit, seega on diskreetimissageduseks "16MHz/jaotuskoefitsient". Olge selle seadistusega ettevaatlik, kuna see määrab ka selle, kui kaua saate signaali jäädvustada. Kuna Timer1 on 16 -bitine taimer, on enne ülevoolu lubatud jäädvustamisaeg "(2^16)*(jaotusfaktor)/16 MHz". Sõltuvalt valitud seadistusest jääb see vahemikku ~ 33 ms kuni 4,2 sekundit. Pidage oma valikut meeles, vajate seda hiljem.

Viimane seade on mürasummutaja. Ma ei teinud sellega palju teste ja 99% juhtudest ei vaja te seda, nii et jätke see märkimata. Neile, kes on endiselt uudishimulikud, saate müra summutajat otsida ATMEGA328P andmelehe jaotises Taimer/loendur1.

Ärge unustage ühendada Arduino UNO plaadi tihvt 8 oma signaaliga ja ühendada maandusjuhtmed kokku, et saada nii testiahela kui ka loogikaanalüsaatori jaoks võrdne pinge. Kui vajate maapealset isolatsiooni või peate mõõtma signaale, mille tase erineb 5 V-st, peate tõenäoliselt oma ahelasse lisama opto-isolaatori.

Kui kõik on õigesti konfigureeritud, võite vajutada nuppu "Hangi".

6. toiming: tulemuste jäädvustamine ja CSV -andmete eksport

Tulemuste jäädvustamine ja CSV -andmete eksport
Tulemuste jäädvustamine ja CSV -andmete eksport

Kui teie Arduino UNO on jäädvustamise lõpetanud, saadab see andmed automaatselt tagasi veebiliidesesse, mis neid joonistab. Saate parema liuguriga sisse või välja suumida ja alumise liuguriga proove läbida.

Graafik annab teile ainult eelvaate ja sellel pole andmeanalüüsi tööriistu. Seega peate oma andmete edasise analüüsi tegemiseks need PulseView'sse importima.

Esimene samm on eksportida csv -fail, mis sisaldab kõiki teie andmeid. Selleks peate lihtsalt klõpsama veebiliidese nupul "Ekspordi". Kui küsitakse, salvestage fail teadaolevasse asukohta.

Nüüd avage PulseView. Klõpsake ülemisel menüüribal nuppu "Ava" (kaustaikoon) ja valige "Impordi komaga eraldatud väärtused …". Valige varem loodud csv -fail, mis sisaldab teie andmeid.

Ilmub väike aken. Jätke kõik nii, nagu on, peate lihtsalt muutma seadistust "Samplerate" vastavalt jäädvustamiseks valitud kellajaotustegurile. Teie proovivõtu sagedus on "16MHz/(jaotusfaktor)". Seejärel klõpsake "Ok", teie signaal peaks ilmuma ekraanile.

Samm 7: PulseView signaalianalüüs

PulseView signaalianalüüs
PulseView signaalianalüüs

PulseView pakub palju protokollide dekoodreid. Neile juurdepääsu saamiseks klõpsake ülemisel menüüribal nuppu "Lisa protokolli dekooder" (kõige parem tööriist). Oma eksperimendi jaoks saatsin just lihtsa UART -teate 9600 baudiga, nii et otsisin "UART".

See lisab kanali, mille vasakul küljel on silt (täpselt nagu teie andmete jaoks). Sildil klõpsates saate muuta dekoodri seadeid. Pärast õigete sõnumite valimist suutsin hankida sama teate, mille saatis minu testimisseade. See näitab, et kogu süsteem töötab ootuspäraselt.

8. samm: järeldus

Järeldus
Järeldus

Isegi kui projekt oli alguses eksperiment, olen saadud tulemustega rahul. Suutsin UART -signaale proovida kuni 115200 baudiga servarežiimis "Both" ilma probleemideta ja isegi kukkumise serva režiimis suutsin isegi kuni 230400 baudini. Minu testi seadistusi näete ülaltoodud pildil.

Minu rakendusel on mitmeid puudusi, alustades sellest, et see suudab korraga hõivata ainult ühe signaali, kuna ainult Arduino UNO tihvt 8 on „sisendvõimeline”. Kui otsite Arduino loogikaanalüsaatorit, millel on rohkem kanaleid, vaadake Catoblepase oma.

Te ei saa eeldada, et Arduino UNO suudab kõrge sagedusega (mõni MHz) signaale jäädvustada, kuna see töötab ainult 16 MHz (kui keegi seda teeks, oleksin huvitatud selle meetodist). Siiski avaldab mulle endiselt muljet selle ATMEGA328P mikrokontrolleri tulemuste tulemus.

Ma ei usu, et ma koodiga palju tööd teeksin. Tegin oma katseid ja sain tulemusi, mida otsisin. Aga kui keegi soovib oma panuse anda, muutke ja levitage minu koodi täielikult või osaliselt.

See oli minu esimene juhendatav ja minu arvates pikk. Loodan, et see oli teile huvitav lugemine.

Andke mulle teada, kui leiate vigu või teil on küsimusi!

Soovitan: