Hopp til innhold

Fagartikkel

Arduino IDE-programmeringsspråk

Mikrokontrollere trenger en kode eller et program for å fungere. Mange leverandører har utvikla egen programvare som gjør det enklere å programmere mikrokontrollere. Arduino IDE er et slikt program. Vi skal se nærmere på hvordan koden i Arduino IDE er bygd opp.
En skjerm som viser en kode for bruk på en Arduino. Skjermbilde.

Innledning

Arduino er en populær plattform for elektronisk prototyping og utvikling. Arduino-programmeringsspråket er basert på C og C++, ett av de mest brukte og velkjente programmeringsspråka i verden. Denne artikkelen er en guide til Arduino-programmeringsspråket og tar for seg kommandoer, funksjoner og vanlige bruksområder.

Du kan kjøre programmeringsverktøyet online, eller du kan laste det ned på di egen 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 en fast struktur, for strukturen sikrer at mikrokontrolleren forstår programkoden.

Alle Arduino-programmene må inneholde kommandoene setup og loop. Når vi åpner programmeringsverktøyet, er startteksten som følger:

Eksempel

Kode

void setup() {

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

}

void loop() {

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

}

void

Begrepet void benytter vi sammen med en kommando. Void at ei programlinje ikke noen verdi.

Med andre ord: Når en programkommando er definert med void, betyr det at programmet utfører en eller flere (for eksempel å skrive ut noe), men at det ikke sender noen data tilbake til den delen av koden som starta med void.

Void kan også benyttes sammen med setup() og loop().

Eksempel

En Arduino kan brukes til å tenne og slukke en diode. Hvis du som operatør ikke trenger noen tilbakemelding eller bekreftelse på at dioden er tent, kan du benytte funksjonen void.

Kode

void blinkLED(int pin, int delayTime)

{

digitalWrite(pin, HIGH);

delay(delayTime);

digitalWrite(pin, LOW);

delay(delayTime);

}

I dette tilfellet er void benytta foran funksjonsnavnet blinkLED for å indikere at funksjonen ikke returnerer noen verdi.

Funksjonen utfører handlingene "slå på LED-diode" og "slå av LED-diode", men den returnerer ikke noe resultat eller informasjon tilbake til kodelinja som aktiverer dioden.

setup()

Dette er en spesiell funksjon som kjører én gang ved oppstart av Arduino-programmet. Den brukes til å konfigurere faste innstillinger og sette opp I/O-porter eller variabler.

Eksempel

I funksjonseksempelet nedenfor forklarer vi Arduinoen noen parametere den må forholde seg til:

  • Først får Arduinoen beskjed om at den skal kommunisere med omverdenen med en hastighet på 9600 baud.

  • Så kommer det en beskjed om at Arduinoen skal sette pinne 3 til lesemodus, altså at den skal motta signaler.

  • Den tredje parameteren er at pinne 4 skal benyttes til å skrive, det vil si til å sende signaler.

Kode

void setup() {

Serial.begin(9600);

pinMode(3, INPUT);

pinMode(4, OUTPUT);

}

loop()

Denne funksjonen gjør at en operasjon gjentas så lenge ikke programmet får beskjed om noe annet. Operasjonen går i en loop (= i ei løkke). Hovedprogrammet skal plasseres i denne funksjonen.

Eksempel

Programmet nedenfor vil skrive på en skjerm om variabelen knapp er skrudd på eller av. Dette vil programmet gjøre hvert sekund helt til det stoppes.

At programmet skal skrive én gang i sekundet, er gjennom kommandoen delay(1000), som betyr at programmet skal ta 1000 millisekunder pause før det kjøres igjen.

Kode

void loop() {

if (digitalRead(knapp) == HIGH) {

Serial.print('På');

}

else {

Serial.print('Av');

}

delay(1000);

}

Datatyper

Arduino støtter de vanlige datatypene, for eksempel int og long (heltall), float (desimaltall), char (tegn) og bool (). Vi kan også bruke spesifikke Arduino-datatyper som byte (8-bits heltall) eller unsigned int (positive heltall).

Logiske funksjoner

Arduino støtter de vanlige funksjonene, som for eksempel if-setninger, for-løkker, while-løkker og switch-case-setninger. Disse funksjonene brukes for å få Arduinoen til å gjennomføre ulike arbeidsoperasjoner ut fra definerte betingelser.

Funksjonene kan ta inn og returnere verdier, og de kan kalles fra andre deler av programmet.

Eksempel

Kodeeksempelet nedenfor er en if-setning. En if-setning definerer en betingelse som avgjør hva som skal skje videre.

Kode

if (temperatur > 22) {

digitalWrite(2, LOW);

}

else {

digitalWrite(2, HIGH);

}

Når Arduinoen har lest en temperaturverdi, skal verdien sjekkes: Hvis temperaturen er over grenseverdien på 22 grader, skal Arduinoen skru av signalet til varmeovnen på pinne 2. Hvis temperaturen er lavere enn 22 grader, skal Arduinoen på pinne 2 sende et signal til varmeovnen om å slå seg på.

Egendefinerte funksjoner

Vi kan definere egne funksjoner i Arduino-programmeringsspråket for å organisere og gjenbruke koden vår. For eksempel kan vi lage små delprogrammer som ligger utenfor loop(), og programmere at mikrokontrolleren skal hoppe til det aktuelle delprogrammet, gjennomføre det og så hoppe tilbake til stedet der den hoppa ut av hovedprogrammet.

Når vi får et program til å gjøre slike hopp, sier vi at programmet kaller opp delprogrammer.

Variabler

For å lagre verdier i programmet må vi opprette variabler. Variabler er datatyper som får et unikt navn som vi selv angir.

Skal vi måle en temperatursensor, kan det være hensiktsmessig at variabelen får navnet temperatur. Skal vi måle lysstyrke, bør variabelen kanskje hete nettopp lysstyrke.

Variablene angis med datatype, navn og verdi. Ofte settes en variabel som skal brukes til avlesing, til verdien 0 på starten av programmet.

Eksempel

Kode

int temperatur = 0;

Her programmerer vi at vi skal ha en variabel som heter temperatur. Verdiene som variabelen kan fylles med, må være av typen int, det vil si heltall uten desimaler, og ved starten av programmet er verdien satt til 0.

Variabler kan også ha faste verdier. Det gjør det enkelt å endre parametere på et seinere tidspunkt, for vi trenger kun å endre verdien i starten av programmet, ikke på alle stedene i programmet der denne verdien skal benyttes.

Klammeparenteser { } og bueparenteser ( )

Klammeparenteser og bueparenteser er viktige i programmeringsspråket. Kommandolinjer som hører sammen, må rammes inn av klammeparenteser, mens verdier må rammes inn av bueparenteser.

Semikolon ;

Semikolon forteller Arduinoen at programlinja er lest ferdig, og at det som står på linja, kan utføres. Alle programlinjer avsluttes med semikolon.

Store og små bokstaver

Kodespråket skiller mellom store og små bokstaver. Vi må derfor passe på at skrivemåten blir helt riktig. Bare da kan programmet kjøre som forventa.

Eksempler på bruk av stor og liten bokstav kan være analogRead og digitalWrite.

Dobbel skråstrek //

Dobbel skråstrek benyttes før en beskrivelse. Tegnet forteller Arduinoen at det som følger, ikke er en del av koden, men en kommentar eller beskjed om hva programmet eller linja skal gjøre.

Vanlige funksjoner og biblioteker

Arduino-programmeringsspråket kommer med et sett med innebygde funksjoner og biblioteker som gjør det enklere å jobbe med forskjellige komponenter og enheter. Her er noen vanlige funksjoner og biblioteker du kan bruke:

pinMode(pin, mode)

Denne funksjonen brukes til å konfigurere en I/O-pinne som enten inngang eller utgang. Du må angi pinnenummeret og modusen (INPUT eller OUTPUT).

Eksempel

Kode

pinMode(3, OUTPUT);

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

digitalRead(pin)

Denne funksjonen leser tilstanden til en digital inngangspinne og returnerer enten HIGH eller LOW, avhengig av tilstanden til pinnen.

Eksempel

Kode

digitalRead(6);

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

Du trenger også en variabel der denne verdien skal lagres. Hele programlinja bli da eksempelvis:

variabel = digitalRead(6)

digitalWrite(pin, value)

Denne funksjonen skriver en digital verdi (HIGH eller LOW) til en digital utgangspinne for å kontrollere tilstanden til enheten som er kopla til pinnen.

Eksempel

Kode

digitalWrite(4, HIGH);

Her programmerer du Arduinoen til å sende/skrive et digitalt signal på pinne 4. Signalet er HIGH, og det betyr at signalet på pinnen er slått på. Da vil for eksempel en diode som er kopla til denne pinnen, lyse.

analogRead(pin)

Denne funksjonen leser den analoge verdien fra en analog inngangspinne og returnerer en verdi mellom 0 og 1023, avhengig av spenningsnivået.

Arduinoen opererer med 5 volt spenning, og den har en kapasitet på 1024 mulige verdier. Derfor vil forskjellen i spenning fra en verdi til neste være 0,0049 volt.

Eksempel

Kode

temperatur = analogRead(6);

I dette eksempelet er Arduinoen tilkopla en temperaturføler og leser verdien fra denne på pinne 6.

Verdien blir lagra i variabelen temperatur.

analogWrite(pin, value)

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

Denne funksjonen vil returnere en verdi mellom 0 og 1023, avhengig av spenningsnivået som skal skrives. Verdien som skal skrives, må være lagra i en variabel.

Eksempel

Kode

analogWrite(6, lydstyrke);

I dette eksempelet 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, pulsbreddemodulasjon)

Animasjon som viser prosentvis varighet på en strømpuls. Animasjon

Denne funksjonen skriver en PWM-verdi til en PWM-kompatibel pinne. PWM brukes ofte til å kontrollere lysstyrken til LED-lys eller hastigheten til en motor.

En Arduino Uno har seks porter som kan benyttes til å sende PWM-signaler. Det er portene 3, 5, 6, 9, 10 og 11. Porter som kan behandle PWM-signaler, er merka med tilde (dvs. symbolet ~).

Pulsbredden angir i prosent hvor stor del av en tidsperiode en port er aktiv, og hvor lenge den er inaktiv.

Arduinoen kan skru av og på en krets 500 ganger per sekund (oppdateringsfreksvens 500 Hz). Verdiene som kan benyttes, går da fra 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 angir "alltid avslått".

For å programmere en PWM må vi bruke en port som kan skrive PWM-signaler, samt velge en verdi. Verdien kan enten være et fast tall eller en variabel.

Eksempel

Hvis du har en vribryter, kan du bruke den som dimmer på et lys ved å lese den analoge verdien fra dimmeren og bruke denne verdien til å regulere PWM-signalet.

Kode

lysstyrke = analogRead(3)

analogWrite(9, lysstyrke)

Her leser Arduinoen verdien fra en dimmer og lagrer denne i variabelen lysstyrke. Så skriver Arduinoen verdien som et PWM-signal på pinne 9 og gir rett lysstyrke.

Biblioteker og tilleggsprogram

Arduino kommer også med et bredt utvalg av biblioteker som utvider funksjonaliteten til plattformen.

Disse bibliotekene gir ferdiglaga funksjoner og verktøy for å jobbe med enheter som LCD-skjermer, sensorer, kommunikasjonsprotokoller og mye mer.

Du kan enkelt legge til biblioteker i Arduino-utviklingsmiljøet for å bruke deres funksjoner i prosjektene dine.

CC BY-SASkrevet av Roger Rosmo.
Sist faglig oppdatert 02.06.2023

Læringsressurser

Programmering av mikrokontrollere