Programiranje z Arduino (3)

Revija 213 213 45 - Programiranje z Arduino (3)Revija logo se - Programiranje z Arduino (3)

V prvih programih je koda ponavadi tista, ki vodi strojno opremo. Prižigamo sveteče diode, poganjamo motorčke, merimo temperaturo… Vendar šele, ko zunanji svet dobi vpliv na programsko kodo, naš program zares “zapleše”. V tem prispevku si bomo ogledali kako na učinkovit način zunanjim (digitalnim) pulzom dovolimo, da spreminjamo potek programa na Arduinu.

Gospod Arduino, vas lahko zmotim?

Kako komuniciramo z zunanjim svetom smo že videli. Lahko se pogovarjamo preko serijskih vrat, lahko komuniciramo preko digitalnih vhodov in izhodov, tako, da v programu periodično pregledamo vhode, ki nas zanimajo. Po domače rečeno, da jih “prečesamo”, kot to počne psevdo koda v naslednjem primeru:

Void setup()
{
int pin=2;
pinMode(pin,INPUT);
}
void loop()
{
delajObičajnoStvar1();
delajObičajnoStvar2();
delajObičajnoStvar3();
if (digitalRead(pin) == HIGH)
narediNekajPosebnega();
}
Slike ni

KLIK

Za mnogo stvari je to povsem dovolj: predvsem takrat, ko se naš glavni program hitro izvede in lahko pogosto pogledamo, če je na priključku ali serijskih vratih “kaj novega”. Ampak včasih nam aplikacija tega ne dopušča. Včasih potrebujemo hiter odziv ali pa bi preverjanje stanja priključkov odžiralo preveč časa preostalemu delu aplikacije. Še najhujše je, če je pulz, ki ga želimo zaznati tako kratek, da bi ga lahko zaradi izvajanja programa zamudili. Konkretno: recimo, da razvijamo vremensko postajo, ki je med drugim opremljena z merilnikom hitrosti vetra (anemometrom). Anemometer ima lopatice, ki se v vetru vrtijo, vsak obrat pa za kratek del obsega sklene stikalo na 0V, sicer je na 5V. Če izmerimo čas med zaporednima obratoma dobimo trenutno hitrost, če izmerimo število obratov na neko daljše časovno obdobje (npr. 1 minuto) pa povprečno hitrost. Ker si ne moremo privoščiti, da bi spregledali kak pulz, ki označuje obhod, nam prekinitve pridejo še kako prav.

Oglejmo si najprej kaj nam ponuja Arduino okolje. Arduino nam na pladnju servira dve zunanji prekinitvi poimenovani 0 in 1, ki sta vezani na priključka D2 in D3. Recimo, da želimo stikalo našega anemometra vezati na priključek D2. V setup() funkcijo bi dodali naslednjo vrstico:

attachInterrupt(0,preracunajHitrost, RISING);

Poglejmo lepo počasi kaj smo naredili. Omogočili smo zunanjo prekinitev programa preko digitalnega priključka D2, ki se bo zgodila, ko bo šel pulz iz digitalne ničle (0V) na digitalno enico (5V). Da, uganili ste, lahko bi izbrali tudi FALLING, ki bi se sprožil pri obratnem preskoku. (Možni sta pa tudi še LOW in CHANGE). Ko se bo ta preskok zgodil, se bo tok našega programa prekinil, ne glede na to kaj takrat dela, izvedla se bo funkcija preracunajHitrost. To funkcijo moramo seveda še definirati. Ko se bo ta zaključila bo program nemoteno tekel naprej od mesta kjer je bil prekinjen. Ko vključujemo prekinitve moramo seveda biti pozorni na to, da nam prekinitve same ne povzročajo več težav kot koristi. Prekinitev med komuniciranjem preko programskih serijskih vrat, ki nimajo od CPE neodvisne strojne podpore bi npr. pomenilo težavo saj bi lahko zamujali posamezne bite. Vsekakor je pred uporabo prekinitev potreben dober premislek o mogočih scenarijih, ki lahko nastanejo.

Napišimo sedaj še funkcijo, ki naj se ob prekinitvi izvede. Recimo, da merimo trenutno hitrost vetra. Da dobimo hitrost želimo vedeti koliko časa je anemometer potreboval za en obrat. Hitrost vetra bo seveda obratno sorazmerna s časom in pomnožena s faktorjem merilne naprave, ki jo ponavadi poda proizvajalec. Recimo, da je ta faktor enak 2000, da dobimo pravo vrednost hitrosti v metrih na sekundo.

Celotni članek

Programiranje z Arduino (3)

www.tehnologija.biz

2013_SE213_45

Tags: