Kaip Atlikti Lygiagrečias Užduotis (siūlus) „Arduino“programoje

Turinys:

Kaip Atlikti Lygiagrečias Užduotis (siūlus) „Arduino“programoje
Kaip Atlikti Lygiagrečias Užduotis (siūlus) „Arduino“programoje

Video: Kaip Atlikti Lygiagrečias Užduotis (siūlus) „Arduino“programoje

Video: Kaip Atlikti Lygiagrečias Užduotis (siūlus) „Arduino“programoje
Video: How to do multiple tasks in Arduino | Beginners | millis() function 2024, Gegužė
Anonim

Mikroprocesorių technologijoje lygiagrečiai vykdomos užduotys vadinamos gijomis. Tai yra labai patogu, nes dažnai reikia atlikti keletą operacijų vienu metu. Ar įmanoma priversti „Arduino“mikrovaldiklį atlikti kelias užduotis vienu metu, kaip tikrą procesorių? Pažiūrėkime.

Lygiagretūs srautai „Arduino“programoje
Lygiagretūs srautai „Arduino“programoje

Tai būtina

  • - Arduino;
  • - 1 šviesos diodas;
  • - 1 pjezo garsinis signalas.

Nurodymai

1 žingsnis

Paprastai tariant, „Arduino“nepalaiko tikro lygiagretinimo ar daugialypio sriegimo.

Bet jūs galite nurodyti mikrovaldikliui patikrinti, ar atėjo laikas atlikti papildomą foninę užduotį kiekviename „loop ()“ciklo kartojime. Tokiu atveju vartotojui atrodys, kad vienu metu atliekamos kelios užduotys.

Pavyzdžiui, pamirksime šviesos diodą tam tikru dažniu ir lygiagrečiai skleiskime garsus, kylančius ir krentančius kaip sirena iš pjezoelektrinio spinduolio.

Tiek LED, tiek pjezo spinduolį prie „Arduino“prijungėme ne kartą. Surinkime grandinę, kaip parodyta paveikslėlyje. Jei jungiate šviesos diodą prie skaitmeninio kaiščio, išskyrus „13“, nepamirškite, kad srovės ribotuvas yra apie 220 omų.

„Arduino“signalo ir šviesos diodų jungimo schema
„Arduino“signalo ir šviesos diodų jungimo schema

2 žingsnis

Parašykime tokį eskizą ir įkelkime jį į „Arduino“.

Įkėlę lentą matote, kad eskizas nėra įvykdytas tiksliai taip, kaip mums reikia: kol sirena neveikia iki galo, šviesos diodas nemirksės ir norėtume, kad šviesos diodas mirksėtų per sirenos skambėjimą. Kokia čia problema?

Faktas yra tas, kad šios problemos negalima išspręsti įprastu būdu. Užduotis mikrokontroleris atlieka griežtai nuosekliai. Operatorius „delay ()“atideda programos vykdymą nustatytam laikotarpiui, o kol pasibaigs šis laikas, šios programos komandos nebus vykdomos. Dėl šios priežasties negalime nustatyti skirtingos kiekvienos užduoties vykdymo trukmės programos „cikle ()“.

Todėl jūs turite kažkaip imituoti daugiafunkcinį darbą.

Signalų ir LED valdymas nuosekliai
Signalų ir LED valdymas nuosekliai

3 žingsnis

Parinktį, kurioje „Arduino“atliks užduotis pseudo lygiagrečiai, „Arduino“kūrėjai siūlo straipsnyje

Metodo esmė yra ta, kad kiekvieną kartą pakartodami „loop ()“kilpą, mes patikriname, ar laikas mirksėti šviesos diodu (atlikti foninę užduotį), ar ne. Ir jei taip, tada apversime šviesos diodo būseną. Tai yra tam tikras „delay ()“operatoriaus aplenkimas.

Reikšmingas šio metodo trūkumas yra tas, kad kodo skyrius priešais LED valdymo bloką turi būti vykdomas greičiau nei mirksi „LEDInterval“šviesos diodo laiko intervalas. Priešingu atveju mirksėjimas pasireikš rečiau nei reikia, ir mes nesulauksime lygiagrečių užduočių vykdymo efekto. Visų pirma, mūsų eskize sirenos garso pasikeitimo trukmė yra 200 + 200 + 200 + 200 = 800 ms, o mes nustatome šviesos diodų mirksėjimo intervalą 200 ms. Bet šviesos diodas mirksi 800 msek periodu, kuris 4 kartus skiriasi nuo mūsų nustatyto. Apskritai, jei kode naudojamas operatorius „delay ()“, tada sunku imituoti pseudoparalelizmą, todėl patartina jo vengti.

Tokiu atveju sirenos garso valdymo blokas taip pat turėtų patikrinti, ar atėjo laikas, ar ne, ir nenaudoti „delay“). Bet tai padidintų kodo kiekį ir pablogintų programos skaitomumą.

Šviesos diodas mirksi nedelsdamas () operatorius
Šviesos diodas mirksi nedelsdamas () operatorius

4 žingsnis

Norėdami išspręsti šią problemą, naudosime nuostabią „ArduinoThread“biblioteką, leidžiančią lengvai kurti pseudo-lygiagrečius procesus. Tai veikia panašiai, tačiau leidžia jums nerašyti kodo, kad patikrintumėte laiką - ar jums reikia atlikti užduotį šioje cikle, ar ne. Tai sumažina kodo kiekį ir pagerina eskizo įskaitomumą. Pažiūrėkime, kaip veikia biblioteka.

Pirmiausia atsisiųskite bibliotekos archyvą iš oficialios svetainės https://github.com/ivanseidel/ArduinoThread/archive/master.zip ir išpakuokite jį į „Arduino IDE“katalogą „bibliotekos“. Tada pervadinkite aplanką „ArduinoThread-master“į „ArduinoThread“.

„ArduinoThread“bibliotekos diegimas
„ArduinoThread“bibliotekos diegimas

5 žingsnis

Ryšio schema išliks ta pati. Pasikeis tik programos kodas. Dabar tai bus tokia pati kaip šoninėje juostoje.

Programoje mes sukuriame du srautus, kiekvienas atlieka savo operaciją: vienas mirksi šviesos diodu, antrasis valdo sirenos garsą. Kiekvienoje kilpos iteracijoje kiekvienai gijai tikriname, ar atėjo laikas ją vykdyti, ar ne. Jei jis ateina, jis paleidžiamas vykdant naudojant „run ()“metodą. Svarbiausia nenaudoti operatoriaus „delay ()“.

Išsamesni paaiškinimai pateikti kode.

Įkelkime kodą į „Arduino“atmintį, paleiskite jį. Dabar viskas veikia tiksliai taip, kaip turėtų!

Rekomenduojamas: