I mikroprocessorteknik kallas uppgifter som körs parallellt Trådar. Detta är mycket bekvämt eftersom det ofta är nödvändigt att utföra flera operationer samtidigt. Är det möjligt att få Arduino mikrokontroller att utföra flera uppgifter samtidigt, som en riktig processor? Låt oss se.
Det är nödvändigt
- - Arduino;
- - 1 LED;
- - 1 piezo-summer.
Instruktioner
Steg 1
Generellt stöder Arduino inte sann parallellisering eller multithreading.
Men du kan be mikrokontrollern att kontrollera om det är dags att utföra ytterligare en bakgrundsuppgift vid varje upprepning av "loop ()" -cykeln. I det här fallet verkar det för användaren att flera uppgifter utförs samtidigt.
Låt oss till exempel blinka en lysdiod vid en given frekvens och parallellt sända ut ljud som stiger och faller som en siren från en piezoelektrisk sändare.
Vi har anslutit både lysdioden och piezosändaren till Arduino mer än en gång. Låt oss montera kretsen som visas i figuren. Om du ansluter en LED till en annan digital stift än "13", kom ihåg att ha ett strömbegränsande motstånd på cirka 220 ohm.
Steg 2
Låt oss skriva en sådan skiss och ladda upp den till Arduino.
Efter att du har laddat brädet kan du se att skissen inte exekveras precis som vi behöver den: tills sirenen är helt i drift blinkar inte lysdioden och vi vill att lysdioden ska blinka UNDER sirenljudet. Vad är problemet här?
Faktum är att detta problem inte kan lösas på vanligt sätt. Uppgifterna utförs av mikrokontrollern strikt sekventiellt. Operatören "fördröjning ()" fördröjer körningen av programmet under en viss tidsperiod, och tills denna tid går ut kommer följande programkommandon inte att utföras. På grund av detta kan vi inte ställa in en annan exekveringstid för varje uppgift i "loop ()" i programmet.
Därför måste du på något sätt simulera multitasking.
Steg 3
Alternativet där Arduino kommer att utföra uppgifter i pseudoparallell föreslås av Arduino-utvecklarna i artikeln
Kärnan i metoden är att vid varje repetition av "loop ()" -slingan kontrollerar vi om det är dags att blinka lysdioden (för att utföra en bakgrundsuppgift) eller inte. Och om det gör det, inverterar vi LED-lampans tillstånd. Detta är ett slags kringgå operatören "delay ()".
En signifikant nackdel med denna metod är att kodsektionen framför LED-styrenheten måste köras snabbare än det blinkande tidsintervallet för "ledInterval" -LED. Annars kommer blinkningen att ske mindre ofta än nödvändigt, och vi får inte effekten av parallellt utförande av uppgifter. I synnerhet i vår skiss är varaktigheten för sirenljudförändringen 200 + 200 + 200 + 200 = 800 ms, och vi ställer in LED-blinkningsintervallet till 200 ms. Men lysdioden blinkar med en period av 800 ms, vilket är 4 gånger annorlunda än vad vi ställde in. I allmänhet, om operatorn "delay ()" används i koden, är det svårt att simulera pseudoparallellism, så det är tillrådligt att undvika det.
I det här fallet skulle det vara nödvändigt för sirenljudstyrenheten att också kontrollera om tiden är inne eller inte och inte använda "fördröjning ()". Men detta skulle öka mängden kod och försämra läsbarheten i programmet.
Steg 4
För att lösa detta problem kommer vi att använda det underbara ArduinoThread-biblioteket, vilket gör att du enkelt kan skapa pseudoparallella processer. Det fungerar på ett liknande sätt, men det låter dig inte skriva kod för att kontrollera tiden - om du behöver utföra uppgiften i den här slingan eller inte. Detta minskar mängden kod och förbättrar skissens läsbarhet. Låt oss kolla in biblioteket i aktion.
Först och främst ladda ner biblioteksarkivet från den officiella webbplatsen https://github.com/ivanseidel/ArduinoThread/archive/master.zip och packa upp det i katalogen "bibliotek" i Arduino IDE. Byt sedan till mappen "ArduinoThread-master" till "ArduinoThread".
Steg 5
Anslutningsdiagrammet förblir detsamma. Endast programkoden ändras. Nu blir det samma som i sidofältet.
I programmet skapar vi två strömmar, var och en utför sin egen operation: en blinkar med en lysdiod, den andra styr ljudet från sirenen. I varje iteration av slingan, för varje tråd, kontrollerar vi om det är dags för dess körning eller inte. Om den anländer lanseras den för körning med "run ()" -metoden. Det viktigaste är att inte använda operatorn "delay ()".
Mer detaljerade förklaringar ges i koden.
Låt oss ladda koden i Arduino-minnet, kör den. Nu fungerar allt som det ska!