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.
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ų.
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ą.
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ą.
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“.
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ų!