Sadržaj:

Arduino UNO Logički njuškalo: 8 koraka (sa slikama)
Arduino UNO Logički njuškalo: 8 koraka (sa slikama)

Video: Arduino UNO Logički njuškalo: 8 koraka (sa slikama)

Video: Arduino UNO Logički njuškalo: 8 koraka (sa slikama)
Video: CS50 2015 - Week 10 2024, Studeni
Anonim
Arduino UNO njuškalo logike
Arduino UNO njuškalo logike

Ovaj je projekt započeo kao jednostavan eksperiment. Tijekom istraživanja o podatkovnom listu ATMEGA328P za neki drugi projekt otkrio sam nešto prilično zanimljivo. Jedinica za snimanje ulaza Timer1. Omogućuje mikrokontroleru našeg Arduino UNO -a da detektira rub signala, pohrani vremensku oznaku i pokrene prekid, sve u hardveru.

Zatim sam se pitao u kojoj bi aplikaciji to moglo biti korisno i kako to testirati. Budući da već neko vrijeme želim nabaviti logički analizator, odlučio sam pokušati ga implementirati u svoju Arduino UNO ploču, samo da isprobam značajku i vidim možemo li iz nje izvući dobre rezultate.

Nisam samo ja imao tu ideju, a pronaći ćete ih puno samo guglanjem "Arduino Logic Analyzer". Na početku projekta, koji je tek počeo kao eksperiment, nisam bio ni svjestan da su ljudi već uspjeli, i bio sam impresioniran dobrim rezultatima koje su postigli s ovim malim komadom hardvera. Međutim, nisam mogao pronaći drugi projekt pomoću jedinice za snimanje ulaza, pa ako ste ovo već vidjeli, javite mi!

Ukratko, moj logički analizator će:

  • Imajte jedan kanal,
  • Imati grafičko sučelje,
  • Komunicirajte sa sučeljem putem USB -a,
  • Pokrenite na Arduino UNO ploči.

Konačno će imati memorijsku dubinu od 800 uzoraka i uspio je uspješno snimiti UART poruku od 115200 bauda (nisam je stvarno testirao pri većim brzinama).

Ova instrukcija sadrži dijelove ovog projekta "kako to radi" i "kako je koristiti", pa za one koje tehnička strana ne zanima, možete izravno prijeći na korak 4.

Pribor

Htio sam analizator učiniti što jednostavnijim, pa mi je bilo potrebno jako malo hardvera.

Trebat će vam:

  • Arduino UNO ploča (ili ekvivalentna ako se oslanja na ATMEGA328P MCU),
  • Računalo,
  • Nešto za otklanjanje pogrešaka (druga Arduino UNO ploča radi dobro za neka testiranja).

Kôd za Arduino UNO i web sučelje možete pronaći ovdje. Trebat će vam i softver p5.serialcontrol i PulseView.

Korak 1: Princip rada

Princip rada
Princip rada

Ideja je jednostavna. Vi birate postavke snimanja i kliknite na "pribavi". Web sučelje će ih poslati u softver p5.serialcontrol, koji nam omogućuje korištenje serijskog sučelja iz preglednika jer mu ne može izravno pristupiti. Softver p5.serialcontrol zatim prenosi informacije na Arduino UNO ploču, koja bilježi podatke i šalje ih natrag na sučelje istim putem.

Lako! Pa … Kako nisam baš dobar u programiranju sučelja čovjek/stroj ili web tehnologijama, moj je zasigurno pomalo ružan i grešan. Ali dopušta mi da započnem hvatanje i vraćam svoje podatke natrag, za što je i dizajniran, pa mislim da je u redu. Za ozbiljnije analize, unosim svoje zapise u PulseView, koji je jednostavan za korištenje i nudi dobar skup značajki i dekodera protokola, što ćemo vidjeti kasnije.

Arduino UNO jedinica za hvatanje ulaza može se konfigurirati za korištenje različitih podjela sata, čime se smanjuje razlučivost, ali povećava kašnjenje prije prelijevanja. Također može pokrenuti podizanje, padanje ili oba ruba za početak snimanja podataka.

Korak 2: Arduino UNO skica

Arduino UNO skica
Arduino UNO skica

Napisao sam i sastavio skicu s Arduino IDE -om. Prvo sam započeo postavljanjem Timer1 u "normalni" način rada upisivanjem u njegove TCCR1A i TCCR1B registre u setup (). Zatim sam napravio neke funkcije kako bih malo olakšao njegovu upotrebu u budućnosti, poput one za postavljanje podjele sata pod nazivom "setTim1PSC ()". Napisao sam i funkcije za aktiviranje i deaktiviranje Timer1 jedinice za snimanje ulaza i prekide prelijevanja.

Dodao sam niz "uzoraka", koji će držati stečene podatke. To je globalni niz koji sam postavio na "volatile" kako bih spriječio kompajler da izvrši optimizaciju i stavio ga u flash, kao što je to činio tijekom mojih prvih kompilacija. Definirao sam ga kao "uint16_t" niz, budući da je Timer1 također 16 -bitni, s duljinom 810. Prestajemo snimati na 800 vrijednosti, ali kako se test radi izvan prekida zbog očiglednih razloga brzine, odlučio sam zadržati 10 više vrijednosti za sprječavanje prelijevanja. S nekoliko dodatnih varijabli za ostatak koda, skica koristi 1313 bajtova (88%) memorije, ostavljajući nam 235 bajtova slobodne RAM -a. Već imamo veliku potrošnju memorije i nisam želio dodati dodatni uzorak jer bi to moglo uzrokovati čudna ponašanja zbog premalo memorijskog prostora.

U potrazi za uvijek povećanjem brzine izvođenja, koristio sam pokazivače funkcija umjesto if naredbi unutar prekida, kako bih smanjio njihovo vrijeme izvođenja na minimum. Pin za hvatanje uvijek će biti Arduino UNO broj 8, jer je jedini spojen na ulaznu jedinicu za hvatanje Timer1.

Postupak snimanja prikazan je na gornjoj slici. Počinje kada Arduino UNO primi valjani UART podatkovni okvir koji sadrži željene postavke snimanja. Zatim te postavke obrađujemo konfiguriranjem desnih registara za hvatanje na odabranom rubu i korištenjem desne podjele sata. Zatim omogućujemo prekid PCINT0 (promjena pina) za otkrivanje prvog ruba signala. Kad ga dobijemo, resetiramo vrijednost Timer1, onemogućujemo prekid PCINT0 i omogućujemo prekid ICU (Input Capture Unit). Od tog trenutka, svaki padajući/rastući rub signala (ovisno o odabranoj konfiguraciji) aktivirat će ulaznu jedinicu za snimanje, čime se sprema vremenska oznaka ovog događaja u ICR1 registar i izvršava prekid. U ovom prekidu stavljamo vrijednost registra ICR1 u naš niz "uzoraka" i povećavamo indeks za sljedeće hvatanje. Kad se Timer1 ili niz preplave, onemogućujemo prekid snimanja i šaljemo podatke natrag na web sučelje putem UART -a.

Odlučio sam upotrijebiti prekid promjene pin -a za pokretanje snimanja, jer jedinica za snimanje ulaza omogućuje snimanje samo s jednog ili drugog ruba, ne oboje. Također uzrokuje problem kada želite snimiti oba ruba. Moje je rješenje tada bilo invertiranje bita koji kontrolira odabir rubova u registru kontrole snimanja ulaza pri svakom dohvaćenom uzorku. Na taj način gubimo brzinu izvođenja, ali i dalje možemo koristiti funkcionalnosti jedinice za snimanje ulaza.

Dakle, kao što ste možda primijetili, ne snimamo svaki uzorak u određenim vremenskim intervalima, već bilježimo trenutak u kojem se događa prijelaz signala. Da smo uhvatili jedan uzorak u svakom ciklusu takta, čak i s najvišom podjelom takta, napunili bismo međuspremnik za otprilike 0,1 s, pod pretpostavkom da koristimo tip uint8_t, koji je najmanji u memoriji bez upotrebe struktura.

Korak 3: Web sučelje i P5.js

Web sučelje i P5.js
Web sučelje i P5.js

Kao što naslov implicira, web sučelje je napravljeno uz pomoć p5.js. Za one koji to još ne znaju, toplo vam preporučujem da posjetite web stranicu jer je to zaista dobra biblioteka. Temelji se na obradi, jednostavan je za upotrebu, omogućuje vam vrlo brzo postizanje dobrih rezultata i dobro je dokumentiran. Iz svih tih razloga odabrao sam ovu knjižnicu. Također sam koristio knjižnicu quicksettings.js za izbornike, onu grafica.js za iscrtavanje mojih podataka, a knjižnicu p5.serialport za komunikaciju s Arduino UNO.

Neću trošiti previše vremena na sučelje jer sam ga upravo dizajnirao za pregled podataka i kontrolu postavki, a i zato što to uopće nije bilo predmet mog eksperimenta. U sljedećim dijelovima ću objasniti različite korake za korištenje cijelog sustava, objašnjavajući tako različite dostupne kontrole.

Korak 4: Postavljanje sustava

Prvo je ovdje preuzeti Arduino UNO i kod sučelja ako to već nije učinjeno. Zatim možete reprogramirati svoju Arduino UNO ploču sa skicom "UNO_LS.ino" kroz Arduino IDE.

Trebali ste preuzeti softver p5.serialcontrol iz njegova github spremišta. Morate nabaviti zip datoteku koja odgovara vašem operativnom sustavu (testirao sam je samo na Windowsima). Raspakirajte zip u mapu, pokrenite izvršnu datoteku koja se u njoj nalazi i ostavite je tako. Ne pokušavajte se spojiti na bilo koji serijski port, samo ga ostavite da radi u pozadini, on će se koristiti kao relej.

Otvorite mapu "Sučelje". Trebali biste pronaći datoteku pod nazivom "index.html". Otvorite ga u svom pregledniku, to je web sučelje.

I to je to! Ne morate preuzimati dodatne knjižnice, sve bi trebalo biti uključeno u paket koji sam dao.

Korak 5: Povezivanje, konfiguracija i stjecanje

Povezivanje, konfiguracija i stjecanje
Povezivanje, konfiguracija i stjecanje

Za spajanje sučelja na Arduino UNO ploču, samo odaberite odgovarajući port na popisu i pritisnite gumb "Otvori". Ako je operacija bila uspješna, poruka "stanje" trebala bi prikazati nešto poput "COMX otvoren".

Sada možete odabrati mogućnosti snimanja. Prvo je odabir ruba. Preporučujem vam da uvijek koristite "Oboje" jer će vam to na najbolji način prikazati pravi signal. Ako postavka "Oboje" ne uspije uhvatiti signal (na primjer, ako je frekvencija signala previsoka), možete pokušati s postavkama "Rising" ili "Falling" edge, ovisno o signalu koji pokušavate vidjeti.

Druga postavka je podjela sata. To će vam dati razlučivost pri kojoj ćete moći snimiti signal. Faktor podjele možete odabrati s "8", "64", "256" i "1024". Arduino UNO ploča koristi kvarc od 16 MHz za taktiranje mikrokontrolera, pa će frekvencija uzorkovanja biti "16MHz/faktor podjele". Budite oprezni s ovom postavkom jer će također odrediti koliko dugo ćete moći snimati signal. Kako je Timer1 16 -bitni mjerač vremena, vrijeme snimanja dopušteno prije prelijevanja bit će "(2^16)*(faktor podjele)/16MHz". Ovisno o postavci koju ste odabrali, ona će se kretati između ~ 33ms i 4.2s. Imajte na umu svoj izbor, trebat će vam kasnije.

Posljednja postavka je poništavanje buke. Nisam proveo mnogo testiranja na njemu i neće vam trebati u 99% slučajeva, pa ga ostavite neoznačenim. Za one koji su još uvijek znatiželjni u vezi s tim, možete potražiti prigušivač buke u odjeljku Timer/Counter1 u podatkovnom listu ATMEGA328P.

Ne zaboravite spojiti pin 8 Arduino UNO ploče na vaš signal i spojiti uzemljenje kako biste imali istu referentnu vrijednost napona i za ispitni krug i za logički analizator. Ako vam je potrebna izolacija uzemljenja ili trebate mjeriti signale s razinama različitim od 5V, vjerojatno ćete u svoj krug morati dodati opto-izolator.

Nakon što je sve ispravno konfigurirano, možete pritisnuti gumb "Nabavi".

Korak 6: Zabilježite rezultate i izvoz CSV podataka

Snimanje rezultata i izvoz CSV podataka
Snimanje rezultata i izvoz CSV podataka

Nakon što vaš Arduino UNO završi snimanje, automatski će poslati podatke na web sučelje koje će ih iscrtati. Desnim klizačem možete povećati ili umanjiti prikaz, a donjim proći kroz uzorke.

Radnja vam daje samo pregled i nema alate za analizu podataka. Stoga ćete za daljnju analizu svojih podataka morati uvesti podatke u PulseView.

Prvi korak je izvoz csv datoteke koja sadrži sve vaše podatke. Da biste to učinili, samo trebate kliknuti gumb "Izvoz" na web sučelju. Kad se to od vas zatraži, spremite datoteku na poznato mjesto.

Sada otvorite PulseView. Na gornjoj traci izbornika kliknite "Otvori" (ikona mape) i odaberite "Uvezi vrijednosti odvojene zarezima …". Odaberite prethodno generiranu csv datoteku koja sadrži vaše podatke.

Pojavit će se mali prozor. Ostavite sve kako jest, samo trebate promijeniti postavku "Samplerate" prema faktoru podjele sata koji je odabran za snimanje. Vaša frekvencija uzorkovanja bit će "16MHz/(faktor podjele)". Zatim kliknite na "Ok", vaš signal bi se trebao pojaviti na ekranu.

Korak 7: Analiza signala PulseView

Analiza signala PulseView
Analiza signala PulseView

PulseView sadrži mnogo dekodera protokola. Da biste im pristupili, kliknite "Dodaj protokolarni dekoder" na gornjoj traci izbornika (najdesniji alat). Za svoj sam eksperiment upravo poslao jednostavnu UART poruku na 9600 bauda, pa sam tražio "UART".

Dodati će kanal s oznakom s lijeve strane (baš poput one za vaše podatke). Klikom na oznaku možete promijeniti postavke dekodera. Nakon što sam odabrao prave, uspio sam dohvatiti istu poruku kao onu koju je poslao moj testni uređaj. To pokazuje da cijeli sustav radi prema očekivanjima.

Korak 8: Zaključak

Zaključak
Zaključak

Čak i ako je projekt na početku bio eksperiment, zadovoljan sam postignutim rezultatima. Uspio sam bez problema uzorkovati UART signale na do 115200 bauda u "Oba" rubnom načinu rada, a čak sam uspio preći i do 230400 bauda u "padajućem" rubnom načinu rada. Moje gornje postavke možete vidjeti na gornjoj slici.

Moja implementacija ima nekoliko nedostataka, počevši od činjenice da može hvatati samo jedan signal odjednom, budući da je samo pin 8 Arduino UNO -a "sposoban za hvatanje ulaza". Ako tražite Arduino logički analizator s više kanala, provjerite Catoblepasov.

Ne možete očekivati da će Arduino UNO moći hvatati signale s visokim frekvencijama (neki MHz), jer radi samo na 16MHz (ako je to netko učinio, bilo bi mi zanimljivo vidjeti njegovu metodu). Međutim, i dalje sam impresioniran rezultatima koje možemo postići s ovim mikrokontrolerom ATMEGA328P.

Mislim da neću puno raditi na kodu. Proveo sam svoje pokuse i dobio rezultate koje sam tražio. No ako netko želi pridonijeti, slobodno izmijenite i distribuirajte cijeli ili dio mog koda.

To je bio moj prvi Instructable, i mislim da je bio dug. Nadam se da vam je ovo zanimljivo štivo.

Javite mi ako pronađete greške ili ako imate bilo kakvo pitanje!

Preporučeni: