Միկրոպրոցեսորային տեխնոլոգիայում զուգահեռ ընթացող առաջադրանքները կոչվում են թելեր: Սա շատ հարմար է, քանի որ հաճախ անհրաժեշտ է միաժամանակ կատարել մի քանի գործողություններ: Հնարավո՞ր է, որ Arduino միկրոկոնտրոլերը միանգամից մի քանի առաջադրանք կատարի, ինչպես իրական պրոցեսորը: Եկեք տեսնենք
Դա անհրաժեշտ է
- - Arduino;
- - 1 LED;
- - 1 պիեզո ձայն.
Հրահանգներ
Քայլ 1
Ընդհանրապես, Arduino- ն չի աջակցում իրական զուգահեռացման կամ բազմալեզուների:
Բայց միկրոհսկիչին կարող եք ասել, որ ստուգի `արդյո՞ք եկել է ժամանակը` «հանգույց ()» ցիկլի յուրաքանչյուր կրկնության վրա որոշակի լրացուցիչ, ֆոնային առաջադրանք կատարելու ժամանակը: Այս դեպքում օգտագործողին թվում է, որ միաժամանակ մի քանի առաջադրանք է կատարվում:
Օրինակ, եկեք թարթենք LED- ը տվյալ հաճախականությամբ և զուգահեռաբար թողարկենք այն պիոզոէլեկտրական ճառագայթման ազդանշանից բարձրացող ու ընկած ձայներ:
Մենք և՛ LED- ն, և՛ պիեզո-արտանետիչը միացրել ենք Arduino- ին մեկից ավելի անգամ: Եկեք հավաքենք շղթան, ինչպես ցույց է տրված նկարում: Եթե դուք միացնում եք LED- ը «13» -ից բացի այլ թվային քորոցին, հիշեք, որ ներկայիս սահմանափակող դիմադրությունը մոտ 220 օմ է:
Քայլ 2
Եկեք գրենք այսպիսի ուրվագիծ և վերբեռնեք այն Arduino- ում:
Գրատախտակը բեռնելուց հետո դուք կտեսնեք, որ ուրվագիծը չի կատարվում այնպես, ինչպես մենք ունենք դրա անհրաժեշտությունը. Մինչև ծորակը լիարժեք գործի դնելը, LED- ը չի թարթելու, և մենք կցանկանայինք, որ LED- ն թարթեր հնչերանգի հնչյունավորման ընթացքում: Ո՞րն է այստեղ խնդիրը:
Փաստն այն է, որ այս խնդիրը հնարավոր չէ լուծել սովորական եղանակով: Առաջադրանքները կատարվում են միկրոհսկիչի կողմից խիստ հաջորդականորեն: «Հետաձգում ()» օպերատորը հետաձգում է ծրագրի կատարումը նշված ժամանակահատվածով, և մինչ այս ժամկետի ավարտը հետևյալ ծրագրի հրամանները չեն կատարվի: Այդ պատճառով ծրագրի «օղակում ()» բաժնում մենք չենք կարող յուրաքանչյուր առաջադրանքի համար կատարել տարբեր կատարման տևողություն:
Հետեւաբար, դուք պետք է ինչ-որ կերպ մոդելավորեք բազմախնդրությունը:
Քայլ 3
Այն տարբերակը, որով Arduino- ն կեղծ կեղծ զուգահեռ առաջադրանքներ կկատարի, առաջարկվում է Arduino մշակողների կողմից https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay հոդվածում:
Մեթոդի էությունն այն է, որ «օղակի ()» օղակի յուրաքանչյուր կրկնության հետ մենք ստուգենք ՝ արդյո՞ք ժամանակն է թարթել LED- ը (ֆոնային առաջադրանք կատարելու համար), թե ոչ: Եվ եթե դա տեղի է ունենում, ապա մենք շրջում ենք LED- ի վիճակը: Սա մի տեսակ շրջանցելու է «հետաձգում ()» օպերատորը:
Այս մեթոդի էական թերությունն այն է, որ լուսադիոդային կառավարման միավորի դիմաց ծածկագրի հատվածը պետք է կատարվի ավելի արագ, քան «ledInterval» LED- ի թարթող ժամանակային միջակայքը: Հակառակ դեպքում թարթելը տեղի կունենա անհրաժեշտից պակաս հաճախ, և մենք չենք ստանա առաջադրանքների զուգահեռ կատարման ազդեցություն: Մասնավորապես, մեր ուրվագծում ազդանշանի ձայնի փոփոխության տևողությունը 200 + 200 + 200 + 200 = 800 մվրկ է, և մենք LED- ի թարթման միջակայքը դնում ենք 200 մվրկ: Բայց LED- ը կթարթա 800 մկս ժամանակահատվածով, ինչը 4 անգամ տարբերվում է մեր սահմանածից: Ընդհանրապես, եթե ծածկագրում օգտագործվում է «հետաձգում ()» օպերատորը, ապա կեղծ զուգահեռականությունը դժվար է նմանակել, ուստի խորհուրդ է տրվում խուսափել դրանից:
Այս դեպքում անհրաժեշտ կլինի, որ ազդանշանային ձայնային հսկողության ստորաբաժանումը ստուգի նաև ժամանակը եկել է, թե ոչ, և չօգտագործել «ուշացում ()»: Բայց դա կբարձրացնի ծածկագրի քանակը և կվատթարացնի ծրագրի ընթերցանությունը:
Քայլ 4
Այս խնդիրը լուծելու համար մենք կօգտագործենք հիանալի ArduinoThread գրադարանը, որը թույլ է տալիս հեշտությամբ ստեղծել կեղծ զուգահեռ գործընթացներ: Այն աշխատում է նույն կերպ, բայց դա թույլ է տալիս Ձեզ չգրել ծածկագիր ՝ ժամանակը ստուգելու համար ՝ անկախ նրանից ՝ այս օղակում անհրաժեշտ է կատարել առաջադրանքը, թե ոչ: Սա նվազեցնում է ծածկագրի քանակը և բարելավում ուրվագծի ընթերցանությունը: Եկեք ստուգենք գրադարանը գործողության մեջ:
Նախևառաջ, ներբեռնեք գրադարանի արխիվը https://github.com/ivanseidel/ArduinoThread/archive/master.zip պաշտոնական կայքից և ապամոնտաժեք այն Arduino IDE- ի «գրադարանների» գրացուցակում: Դրանից հետո վերանվանեք «ArduinoThread-master» պանակը «ArduinoThread»:
Քայլ 5
Միացման դիագրամը կմնա նույնը: Փոխվելու է միայն ծրագրի կոդը: Հիմա դա կլինի նույնը, ինչ կողային տողում:
Րագրում մենք ստեղծում ենք երկու հոսք, յուրաքանչյուրն իրականացնում է իր գործողությունը. Մեկը թարթում է LED- ով, երկրորդը վերահսկում է ազդանշանի ձայնը: Օղակի յուրաքանչյուր կրկնության դեպքում, յուրաքանչյուր թելի համար, մենք ստուգում ենք ՝ արդյո՞ք եկել է դրա կատարման ժամանակը, թե ոչ: Եթե այն տեղ հասնի, այն գործարկվում է կատարման համար `օգտագործելով« վազել () »մեթոդը: Հիմնական բանը `չօգտագործել« հետաձգում () »օպերատոր:
Ավելի մանրամասն բացատրությունները տրված են ծածկագրում:
Եկեք բեռնենք կոդը Arduino հիշողության մեջ, գործարկենք այն: Հիմա ամեն ինչ գործում է ճիշտ այնպես, ինչպես պետք է: