Përmbajtje:

Arduino UNO Logic Sniffer: 8 hapa (me fotografi)
Arduino UNO Logic Sniffer: 8 hapa (me fotografi)

Video: Arduino UNO Logic Sniffer: 8 hapa (me fotografi)

Video: Arduino UNO Logic Sniffer: 8 hapa (me fotografi)
Video: Lecture 08: Arduino Conditional Statements | Robojax Arduino Step By Step Course 2024, Korrik
Anonim
Arduino UNO Logic Sniffer
Arduino UNO Logic Sniffer

Ky projekt filloi si një eksperiment i thjeshtë. Gjatë kërkimit tim mbi fletën e të dhënave të ATMEGA328P për një projekt tjetër, gjeta diçka mjaft interesante. Njësia e regjistrimit të hyrjes Timer1. Ai lejon mikrokontrolluesin tonë Arduino UNO të zbulojë një skaj të sinjalit, të ruajë një etiketë kohore dhe të shkaktojë një ndërprerje, të gjitha në pajisje.

Atëherë pyesja veten se në cilin aplikacion mund të ishte i dobishëm dhe si ta provoja. Ndërsa dua të marr një analizues logjik për ca kohë tani, vendosa të provoj të zbatoj një në bordin tim Arduino UNO, vetëm për të testuar funksionin dhe për të parë nëse mund të marrim rezultate të mira prej tij.

Unë nuk jam i vetmi që e kam këtë ide, dhe ju do të gjeni shumë prej tyre thjesht duke googluar "Arduino Logic Analyzer". Në fillim të projektit, pasi sapo filloi si një eksperiment, unë as nuk isha i vetëdijshëm se njerëzit tashmë e kishin bërë atë, dhe isha i impresionuar nga rezultatet e mira që arritën me këtë pjesë të vogël të pajisjeve. Sidoqoftë, nuk mund të gjeja një projekt tjetër duke përdorur njësinë e kapjes së hyrjes, kështu që nëse e keni parë tashmë këtë, më tregoni!

Për ta përmbledhur, analizuesi im logjik do të:

  • Keni një kanal,
  • Të ketë një ndërfaqe grafike,
  • Komunikoni me ndërfaqen përmes USB,
  • Drejtoni në një bord Arduino UNO.

Më në fund do të ketë një thellësi memorie prej 800 mostrash, dhe ishte në gjendje të kapte me sukses një mesazh UART 115200 bauds (nuk e provova vërtet me shpejtësi më të madhe).

Ky udhëzues përmban si pjesët "si funksionon" ashtu edhe "si ta përdorni" të këtij projekti, kështu që për ata që nuk janë të interesuar nga ana teknike, ju mund të hidheni drejtpërdrejt në hapin 4.

Furnizimet

Doja ta mbaja analizuesin sa më të thjeshtë që të ishte e mundur, kështu që kërkoja shumë pak pajisje.

Do t'ju duhet:

  • Një bord Arduino UNO (ose ekuivalent për sa kohë që mbështetet në MCU ATMEGA328P),
  • Një kompjuter,
  • Diçka për të korrigjuar (një bord tjetër Arduino UNO punon mirë për të bërë disa prova).

Kodi për Arduino UNO dhe ndërfaqen në internet mund të gjendet këtu. Ju gjithashtu do të keni nevojë për programin p5.serialcontrol dhe PulseView.

Hapi 1: Parimi i punës

Parimi i punës
Parimi i punës

Ideja është e thjeshtë. Ju zgjidhni cilësimet e kapjes dhe klikoni në "fito". Ndërfaqja në internet do t'i dërgojë ato në programin p5.serialcontrol, i cili na lejon të përdorim ndërfaqen serike nga një shfletues, pasi nuk mund të ketë qasje të drejtpërdrejtë në të. Softueri p5.serialcontrol pastaj transmeton informacionin në bordin Arduino UNO, i cili kap të dhënat dhe i dërgon ato përsëri në ndërfaqe përmes së njëjtës rrugë.

Lehtë! Epo … Meqenëse nuk jam vërtet i mirë në programimin e ndërfaqes Njerëz/Makinë ose teknologjitë në internet, e imja është sigurisht pak e shëmtuar dhe e gabuar. Por më lejon të filloj një kapje dhe të marr përsëri të dhënat e mia, për të cilat është krijuar, kështu që unë mendoj se është mirë. Për punë më serioze të analizës, unë importoj regjistrimet e mia në PulseView, i cili është i lehtë për t’u përdorur dhe ofron një grup të mirë karakteristikash dhe dekodues protokolli, siç do të shohim më vonë.

Njësia e kapjes hyrëse të Arduino UNO mund të konfigurohet për të përdorur ndarje të ndryshme të orës, duke zvogëluar kështu rezolucionin, por duke rritur vonesën para tejmbushjes. Gjithashtu mund të shkaktojë ngritje, rënie ose të dyja skajet për të filluar kapjen e të dhënave.

Hapi 2: Skica e Arduino UNO

Arduino UNO Sketch
Arduino UNO Sketch

Shkrova dhe përpilova skicën me Arduino IDE. Fillimisht fillova duke vendosur Timer1 në modalitetin e funksionimit "Normal" duke shkruar në regjistrat e tij TCCR1A dhe TCCR1B në konfigurimin (). Unë pastaj bëra disa funksione për të lehtësuar pak përdorimin e tij në të ardhmen, si ai për të vendosur ndarjen e orës të quajtur "setTim1PSC ()". Unë gjithashtu shkrova funksione për të aktivizuar dhe çaktivizuar njësinë e kapjes së hyrjes Timer1 dhe ndërprerjet e tejmbushjes.

Shtova grupin "mostra", i cili do të mbajë të dhënat e marra. Shtë një grup global që e vendosa në "të paqëndrueshëm" për të parandaluar që përpiluesi të bëjë optimizime dhe ta vendosë atë në flash, siç bënte gjatë përpilimeve të mia të para. Unë e përkufizova atë si një grup "uint16_t", pasi Timer1 është gjithashtu 16bit, me një gjatësi 810. Ne ndalojmë kapjen në 800 vlera, por pasi testi bëhet jashtë ndërprerjeve për arsye të dukshme të shpejtësisë, unë zgjodha të mbaj 10 më shumë vlera për të parandaluar tejmbushjen. Me disa ndryshore shtesë për pjesën tjetër të kodit, skica po përdor 1313 bajt (88%) të kujtesës, duke na lënë me 235 bajt RAM falas. Ne jemi tashmë në një përdorim të lartë të kujtesës dhe nuk doja të shtoja më shumë kapacitet mostre, pasi mund të shkaktonte sjellje të çuditshme për shkak të shumë pak hapësirës në kujtesë.

Në përpjekjen time për të rritur gjithmonë shpejtësinë e ekzekutimit, kam përdorur tregues të funksioneve në vend të deklaratave nëse ndodhin brenda ndërprerjeve, për të zvogëluar kohën e ekzekutimit të tyre në minimum. Pina e kapjes do të jetë gjithmonë Arduino UNO numri 8, pasi është e vetmja e lidhur me njësinë e kapjes së hyrjes së Timer1.

Procesi i kapjes është treguar në imazhin e mësipërm. Fillon kur Arduino UNO merr një kornizë të vlefshme të të dhënave UART, që përmban cilësimet e dëshiruara të kapjes. Ne pastaj i përpunojmë ato cilësime duke konfiguruar regjistrat e duhur për të kapur në skajin e zgjedhur dhe duke përdorur ndarjen e duhur të orës. Ne pastaj mundësojmë ndërprerjen PCINT0 (ndryshimi i pinit) për të zbuluar skajin e parë të sinjalit. Kur ta marrim, rivendosim vlerën Timer1, çaktivizojmë ndërprerjen PCINT0 dhe aktivizojmë ndërprerjen ICU (Input Capture Unit). Nga ai moment, çdo rënie/ngritje e skajit në sinjal (në varësi të konfigurimit të zgjedhur), do të shkaktojë njësinë e kapjes së hyrjes, duke kursyer kështu një vulë kohore të kësaj ngjarje në regjistrin ICR1 dhe duke ekzekutuar një ndërprerje. Në këtë ndërprerje ne vendosim vlerën e regjistrit ICR1 në grupin tonë "mostra" dhe rrisim indeksin për kapjen tjetër. Kur Timer1 ose grupi tejmbush, ne çaktivizojmë ndërprerjen e kapjes dhe i dërgojmë të dhënat përsëri në ndërfaqen e uebit përmes UART.

Vendosa të përdor një ndërprerje të ndryshimit të kunjave për të shkaktuar kapjen, pasi njësia e kapjes hyrëse lejon vetëm kapjen në njërën ose në skajin tjetër, jo të dyja. Gjithashtu shkakton një problem kur doni të kapni të dy skajet. Zgjidhja ime është atëherë të përmbys bitin që kontrollon përzgjedhjen e skajit në regjistrin e kontrollit të kapjes së hyrjes në secilën mostër të marrë. Në këtë mënyrë ne humbim shpejtësinë e ekzekutimit, por ne ende mund të përdorim funksionalitetet e njësisë së kapjes hyrëse.

Pra, siç mund ta keni vënë re, ne nuk e kapim me të vërtetë çdo mostër në intervale të caktuara kohore, por kapim momentin kur ndodh një kalim i sinjalit. Nëse do të kishim kapur një mostër në çdo cikël të orës, edhe me ndarjen më të lartë të orës, do ta kishim mbushur tamponin në afërsisht 0.1 sekonda, duke supozuar se po përdorim llojin uint8_t, i cili është më i vogli në kujtesë pa përdorur struktura.

Hapi 3: Ndërfaqja në internet dhe P5.js

Ndërfaqja në internet dhe P5.js
Ndërfaqja në internet dhe P5.js

Siç nënkupton edhe titulli, ndërfaqja në internet është bërë me ndihmën e p5.js. Për ata që nuk e dinë tashmë, ju rekomandoj që të shkoni dhe të kontrolloni faqen e internetit, pasi është një bibliotekë vërtet e mirë. Bazohet në Përpunim, është i lehtë për t’u përdorur, ju lejon të merrni rezultate të mira shumë shpejt dhe është i dokumentuar mirë. Për të gjitha ato arsye unë zgjodha këtë bibliotekë. Përdora gjithashtu bibliotekën quicksettings.js për menutë, grafica.js atë për të komplotuar të dhënat e mia dhe bibliotekën p5.serialport për të komunikuar me Arduino UNO.

Unë nuk do të shpenzoj shumë kohë në ndërfaqen, pasi sapo e kam projektuar për shikimin e të dhënave dhe kontrollin e cilësimeve, dhe gjithashtu sepse nuk ishte aspak subjekt i eksperimentit tim. Sidoqoftë, unë do të shpjegoj në pjesët e mëposhtme hapat e ndryshëm për të përdorur të gjithë sistemin, duke shpjeguar kështu kontrollet e ndryshme në dispozicion.

Hapi 4: Konfigurimi i sistemit

Gjëja e parë është të shkarkoni Arduino UNO dhe kodin e ndërfaqes këtu nëse nuk është bërë tashmë. Pastaj mund të riprogramoni bordin tuaj Arduino UNO me skicën "UNO_LS.ino" përmes Arduino IDE.

Ju duhet të keni shkarkuar programin p5.serialcontrol nga depoja e tij github. Ju duhet të merrni skedarin zip që përputhet me sistemin tuaj operativ (e testova vetëm në Windows). Nxirrni zip -in në një dosje, filloni ekzekutuesin që gjendet në të dhe lëreni ashtu. Mos u mundoni të lidheni me ndonjë port serik, thjesht lëreni të funksionojë në sfond, do të përdoret si stafetë.

Hapni dosjen "Ndërfaqja". Ju duhet të gjeni një skedar të quajtur "index.html". Hapeni atë në shfletuesin tuaj, është ndërfaqja në internet.

Dhe kjo eshte! Nuk keni nevojë të shkarkoni biblioteka shtesë, gjithçka duhet të përfshihet në paketën që kam ofruar.

Hapi 5: Lidhja, Konfigurimi dhe Blerja

Lidhja, Konfigurimi dhe Blerja
Lidhja, Konfigurimi dhe Blerja

Për të lidhur ndërfaqen me bordin Arduino UNO, thjesht zgjidhni portin përkatës në listë dhe shtypni butonin "Hap". Nëse operacioni ishte i suksesshëm, mesazhi "gjendje" duhet të shfaqë diçka si "COMX u hap".

Tani mund të zgjidhni opsionet tuaja të kapjes. E para është përzgjedhja e buzëve. Unë ju rekomandoj që të përdorni gjithmonë "Të dy", pasi do t'ju japë përfaqësimin më të mirë të sinjalit real. Nëse cilësimi "Të dy" nuk arrijnë të kapin sinjalin (nëse frekuenca e sinjalit është shumë e lartë për shembull), mund të provoni me cilësimin e skajit "Rising" ose "Falling", në varësi të sinjalit që përpiqeni të shihni.

Vendosja e dytë është ndarja e orës. Do t'ju japë rezolucionin në të cilin do të jeni në gjendje të kapni sinjalin. Ju mund të zgjidhni të vendosni faktorin e ndarjes me "8", "64", "256" dhe "1024". Bordi Arduino UNO përdor një kuarc 16MHz për të fikur mikrokontrolluesin, kështu që frekuenca e marrjes së mostrave do të jetë "16MHz/faktori i ndarjes". Kini kujdes me këtë cilësim, pasi gjithashtu do të përcaktojë për sa kohë do të jeni në gjendje të kapni një sinjal. Meqenëse Kohëmatësi1 është një kohëmatës 16bit, koha e kapjes e lejuar para tejmbushjes do të jetë "(2^16)*(faktori i ndarjes)/16MHz". Në varësi të cilësimit që keni zgjedhur, do të shkojë midis ms 33ms dhe 4.2s. Mbani zgjedhjen tuaj në mendjen tuaj, do t'ju duhet më vonë.

Cilësimi i fundit është anuluesi i zhurmës. Unë nuk kam kryer shumë testime mbi të, dhe nuk do të keni nevojë për të në 99% të rasteve, kështu që thjesht lini atë të pakontrolluar. Për ata që janë ende kuriozë për të, mund të kërkoni për anuluesin e zhurmës në pjesën Timer/Counter1 të fletës së të dhënave të ATMEGA328P.

Mos harroni të lidhni pinin e bordit Arduino UNO 8 me sinjalin tuaj dhe lidhni bazat së bashku për të pasur të njëjtën referencë të tensionit si për qarkun e testimit ashtu edhe për analizuesin logjik. Nëse keni nevojë për izolim të tokës, ose keni nevojë për të matur sinjale me nivele të ndryshme nga 5V, me siguri do t'ju duhet të shtoni një opto-izolues në qarkun tuaj.

Pasi gjithçka është konfiguruar saktë, mund të shtypni butonin "Fito".

Hapi 6: Regjistroni rezultatet dhe eksportoni të dhënat CSV

Kapni Rezultatet dhe Eksportoni të Dhënat CSV
Kapni Rezultatet dhe Eksportoni të Dhënat CSV

Sapo Arduino UNO juaj të përfundojë një regjistrim, ai automatikisht do t'i kthejë të dhënat në ndërfaqen e uebit, e cila do t'i komplotojë ato. Mund të zvogëloni ose zvogëloni me rrëshqitësin e duhur dhe të udhëtoni nëpër mostrat me atë të poshtëm.

Komploti ju jep vetëm një pamje paraprake dhe nuk ka mjete për analizën e të dhënave. Kështu, për të kryer analiza të mëtejshme mbi të dhënat tuaja, do t'ju duhet t'i importoni ato në PulseView.

Hapi i parë është të eksportoni një skedar csv që përmban të gjitha të dhënat tuaja. Për ta bërë këtë, ju vetëm duhet të klikoni në butonin "Eksport" nga ndërfaqja në internet. Ruani skedarin tuaj në një vend të njohur kur ju kërkohet.

Tani hapni PulseView. Në shiritin e menusë së sipërme, klikoni në "Hap" (ikona e dosjes) dhe zgjidhni "Importo vlera të ndara me presje …". Zgjidhni skedarin csv të krijuar më parë që përmban të dhënat tuaja.

Do të shfaqet një dritare e vogël. Lërini gjithçka ashtu siç është, ju vetëm duhet të modifikoni cilësimin "Samplerate" sipas faktorit të ndarjes së orës të zgjedhur për kapjen. Frekuenca e mostrës suaj do të jetë "16MHz/(faktori i ndarjes)". Pastaj klikoni në "Ok", sinjali juaj duhet të shfaqet në ekran.

Hapi 7: Analiza e sinjalit PulseView

Analiza e Sinjalit PulseView
Analiza e Sinjalit PulseView

PulseView përmban shumë dekodues protokolli. Për t'iu qasur atyre, klikoni në "Shto dekodues protokolli" në shiritin e menusë së sipërme (mjeti më i duhur). Për eksperimentin tim, sapo dërgova një mesazh të thjeshtë UART në 9600 bauds, kështu që kërkova "UART".

Do të shtojë një kanal me një etiketë në të majtë të tij (ashtu si ai për të dhënat tuaja). Duke klikuar në etiketë, mund të ndryshoni cilësimet e dekoduesit. Pasi zgjodha ato të duhurat, unë kam qenë në gjendje të marr të njëjtin mesazh si ai i dërguar nga pajisja ime e testimit. Kjo tregon se i gjithë sistemi funksionon ashtu siç pritej.

Hapi 8: Përfundimi

Përfundim
Përfundim

Edhe nëse projekti ishte, në fillim, një eksperiment, unë jam i kënaqur me rezultatet që mora. Unë kam qenë në gjendje të marr sinjale UART deri në 115200 baud në modalitetin e skajit "Të dy" pa asnjë problem, dhe madje kam arritur të shkoj deri në 230400 baud në modalitetin e skajit "Falling". Ju mund të shihni konfigurimin tim të testit në foton më lart.

Zbatimi im ka disa të meta, duke filluar nga fakti se ai mund të kapë vetëm një sinjal në të njëjtën kohë, pasi vetëm kunja 8 e Arduino UNO është "kapja e hyrjes e aftë". Nëse jeni duke kërkuar për një analizues logjik Arduino me më shumë kanale, shkoni të kontrolloni atë të Catoblepas.

Ju nuk mund të prisni që një Arduino UNO të jetë në gjendje të kapë sinjale me frekuenca të larta (disa MHz), pasi ajo është e akorduar vetëm në 16MHz (nëse dikush e bëri atë, do të isha i interesuar të shihja metodën e tij). Sidoqoftë, unë jam akoma i impresionuar nga rezultatet që mund të nxjerrim nga ky mikrokontrollues ATMEGA328P.

Unë nuk mendoj se do të bëj shumë punë në kod. Kam kryer eksperimentet e mia dhe kam marrë rezultatet që po kërkoja. Por nëse dikush dëshiron të kontribuojë, mos ngurroni të modifikoni dhe rishpërndani të gjithë ose një pjesë të kodit tim.

Ky ishte udhëzuesi im i parë, dhe mendoj se ishte i gjatë. Shpresoj se ka qenë një lexim interesant për ju.

Më tregoni nëse gjeni gabime, ose nëse keni ndonjë pyetje!

Recommended: