Indholdsfortegnelse:

Arduino UNO Logic Sniffer: 8 trin (med billeder)
Arduino UNO Logic Sniffer: 8 trin (med billeder)

Video: Arduino UNO Logic Sniffer: 8 trin (med billeder)

Video: Arduino UNO Logic Sniffer: 8 trin (med billeder)
Video: 35 видео со страшными призраками: мегасборник 2023 года [V1] 2024, November
Anonim
Arduino UNO Logic Sniffer
Arduino UNO Logic Sniffer

Dette projekt startede som et simpelt eksperiment. Under min undersøgelse af ATMEGA328P's datablad til et andet projekt fandt jeg noget ret interessant. Timer1 Input Capture Unit. Det gør det muligt for vores Arduino UNOs mikrokontroller at registrere en signalkant, gemme et tidsstempel og udløse en afbrydelse, alt sammen i hardware.

Jeg spekulerede derefter på, i hvilken applikation det kunne være nyttigt, og hvordan man testede det. Da jeg vil have en logisk analysator i et stykke tid nu, besluttede jeg mig for at prøve at implementere en i mit Arduino UNO -kort, bare for at teste funktionen og se, om vi kan få gode resultater ud af det.

Jeg er ikke den eneste, der havde denne idé, og du finder masser af dem ved bare at google "Arduino Logic Analyzer". I begyndelsen af projektet, da det bare startede som et eksperiment, var jeg ikke engang klar over, at folk allerede nåede det, og var imponeret over de gode resultater, de opnåede med dette lille stykke hardware. Jeg kunne dog ikke finde et andet projekt ved hjælp af inputoptagelsesenheden, så lad mig vide det, hvis du allerede har set dette!

For at opsummere vil min logiske analysator:

  • Hav en kanal,
  • Har en grafisk grænseflade,
  • Kommuniker med grænsefladen via USB,
  • Kør på et Arduino UNO -bord.

Det vil endelig have en hukommelsesdybde på 800 prøver og kunne med succes fange en 115200 bauds UART -besked (jeg testede det ikke rigtig ved højere hastigheder).

Denne instruktør indeholder både "hvordan det fungerer" og "hvordan man bruger det" dele af dette projekt, så for dem, der ikke er interesseret af den tekniske side, kan du direkte springe til trin 4.

Forbrugsvarer

Jeg ville have analysatoren så enkel som muligt, så det kræver meget lidt hardware.

Du får brug for:

  • Et Arduino UNO -kort (eller tilsvarende, så længe det er afhængigt af ATMEGA328P MCU),
  • En computer,
  • Noget at fejle (et andet Arduino UNO -bord fungerer fint til at foretage nogle test).

Koden til både Arduino UNO og webinterface kan findes her. Du skal også bruge p5.serialcontrol og PulseView -softwaren.

Trin 1: Arbejdsprincip

Arbejdsprincip
Arbejdsprincip

Ideen er enkel. Du vælger indstillingerne for optagelse, og klikker på "erhverve". Webgrænsefladen sender dem til p5.serialcontrol -softwaren, som giver os mulighed for at bruge det serielle interface fra en browser, da den ikke kan få direkte adgang til den. P5.serialcontrol -softwaren videresender derefter oplysningerne til Arduino UNO -kortet, som indsamler dataene og sender dem tilbage til grænsefladen via den samme sti.

Let! Godt … Da jeg ikke er særlig god til programmering af grænseflader mellem mennesker og maskiner eller webteknologier, er min bestemt en smule grim og buggy. Men det giver mig mulighed for at starte en registrering og hente mine data tilbage, hvilket er det, de er designet til, så jeg synes, det er fint. For mere seriøst analysearbejde importerer jeg mine poster til PulseView, som er let at bruge og tilbyder et godt sæt funktioner og protokoldekodere, som vi vil se senere.

Arduino UNOs input capture -enhed kan konfigureres til at bruge forskellige urinddelinger, hvilket reducerer opløsningen, men øger forsinkelsen før overløb. Det kan også udløse stigende, faldende eller begge kanter for at begynde at fange dataene.

Trin 2: Arduino UNO Skitse

Arduino UNO Skitse
Arduino UNO Skitse

Jeg skrev og kompilerede skitsen med Arduino IDE. Jeg startede først med at konfigurere Timer1 i "Normal" driftstilstand ved at skrive til dets TCCR1A- og TCCR1B -registre i opsætningen (). Jeg lavede derefter nogle funktioner for at lette brugen lidt i fremtiden, som den, der skulle indstille uropdelingen med navnet "setTim1PSC ()". Jeg skrev også funktioner til at aktivere og deaktivere Timer1 input capture -enhed og overløbsafbrydelser.

Jeg tilføjede "samples" -arrayet, som gemmer de indsamlede data. Det er et globalt array, som jeg indstiller til "volatile" for at forhindre kompilatoren i at foretage optimeringer og sætte det i flash, som det gjorde under mine første kompileringer. Jeg definerede det som et "uint16_t" array, da Timer1 også er 16bit, med en længde på 810. Vi stopper med at fange med 800 værdier, men da testen udføres uden for afbrydelserne af indlysende hastighedsgrunde, valgte jeg at beholde 10 flere værdier for at forhindre overløb. Med et par ekstra variabler for resten af koden bruger skitsen 1313 bytes (88%) hukommelse, hvilket efterlader os med 235 bytes ledig RAM. Vi har allerede et højt hukommelsesforbrug, og jeg ville ikke tilføje mere prøvekapacitet, da det kan forårsage underlig adfærd på grund af for få hukommelsesplads.

I min søgen efter altid at øge eksekveringshastigheden brugte jeg funktionstegn i stedet for if -sætninger inde i afbrydelserne for at reducere deres udførelsestid til et minimum. Capture pin vil altid være Arduino UNO nummer 8, da det er den eneste, der er forbundet til Timer1's input capture unit.

Optagelsesprocessen er vist på billedet ovenfor. Det starter, når Arduino UNO modtager en gyldig UART -dataramme, der indeholder de ønskede indstillinger for optagelse. Vi behandler derefter disse indstillinger ved at konfigurere de rigtige registre til at fange på den valgte kant og bruge den rigtige urinddeling. Vi aktiverer derefter PCINT0 (pin -ændring) afbrydelse til at registrere den første signalkant. Når vi får det, nulstiller vi Timer1 -værdien, deaktiverer PCINT0 -afbrydelsen og aktiverer ICU (Input Capture Unit) afbrydelse. Fra det øjeblik vil enhver faldende/stigende kant på signalet (afhængigt af den valgte konfiguration) udløse inputoptagelsesenheden og dermed gemme et tidsstempel for denne hændelse i ICR1 -registret og udføre en afbrydelse. I denne afbrydelse sætter vi ICR1 -registerværdien i vores "samples" -array, og øger indekset for den næste registrering. Når timeren1 eller arrayet overløber, deaktiverer vi optagelsesafbrydelsen og sender dataene tilbage til webgrænsefladen via UART.

Jeg besluttede at bruge en pin -change interrupt til at udløse capture, da input capture -enheden kun tillader at fange på den ene eller den anden kant, ikke begge dele. Det forårsager også et problem, når du vil fange begge kanter. Min løsning har derefter været at vende den bit, der styrer kantvalget i inputregistreringsregistret ved hver prøve, der hentes. På den måde mister vi eksekveringshastigheden, men vi kan stadig bruge input capture -enhedens funktioner.

Så som du måske har bemærket, fanger vi ikke rigtig hver prøve med faste tidsintervaller, men vi fanger det øjeblik, hvor der sker en signalovergang. Hvis vi havde fanget en prøve ved hver urcyklus, selv med den højeste urinddeling, ville vi have fyldt bufferen på cirka 0,1 sekunder, forudsat at vi brugte typen uint8_t, som er den mindste i hukommelsen uden at bruge strukturer.

Trin 3: Webgrænseflade og P5.js

Webgrænseflade og P5.js
Webgrænseflade og P5.js

Som titlen antyder, blev webgrænsefladen lavet ved hjælp af p5.js. For dem, der ikke allerede ved det, kan jeg varmt anbefale dig at gå og tjekke hjemmesiden, da det er et rigtig godt bibliotek. Det er baseret på Processing, er let at bruge, giver dig mulighed for at få gode resultater meget hurtigt og er veldokumenteret. Det er af alle de grunde, at jeg valgte dette bibliotek. Jeg brugte også quicksettings.js -biblioteket til menuerne, grafica.js -en til at plotte mine data og p5.serialport -biblioteket til at kommunikere med Arduino UNO.

Jeg vil ikke bruge for meget tid på grænsefladen, da jeg lige har designet det til forhåndsvisning af data og indstillingskontrol, og også fordi det slet ikke var genstand for mit eksperiment. Jeg vil imidlertid i de følgende dele forklare de forskellige trin for at bruge hele systemet og dermed forklare de forskellige tilgængelige kontroller.

Trin 4: Systemopsætning

Den første ting er at downloade Arduino UNO og interfacekoden her, hvis den ikke allerede er udført. Du kan derefter omprogrammere dit Arduino UNO -bord med "UNO_LS.ino" -skitsen gennem Arduino IDE.

Du skulle have downloadet p5.serialcontrol -softwaren fra dens github -lager. Du skal hente zip -filen, der matcher dit operativsystem (jeg testede den kun på Windows). Udpak zip i en mappe, start den eksekverbare fil, der findes i den, og lad den være sådan. Prøv ikke at oprette forbindelse til en seriel port, bare lad den køre i baggrunden, den vil blive brugt som et relæ.

Åbn mappen "Interface". Du bør finde en fil med navnet "index.html". Åbn den i din browser, det er webgrænsefladen.

Og det er det! Du behøver ikke downloade ekstra biblioteker, alt skal være inkluderet i den pakke, jeg leverede.

Trin 5: Forbindelse, konfiguration og erhvervelse

Forbindelse, konfiguration og erhvervelse
Forbindelse, konfiguration og erhvervelse

For at slutte grænsefladen til Arduino UNO -kortet skal du bare vælge den tilsvarende port på listen og trykke på knappen "Åbn". Hvis operationen var vellykket, skulle meddelelsen "tilstand" vise noget som "COMX åbnet".

Du kan nu vælge dine optagelsesmuligheder. Først er kantvalget. Jeg anbefaler dig altid at bruge "Begge", da det vil give dig den bedste repræsentation af det virkelige signal. Hvis indstillingen "Begge" ikke kan fange signalet (hvis for eksempel signalfrekvensen er for høj), kan du prøve med enten "stigende" eller "faldende" kantindstilling afhængigt af det signal, du forsøger at se.

Den anden indstilling er urinddeling. Det vil give dig den opløsning, hvormed du vil være i stand til at fange signalet. Du kan vælge at indstille divisionsfaktoren med enten "8", "64", "256" og "1024". Arduino UNO -kortet bruger et 16MHz kvarts til at urmikre mikrokontrolleren, så samplingsfrekvensen vil være "16MHz/divisionsfaktor". Vær forsigtig med denne indstilling, da den også bestemmer, hvor længe du vil være i stand til at fange et signal. Da Timer1 er en 16 -bit timer, vil den tilladte optagelsestid før overløb være "(2^16)*(divisionsfaktor)/16MHz". Afhængigt af den indstilling, du har valgt, vil den variere mellem ~ 33ms og 4,2s. Hold dit valg i tankerne, du får brug for det senere.

Den sidste indstilling er støjreducerende. Jeg har ikke foretaget en masse test på det, og du får ikke brug for det i 99% af tilfældene, så lad det være ukontrolleret. For dem, der stadig er nysgerrige efter det, kan du søge efter støjreduceringen i afsnittet Timer/Counter1 i ATMEGA328P's datablad.

Glem ikke at slutte Arduino UNO -kortets pin 8 til dit signal, og forbind grunde til at have den samme spændingsreference for både testkredsløbet og logikanalysatoren. Hvis du har brug for jordisolering eller skal måle signaler med forskellige niveauer end 5V, skal du sandsynligvis tilføje en opto-isolator til dit kredsløb.

Når alt er konfigureret korrekt, kan du trykke på knappen "Anskaf".

Trin 6: Optag resultater og eksport af CSV -data

Optag resultater og CSV -dataeksport
Optag resultater og CSV -dataeksport

Når din Arduino UNO er færdig med en optagelse, sender den automatisk dataene tilbage til webgrænsefladen, som plotter dem. Du kan zoome ind eller ud med den højre skyder og rejse gennem prøverne med den nederste.

Plottet giver dig kun en forhåndsvisning og har ingen dataanalyseværktøjer. For at foretage yderligere analyse af dine data skal du således importere dem til PulseView.

Det første trin er at eksportere en csv -fil, der indeholder alle dine data. For at gøre det skal du blot klikke på knappen "Eksporter" fra webgrænsefladen. Gem din fil på et kendt sted, når du bliver bedt om det.

Åbn nu PulseView. Klik på "Åbn" (mappeikon) i den øverste menulinje, og vælg "Importer kommaseparerede værdier …". Vælg den tidligere genererede csv -fil, der indeholder dine data.

Et lille vindue vises. Lad alt være som det er, du skal bare ændre indstillingen "Samplerate" i henhold til den opdelingsfaktor, der er valgt til optagelsen. Din samplerate -frekvens vil være "16MHz/(divisionsfaktor)". Klik derefter på "Ok", dit signal skal vises på skærmen.

Trin 7: PulseView -signalanalyse

PulseView -signalanalyse
PulseView -signalanalyse

PulseView har mange protokoldekodere. For at få adgang til dem skal du klikke på "Tilføj protokoldekoder" i den øverste menulinje (værktøj til højre). Til mit eksperiment sendte jeg lige en simpel UART -besked på 9600 bauds, så jeg søgte efter "UART".

Det tilføjer en kanal med et tag til venstre (ligesom den for dine data). Ved at klikke på mærket kan du ændre dekoderens indstillinger. Efter at have valgt de rigtige, kunne jeg hente den samme besked som den, der blev sendt af min testenhed. Dette viser, at hele systemet fungerer som forventet.

Trin 8: Konklusion

Konklusion
Konklusion

Selvom projektet i begyndelsen var et eksperiment, er jeg glad for de resultater, jeg fik. Jeg var i stand til at prøve UART -signaler på op til 115200 bauds i "Begge" kanttilstand uden problemer, og jeg nåede endda at gå op til 230400 bauds i "Falling" edge mode. Du kan se min testopsætning på billedet ovenfor.

Min implementering har flere ulemper, begyndende med at den kun kan fange ét signal ad gangen, da kun Arduino UNOs pin 8 er "input capture capable". Hvis du leder efter en Arduino logisk analysator med flere kanaler, skal du tjekke Catoblepas 'en.

Du kan ikke forvente, at en Arduino UNO er i stand til at fange signaler med høje frekvenser (nogle MHz), da den kun er klokket til 16MHz (hvis nogen gjorde det, ville jeg være interesseret i at se dens metode). Jeg er dog stadig imponeret over de resultater, vi kan få ud af denne ATMEGA328P mikrokontroller.

Jeg tror ikke, at jeg vil gøre meget arbejde med koden. Jeg gennemførte mine eksperimenter og fik de resultater, jeg ledte efter. Men hvis nogen vil bidrage, er du velkommen til at ændre og omfordele hele eller dele af min kode.

Det var min første instruerbare, og en lang, synes jeg. Jeg håber, at det har været en interessant læsning for dig.

Lad mig vide, hvis du finder fejl, eller hvis du har spørgsmål!

Anbefalede: