Բովանդակություն:

Arduino UNO Logic Sniffer: 8 քայլ (նկարներով)
Arduino UNO Logic Sniffer: 8 քայլ (նկարներով)

Video: Arduino UNO Logic Sniffer: 8 քայլ (նկարներով)

Video: Arduino UNO Logic Sniffer: 8 քայլ (նկարներով)
Video: Arduino Programming: Logical Operators 2024, Նոյեմբեր
Anonim
Arduino UNO Logic Sniffer
Arduino UNO Logic Sniffer

Այս նախագիծը սկսվեց որպես պարզ փորձ: Մեկ այլ նախագծի համար ATMEGA328P- ի տվյալների թերթիկի վերաբերյալ իմ հետազոտության ընթացքում ես գտա բավականին հետաքրքիր բան: Timer1 մուտքային գրավման միավոր: Այն թույլ է տալիս մեր Arduino UNO- ի միկրոկառավարիչին հայտնաբերել ազդանշանի եզրը, պահել ժամանակային նշանը և ընդհատում առաջացնել ՝ բոլորը սարքավորման մեջ:

Հետո ես մտածեցի, թե որ հավելվածում դա կարող է օգտակար լինել, և ինչպես փորձարկել այն: Քանի որ ես ուզում եմ տրամաբանական անալիզատոր ձեռք բերել որոշ ժամանակ անց, ես որոշեցի փորձել այն կիրառել իմ Arduino UNO- ի տախտակում, պարզապես գործառույթը փորձարկելու համար և տեսնելու, թե արդյոք մենք կարող ենք դրանից լավ արդյունքներ ստանալ:

Ես միակը չեմ, ով ունեցել է այս գաղափարը, և դուք դրանցից շատերը կգտնեք ՝ պարզապես googling «Arduino Logic Analyzer» - ով: Նախագծի սկզբում, քանի որ այն նոր էր սկսվել որպես փորձ, ես նույնիսկ տեղյակ չէի, որ մարդիկ արդեն հասցրել են այն, և տպավորված էի այն լավ արդյունքներից, որոնք նրանք ձեռք բերեցին այս փոքրիկ սարքավորման միջոցով: Այնուամենայնիվ, ես չկարողացա գտնել մեկ այլ նախագիծ ՝ օգտագործելով մուտքի գրավման միավորը, այնպես որ, եթե արդեն տեսել եք սա, տեղեկացրեք ինձ:

Ամփոփելու համար, իմ տրամաբանական անալիզատորը.

  • Ունեն մեկ ալիք,
  • Ունեն գրաֆիկական ինտերֆեյս,
  • Կապվեք ինտերֆեյսի հետ USB- ի միջոցով,
  • Աշխատեք Arduino UNO- ի տախտակի վրա:

Այն, ի վերջո, կունենա 800 նմուշի հիշողության խորություն և կարողացավ հաջողությամբ գրավել 115200 bauds UART հաղորդագրություն (իրականում այն չեմ փորձարկել ավելի մեծ արագությամբ):

Այս հրահանգը պարունակում է այս նախագծի ինչպես «ինչպես է այն աշխատում», այնպես էլ «ինչպես օգտագործել այն» հատվածները, ուստի նրանց համար, ովքեր տեխնիկական առումով չեն հետաքրքրվում, կարող եք ուղղակիորեն անցնել 4 -րդ քայլին:

Պարագաներ

Ես ուզում էի անալիզատորը պահել հնարավորինս պարզ, այնպես որ պահանջվում էր շատ քիչ սարքավորում:

Ձեզ հարկավոր կլինի.

  • Arduino UNO տախտակ (կամ համարժեք, քանի դեռ այն ապավինում է ATMEGA328P MCU- ին),
  • Համակարգիչ,
  • Ինչ -որ բան շտկելու համար (Arduino UNO- ի մյուս խորհուրդը լավ է աշխատում որոշ փորձարկումներ կատարելու համար):

Ինչպես Arduino UNO- ի, այնպես էլ վեբ ինտերֆեյսի կոդը կարելի է գտնել այստեղ: Ձեզ նույնպես անհրաժեշտ կլինեն p5.serialcontrol և PulseView ծրագրակազմերը:

Քայլ 1: Աշխատանքի սկզբունքը

Աշխատանքի սկզբունքը
Աշխատանքի սկզբունքը

Գաղափարը պարզ է: Դուք ընտրում եք գրավման կարգավորումները և կտտացրեք «ձեռք բերել»: Վեբ ինտերֆեյսը դրանք կուղարկի p5.serialcontrol ծրագրային ապահովմանը, որը թույլ է տալիս մեզ օգտագործել սերիական ինտերֆեյսը դիտարկիչից, քանի որ այն չի կարող ուղղակիորեն մուտք գործել դրան: P5.serialcontrol ծրագրաշարը այնուհետև տեղեկատվությունը փոխանցում է Arduino UNO- ի տախտակին, որը գրավում է տվյալները և դրանք նույն ճանապարհով հետ ուղարկում ինտերֆեյս:

Հեշտ! Դե… Քանի որ ես իսկապես լավ չեմ տիրապետում Մարդու/մեքենայի ինտերֆեյսի ծրագրավորմանը կամ վեբ տեխնոլոգիաներին, իմը, անշուշտ, մի փոքր տգեղ է և խելագար: Բայց դա թույլ է տալիս ինձ սկսել գրավել և հետ վերցնել իմ տվյալները, ինչը և դրա համար է նախատեսված, ուստի ես կարծում եմ, որ դա լավ է: Ավելի լուրջ վերլուծական աշխատանքների համար ես ներմուծում եմ իմ գրառումները PulseView- ում, որը հեշտ է օգտագործել և առաջարկում է գործառույթների և արձանագրությունների ապակոդավորման լավ փաթեթ, ինչպես կտեսնենք ավելի ուշ:

Arduino UNO- ի մուտքի գրավման միավորը կարող է կազմաձևվել ժամացույցի տարբեր բաժիններ օգտագործելու համար, դրանով իսկ նվազեցնելով բանաձևը, բայց մեծացնելով մինչև հոսքի հետաձգումը: Այն կարող է նաև առաջացնել բարձրանալու, ընկնելու կամ երկու եզրերի վրա `տվյալների գրավումը սկսելու համար:

Քայլ 2. Arduino UNO ուրվագիծ

Arduino UNO ուրվագիծ
Arduino UNO ուրվագիծ

Ես գրել և կազմել եմ էսքիզը Arduino IDE- ով: Ես առաջին անգամ սկսեցի erամաչափը 1 -ի «Սովորական» ռեժիմում կարգաբերելով ՝ տեղադրելով դրա TCCR1A և TCCR1B գրանցամատյաններում (): Այնուհետև ես որոշ գործառույթներ կատարեցի, որպեսզի հետագայում մի փոքր թեթևացնեմ դրա օգտագործումը, ինչպես օրինակ `« setTim1PSC () »անվանումով ժամացույցի բաժանումը: Ես գրել եմ նաև գործառույթներ ՝ ակտիվացնելու և ապաակտիվացնելու Timer1 մուտքի գրավման միավորը և արտահոսքի ընդհատումները:

Ես ավելացրեցի «նմուշներ» զանգվածը, որը կպահպանի ձեռք բերված տվյալները: Դա գլոբալ զանգված է, որը ես սահմանել եմ «անկայուն» `կանխելու համար, որ կոմպիլյատորը կատարի օպտիմալացում և այն դնի արագ, ինչպես դա արվում էր իմ առաջին հավաքածուների ժամանակ: Ես այն սահմանեցի որպես «uint16_t» զանգված, քանի որ erամաչափը նույնպես 16 բիթ է ՝ 810 երկարությամբ: Մենք դադարում ենք գրառել 800 արժեքներով, բայց քանի որ թեստը կատարվում է ընդհատումներից դուրս ՝ արագության ակնհայտ պատճառներով, ես որոշեցի պահել 10 -ը: ավելի շատ արժեքներ `կանխելու հեղեղումը: Մնացած կոդի համար մի քանի լրացուցիչ փոփոխականներով, ուրվագիծը օգտագործում է 1313 բայթ (88%) հիշողություն, ինչը մեզ թողնում է 235 բայթ ազատ RAM: Մենք արդեն օգտագործում ենք բարձր հիշողություն, և ես չէի ցանկանում ավելացնել ավելի շատ նմուշի կարողություն, քանի որ դա կարող է տարօրինակ վարք առաջացնել հիշողության չափազանց քիչ տարածքի պատճառով:

Կատարման արագությունը միշտ բարձրացնելու իմ ձգտման մեջ ես օգտագործեցի ֆունկցիայի ցուցիչներ ընդհատումների ներսում if հայտարարությունների փոխարեն `դրանց կատարման ժամանակը նվազագույնի հասցնելու համար: Գրավիչ քորոցը միշտ լինելու է Arduino UNO համարը 8, քանի որ այն միակն է, որը միացված է Timer1- ի մուտքի գրավման միավորին:

Գրավման գործընթացը ցուցադրվում է վերևի պատկերի վրա: Այն սկսվում է, երբ Arduino UNO- ն ստանում է վավեր UART տվյալների շրջանակ, որը պարունակում է գրավման ցանկալի կարգավորումները: Այնուհետև մենք մշակում ենք այդ կարգավորումները `կազմաձևելով ճիշտ գրանցամատյանները` ընտրված եզրին գրավելու համար և օգտագործելով ժամացույցի ճիշտ բաժանումը: Այնուհետև մենք միացնում ենք PCINT0 (կապի փոփոխություն) ընդհատումը `ազդանշանի առաջին եզրը հայտնաբերելու համար: Երբ այն ստանում ենք, մենք վերականգնում ենք Timer1 արժեքը, անջատում ենք PCINT0- ի ընդհատումը և միացնում ենք ICU- ն (Input Capture Unit) ընդհատումը: Այդ պահից ազդանշանի ցանկացած ընկնում/բարձրանում (կախված ընտրված կազմաձևից), կաշխատի մուտքի գրավման միավորը, այդպիսով պահպանելով այս իրադարձության ժամանակային նշանը ICR1 գրանցամատյանում և կատարելով ընդհատում: Այս ընդհատման մեջ մենք ICR1 գրանցամատյանի արժեքը դնում ենք մեր «նմուշների» զանգվածում և ավելացնում ինդեքսը հաջորդ գրավման համար: Երբ erամաչափ 1 -ը կամ զանգվածը լցվում են, մենք անջատում ենք գրավման ընդհատումը և տվյալները հետ ուղարկում վեբ ինտերֆեյս UART- ի միջոցով:

Ես որոշեցի օգտագործել կապի փոփոխման ընդհատումը ՝ գրավումը խթանելու համար, քանի որ մուտքի գրավման միավորը թույլ է տալիս լուսանկարել միայն մեկ կամ մյուս եզրին, ոչ թե երկուսն էլ: Այն նաև խնդիր է առաջացնում, երբ ցանկանում եք գրավել երկու ծայրերը: Իմ լուծումն այն է, որ յուրաքանչյուր բեռնված նմուշի մուտքի գրավման հսկիչ գրանցամատյանում եզրերի ընտրությունը վերահսկող բիթը շրջվի: Այդ կերպ մենք կորցնում ենք կատարման արագությունը, բայց մենք դեռ կարող ենք օգտագործել մուտքի գրավման միավորի գործառույթները:

Այսպիսով, ինչպես երևի նկատեցիք, մենք իրականում չենք վերցնում յուրաքանչյուր նմուշ ֆիքսված ժամանակային ընդմիջումներով, այլ որսում ենք այն պահը, երբ տեղի է ունենում ազդանշանի անցում: Եթե մենք վերցնեինք մեկ նմուշ յուրաքանչյուր ժամացույցի ցիկլում, նույնիսկ ժամացույցի ամենաբարձր բաժանումով, մենք բուֆերը կլրացնեինք մոտավորապես 0,1 վայրկյանում ՝ ենթադրելով, որ մենք օգտագործում էինք uint8_t տիպը, որն ամենափոքրն է հիշողության մեջ ՝ առանց ստրուկներ օգտագործելու:

Քայլ 3: Վեբ ինտերֆեյս և P5.js

Վեբ ինտերֆեյս և P5.js
Վեբ ինտերֆեյս և P5.js

Ինչպես նշում է վերնագիրը, վեբ ինտերֆեյսը ստեղծվել է p5.js. Նրանց համար, ովքեր դա արդեն չգիտեն, խորհուրդ եմ տալիս գնալ և ստուգել կայքը, քանի որ այն իսկապես լավ գրադարան է: Այն հիմնված է Մշակման վրա, հեշտ է օգտագործել, թույլ է տալիս շատ արագ լավ արդյունքներ ստանալ և լավ փաստաթղթավորված է: Այդ բոլոր պատճառներով ես ընտրեցի այս գրադարանը: Ես նաև օգտագործեցի quicksettings.js գրադարանը `ընտրացանկերի համար, grafica.js- ը` իմ տվյալները գծելու համար, և p5.serialport գրադարանը `Arduino UNO- ի հետ հաղորդակցվելու համար:

Ես շատ ժամանակ չեմ ծախսի ինտերֆեյսի վրա, քանի որ այն պարզապես նախագծել եմ տվյալների նախադիտման և կարգավորումների կառավարման համար, ինչպես նաև այն պատճառով, որ դա ընդհանրապես իմ փորձի թեման չէր: Այնուամենայնիվ, ես ստորև կբացատրեմ ամբողջ համակարգն օգտագործելու տարբեր քայլերը ՝ դրանով իսկ բացատրելով առկա տարբեր վերահսկումները:

Քայլ 4: Համակարգի կարգավորում

Առաջին բանը, որ Arduino UNO- ն և ինտերֆեյսի ծածկագիրը ներբեռնեք այստեղ, եթե դա արդեն արված չէ: Այնուհետև կարող եք վերադասավորել ձեր Arduino UNO- ի խորհուրդը «UNO_LS.ino» ուրվագծով ՝ Arduino IDE- ի միջոցով:

Դուք պետք է ներբեռնեիք p5.serialcontrol ծրագրակազմը նրա github պահոցից: Դուք պետք է ստանաք ձեր օպերացիոն համակարգին համապատասխանող zip ֆայլը (ես այն փորձարկել եմ միայն Windows- ում): Հավաքեք zip- ը թղթապանակում, սկսեք դրա մեջ գտնված գործարկվողը և թողեք այդպես: Մի փորձեք միանալ սերիական որևէ պորտին, պարզապես թողեք այն աշխատի հետին պլանում, այն կօգտագործվի որպես ռելե:

Բացեք «Ինտերֆեյս» թղթապանակը: Դուք պետք է գտնեք «index.html» անունով ֆայլ: Բացեք այն ձեր դիտարկիչում, դա վեբ ինտերֆեյս է:

Եվ վերջ! Անհրաժեշտ չէ լրացուցիչ գրադարաններ ներբեռնել, ամեն ինչ պետք է ներառվի իմ տրամադրած փաթեթում:

Քայլ 5: Միացում, կազմաձևում և ձեռքբերում

Միացում, կազմաձևում և ձեռքբերում
Միացում, կազմաձևում և ձեռքբերում

Ինտերֆեյսը Arduino UNO տախտակին միացնելու համար պարզապես ընտրեք ցանկի համապատասխան նավահանգիստը և սեղմեք «Բաց» կոճակը: Եթե գործողությունը հաջող էր, ապա «պետական» հաղորդագրությունը պետք է ցուցադրեր «COMX- ը բացված» -ի նման մի բան:

Այժմ կարող եք ընտրել ձեր գրավման ընտրանքները: Առաջինը եզրերի ընտրությունն է: Խորհուրդ եմ տալիս միշտ օգտագործել «Երկուսն էլ», քանի որ դա ձեզ կտա իրական ազդանշանի լավագույն ներկայացումը: Եթե «Երկուսն» պարամետրը չի կարողանում որսալ ազդանշանը (եթե ազդանշանի հաճախականությունը, օրինակ, չափազանց բարձր է), կարող եք փորձել կամ «Բարձրացում» կամ «Ընկնում» եզրերի կարգավորմամբ ՝ կախված ազդանշանից, որը փորձում եք տեսնել:

Երկրորդ կարգավորումը ժամացույցի բաժանումն է: Այն կտա ձեզ բանաձև, որով դուք կկարողանաք գրավել ազդանշանը: Դուք կարող եք ընտրել բաժանման գործակիցը սահմանել կամ «8», «64», «256» և «1024»: Arduino UNO- ի խորհուրդը օգտագործում է 16 ՄՀց քվարց `միկրոկոնտրոլերը ժամացույց անելու համար, ուստի ընտրանքի հաճախականությունը կլինի« 16 ՄՀց/բաժանման գործոն »: Settingգույշ եղեք այս պարամետրերի նկատմամբ, քանի որ այն նաև կորոշի, թե որքան ժամանակ դուք կկարողանաք որսալ ազդանշան: Քանի որ erամաչափը 16 բիթ ժամաչափ է, գերհոսքից առաջ թույլատրելի գրավման ժամանակը կլինի «(2^16)*(բաժանման գործակից)/16 ՄՀց»: Կախված ձեր ընտրած պարամետրից, այն կտատանվի 33 միլիոն ֆունտից մինչև 4.2 վրկ: Ձեր ընտրությունը մտքում պահեք, այն ձեզ ավելի ուշ պետք կգա:

Վերջին կարգավորումը աղմուկը չեղարկող սարքն է: Ես դրա վրա շատ փորձարկումներ չեմ անցկացրել, և դա ձեզ պետք չի լինի 99% դեպքերում, այնպես որ պարզապես թողեք այն չստուգված: Նրանց համար, ովքեր դեռ հետաքրքրված են դրանով, կարող եք աղմուկի ազդանշանը որոնել ATMEGA328P- ի տվյալների թերթի erամաչափ/հաշվիչ 1 բաժնում:

Մի մոռացեք Arduino UNO- ի տախտակի 8 -րդ կապը միացնել ձեր ազդանշանին և միացրեք լարերը, որպեսզի ունենաք միևնույն լարման տեղեկանք ինչպես փորձարկման շղթայի, այնպես էլ տրամաբանական անալիզատորի համար: Եթե Ձեզ անհրաժեշտ է գրունտային մեկուսացում, կամ պետք է չափել 5 Վ-ից տարբեր մակարդակներով ազդանշաններ, հավանաբար պետք է օպտո-մեկուսիչ ավելացնել ձեր շղթային:

Երբ ամեն ինչ ճիշտ կազմաձևվի, կարող եք սեղմել «Ձեռք բերել» կոճակը:

Քայլ 6. Գրավել արդյունքները և CSV տվյալների արտահանումը

Գրավել արդյունքները և CSV տվյալների արտահանումը
Գրավել արդյունքները և CSV տվյալների արտահանումը

Երբ ձեր Arduino UNO- ն ավարտի գրավումը, այն ինքնաբերաբար տվյալները հետ կուղարկի վեբ ինտերֆեյս, որը դրանք գծապատկերելու է: Կարող եք մեծացնել կամ փոքրացնել աջ սահնակով, իսկ ներքևի մասով անցնել նմուշների միջով:

Սյուժեն տալիս է միայն նախադիտում և չունի տվյալների վերլուծության գործիքներ: Այսպիսով, ձեր տվյալների հետագա վերլուծություն իրականացնելու համար դուք ստիպված կլինեք դրանք ներմուծել PulseView:

Առաջին քայլը ձեր բոլոր տվյալները պարունակող csv ֆայլ արտահանելն է: Դա անելու համար պարզապես անհրաժեշտ է վեբ ինտերֆեյսից սեղմել «Արտահանել» կոճակը: Պահպանեք ձեր ֆայլը հայտնի վայրում, երբ պահանջվի:

Այժմ բացեք PulseView- ը: Վերևի ցանկի բարում կտտացրեք «Բացել» (թղթապանակի պատկերակ) և ընտրեք «Ներմուծել ստորակետներով անջատված արժեքներ …»: Ընտրեք ձեր տվյալները պարունակող նախկինում ստեղծված csv ֆայլը:

Մի փոքր պատուհան կհայտնվի: Թողեք ամեն ինչ այնպես, ինչպես կա, պարզապես անհրաժեշտ է փոփոխել «Նմուշառել» կարգավորումը ՝ ըստ գրավման համար ընտրված ժամացույցի բաժանման գործոնի: Ձեր ընտրանքի հաճախականությունը կլինի «16 ՄՀց/(բաժանման գործակից)»: Այնուհետեւ կտտացրեք «Լավ», ձեր ազդանշանը պետք է հայտնվի էկրանին:

Քայլ 7: PulseView ազդանշանի վերլուծություն

PulseView ազդանշանի վերլուծություն
PulseView ազդանշանի վերլուծություն

PulseView- ն ունի բազմաթիվ արձանագրությունների ապակոդավորիչներ: Դրանք մուտք գործելու համար կտտացրեք «Ավելացնել արձանագրության ապակոդավորիչ» ցանկի վերին ցանկում (առավել ճիշտ գործիք): Իմ փորձի համար ես պարզապես ուղարկել եմ մի պարզ UART հաղորդագրություն 9600 bauds հասցեով, այնպես որ ես փնտրեցի «UART»:

Այն կավելացնի ալիք, որի ձախ կողմում կա պիտակ (ճիշտ այնպես, ինչպես ձեր տվյալների համարը): Սեղմելով պիտակի վրա, կարող եք փոխել ապակոդավորման կարգավորումները: Onesիշտներն ընտրելուց հետո ես կարողացա ստանալ նույն հաղորդագրությունը, ինչ ուղարկել էր իմ փորձարկող սարքը: Սա ցույց է տալիս, որ ամբողջ համակարգը գործում է ինչպես և սպասվում էր:

Քայլ 8: Եզրակացություն

Եզրակացություն
Եզրակացություն

Նույնիսկ եթե նախագիծը սկզբում փորձ էր, ես գոհ եմ իմ ստացած արդյունքներից: Ես կարողացա UART- ի ազդանշաններ նմուշառել մինչև 115200 բաուդ «Երկու» եզրային ռեժիմում ՝ առանց որևէ խնդրի, և ես նույնիսկ հասցրեցի մինչև 230400 բաուդ ՝ «Ընկնել» եզրային ռեժիմում: Դուք կարող եք տեսնել իմ թեստի կարգավորումը վերևի նկարում:

Իմ իրականացումը մի քանի թերություններ ունի ՝ սկսած այն փաստից, որ այն կարող է միաժամանակ միայն մեկ ազդանշան գրավել, քանի որ միայն Arduino UNO- ի 8 -րդ փինն է «մուտքագրման ունակություն ունակ»: Եթե դուք փնտրում եք Arduino տրամաբանական անալիզատոր ավելի շատ ալիքներով, գնացեք ստուգեք Catoblepas- ը:

Դուք չեք կարող ակնկալել, որ Arduino UNO- ն կկարողանա որսալ բարձր հաճախականությամբ ազդանշաններ (որոշ ՄՀց), քանի որ այն ընդամենը 16 ՄՀց հաճախականությամբ է աշխատում (եթե ինչ -որ մեկը դա արել է, ինձ հետաքրքիր կլինի տեսնել դրա մեթոդը): Այնուամենայնիվ, ես դեռ տպավորված եմ այն արդյունքներից, որոնք մենք կարող ենք ստանալ այս ATMEGA328P միկրոկոնտրոլերից:

Չեմ կարծում, որ կոդի վրա շատ աշխատանքներ կանեմ: Ես անցկացրեցի իմ փորձերը և ստացա այն արդյունքները, որոնք ես փնտրում էի: Բայց եթե ինչ -որ մեկը ցանկանում է իր ներդրումն ունենալ, ազատ զգալ փոփոխել և վերաբաշխել իմ ծածկագիրը ամբողջությամբ կամ դրա մի մասը:

Դա իմ առաջին հրահանգն էր, և կարծում եմ ՝ երկար: Հուսով եմ, որ ձեզ համար հետաքրքիր ընթերցում էր:

Տեղեկացրեք ինձ, եթե սխալներ եք գտնում, կամ որևէ հարց ունեք:

Խորհուրդ ենք տալիս: