Stýriforrit

Þetta er wikibók um hvernig hægt er að nota einfaldar bólskar jöfnur í forritun á Arduino. Sýnt er hvernig stöðurit nýtist við hönnun á forriti sem stýrir bílskúrshurðaopnara. Bókin er hentug sem kennsluefni í grunndeild rafiðna og fyrir þá sem vilja læra einfalda aðferð til að byggja upp stýriforrit.
Bool jöfnur

Rökhlið eru grunneiningar í stafrænum rásum. Þau hafa virkni sem gefur útgangi gildi samkvæmt reglu sem beitt er á einn eða fleiri innganga. Þessar reglur eru í raun stærðfræði jöfnur og má nota slíkar jöfnur við forritun ýmissa stýringa. Grunnhliðunum er hægt að raða saman í flóknar rásir til að ná fram ákveðinni virkni og beita aðferðum til að einfalda jöfnurnar sem lýsa virkninni. Þessar jöfnur eru nefndar bool jöfnur (bólskar jöfnur) eftir enska stærðfræðingnum George Boole. Lesið meira um bool jöfnur á Wiki síðu um Boolean algebra
Sem dæmi þá er jafnan fyrir tveggja innganga AND hlið , þar sem A og B eru inngangar og C er útgangurinn. Hér fyrir neðan sjáum við tvö teiknitákn samkvæmt mismunandi stöðlum: Amerískur staðall (ANSI) og Evrópu staðal (IEC).
| ANSI Tákn | IEC Tákn |
Lesið allt um rökhlið á Wiki síðu um Logic gate
Stýriforrit fyrir bílskúrshurðaopnara

Hér á eftir er dæmi um hvernig við getum nýtt okkur stöðurit og bólskar jöfnur til að gera lítið forrit fyrir bílskúrshurðaopnara. Við notum Arduino [1] örtölvu sem stýrivél og forritunarmálið C.
Stöðurit
Flæðirit
Svona lítur flæðiritið út fyrir aðallykkju forritsins. Til hliðar eru föllinn sem endurspegla stöðurnar sem við skilgreindum í stöðuritinu.
|
|
void stopp() {
motor.stop();
delay(300);
do
{
takkiFlag = digitalRead(opnaLokaTakki);
} while (!takkiFlag);
}
void adOpna() {
motor.back();
delay(300);
do
{
takkiFlag = digitalRead(opnaLokaTakki);
fullopidFlag = digitalRead(fullopidRofi);
} while (!takkiFlag && !fullopidFlag);
}
void adLoka() {
motor.forward();
delay(300);
do
{
takkiFlag = digitalRead(opnaLokaTakki);
fulllokadFlag = digitalRead(fulllokadRofi);
} while (!takkiFlag && !fulllokadFlag);
}
|
Í föllunum er notað til að forritið sé stopp í stöðunni á meðan bool jafnan í endaskilyrðunum er sönn.
stopp()
do
{
takkiFlag = digitalRead(opnaLokaTakki);
} while (!takkiFlag);
adOpna()
do
{
takkiFlag = digitalRead(opnaLokaTakki);
fullopidFlag = digitalRead(fullopidRofi);
} while (!takkiFlag && !fullopidFlag);
adLoka()
do
{
takkiFlag = digitalRead(opnaLokaTakki);
fulllokadFlag = digitalRead(fulllokadRofi);
} while (!takkiFlag && !fulllokadFlag);
Kóðinn
Svona er allur kóðinn fyrir forritið.
Library fyrir mótorinn: vmaHG7881
//----------------------------------------------------------------------------------------
// Date: 20.023.2017
// Program: Bílskúrshurða opnari
// Version 5.00
// Project: Verkefni 3 - Mekatrónik 4
// Ari Baldursson
// Verkmenntaskólinn á Akureyri
//
// ----------------------------------
// Föll úr vmaHG7881.h fyrir mótor
//
// vmaHG7881(frumstilltur hraði, mótorpinni 1 PWM, mótorpinni 2 PWM)
// forward() mótor áfram
// back() mótor afturábak
// stop() mótor stop
// setSpeed(hraði) hraði = 0 - 255
//
//----------------------------------------------------------------------------------------
#include <vmaHG7881.h>
vmaHG7881 motor(200,5,6); // Hraði, M pinni 1, M pinni 2
bool fullopidFlag = 0; // FullOpid
bool fulllokadFlag = 0; // FullLokad
bool takkiFlag = 0; // Takki
int opnaLokaTakki = 12; // Inngangur fyrir takka
int fullopidRofi = 10; // Inngangur fyrir fullopið rofa
int fulllokadRofi = 11; // Inngangur fyrir fulllokað rofa
void adOpna();
void stopp();
void adLoka();
void setup() {
pinMode(opnaLokaTakki, INPUT);
pinMode(fullopidRofi, INPUT);
pinMode(fulllokadRofi, INPUT);
}
void loop() {
stopp();
adOpna();
stopp();
adLoka();
}
void adOpna() {
motor.back();
delay(300);
do
{
takkiFlag = digitalRead(opnaLokaTakki);
fullopidFlag = digitalRead(fullopidRofi);
} while (!takkiFlag && !fullopidFlag);
}
void stopp() {
motor.stop();
delay(300);
do
{
takkiFlag = digitalRead(opnaLokaTakki);
} while (!takkiFlag);
}
void adLoka() {
motor.forward();
delay(300);
do
{
takkiFlag = digitalRead(opnaLokaTakki);
fulllokadFlag = digitalRead(fulllokadRofi);
} while (!takkiFlag && !fulllokadFlag);
}
Myndskeið
| Hér er myndskeið sem sýnir hvernig forritið virkar í prófunarumhverfi. Smellið á YouTube myndina |
Verkefni
Spurningar
- Hvað sýnir stöðurit?
- Hvernig er jafnan á C koða fyrir Arduino?
- Hvernig er jafnan á C koða fyrir Arduino?
Krossapróf
<quiz display=simple>
{Forritið bíður í fallinu adOpna() þegar ýtt er á takkann.
Hvað gerist??
|type="()"}
- Forritið bíður áfram + Forritið heldur áfram í næstu stöðu
{Forritið bíður í fallinu stop().
Hvaða gildi þarf bool breytan takkiFlag að fá svo forritið fari í næstu stöðu?
|type="()"}
+ True - False - Skiptir ekki máli
{Hvaða teiknistaðall er notaður á Íslandi fyrir rökhlið? |type="()"}
- DIN + IEC - ANSI - GSM
</quiz>
Heimildir
https://www.arduino.cc/
Purdum, J. J., & Levy, B. (2012). Beginning C for Arduino. Apress.
https://en.wikipedia.org/wiki/George_Boole
Ýtarefni
Wiki síða um LaTeX skipanir fyrir stærðfræði formúlur: LaTeX/Mathematics
Wiki síða um hvernig við sejum upp stærðfræði formúlur á Wiki: Guide/Mathematics


