Cuprins:

Arduino UNO Logic Sniffer: 8 pași (cu imagini)
Arduino UNO Logic Sniffer: 8 pași (cu imagini)

Video: Arduino UNO Logic Sniffer: 8 pași (cu imagini)

Video: Arduino UNO Logic Sniffer: 8 pași (cu imagini)
Video: Arduino for Beginners, 10 projects 2024, Noiembrie
Anonim
Arduino UNO Logic Sniffer
Arduino UNO Logic Sniffer

Acest proiect a început ca un simplu experiment. În timpul cercetărilor mele asupra fișei tehnice ATMEGA328P pentru un alt proiect, am găsit ceva destul de interesant. Unitatea de captare a intrării Timer1. Permite microcontrolerului nostru Arduino UNO să detecteze o margine de semnal, să stocheze un timestamp și să declanșeze o întrerupere, totul în hardware.

M-am întrebat apoi în ce aplicație ar putea fi utilă și cum să o testez. Deoarece vreau să obțin un analizor logic de ceva timp acum, am decis să încerc să implementez unul pe placa mea Arduino UNO, doar pentru a testa caracteristica și pentru a vedea dacă putem obține rezultate bune din aceasta.

Nu sunt singurul care a avut această idee și veți găsi o mulțime de ele doar prin googling „Arduino Logic Analyzer”. La începutul proiectului, deoarece tocmai a început ca un experiment, nici măcar nu eram conștient de faptul că oamenii l-au realizat deja și am fost impresionat de rezultatele bune pe care le-au obținut cu această mică piesă de hardware. Cu toate acestea, nu am putut găsi un alt proiect folosind unitatea de captură de intrare, așa că, dacă ați văzut deja acest lucru, anunțați-mă!

Pentru a rezuma, analizatorul meu logic va:

  • Au un singur canal,
  • Aveți o interfață grafică,
  • Comunicați cu interfața prin USB,
  • Rulați pe o placă Arduino UNO.

În cele din urmă va avea o adâncime de memorie de 800 de eșantioane și a reușit să capteze cu succes un mesaj UART de 115200 bauds (nu l-am testat cu adevărat la viteze mai mari).

Acest instructable conține atât „cum funcționează”, cât și „cum se folosește” părțile acestui proiect, astfel încât pentru cei care nu sunt interesați de partea tehnică, puteți trece direct la pasul 4.

Provizii

Am vrut să păstrez analizorul cât mai simplu posibil, necesitând foarte puțin hardware.

Vei avea nevoie:

  • O placă Arduino UNO (sau echivalentă, atâta timp cât se bazează pe ATMEGA328P MCU),
  • Un calculator,
  • Ceva de depanat (o altă placă Arduino UNO funcționează bine pentru a face unele testări).

Codul atât pentru Arduino UNO cât și pentru interfața web poate fi găsit aici. De asemenea, veți avea nevoie de p5.serialcontrol și de software-ul PulseView.

Pasul 1: Principiul de lucru

Principiul de funcționare
Principiul de funcționare

Ideea este simplă. Alegeți setările de captare și faceți clic pe „dobândiți”. Interfața web le va trimite către software-ul p5.serialcontrol, care ne permite să folosim interfața serială dintr-un browser, deoarece nu o poate accesa direct. Software-ul p5.serialcontrol transmite apoi informațiile către placa Arduino UNO, care captează datele și le trimite înapoi la interfață prin aceeași cale.

Uşor! Ei bine … Întrucât nu mă pricep la programarea interfeței Uman / Mașină sau la tehnologiile web, al meu este cu siguranță un pic urât și buggy. Dar îmi permite să încep o captură și să recuperez datele înapoi, pentru care a fost conceput, așa că cred că este bine. Pentru o analiză mai serioasă, îmi import înregistrările în PulseView, care este ușor de utilizat și oferă un set bun de caracteristici și decodificatoare de protocol, așa cum vom vedea mai târziu.

Unitatea de captare a intrării Arduino UNO poate fi configurată pentru a utiliza diferite divizii de ceas, reducând astfel rezoluția, dar crescând întârzierea înainte de revărsare. De asemenea, poate declanșa creșterea, scăderea sau ambele margini pentru a începe capturarea datelor.

Pasul 2: Arduino UNO Sketch

Arduino UNO Sketch
Arduino UNO Sketch

Am scris și compilat schița cu IDE Arduino. Am început mai întâi prin configurarea Timer1 în modul de operare „Normal”, scriind în registrele sale TCCR1A și TCCR1B din setare (). Apoi am făcut câteva funcții pentru a ușura puțin utilizarea sa în viitor, cum ar fi cea de a seta diviziunea de ceas numită "setTim1PSC ()". De asemenea, am scris funcții pentru activarea și dezactivarea unității de captare a intrării Timer1 și întreruperile de depășire.

Am adăugat matricea „samples”, care va păstra datele achiziționate. Este un tablou global pe care l-am setat la „volatil” pentru a împiedica compilatorul să facă optimizări și să-l pună în bliț, așa cum se întâmpla în timpul primelor mele compilări. L-am definit ca o matrice "uint16_t", deoarece Timer1 are și el 16 biți, cu o lungime de 810. Ne oprim capturarea la 800 de valori, dar deoarece testul se face în afara întreruperilor din motive evidente de viteză, am ales să păstrez 10 mai multe valori pentru a preveni revărsarea. Cu câteva variabile suplimentare pentru restul codului, schița folosește 1313 octeți (88%) de memorie, lăsându-ne cu 235 octeți de memorie RAM gratuită. Suntem deja la o utilizare ridicată a memoriei și nu am vrut să adaug mai multă capacitate de eșantionare, deoarece ar putea provoca comportamente ciudate din cauza spațiului de memorie prea mic.

În căutarea mea de a crește întotdeauna viteza de execuție, am folosit indicatoare funcționale în loc de instrucțiuni if din interiorul întreruperilor, pentru a reduce timpul de execuție la minimum. Pinul de captură va fi întotdeauna numărul Arduino UNO 8, deoarece este singurul conectat la unitatea de captare a intrării Timer1.

Procesul de captare este afișat pe imaginea de mai sus. Începe când Arduino UNO primește un cadru de date UART valid, care conține setările de captare dorite. Apoi procesăm aceste setări configurând registrele potrivite pentru a captura pe marginea aleasă și folosim diviziunea ceasului potrivit. Apoi activăm întreruperea PCINT0 (pin change) pentru a detecta prima margine de semnal. Când o obținem, resetăm valoarea Timer1, dezactivăm întreruperea PCINT0 și activăm întreruperea ICU (Input Capture Unit). Din acel moment, orice margine de cădere / creștere a semnalului (în funcție de configurația aleasă), va declanșa unitatea de captare a intrării, salvând astfel un timestamp al acestui eveniment în registrul ICR1 și executând o întrerupere. În această întrerupere, punem valoarea registrului ICR1 în matricea „eșantioane” și creștem indexul pentru următoarea captură. Când Timer1 sau matricea se revarsă, dezactivăm întreruperea de captură și trimitem datele înapoi la interfața web prin UART.

Am decis să folosesc o întrerupere de schimbare a pinului pentru a declanșa captura, deoarece unitatea de captare de intrare permite doar captarea pe una sau pe alta margine, nu pe ambele. De asemenea, cauzează o problemă atunci când doriți să capturați ambele margini. Soluția mea a fost apoi de a inversa bitul care controlează selecția marginii în registrul de control al capturii de intrare la fiecare eșantion recuperat. Astfel pierdem viteza de execuție, dar putem folosi în continuare funcționalitățile unității de captare a intrării.

Deci, după cum ați observat, nu captăm cu adevărat fiecare eșantion la intervale fixe de timp, ci captăm momentul în care se întâmplă o tranziție a semnalului. Dacă am fi capturat câte un eșantion la fiecare ciclu de ceas, chiar și cu cea mai mare diviziune de ceas, am fi umplut tamponul în aproximativ 0,1 secunde, presupunând că folosim tipul uint8_t, care este cel mai mic din memorie fără a utiliza structuri.

Pasul 3: Interfață web și P5.js

Interfață web și P5.js
Interfață web și P5.js

După cum sugerează titlul, interfața web a fost realizată cu ajutorul p5.js. Pentru cei care nu o știu deja, vă recomand cu mare drag să vizitați site-ul web, deoarece este o bibliotecă foarte bună. Se bazează pe procesare, este ușor de utilizat, vă permite să obțineți rezultate bune foarte repede și este bine documentat. Din toate aceste motive am ales această bibliotecă. Am folosit, de asemenea, biblioteca quicksettings.js pentru meniuri, cea grafica.js pentru a grafica datele mele și biblioteca p5.serialport pentru a comunica cu Arduino UNO.

Nu voi petrece prea mult timp pe interfață, deoarece am conceput-o doar pentru previzualizarea datelor și controlul setărilor și, de asemenea, pentru că nu a fost deloc subiectul experimentului meu. Cu toate acestea, voi explica în următoarele părți diferiții pași pentru utilizarea întregului sistem, explicând astfel diferitele controale disponibile.

Pasul 4: Configurarea sistemului

Primul lucru este să descărcați Arduino UNO și codul de interfață aici, dacă nu s-a făcut deja. Apoi vă puteți reprograma placa Arduino UNO cu schița „UNO_LS.ino” prin ID-ul Arduino.

Ar fi trebuit să descărcați software-ul p5.serialcontrol din depozitul său github. Trebuie să obțineți fișierul zip care să corespundă sistemului dvs. de operare (l-am testat doar pe Windows). Extrageți fișierul zip într-un folder, porniți executabilul găsit în el și lăsați-l așa. Nu încercați să vă conectați la niciun port serial, doar lăsați-l să ruleze în fundal, va fi folosit ca releu.

Deschideți folderul „Interfață”. Ar trebui să găsiți un fișier numit „index.html”. Deschideți-l în browserul dvs., este interfața web.

Si asta e! Nu este nevoie să descărcați biblioteci suplimentare, totul ar trebui să fie inclus în pachetul pe care l-am furnizat.

Pasul 5: Conexiune, configurare și achiziție

Conexiune, configurare și achiziție
Conexiune, configurare și achiziție

Pentru a conecta interfața la placa Arduino UNO, trebuie doar să selectați portul corespunzător din listă și să apăsați butonul „Deschidere”. Dacă operațiunea a avut succes, mesajul „stare” ar trebui să afișeze ceva de genul „COMX deschis”.

Acum puteți alege opțiunile de captură. În primul rând este selecția de margine. Vă recomand să utilizați întotdeauna „Ambele”, deoarece vă va oferi cea mai bună reprezentare a semnalului real. Dacă setarea „Ambele” nu reușește să capteze semnalul (dacă frecvența semnalului este prea mare, de exemplu), puteți încerca fie cu setarea marginii „Rising”, fie „Falling”, în funcție de semnalul pe care încercați să-l vedeți.

A doua setare este divizarea ceasului. Vă va oferi rezoluția la care veți putea capta semnalul. Puteți alege să setați factorul de împărțire cu „8”, „64”, „256” și „1024”. Placa Arduino UNO utilizează un cuarț de 16 MHz pentru a monitoriza microcontrolerul, astfel încât frecvența de eșantionare va fi „16 MHz / factor de divizare”. Aveți grijă la această setare, deoarece va determina și pentru cât timp veți putea capta un semnal. Deoarece Timer1 este un temporizator de 16 biți, timpul de captură permis înainte de revărsare va fi „(2 ^ 16) * (factor de diviziune) / 16 MHz”. În funcție de setarea pe care ați ales-o, aceasta va varia între ~ 33ms și 4.2s. Păstrați-vă alegerea în minte, veți avea nevoie de ea mai târziu.

Ultima setare este eliminarea zgomotului. Nu am efectuat multe teste și nu veți avea nevoie de el în 99% din cazuri, așa că lăsați-l necontrolat. Pentru cei care sunt încă curioși în acest sens, puteți căuta eliminatorul de zgomot în secțiunea Timer / Counter1 din foaia de date a ATMEGA328P.

Nu uitați să conectați pinul 8 al plăcii Arduino UNO la semnalul dvs. și să conectați terenurile împreună pentru a avea aceeași referință de tensiune atât pentru circuitul de testare, cât și pentru analizorul logic. Dacă aveți nevoie de izolarea la sol sau trebuie să măsurați semnale cu niveluri diferite de 5V, probabil că va trebui să adăugați un opto-izolator la circuitul dvs.

Odată ce totul este configurat corect, puteți apăsa butonul „Achiziționează”.

Pasul 6: Capturați rezultatele și exportul de date CSV

Capturați rezultatele și exportul de date CSV
Capturați rezultatele și exportul de date CSV

Odată ce Arduino UNO termină o captură, acesta va trimite automat datele înapoi la interfața web, care le va grafica. Puteți mări sau micșora cu glisorul drept și puteți călători prin eșantioane cu cel de jos.

Complotul vă oferă doar o previzualizare și nu are instrumente de analiză a datelor. Astfel, pentru a efectua analize suplimentare asupra datelor dvs., va trebui să le importați în PulseView.

Primul pas este să exportați un fișier CSV care conține toate datele. Pentru a face acest lucru, trebuie doar să faceți clic pe butonul „Export” din interfața web. Salvați fișierul într-o locație cunoscută când vi se solicită.

Acum deschideți PulseView. În bara de meniu de sus, faceți clic pe „Deschideți” (pictograma folderului) și selectați „Importați valori separate prin virgulă …”. Selectați fișierul CSV generat anterior care conține datele dvs.

Va apărea o fereastră mică. Lăsați totul așa cum este, trebuie doar să modificați setarea „Samplerate” în funcție de factorul de divizare a ceasului ales pentru captură. Frecvența dvs. de eșantionare va fi „16 MHz / (factor de diviziune)”. Apoi faceți clic pe „Ok”, semnalul dvs. ar trebui să apară pe ecran.

Pasul 7: Analiza semnalului PulseView

Analiza semnalului PulseView
Analiza semnalului PulseView

PulseView dispune de o mulțime de decodoare de protocol. Pentru a le accesa, faceți clic pe „Adăugați un decodor de protocol” în bara de meniu de sus (instrumentul din dreapta). Pentru experimentul meu, tocmai am trimis un mesaj UART simplu la 9600 bauds, așa că am căutat „UART”.

Se va adăuga un canal cu o etichetă în partea stângă (la fel ca cel pentru datele dvs.). Făcând clic pe etichetă, puteți modifica setările decodorului. După alegerea celor potrivite, am reușit să recuperez același mesaj cu cel trimis de dispozitivul meu de testare. Aceasta arată că întregul sistem funcționează conform așteptărilor.

Pasul 8: Concluzie

Concluzie
Concluzie

Chiar dacă proiectul a fost, la început, un experiment, sunt mulțumit de rezultatele obținute. Am reușit să probez semnale UART la până la 115200 baud în modul de margine „Ambele” fără nici o problemă și am reușit chiar să urc până la 230400 de bauduri în modul de margine „Cadere”. Puteți vedea configurarea testului meu în imaginea de mai sus.

Implementarea mea are mai multe dezavantaje, începând de la faptul că poate capta un singur semnal la un moment dat, deoarece doar pinul 8 al Arduino UNO este „capabil de captură de intrare”. Dacă căutați un analizor logic Arduino cu mai multe canale, verificați-l pe unul din Catoblepas.

Nu vă puteți aștepta ca un Arduino UNO să poată captura semnale cu frecvențe înalte (unele MHz), deoarece este tactat doar la 16 MHz (dacă cineva ar face-o, aș fi interesat să văd metoda sa). Cu toate acestea, sunt încă impresionat de rezultatele pe care le putem obține din acest microcontroler ATMEGA328P.

Nu cred că voi lucra mult la cod. Mi-am condus experimentele și am obținut rezultatele pe care le căutam. Dar dacă cineva dorește să contribuie, nu ezitați să modificați și să redistribuiți integral sau parțial codul meu.

Acesta a fost primul meu instructabil și unul lung cred că. Sper că a fost o lectură interesantă pentru tine.

Spuneți-mi dacă găsiți erori sau dacă aveți vreo întrebare!

Recomandat: