Þ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.

Arduino Uno - R3

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ð

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

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ð
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
 

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