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, Septembar
Anonim
Arduino UNO njuškalo logike
Arduino UNO njuškalo logike

Ovaj projekat je počeo kao jednostavan eksperiment. Tokom istraživanja preko lista sa podacima ATMEGA328P za drugi projekat, 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 aplikaciji bi to moglo biti korisno i kako to testirati. Kako već neko vrijeme želim nabaviti logički analizator, odlučio sam isprobati jedan na mojoj Arduino UNO ploči, samo da isprobam funkciju i vidim možemo li iz nje izvući dobre rezultate.

Nisam samo ja imao tu ideju, a pronaći ćete ih mnogo 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,
  • Imajte grafičko sučelje,
  • Komunicirajte sa sučeljem putem USB -a,
  • Pokrenite ga 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 testirao pri većim brzinama).

Ovo uputstvo sadrži dijelove ovog projekta "kako to funkcionira" i "kako ga koristiti", pa za one koje tehnička strana ne zanima, možete direktno preći na korak 4.

Supplies

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

Trebat će vam:

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

Kod 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ćava 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 u sučelje istim putem.

Polako! Pa … Kako nisam baš dobar u programiranju interfejsa čovjeka/stroja ili web tehnologijama, moj je svakako pomalo ružan i grešan. Ali dozvoljava mi da započnem hvatanje i vraćam svoje podatke natrag, za što je i dizajniran, pa mislim da je to u redu. Za ozbiljnije analize, unosim svoje zapise u PulseView, koji je jednostavan za upotrebu i nudi dobar skup funkcija i dekodera protokola, kao što ćemo vidjeti kasnije.

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

Korak 2: Arduino UNO skica

Arduino UNO skica
Arduino UNO skica

Napisao sam i sastavio skicu sa Arduino IDE -om. Prvo sam postavio Timer1 u "normalnom" načinu rada upisivanjem u njegove TCCR1A i TCCR1B registre u setup (). Zatim sam napravio neke funkcije da malo olakšam 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 prelivanja.

Dodao sam niz "uzoraka", koji će sadržavati prikupljene 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 radio tokom mojih prvih kompilacija. Definirao sam ga kao "uint16_t" niz, jer je Timer1 također 16 -bitni, s dužinom od 810. Prestajemo snimati na 800 vrijednosti, ali kako se test radi izvan prekida iz 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 želji da uvijek povećam brzinu izvođenja, koristio sam pokazivače funkcija umjesto if naredbi unutar prekida, kako bih smanjio njihovo vrijeme izvođenja na minimum. Pin za hvatanje će uvijek biti Arduino UNO broj 8, jer je jedini spojen na ulaznu jedinicu za hvatanje Timer1.

Proces snimanja prikazan je na gornjoj slici. Počinje kada Arduino UNO primi važeći UART okvir podataka koji sadrži željene postavke snimanja. Zatim obrađujemo te postavke tako što konfiguriramo desne registre za hvatanje na odabranoj ivici i koristimo desnu podjelu sata. Zatim omogućujemo prekid PCINT0 (promjena pina) za otkrivanje prve ivice 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 dopušta snimanje samo s jedne ili druge ivice, ne oboje. Također uzrokuje problem kada želite snimiti obje ivice. Moje rješenje je tada bilo invertiranje bita koji kontrolira odabir rubova u registru kontrole snimanja ulaza pri svakom dohvaćenom uzorku. Na taj način gubimo brzinu izvršavanja, 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 sa najvećom taktičkom podjelom, napunili bismo bafer 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. Zasnovan je na obradi, jednostavan je za upotrebu, omogućava vam vrlo brzo postizanje dobrih rezultata i dobro je dokumentiran. Iz svih tih razloga odabrao sam ovu biblioteku. Takođe sam koristio biblioteku quicksettings.js za menije, onu grafica.js za iscrtavanje mojih podataka i biblioteku p5.serialport za komunikaciju sa 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 bio predmet mog eksperimenta. Međutim, u sljedećim dijelovima ću objasniti različite korake za korištenje cijelog sistema, objašnjavajući tako različite dostupne kontrole.

Korak 4: Postavljanje sistema

Prva stvar je preuzeti ovdje 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 njegovog github spremišta. Morate nabaviti zip datoteku koja odgovara vašem operativnom sistemu (testirao sam je samo na Windowsu). Izvucite zip u mapu, pokrenite izvršnu datoteku koja se u njoj nalazi i ostavite je tako. Ne pokušavajte se povezati na bilo koji serijski port, samo ga ostavite da radi u pozadini, on će se koristiti kao relej.

Otvorite fasciklu "Interface". 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 biblioteke, sve bi trebalo biti uključeno u paket koji sam dao.

Korak 5: Povezivanje, konfiguracija i akvizicija

Povezivanje, konfiguracija i akvizicija
Povezivanje, konfiguracija i akvizicija

Za povezivanje 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 opcije snimanja. Prvo je odabir ruba. Preporučujem vam da uvijek koristite "Oba", jer će vam to na najbolji način prikazati pravi signal. Ako postavka "Oboje" ne uspije uhvatiti signal (ako je frekvencija signala previsoka, na primjer), možete pokušati s postavkama "Uzdižuća se" ili "Padajuća" ivica, ovisno o signalu koji pokušavate vidjeti.

Druga postavka je podjela sata. To će vam dati rezoluciju na kojoj ćete moći snimiti signal. Faktor podjele možete izabrati sa "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 ona 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 Tajmer/brojač1 u podatkovnom listu ATMEGA328P.

Ne zaboravite spojiti pin 8 Arduino UNO ploče na vaš signal i spojiti uzemljenje zajedno 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 morati dodati opto-izolator u svoje kolo.

Nakon što je sve ispravno konfigurirano, možete pritisnuti dugme "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 uveć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 "Izvezi" na web sučelju. Sačuvajte datoteku na poznatoj lokaciji kada se to od vas zatraži.

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 je, 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

PulseView analiza signala
PulseView analiza signala

PulseView sadrži mnogo dekodera protokola. Da biste im pristupili, kliknite na "Dodaj protokolarni dekoder" na gornjoj traci menija (najdesniji alat). Za svoj eksperiment, upravo sam poslao jednostavnu UART poruku na 9600 bauda, pa sam potraž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 preuzeti istu poruku kao onu koju je poslao moj testni uređaj. Ovo pokazuje da cijeli sistem 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 neko učinio, bilo bi mi zanimljivo vidjeti njegovu metodu). Međutim, i dalje sam impresioniran rezultatima koje možemo postići s ovim ATMEGA328P mikrokontrolerom.

Ne mislim da ću puno raditi na kodu. Sproveo sam svoje eksperimente i dobio rezultate koje sam tražio. Ali ako neko želi dati svoj doprinos, 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čuje se: