Hopp til innhald
Fagartikkel

Programmeringsspråket i Arduino IDE

Mikrokontrollerar treng ein kode eller eit program for å fungere. Mange leverandørar har utvikla eiga programvare som gjer det enklare å programmere mikrokontrollerar. Arduino IDE er eit slikt program. Vi skal sjå nærare på korleis koden i Arduino IDE er bygd opp.

Innleiing

Arduino er ei populær plattform for elektronisk prototyping og utvikling. Arduino-programmeringsspråket er basert på C og C++, eit av dei mest brukte og velkjende programmeringsspråka i verda. Denne artikkelen er ein guide til Arduino-programmeringsspråket og tek for seg kommandoar, funksjonar og vanlege bruksområde.

Du kan køyre programmeringsverktøyet online, eller du kan laste det ned på di eiga side. Tilgang får du gjennom denne lenka: programmeringsverktøyet Arduino IDE.

Programmeringsverktøyet Arduino IDE

Når vi programmerer, er det viktig at vi følger ein fast struktur, for strukturen sikrar at mikrokontrolleren forstår programkoden.

Alle Arduino-programma må innehalde kommandoane setup og loop. Når vi opnar programmeringsverktøyet, er startteksten som i dømet nedanfor:

Døme

Kode

void setup() {

// put your setup code here, to run once:

}

void loop() {

// put your main code here, to run repeatedly:

}

void

Omgrepet void nyttar vi saman med ein kommando. Void at ei programlinje ikkje nokon verdi.

Med andre ord: Når ein programkommando er definert med void, betyr det at programmet utfører ein eller fleire (til dømes å skrive ut noko), men at det ikkje sender nokon data tilbake til den delen av koden som starta med void.

Void kan òg nyttast saman med setup() og loop().

Døme

Ein Arduino kan brukast til å tenne og sløkke ein diode. Viss du som operatør ikkje treng tilbakemelding eller stadfesting på at dioden er tend, kan du nytte funksjonen void.

Kode

void blinkLED(int pin, int delayTime)

{

digitalWrite(pin, HIGH);

delay(delayTime);

digitalWrite(pin, LOW);

delay(delayTime);

}

I dette tilfellet er void nytta framfor funksjonsnamnet blinkLED for å indikere at funksjonen ikkje returnerer nokon verdi.

Funksjonen utfører handlingane "slå på LED-diode" og "slå av LED-diode", men han returnerer ikkje noko resultat og ikkje nokon informasjon tilbake til kodelinja som aktiverer dioden.

setup()

Dette er ein spesiell funksjon som køyrer éin gong ved oppstart av Arduino-programmet. Han blir brukt til å konfigurere faste innstillingar og setje opp I/O-portar eller variablar.

Døme

I funksjonsdømet nedanfor forklarer vi Arduinoen nokre parameterar han må bruke:

  • Først får Arduinoen beskjed om at han skal kommunisere med omverda med ei fart på 9600 baud.

  • Så kjem det ein beskjed om at Arduinoen skal setje pinne 3 til lesemodus, altså at pinnen skal motta signal.

  • Den tredje parameteren er at pinne 4 skal nyttast til å skrive, det vil seie til å sende signal.

Kode

void setup() {

Serial.begin(9600);

pinMode(3, INPUT);

pinMode(4, OUTPUT);

}

loop()

Denne funksjonen gjer at ein operasjon blir gjenteken så lenge ikkje programmet får beskjed om noko anna. Operasjonen går i ein loop (= i ei løkke). Hovudprogrammet skal plasserast i denne funksjonen.

Døme

Programmet nedanfor skriv på ein skjerm om variabelen knapp er skrudd på eller av. Dette vil programmet gjere kvart sekund, heilt til det blir stoppa.

At programmet skal skrive éin gong i sekundet, er gjennom kommandoen delay(1000), som betyr at programmet skal ta 1000 millisekund pause før det køyrer på ny.

Kode

void loop() {

if (digitalRead(knapp) == HIGH) {

Serial.print('På');

}

else {

Serial.print('Av');

}

delay(1000);

}

Datatypar

Arduino støttar dei vanlege datatypane, til dømes int og long (heiltal), float (desimaltal), char (teikn) og bool (). Vi kan òg bruke spesifikke Arduino-datatypar som byte (8-bits heiltal) eller unsigned int (positive heiltal).

Logiske funksjonar

Arduino støttar dei vanlege funksjonane, som til dømes if-setningar, for-løkker, while-løkker og switch-case-setningar. Desse funksjonane blir brukte for å få Arduinoen til å gjennomføre ulike arbeidsoperasjonar ut frå definerte vilkår.

Funksjonane kan ta inn og returnere verdiar, og dei kan kallast frå andre delar av programmet.

Døme

Kodedømet nedanfor er ei if-setning. Ei if-setning definerer eit vilkår som avgjer kva som skal skje vidare.

Kode

if (temperatur > 22) {

digitalWrite(2, LOW);

}

else {

digitalWrite(2, HIGH);

}

Når Arduinoen har lese ein temperaturverdi, skal verdien sjekkast: Viss temperaturen er over grenseverdien på 22 gradar, skal Arduinoen skru av signalet til varmeomnen på pinne 2. Viss temperaturen er lågare enn 22 gradar, skal Arduinoen på pinne 2 sende eit signal til varmeomnen om å slå seg på.

Eigendefinerte funksjonar

Vi kan definere eigne funksjonar i Arduino-programmeringsspråket for å organisere og gjenbruke koden vår. Til dømes kan vi lage små delprogram som ligg utanfor loop(), og programmere at mikrokontrolleren skal hoppe til det aktuelle delprogrammet, gjennomføre det og så hoppe tilbake til staden der den hoppa ut av hovudprogrammet.

Når vi får eit program til å gjere slike hopp, seier vi at programmet kallar opp delprogram.

Variablar

For å lagre verdiar i programmet må vi opprette variablar. Variablar er datatypar som får eit unikt namn som vi vel sjølve.

Skal vi måle ein temperatursensor, kan det vere formålstenleg at variabelen får namnet temperatur. Skal vi måle lysstyrke, bør variabelen kanskje heite nettopp lysstyrke.

Variablane blir oppgitt med datatype, namn og verdi. Ofte blir ein variabel som skal brukast til avlesing, sett til verdien 0 i starten av programmet.

Døme

Kode

int temperatur = 0;

Her programmerer vi at vi skal ha ein variabel som heiter temperatur. Verdiane som variabelen kan fyllast med, må vere av typen int, det vil seie heiltal utan desimalar, og ved starten av programmet er verdien sett til 0.

Variablar kan òg ha faste verdiar. Det gjer det enkelt å endre parameterar på eit seinare tidspunkt, for vi treng berre å endre verdien i starten av programmet, ikkje på kvar einaste stad i programmet der denne verdien skal nyttast.

Klammeparentesar { } og bogeparentesar ( )

Klammeparentesar og bogeparentesar er viktige i programmeringsspråket. Kommandolinjer som høyrer saman, må rammast inn av klammeparentesar, mens verdiar må rammast inn av bogeparentesar.

Semikolon ;

Semikolon fortel Arduinoen at programlinja er lesen ferdig, og at det som står på linja, kan utførast. Alle programlinjene blir avslutta med semikolon.

Store og små bokstavar

Kodespråket skil mellom store og små bokstavar. Vi må derfor passe på at skrivemåten blir heilt rett. Berre då kan programmet køyre som forventa.

Døme på bruk av stor og liten bokstav kan vere analogRead og digitalWrite.

Dobbel skråstrek //

Dobbel skråstrek blir nytta før ei beskriving. Teiknet fortel Arduinoen at det som følger, ikkje er ein del av koden, men ein kommentar eller beskjed om kva programmet eller linja skal gjere.

Vanlege funksjonar og bibliotek

Arduino-programmeringsspråket kjem med eit sett med innebygde funksjonar og bibliotek som gjer det enklare å jobbe med ulike komponentar og einingar. Her er nokre vanlege funksjonar og bibliotek du kan bruke:

pinMode(pin, mod)

Denne funksjonen blir brukt til å konfigurere ein I/O-pinne som anten inngang eller utgang. Du må oppgi pinnenummeret og modusen (INPUT eller OUTPUT).

Døme

Kode

pinMode(3, OUTPUT);

Her programmerer du Arduinoen til å bruke pinne 3 til så sende eller skrive eit signal.

digitalRead(pin)

Denne funksjonen les tilstanden til ein digital inngangspinne og returnerer anten HIGH eller LOW, avhengig av tilstanden til pinnen.

Døme

Kode

digitalRead(6);

Her programmerer du Arduinoen til å motta eller lese eit digitalt signal på pinne 6.

Du treng òg ein variabel der denne verdien skal lagrast. Heile programlinja bli då til dømes:

variabel = digitalRead(6)

digitalWrite(pin, value)

Denne funksjonen skriv ein digital verdi (HIGH eller LOW) til ein digital utgangspinne for å kontrollere tilstanden til eininga som er kopla til pinnen.

Døme

Kode

digitalWrite(4, HIGH);

Her programmerer du Arduinoen til å sende eller skrive eit digitalt signal på pinne 4. Signalet er HIGH, og det betyr at signalet på pinnen er slått på. Då vil til dømes ein diode som er kopla til denne pinnen, lyse.

analogRead(pin)

Denne funksjonen les den analoge verdien frå ein analog inngangspinne og returnerer ein verdi mellom 0 og 1023, avhengig av spenningsnivået.

Arduinoen opererer med 5 volt spenning, og han har ein kapasitet på 1024 moglege verdiar. Derfor vil forskjellen i spenning frå ein verdi til neste vere 0,0049 volt.

Døme

Kode

temperatur = analogRead(6);

I dette dømet er Arduinoen kopla til ein temperaturfølar og les verdien frå denne på pinne 6.

Verdien blir lagra i variabelen temperatur.

analogWrite(pin, value)

For å skrive ein verdi på ein analog I/O-port bruker vi analogWrite(pin)-funksjonen, der pin er nummeret på den analoge I/O-porten.

Denne funksjonen vil returnere ein verdi mellom 0 og 1023, avhengig av spenningsnivået som skal skrivast. Verdien som skal skrivast, må vere lagra i ein variabel.

Døme

Kode

analogWrite(6, lydstyrke);

I dette dømet vil Arduinoen skrive den verdien som er lagra på variabelen lydstyrke, gjennom pinne 6.

Full lydstyrke vil ha verdien 1023, mens "ingen lyd" vil ha verdien 0.

PWM (Pulse Width Modulation, pulsbreiddemodulasjon)

Denne funksjonen skriv ein PWM-verdi til ein PWM-kompatibel pinne. PWM blir ofte brukt til å kontrollere lysstyrken til LED-lys eller farta til ein motor.

Ein Arduino Uno har seks portar som kan nyttast til å sende PWM-signal. Det er portane 3, 5, 6, 9, 10 og 11. Portar som kan behandle PWM-signal, er merkte med tilde (dvs. symbolet ~).

Pulsbreidda angir i prosent kor stor del av ein tidsperiode ein port er aktiv, og kor lenge han er inaktiv.

Arduinoen kan skru av og på ein krets 500 gonger per sekund (oppdateringsfreksvens 500 Hz). Verdiane som kan nyttast, går då frå 0 til 255.

Verdien 255 betyr "alltid avslått", verdien 128 betyr "avslått omtrent halve tida, påslått omtrent halve tida", mens verdien 0 betyr "alltid avslått".

For å programmere ein PWM må vi bruke ein port som kan skrive PWM-signal, og dessutan velje ein verdi. Verdien kan anten vere eit fast tal eller ein variabel.

Døme

Viss du har ein vribrytar, kan du nytte han som dimmer på eit lys ved å lese den analoge verdien frå dimmeren og nytte denne til å regulere PWM-signalet.

Kode

lysstyrke = analogRead(3)

analogWrite(9, lysstyrke)

Her les Arduinoen verdien frå dimmeren og lagrar han i variabelen lysstyrke. Så skriv Arduinoen verdien som eit PWM-signal på pinne 9 og gir rett lysstyrke.

Bibliotek og tilleggsprogram

Arduino kjem òg med eit breitt utval av bibliotek som utvidar funksjonaliteten til plattforma.

Desse biblioteka gir ferdiglaga funksjonar og verktøy for å jobbe med einingar som LCD-skjermar, sensorar, kommunikasjonsprotokollar og mykje meir.

Du kan enkelt legge til bibliotek i Arduino-utviklingsmiljøet for å bruke funksjonane deira i prosjekta dine.