INHOUDSOPGAWE:

Arduino UNO Logic Sniffer: 8 stappe (met foto's)
Arduino UNO Logic Sniffer: 8 stappe (met foto's)

Video: Arduino UNO Logic Sniffer: 8 stappe (met foto's)

Video: Arduino UNO Logic Sniffer: 8 stappe (met foto's)
Video: Arduino Programming: Logical Operators 2024, November
Anonim
Arduino UNO Logic Sniffer
Arduino UNO Logic Sniffer

Hierdie projek het begin as 'n eenvoudige eksperiment. Tydens my navorsing oor die ATMEGA328P se datablad vir 'n ander projek, het ek iets interessants gevind. Die Timer1 Input Capture Unit. Dit laat ons Arduino UNO se mikrobeheerder toe om 'n seinkant op te spoor, 'n tydstempel op te slaan en 'n onderbreking te veroorsaak, alles in hardeware.

Ek wonder toe in watter toepassing dit nuttig kan wees en hoe om dit te toets. Aangesien ek nou al geruime tyd 'n logiese ontleder wil kry, het ek besluit om een in my Arduino UNO -bord te probeer implementeer, net om die funksie te toets en te kyk of ons goeie resultate kan behaal.

Ek is nie die enigste een wat hierdie idee gehad het nie, en u sal baie daarvan vind deur 'Arduino Logic Analyzer' te gaan google. Aan die begin van die projek, toe dit net as 'n eksperiment begin het, was ek nie eens daarvan bewus dat mense dit reeds gemaak het nie, en ek was beïndruk met die goeie resultate wat hulle met hierdie klein stukkie hardeware behaal het. Ek kon egter nie 'n ander projek vind met behulp van die invoeropname -eenheid nie, so laat weet my as u dit al gesien het!

Om op te som, sal my logika -ontleder:

  • Het een kanaal,
  • Het 'n grafiese koppelvlak,
  • Kommunikeer met die koppelvlak via USB,
  • Hardloop op 'n Arduino UNO -bord.

Dit het uiteindelik 'n geheue -diepte van 800 monsters en kon 'n UART -boodskap van 115200 bauds suksesvol opneem (ek het dit nie regtig teen hoër snelhede getoets nie).

Hierdie instruksies bevat beide die 'hoe dit werk' en 'hoe om dit te gebruik' dele van hierdie projek, dus vir diegene wat nie belangstel in die tegniese kant nie, kan u direk na stap 4 spring.

Voorrade

Ek wou die ontleder so eenvoudig as moontlik hou, so ek benodig baie min hardeware.

Jy sal nodig hê:

  • 'N Arduino UNO -bord (of ekwivalent solank dit staatmaak op die ATMEGA328P MCU),
  • N rekenaar,
  • Iets om te ontfout ('n ander Arduino UNO -bord werk goed om toetse te doen).

Die kode vir beide die Arduino UNO en die webkoppelvlak kan hier gevind word. U benodig ook die p5.serialcontrol en PulseView sagteware.

Stap 1: Werkbeginsel

Werkbeginsel
Werkbeginsel

Die idee is eenvoudig. U kies die opname -instellings en klik op "verkry". Die webkoppelvlak stuur dit na die p5.serialcontrol -sagteware, waarmee ons die seriële koppelvlak vanaf 'n blaaier kan gebruik, aangesien dit nie direk toegang daartoe het nie. Die sagteware p5.serialcontrol stuur die inligting dan na die Arduino UNO -bord, wat die data vang, en stuur dit via dieselfde pad terug na die koppelvlak.

Maklik! Wel … Omdat ek nie regtig goed is in die programmering van menslike/masjien -koppelvlak of webtegnologie nie, is myne beslis 'n bietjie lelik en karig. Maar dit laat my toe om 'n opname te begin en my data terug te haal, waarvoor dit ontwerp is, so ek dink dit is goed. Vir meer ernstige ontledingswerk, voer ek my rekords in in PulseView, wat maklik is om te gebruik en 'n goeie reeks funksies en protokol -dekodeerders bied, soos ons later sal sien.

Die invoeropname -eenheid van die Arduino UNO kan gekonfigureer word om verskillende klokafdelings te gebruik, wat die resolusie verminder, maar die vertraging voor oorloop verhoog. Dit kan ook veroorsaak dat stygings, dalings of albei kante begin om die data vas te lê.

Stap 2: Arduino UNO -skets

Arduino UNO Skets
Arduino UNO Skets

Ek het die skets met die Arduino IDE geskryf en saamgestel. Ek het eers begin met die opstel van die Timer1 in die "normale" modus deur na die TCCR1A- en TCCR1B -registers in die setup () te skryf. Ek het toe 'n paar funksies gemaak om die gebruik daarvan in die toekoms 'n bietjie te vergemaklik, soos die een om die klokafdeling met die naam "setTim1PSC ()" in te stel. Ek het ook funksies geskryf om die Timer1 -invoeropname -eenheid te aktiveer en te deaktiveer en oorlooponderbrekings.

Ek het die "monsters" -skikking bygevoeg, wat die verkrygde data bevat. Dit is 'n wêreldwye skikking wat ek op 'onstabiel' gestel het om te verhoed dat die samesteller optimalisering maak en dit in flits plaas, soos tydens my eerste versamelings. Ek het dit gedefinieer as 'n "uint16_t" -skikking, aangesien die Timer1 ook 16bit is, met 'n lengte van 810. Ons hou op om 800 waardes vas te lê, maar omdat die toets om ooglopende spoedredes buite die onderbrekings gedoen word, het ek gekies om 10 te behou meer waardes om oorloop te voorkom. Met 'n paar ekstra veranderlikes vir die res van die kode, gebruik die skets 1313 grepe (88%) geheue, wat ons 235 grepe gratis RAM laat. Ons het reeds 'n hoë geheueverbruik, en ek wou nie meer steekproefkapasiteit byvoeg nie, aangesien dit vreemde gedrag kan veroorsaak as gevolg van te min geheue.

In my strewe om altyd die uitvoeringsnelheid te verhoog, het ek funksie -aanwysers gebruik in plaas van as stellings in die onderbrekings, om die uitvoeringstyd tot 'n minimum te beperk. Die vangpen sal altyd die Arduino UNO nommer 8 wees, aangesien dit die enigste is wat gekoppel is aan die invoeropname -eenheid van die Timer1.

Die opneemproses word op die prent hierbo getoon. Dit begin wanneer die Arduino UNO 'n geldige UART -datarame ontvang, met die gewenste opname -instellings. Ons verwerk dan die instellings deur die regte registers op te stel om op die gekose rand vas te lê, en gebruik die regte klokindeling. Ons stel dan die PCINT0 (pin change) -onderbreking in staat om die eerste seinkant op te spoor. As ons dit kry, stel ons die Timer1 -waarde terug, skakel die PCINT0 -onderbreking uit en aktiveer die ICU (Input Capture Unit) -onderbreking. Vanaf daardie oomblik sal enige val/stygende rand op die sein (afhangende van die gekose konfigurasie) die invoeropname -eenheid aktiveer, en sodoende 'n tydstempel van hierdie gebeurtenis in die ICR1 -register bespaar en 'n onderbreking uitgevoer word. In hierdie onderbreking plaas ons die ICR1 registerwaarde in ons "monsters" skikking en verhoog die indeks vir die volgende opname. As die timer1 of die skikking oorloop, skakel ons die opname -onderbreking uit en stuur ons die data terug na die webkoppelvlak via UART.

Ek het besluit om 'n speldwisselingsonderbreking te gebruik om die opname te aktiveer, aangesien die invoeropname -eenheid slegs op die een of ander rand kan vasvang, nie beide nie. Dit veroorsaak ook 'n probleem as u albei rande wil vasvang. My oplossing is dan om die bietjie wat die randkeuse in die invoeropname -beheerregister beheer, om te keer by elke monster wat omgetrek word. Op hierdie manier verloor ons die uitvoeringsnelheid, maar ons kan steeds die funksies van die invoeropname -eenheid gebruik.

Soos u moontlik opgemerk het, neem ons elke monster nie regtig op vaste tydsintervalle vas nie, maar ons neem die oomblik vas waarop 'n seintransisie plaasvind. As ons een monster by elke kloksiklus geneem het, selfs met die hoogste klokindeling, sou ons die buffer in ongeveer 0,1 sekondes gevul het, met die veronderstelling dat ons die uint8_t -tipe gebruik, wat die kleinste in die geheue is sonder om strukture te gebruik.

Stap 3: Webinterface en P5.js

Webkoppelvlak en P5.js
Webkoppelvlak en P5.js

Soos die titel aandui, is die webkoppelvlak gemaak met behulp van p5.js. Vir diegene wat dit nog nie weet nie, beveel ek u sterk aan om na die webwerf te gaan, want dit is 'n baie goeie biblioteek. Dit is gebaseer op verwerking, is maklik om te gebruik, laat u baie goeie resultate behaal en is goed gedokumenteer. Dit is om al die redes waarom ek hierdie biblioteek gekies het. Ek het ook die quicksettings.js -biblioteek vir die spyskaarte gebruik, die grafica.js -een om my data te plot, en die p5.serialport -biblioteek om met die Arduino UNO te kommunikeer.

Ek sal nie te veel tyd aan die koppelvlak spandeer nie, want ek het dit net ontwerp vir data -voorskou en instellingsbeheer, en ook omdat dit glad nie die onderwerp van my eksperiment was nie. Ek sal egter in die volgende dele die verskillende stappe om die hele stelsel te gebruik verduidelik, en dus die verskillende beskikbare kontroles verduidelik.

Stap 4: Stelselopstelling

Die eerste ding is om die Arduino UNO en koppelvlakkode hier af te laai as dit nog nie gedoen is nie. U kan dan u Arduino UNO -bord herprogrammeer met die 'UNO_LS.ino' skets deur die Arduino IDE.

U moes die p5.serialcontrol -sagteware van die github -bewaarplek afgelaai het. U moet die zip -lêer kry wat by u bedryfstelsel pas (ek het dit slegs op Windows getoets). Pak die zip in 'n gids uit, begin die uitvoerbare lêer en laat dit so. Moenie probeer om aan te sluit op enige seriële poort nie; laat dit net op die agtergrond loop, dit sal as 'n aflos gebruik word.

Maak die gids "Interface" oop. U moet 'n lêer met die naam "index.html" vind. Maak dit oop in u blaaier, dit is die webkoppelvlak.

En dit is dit! U hoef nie ekstra biblioteke af te laai nie; alles moet ingesluit wees in die pakket wat ek verskaf het.

Stap 5: Verbinding, konfigurasie en verkryging

Verbinding, konfigurasie en verkryging
Verbinding, konfigurasie en verkryging

Om die koppelvlak aan die Arduino UNO -bord te koppel, kies die ooreenstemmende poort in die lys en klik op die "Open" -knoppie. As die operasie suksesvol was, moet die "staat" -boodskap iets soos "COMX oopgemaak" vertoon.

U kan nou u opname -opsies kies. Eerstens is die randkeuse. Ek beveel u aan om altyd 'beide' te gebruik, aangesien dit u die beste weergawe van die werklike sein sal gee. As die 'Beide' instelling nie die sein kan opneem nie (as die seinfrekwensie byvoorbeeld te hoog is), kan u probeer om met die 'Stygende' of 'Dalende' randinstelling te werk, afhangende van die sein wat u probeer sien.

Die tweede instelling is die klokindeling. Dit gee u die resolusie waarop u die sein sal kan vasvang. U kan kies om die verdelingsfaktor met "8", "64", "256" en "1024" in te stel. Die Arduino UNO -bord gebruik 'n 16MHz -kwarts om die mikrobeheerder te klok, dus is die bemonsteringsfrekwensie '16MHz/delingsfaktor'. Wees versigtig met hierdie instelling, aangesien dit ook bepaal hoe lank u 'n sein kan afneem. Aangesien die Timer1 'n 16bit -timer is, is die opnametyd wat toegelaat word voor oorloop "(2^16)*(delingsfaktor)/16MHz". Afhangende van die gekose instelling, wissel dit tussen ~ 33ms en 4.2s. Hou u keuse in gedagte, u sal dit later nodig hê.

Die laaste instelling is die ruisonderdrukker. Ek het dit nie baie getoets nie, en u benodig dit nie in 99% van die gevalle nie, dus laat dit ongemerk. Vir diegene wat nog steeds nuuskierig is, kan u die ruisonderdrukker in die afdeling Timer/Counter1 van die ATMEGA328P se datablad soek.

Moenie vergeet om die pen 8 van die Arduino UNO -bord aan u sein te koppel nie, en dra die gronde saam om dieselfde spanningsverwysing vir die toetsbaan en die logiese ontleder te hê. As u grondisolasie benodig of seine met 'n ander vlak as 5V moet meet, moet u waarskynlik 'n opto-isolator by u stroombaan voeg.

Sodra alles korrek opgestel is, kan u op die "Acquire" -knoppie druk.

Stap 6: Vang resultate en CSV -data -uitvoer op

Vang resultate en CSV -data -uitvoer
Vang resultate en CSV -data -uitvoer

Sodra u Arduino UNO klaar is met die opname, stuur dit outomaties die data terug na die webkoppelvlak, wat dit sal plot. U kan in- of uitzoomen met die regte skuifbalk en deur die monsters met die onderste een beweeg.

Die plot gee u slegs 'n voorskou en het geen gereedskap vir data -analise nie. Om u data verder te ontleed, moet u dit in PulseView invoer.

Die eerste stap is om 'n csv -lêer met al u data uit te voer. Om dit te kan doen, hoef u net op die "Uitvoer" -knoppie in die webkoppelvlak te klik. Stoor u lêer op 'n bekende plek as u gevra word.

Maak nou PulseView oop. Klik in die boonste menubalk op "Open" (vouer-ikoon) en kies "Import Comma-separate values …". Kies die voorheen gegenereerde csv -lêer wat u data bevat.

'N Klein venster verskyn. Laat alles soos dit is, u hoef net die "Samplerate" -instelling aan te pas volgens die klokindelingsfaktor wat gekies is vir die opname. U monsterfrekwensie is "16MHz/(delingsfaktor)". Klik dan op "Ok", u sein moet op die skerm verskyn.

Stap 7: PulseView -seinanalise

PulseView -seinanalise
PulseView -seinanalise

PulseView bevat baie protokol -dekodeerders. Om toegang tot hulle te verkry, klik op "Voeg protokoldekodeerder by" in die boonste menubalk (hulpmiddel regs). Vir my eksperiment het ek net 'n eenvoudige UART -boodskap op 9600 bauds gestuur, so ek het na "UART" gesoek.

Dit sal 'n kanaal byvoeg met 'n merker aan die linkerkant (net soos die een vir u data). Deur op die etiket te klik, kan u die instellings van die dekodeerder verander. Nadat ek die regte een gekies het, kon ek dieselfde boodskap terugstuur as die boodskap wat deur my toetsapparaat gestuur is. Dit toon dat die hele stelsel werk soos verwag.

Stap 8: Gevolgtrekking

Afsluiting
Afsluiting

Selfs as die projek in die begin 'n eksperiment was, is ek tevrede met die resultate wat ek gekry het. Ek kon sonder probleme UART -seine met 'n maksimum van 115200 bauds in die 'beide' randmodus proe, en ek kon selfs 230400 bauds in die 'Falling' edge -modus bereik. U kan my toetsopstelling op die foto hierbo sien.

My implementering het verskeie nadele, wat begin met die feit dat dit slegs een sein op 'n slag kan opneem, aangesien slegs die pen 8 van Arduino UNO 'input capture capable' is. As u op soek is na 'n Arduino -logiese ontleder met meer kanale, gaan kyk na die een van Catoblepas.

U kan nie verwag dat 'n Arduino UNO seine met hoë frekwensies (sommige MHz) kan opneem nie, want dit word slegs op 16MHz geklok (as iemand dit gedoen het, sou ek die metode daarvan wou sien). Ek is egter nog steeds onder die indruk van die resultate wat ons uit hierdie ATMEGA328P -mikrobeheerder kan kry.

Ek dink nie ek sal veel aan die kode werk nie. Ek het my eksperimente uitgevoer en die resultate gekry waarna ek gesoek het. Maar as iemand 'n bydrae wil lewer, kan u my kode gedeeltelik verander of herverdeel.

Dit was my eerste Instructable, en 'n lang een, dink ek. Ek hoop dat dit vir u 'n interessante leesstof was.

Laat weet my as u foute vind, of as u enige vrae het!

Aanbeveel: