Arduino UNO Logic Sniffer: 8 soļi (ar attēliem)
Arduino UNO Logic Sniffer: 8 soļi (ar attēliem)
Anonim
Arduino UNO Logic Sniffer
Arduino UNO Logic Sniffer

Šis projekts sākās kā vienkāršs eksperiments. Pētot ATMEGA328P datu lapu citam projektam, es atklāju kaut ko diezgan interesantu. Taimera 1 ievades uztveršanas vienība. Tas ļauj mūsu Arduino UNO mikrokontrolleram noteikt signāla malu, saglabāt laika zīmogu un izraisīt pārtraukumu, viss aparatūrā.

Tad es domāju, kurā lietojumprogrammā tas varētu būt noderīgs un kā to pārbaudīt. Tā kā es jau kādu laiku vēlos iegūt loģikas analizatoru, es nolēmu izmēģināt to ieviest savā Arduino UNO panelī, lai tikai pārbaudītu šo funkciju un pārbaudītu, vai mēs varam iegūt labus rezultātus.

Es neesmu vienīgais, kam radās šī ideja, un jūs atradīsit daudz tādu, vienkārši atrodot googlē "Arduino Logic Analyzer". Projekta sākumā, jo tas tikko sākās kā eksperiments, es pat nezināju, ka cilvēki to jau ir veikuši, un mani pārsteidza labie rezultāti, ko viņi sasniedza ar šo mazo aparatūru. Tomēr es nevarēju atrast citu projektu, izmantojot ievades uztveršanas vienību, tādēļ, ja jūs to jau esat redzējis, dariet man zināmu!

Rezumējot, mans loģikas analizators:

  • Ir viens kanāls,
  • Ir grafisks interfeiss,
  • Sazinieties ar saskarni, izmantojot USB,
  • Palaist uz Arduino UNO plates.

Tam beidzot būs 800 paraugu atmiņas dziļums, un tas varēja veiksmīgi uzņemt 115200 baudu UART ziņojumu (es to īsti nepārbaudīju ar lielāku ātrumu).

Šajā pamācībā ir iekļautas gan šī projekta daļas "kā tas darbojas", gan "kā to izmantot", tāpēc tiem, kurus neinteresē tehniskā puse, varat tieši pāriet uz 4. darbību.

Piegādes

Es gribēju, lai analizators būtu pēc iespējas vienkāršāks, tāpēc ir nepieciešams ļoti maz aparatūras.

Jums būs nepieciešams:

  • Arduino UNO plate (vai līdzvērtīga, ja vien tā balstās uz ATMEGA328P MCU),
  • Dators,
  • Ir kaut kas atkļūdojams (cita Arduino UNO plate darbojas labi, lai veiktu dažus testus).

Gan Arduino UNO, gan tīmekļa saskarnes kodu var atrast šeit. Jums būs nepieciešama arī p5serialcontrol un PulseView programmatūra.

1. darbība. Darba princips

Darba princips
Darba princips

Ideja ir vienkārša. Jūs izvēlaties uzņemšanas iestatījumus un noklikšķiniet uz "iegūt". Tīmekļa saskarne tos nosūtīs uz programmatūru p5.serialcontrol, kas ļauj mums izmantot seriālo saskarni no pārlūkprogrammas, jo tā nevar tai tieši piekļūt. Pēc tam programmatūra p5.serialcontrol pārsūta informāciju uz Arduino UNO plati, kas uztver datus, un pa to pašu ceļu nosūta tos atpakaļ uz saskarni.

Viegli! Nu … Tā kā es neesmu īsti labs cilvēka/mašīnas saskarnes programmēšanā vai tīmekļa tehnoloģijās, manējā noteikti ir nedaudz neglīta un kļūdaina. Bet tas ļauj man sākt uztveršanu un atgūt savus datus, kam tas ir paredzēts, tāpēc es domāju, ka tas ir labi. Nopietnākam analīzes darbam es importēju savus ierakstus PulseView, kas ir viegli lietojams un piedāvā labu funkciju un protokolu dekodētāju komplektu, kā mēs redzēsim vēlāk.

Arduino UNO ievades uztveršanas vienību var konfigurēt, lai izmantotu dažādus pulksteņa nodalījumus, tādējādi samazinot izšķirtspēju, bet palielinot aizkavi pirms pārplūdes. Tas var izraisīt arī pacelšanos, krišanu vai abas malas, lai sāktu datu uztveršanu.

2. darbība: Arduino UNO skice

Arduino UNO skice
Arduino UNO skice

Es uzrakstīju un apkopoju skici ar Arduino IDE. Es vispirms sāku, iestatot Timer1 “Normal” darbības režīmā, rakstot uz tā TCCR1A un TCCR1B reģistriem iestatījumos (). Pēc tam es izveidoju dažas funkcijas, lai mazliet atvieglotu tā izmantošanu nākotnē, piemēram, vienu, lai iestatītu pulksteņa sadalījumu ar nosaukumu "setTim1PSC ()". Es arī uzrakstīju funkcijas, lai aktivizētu un deaktivizētu ieejas uztveršanas vienību Timer1 un pārplūdes pārtraukumus.

Es pievienoju "paraugu" masīvu, kurā tiks glabāti iegūtie dati. Tas ir globāls masīvs, kuru es iestatīju kā “gaistošu”, lai neļautu kompilatoram veikt optimizāciju un nodot to zibspuldzei, kā tas tika darīts manu pirmo apkopojumu laikā. Es to definēju kā “uint16_t” masīvu, jo arī taimeris 1 ir 16 bitu garums 810. Mēs pārtraucam uztvert 800 vērtības, bet, tā kā acīmredzamu ātruma apsvērumu dēļ pārbaude tiek veikta ārpus pārtraukumiem, es izvēlējos saglabāt 10 vairāk vērtību, lai novērstu pārplūdi. Izmantojot dažus papildu mainīgos pārējā koda daļā, skice izmanto 1313 baitus (88%) atmiņas, atstājot mums 235 baitus brīvas RAM. Mēs jau izmantojam lielu atmiņas apjomu, un es negribēju pievienot vairāk parauga ietilpības, jo tas var izraisīt dīvainu uzvedību pārāk mazās atmiņas vietas dēļ.

Cenšoties vienmēr palielināt izpildes ātrumu, es izmantoju funkciju norādes, nevis paziņojumus pārtraukumos, lai samazinātu to izpildes laiku līdz minimumam. Uzņemšanas tapa vienmēr būs Arduino UNO numurs 8, jo tas ir vienīgais, kas ir savienots ar Timer1 ievades uztveršanas bloku.

Uzņemšanas process ir parādīts attēlā iepriekš. Tas sākas, kad Arduino UNO saņem derīgu UART datu rāmi, kurā ir vajadzīgie uztveršanas iestatījumi. Pēc tam mēs apstrādājam šos iestatījumus, konfigurējot pareizos reģistrus, lai tie tiktu uzņemti izvēlētajā malā, un izmantojam pareizo pulksteņa sadalījumu. Pēc tam mēs iespējojam PCINT0 (tapas maiņa) pārtraukšanu, lai noteiktu pirmo signāla malu. Kad mēs to iegūstam, mēs atiestatām Timer1 vērtību, atspējojam PCINT0 pārtraukumu un iespējojam ICU (Input Capture Unit) pārtraukšanu. No šī brīža jebkura signāla krītošā/augošā mala (atkarībā no izvēlētās konfigurācijas) aktivizēs ievades uztveršanas vienību, tādējādi saglabājot šī notikuma laika zīmogu ICR1 reģistrā un izpildot pārtraukumu. Šajā pārtraukumā mēs ievietojam ICR1 reģistra vērtību mūsu "paraugu" masīvā un palielinām indeksu nākamajai uzņemšanai. Kad taimeris1 vai masīvs pārplūst, mēs atspējojam uztveršanas pārtraukumu un nosūtām datus atpakaļ uz tīmekļa saskarni, izmantojot UART.

Es nolēmu izmantot tapas maiņas pārtraukumu, lai aktivizētu uztveršanu, jo ievades uztveršanas vienība ļauj uzņemt tikai vienā vai otrā malā, nevis abās. Tas arī rada problēmas, ja vēlaties uzņemt abas malas. Mans risinājums ir apgriezt bitu, kas kontrolē malu izvēli ievades uztveršanas kontroles reģistrā pie katra iegūtā parauga. Tādā veidā mēs zaudējam izpildes ātrumu, bet joprojām varam izmantot ievades uztveršanas vienības funkcijas.

Tātad, kā jūs, iespējams, pamanījāt, mēs patiešām neuzņemam katru paraugu noteiktos laika intervālos, bet mēs uztveram brīdi, kad notiek signāla pāreja. Ja mēs būtu ieguvuši vienu paraugu katrā pulksteņa ciklā, pat ar visaugstāko pulksteņa sadalījumu, mēs būtu piepildījuši buferi aptuveni 0, 1 sekundēs, pieņemot, ka mēs izmantojām tipu uint8_t, kas ir mazākais atmiņā, neizmantojot struktūras.

3. darbība: tīmekļa saskarne un P5.js

Tīmekļa saskarne un P5.js
Tīmekļa saskarne un P5.js

Kā norāda nosaukums, tīmekļa saskarne tika izveidota ar p5.js palīdzību. Tiem, kas to vēl nezina, es ļoti iesaku jums doties un pārbaudīt vietni, jo tā ir patiešām laba bibliotēka. Tas ir balstīts uz apstrādi, ir viegli lietojams, ļauj ļoti ātri iegūt labus rezultātus un ir labi dokumentēts. Visu šo iemeslu dēļ es izvēlējos šo bibliotēku. Izvēlnēm izmantoju arī bibliotēku quicksettings.js, vienu - grafica.js, lai attēlotu savus datus, un p5.serialport bibliotēku, lai sazinātos ar Arduino UNO.

Es netērēšu pārāk daudz laika saskarnei, jo es to vienkārši izstrādāju datu priekšskatīšanai un iestatījumu kontrolei, kā arī tāpēc, ka tas vispār nebija mana eksperimenta priekšmets. Tomēr turpmākajās daļās es paskaidrošu dažādus soļus visas sistēmas izmantošanai, tādējādi izskaidrojot dažādas pieejamās vadības ierīces.

4. darbība: sistēmas iestatīšana

Pirmā lieta ir šeit lejupielādēt Arduino UNO un saskarnes kodu, ja tas vēl nav izdarīts. Pēc tam jūs varat pārprogrammēt savu Arduino UNO plāksni ar skici "UNO_LS.ino", izmantojot Arduino IDE.

Jums vajadzēja lejupielādēt programmatūru p5.serialcontrol no tās github krātuves. Jums ir jāiegūst zip fails, kas atbilst jūsu operētājsistēmai (es to pārbaudīju tikai operētājsistēmā Windows). Izvelciet zip mapē, sāciet tajā atrodamo izpildāmo failu un atstājiet to tādu. Nemēģiniet izveidot savienojumu ar jebkuru seriālo portu, vienkārši atstājiet to darbam fonā, tas tiks izmantots kā relejs.

Atveriet mapi "Interfeiss". Jums vajadzētu atrast failu ar nosaukumu "index.html". Atveriet to savā pārlūkprogrammā, tā ir tīmekļa saskarne.

Un tas arī viss! Jums nav jālejupielādē papildu bibliotēkas, viss ir jāiekļauj manā komplektā.

5. darbība: savienojums, konfigurācija un iegūšana

Savienojums, konfigurēšana un iegūšana
Savienojums, konfigurēšana un iegūšana

Lai savienotu saskarni ar Arduino UNO plati, sarakstā vienkārši atlasiet atbilstošo portu un nospiediet pogu "Atvērt". Ja darbība bija veiksmīga, ziņojumā "valsts" vajadzētu parādīties kaut kas līdzīgs "COMX atvērts".

Tagad varat izvēlēties uzņemšanas iespējas. Pirmais ir malu izvēle. Es iesaku jums vienmēr izmantot “Abus”, jo tas sniegs vislabāko reālā signāla attēlojumu. Ja iestatījums "Abi" neizdodas uztvert signālu (ja, piemēram, signāla frekvence ir pārāk augsta), atkarībā no signāla, kuru mēģināt saskatīt, varat mēģināt iestatīt "Rising" vai "Falling" malas iestatījumu.

Otrais iestatījums ir pulksteņa sadalījums. Tas dos jums izšķirtspēju, ar kādu varēsit uztvert signālu. Jūs varat izvēlēties sadalījuma koeficientu iestatīt ar "8", "64", "256" un "1024". Arduino UNO plāksne izmanto 16MHz kvarcu, lai pulkstenis mikrokontrolleru, tāpēc paraugu ņemšanas frekvence būs "16MHz/dalīšanas koeficients". Esiet piesardzīgs ar šo iestatījumu, jo tas arī noteiks, cik ilgi varēsit uztvert signālu. Tā kā taimeris 1 ir 16 bitu taimeris, uzņemšanas laiks, kas atļauts pirms pārplūdes, būs "(2^16)*(dalīšanas koeficients)/16 MHz". Atkarībā no izvēlētā iestatījuma tas svārstīsies no ~ 33ms līdz 4,2s. Paturiet savu izvēli prātā, tā jums būs nepieciešama vēlāk.

Pēdējais iestatījums ir trokšņu slāpētājs. Es neveicu daudz testu, un jums tas nebūs vajadzīgs 99% gadījumu, tāpēc vienkārši atstājiet to bez izvēles. Tiem, kam tas joprojām interesē, varat meklēt trokšņa slāpētāju ATMEGA328P datu lapas sadaļā Taimeris/skaitītājs1.

Neaizmirstiet pieslēgt signālam Arduino UNO plates 8. tapu un savienot pamatni kopā, lai būtu vienāda sprieguma atsauce gan testēšanas ķēdei, gan loģikas analizatoram. Ja jums nepieciešama zemes izolācija vai jāmēra signāli, kuru līmenis atšķiras no 5 V.

Kad viss ir pareizi konfigurēts, varat nospiest pogu "Iegūt".

6. darbība: rezultātu uztveršana un CSV datu eksportēšana

Uztveršanas rezultāti un CSV datu eksportēšana
Uztveršanas rezultāti un CSV datu eksportēšana

Kad jūsu Arduino UNO būs pabeidzis uztveršanu, tas automātiski nosūtīs datus atpakaļ uz tīmekļa saskarni, kurā tie tiks attēloti. Jūs varat tuvināt vai tālināt, izmantojot labo slīdni, un pārvietoties pa paraugiem, izmantojot apakšējo.

Sižets sniedz tikai priekšskatījumu, un tam nav datu analīzes rīku. Tādējādi, lai veiktu turpmāku datu analīzi, jums tie būs jāimportē PulseView.

Pirmais solis ir eksportēt csv failu, kurā ir visi jūsu dati. Lai to izdarītu, jums vienkārši jānoklikšķina uz pogas "Eksportēt" no tīmekļa saskarnes. Saglabājiet failu zināmā vietā, kad tas tiek prasīts.

Tagad atveriet PulseView. Augšējā izvēlnes joslā noklikšķiniet uz "Atvērt" (mapes ikona) un atlasiet "Importēt ar komatu atdalītas vērtības …". Atlasiet iepriekš ģenerēto csv failu, kurā ir jūsu dati.

Parādīsies neliels logs. Atstājiet visu, kā ir, jums vienkārši jāmaina iestatījums "Samplerate" atbilstoši uzņemšanai izvēlētajam pulksteņa dalīšanas koeficientam. Jūsu izlases frekvence būs "16MHz/(dalīšanas koeficients)". Pēc tam noklikšķiniet uz "Labi", jūsu signālam vajadzētu parādīties ekrānā.

7. solis: PulseView signālu analīze

PulseView signālu analīze
PulseView signālu analīze

PulseView piedāvā daudz protokola dekodētāju. Lai tiem piekļūtu, augšējā izvēlnes joslā noklikšķiniet uz "Pievienot protokola dekodētāju" (labākais rīks). Manam eksperimentam es tikko nosūtīju vienkāršu UART ziņojumu ar 9600 bodu, tāpēc es meklēju "UART".

Tas pievienos kanālu ar atzīmi kreisajā pusē (tāpat kā jūsu datiem). Noklikšķinot uz birkas, varat mainīt dekodētāja iestatījumus. Pēc pareizo ziņojumu izvēles es varēju izgūt to pašu ziņojumu, ko nosūtīja mana testa ierīce. Tas parāda, ka visa sistēma darbojas, kā paredzēts.

8. solis: Secinājums

Secinājums
Secinājums

Pat ja projekts sākumā bija eksperiments, esmu apmierināts ar iegūtajiem rezultātiem. Man bija iespēja bez problēmām izlasīt UART signālus līdz pat 115200 baudām "Abi" malu režīmā, un man pat izdevās sasniegt līdz 230400 baudām "Krītošā" malu režīmā. Iepriekš redzamajā attēlā varat redzēt manu testa iestatījumu.

Manai ieviešanai ir vairāki trūkumi, sākot ar faktu, ka tā vienlaikus var uztvert tikai vienu signālu, jo tikai Arduino UNO 8. tapa ir "spējīga ievadīt uztveršanu". Ja jūs meklējat Arduino loģikas analizatoru ar vairākiem kanāliem, pārbaudiet Catoblepas vienu.

Jūs nevarat gaidīt, ka Arduino UNO spēs uztvert signālus ar augstām frekvencēm (daži MHz), jo tas ir tikai 16MHz (ja kāds to darītu, es būtu ieinteresēts redzēt tā metodi). Tomēr mani joprojām iespaido rezultāti, ko varam iegūt no šī ATMEGA328P mikrokontrollera.

Es nedomāju, ka daudz strādāšu pie koda. Es veicu savus eksperimentus un saņēmu meklēto rezultātu. Bet, ja kāds vēlas sniegt savu ieguldījumu, nekautrējieties modificēt un pārdalīt visu manu kodu vai tā daļu.

Tas bija mans pirmais pamācāms un, manuprāt, garš. Es ceru, ka jums tā bija interesanta lasāmviela.

Paziņojiet man, ja atrodat kļūdas vai jums ir kādi jautājumi!

Ieteicams: