V mikroprocesorski tehnologiji se naloge, ki se izvajajo vzporedno, imenujejo niti. To je zelo priročno, saj je pogosto treba izvesti več operacij hkrati. Ali je mogoče mikrokrmilnik Arduino hkrati izvajati več nalog, kot pravi procesor? Pa poglejmo.
Potrebno je
- - Arduino;
- - 1 LED;
- - 1 piezo zvočni signal.
Navodila
Korak 1
Na splošno Arduino ne podpira prave paralelizacije ali večnitnosti.
Lahko pa mikrokontrolerju naročite, naj preveri, ali je napočil čas za izvedbo kakšne dodatne naloge v ozadju pri vsakem ponavljanju cikla "loop ()". V tem primeru se bo uporabniku zdelo, da se hkrati izvaja več nalog.
Na primer, utripnimo LED na dani frekvenci in vzporedno s tem oddajamo zvoke, ki se kot pierena iz piezoelektričnega oddajnika dvignejo in spustijo.
Tako LED kot piezo oddajnik smo večkrat povezali z Arduino. Sestavimo vezje, kot je prikazano na sliki. Če LED priklopite na digitalni zatič, ki ni "13", ne pozabite, da ima trenutni omejevalni upor približno 220 ohmov.
2. korak
Napišimo takšno skico in jo naložimo v Arduino.
Po nalaganju plošče lahko vidite, da skica ni izvedena natančno tako, kot jo potrebujemo: dokler sirena ne bo popolnoma delovala, LED ne bo utripala in želeli bi, da LED utripa med zvokom sirene. V čem je problem tukaj?
Dejstvo je, da tega problema ni mogoče rešiti na običajen način. Naloge mikrokrmilnik izvaja strogo zaporedno. Operator "delay ()" odloži izvajanje programa za določeno časovno obdobje in dokler se ta čas ne izteče, se naslednji ukazi programa ne bodo izvajali. Zaradi tega v "zanki ()" programa ne moremo nastaviti različnega trajanja izvajanja za vsako nalogo.
Zato morate nekako simulirati večopravilnost.
3. korak
Možnost, v kateri bo Arduino opravljal naloge v psevdo-vzporedniku, predlagajo razvijalci Arduino v članku
Bistvo metode je, da z vsakim ponovitvijo zanke "loop ()" preverimo, ali je čas, da utripa LED (za izvedbo naloge v ozadju) ali ne. In če se, potem obrnemo stanje LED. To je nekakšen mimo operaterja "delay ()".
Pomembna pomanjkljivost te metode je, da je treba odsek kode pred krmilno enoto LED izvesti hitreje kot utripajoči časovni interval LED "ledInterval". V nasprotnem primeru se bo utripanje zgodilo manj pogosto, kot je potrebno, in ne bomo dobili učinka vzporednega izvajanja nalog. Zlasti v naši skici traja sprememba zvoka sirene 200 + 200 + 200 + 200 = 800 msec, interval utripanja LED pa nastavimo na 200 msec. Toda LED bo utripala s časom 800 ms, kar je 4-krat drugačno od nastavljenega. Če je v kodi na splošno uporabljen operator "delay ()", je težko simulirati psevdo-paralelizem, zato se ga je priporočljivo izogniti.
V tem primeru bi bilo potrebno, da enota za nadzor zvoka sirene tudi preveri, ali je napočil čas, in ne uporabi funkcije "delay ()". Toda to bi povečalo količino kode in poslabšalo berljivost programa.
4. korak
Za rešitev tega problema bomo uporabili čudovito knjižnico ArduinoThread, ki vam omogoča enostavno ustvarjanje psevdo-vzporednih procesov. Deluje na podoben način, vendar vam omogoča, da ne pišete kode za preverjanje časa - ali morate nalogo izvesti v tej zanki ali ne. To zmanjša količino kode in izboljša berljivost skice. Oglejmo si knjižnico v akciji.
Najprej prenesite arhiv knjižnice z uradne strani https://github.com/ivanseidel/ArduinoThread/archive/master.zip in ga razpakirajte v imenik "knjižnice" v Arduino IDE. Nato mapo "ArduinoThread-master" preimenujte v "ArduinoThread".
5. korak
Diagram povezave bo ostal enak. Spremenila se bo samo programska koda. Zdaj bo enako kot v stranski vrstici.
V programu ustvarimo dva toka, vsak izvaja svojo operacijo: eden utripa z LED, drugi nadzoruje zvok sirene. V vsaki ponovitvi zanke za vsako nit preverimo, ali je napočil čas za njeno izvedbo ali ne. Če prispe, se sproži za izvajanje z uporabo metode "run ()". Glavna stvar je, da ne uporabljate operaterja "delay ()".
Podrobnejša pojasnila so navedena v kodeksu.
Naložimo kodo v pomnilnik Arduino in jo zaženimo. Zdaj vse deluje natanko tako, kot bi moralo!