Stýriforrit

Úr Wikibókunum
(Endurbeint frá Bílskúrsurðaopnari)
Arduino Uno - R3

Þ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[breyta]

George Boole color

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[breyta]

Garage door opener

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[breyta]

Virkni lýst með orðum

Hér er stöðurit sem sýnir virknina fyrir forritið. Búið er að skilgreina við hvaða skilyrði forritið skiptir um stöðu og hver staðan verður í samræmi við það. Skilyrðunum sem er lýst með orðum á myndinni mundu líta út á eftir farandi hátt skrifaðar á bool formi:

Ekki ýtt á takka
Ýtt á takka
Ekki ýtt á takka og ekki fullopið
Fullopið eða ýtt á takka
Ekki ýtt á takka og ekki fulllokað
Fulllokad eða ýtt á takka


Við þurfum ekki að nota nema þrjár af þessum jöfnum til að forrita stöðuvél sem hefur högun eins og stöðuritið sýnir. Ef við notum lykkju, þá er nóg er að nota jöfnurnar sem fær vélina (forritið) til að haldar sér í lykkjunni.

Stöðurit fyrir stýrivél sem stýrir bílskúrshurð
Stöðurit fyrir stýrivél sem stýrir bílskúrshurð

Virkni skrifuð í C
Hér er sama stöðurit þar sem skilyrðin eru skrifuð á bool formi fyrir Arduino.

Stöðurit fyrir stýrivél sem stýrir bílskúrshurð - Arduino
Stöðurit fyrir stýrivél sem stýrir bílskúrshurð - Arduino

Flæðirit[breyta]

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.

Flæðirit fyrir main fallið
Flæðirit fyrir main fallið
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[breyta]

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ð[breyta]

Hér er myndskeið sem sýnir hvernig forritið virkar í prófunarumhverfi.
Smellið á YouTube myndina
Logo of YouTube (2015-2017)

Verkefni[breyta]

Spurningar[breyta]

  1. Hvað sýnir stöðurit?
  2. Hvernig er jafnan á C koða fyrir Arduino?
  3. Hvernig er jafnan á C koða fyrir Arduino?

Krossapróf[breyta]

1 Forritið bíður í fallinu adOpna() þegar ýtt er á takkann.
Hvað gerist??

Forritið bíður áfram
Forritið heldur áfram í næstu stöðu

2 Forritið bíður í fallinu stop().
Hvaða gildi þarf bool breytan takkiFlag að fá svo forritið fari í næstu stöðu?

True
False
Skiptir ekki máli

3 Hvaða teiknistaðall er notaður á Íslandi fyrir rökhlið?

DIN
IEC
ANSI
GSM


Heimildir[breyta]

https://www.arduino.cc/
Purdum, J. J., & Levy, B. (2012). Beginning C for Arduino. Apress.
https://en.wikipedia.org/wiki/George_Boole

Ýtarefni[breyta]

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