Hopp til innhold
Bokmål
Oppgave

Spaceship Interface

I denne oppgava skal du kople og programmere et kult kontrollpanel med en bryter og tre LED-lys som slås på eller av når du trykker på bryteren.

Kort om oppgava

Læringsmål, tidsbruk, utstyr

Du skal kode det første Arduino-programmet ditt.

Dette skal du lære om:

  • digital inngang og utgang

  • variabler

  • if-kommando

  • else-kommando

Tidsbruk

45 minutter

Nivå

1 av 5

Forkunnskaper

gjennomført modul 1

Nødvendig utstyr

  • Arduino mikrokontroller

  • koplingsbrett (breadboard)

  • ledninger

  • trykkbryter (push-button)

  • tre lysdioder (2 røde, 1 grønn)

  • tre resistorer på 220 ohm (Ω)

  • en resistor på 10 kiloohm (kΩ)

Introduksjon

I dette prosjektet skal du bygge noe som kunne vært et romskipsgrensesnitt i en science fiction-film fra 1970-tallet. Du lager et kontrollpanel med en bryter og tre LED-lys som slås på eller av når du trykker på bryteren. Du kan bestemme om lysa betyr "Engage Hyperdrive" eller "Fire the lasers!". Ei grønn LED-lampe lyser helt til du trykker på en knapp. Når Arduinoen får et signal fra knappen, vil det grønne lyset slå seg av, og to andre lys vil begynne å blinke.

Kopling av Arduinoen

Du skal kople Arduinoen til koplingsbrettet (breadbord) og montere lysdiodene, trykkbryteren og resistorene. Du kan velge hvor på brettet du vil plassere komponentene.

Koplingsbrett og dioder

Kople koplingsbrettet til Arduinoens 5V og jordforbindelser. Plasser de to røde lysdiodene og en grønn lysdiode på koplingsbrettet.

Fest katoden (kort bein) til hver lysdiode til jord gjennom en 220 Ω (220 ohm) motstand. Kople anoden (langt bein) til den grønne lysdioden til pinne 3. Kople anodene til de røde diodene til henholdsvis pinne 4 og 5.

Bryter

Plasser bryteren på koplingsbrettet. Fest den ene sida til strøm og den andre sida til digital pin 2 på Arduinoen. Du må også legge til en 10 kΩ (10 kiloohm) motstand fra jord til bryterpinnen som koples til Arduinoen.

Denne nedtrekksmotstanden kopler pinnen til jord når bryteren er åpen, og den leser LAV (LOW) når det ikke kommer spenning inn gjennom bryteren.

Valg av design

Du kan dekke koplingsbrettet med et deksel etter malen som følger med i oppgava, eller du kan lage ditt eget design.

Lysa som slås av og på, betyr ingenting i seg selv. De får først mening når du setter dem i et kontrollpanel og gir dem etiketter. Hva vil du at den grønne lysdioden skal signalisere? Hva skal de blinkende røde lysdiodene bety? Du bestemmer!

Programmering av Arduinoen

For at lys og bryter skal gjøre det du ønsker, må du programmere Arduinoen. Her får du forklart programmet, og du lærer litt grunnleggende Arduino-programmering.

Funksjoner

Funksjoner er kodeblokker eller delprogrammer som får en datamaskin til å utføre én bestemt oppgave. De har unike navn og "" ved behov.

Et Arduino-program har to hovedfunksjoner, setup() og loop(). Funksjonen setup() kjøres bare én gang, og det er med én gang bruker kopler til strømmen. Funksjonen loop() kjører så lenge Arduinoen har strøm.

Når du åpner programmeringsverktøyet Arduino IDE, er de to hovedfunksjonene setup() og loop() allerede på plass. De skal fylles med kode som forteller datamaskinen hva den skal gjøre.

Startoppsett Arduino IDE

void setup(){

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

}

void loop(){

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

}

Sløyfeparenteser

Foran og etter koden til en funksjon setter du sløyfeparenteser. All koden som står innenfor sløyfeparentesene, blir utført når funksjonen kalles opp.

Variabler

I programmet ditt skal du lage en variabel før du kommer inn i hoveddelen til programmet. En variabel er en lagringsplass for en verdi i minnet til Arduinoen. Denne verdien kan forandre seg avhengig av instruksjonene du gir i programmet.

Variabler bør ha et navn som beskriver verdien de lagrer. For eksempel forteller variabelnavnet switchState (bryterTilstand) deg at denne variabelen lagrer tilstanden til en switch (bryter).

For å lage en variabel må du også angi hvilken datatype den kan inneholde. I eksempelet nedenfor er datatypen valgt. Da kan variabelen lagre et heltall, det vil si et tall uten desimaler. Når du deklarerer en variabel, gir du den vanligvis også en startverdi. Deklarasjonen av variabelen må ende med semikolon (;).

Eksempel på variabeldeklarering

1 int switchState = 0;

Nummerering

Programlinja i eksempelet starter med tallet 1. Dette tallet er kun ei linjenummerering, det er ikke en del av selve programmet. De neste linjene i programmet får talla 2, 3, 4 osv.

Innganger og utganger

De digitale pinnene til Arduinoen kan bare lese to tilstander: om det er spenning på en inngangspinne, eller om det ikke er det. Disse tilstandene blir ofte omtalt som HØY (på)og LAV (av).

Pinnene på Arduinoen kan fungere som enten innganger eller utganger. I koden din du dem ut fra funksjonen du vil de skal ha. Hvis pinnene er utganger, kan du bruke dem til å slå på komponenter som LED-lys. Og hvis du konfigurerer dem som innganger, kan du sjekke om en bryter blir trykt eller ikke. Siden pinnene 0 og 1 brukes til å kommunisere med datamaskinen, starter du med pinne 2.

Du konfigurerer de digitale pinnene i hovedfunksjonen setup(). Til dette bruker du en funksjon kalt pinMode(). Pinnene som er kopla til lysdioder, vil være OUTPUT, og bryterpinnen vil være en INPUT.

Eksempel på konfigurering av innganger og utganger

2 void setup(){

3 pinMode(3,OUTPUT);

4 pinMode(4,OUTPUT);

5 pinMode(5,OUTPUT);

6 pinMode(2,INPUT);

7 }

Store og små bokstaver

Vær nøyaktig med bruk av store og små bokstaver i koden din. For eksempel er pinMode navnet på en kommando i programvaren til Arduinoen. Skriver du pinmode med liten m, får du en kodefeil.

Loop-funksjonen

Funksjonen loop() kjører kontinuerlig etter at setup() er fullført. loop() er selve programdelen der du vil sjekke for spenning på inngangene og slå utganger på og av.

For å sjekke spenningsnivået på en digital inngang bruker du funksjonen digitalRead(). Funksjonen må få beskjed om hvilken pinne som skal sjekkes. På fagspråket sier vi at digitalRead() trenger et argument. Et argument er altså konkret informasjon som du sender til en funksjon slik at den kan gjøre jobben sin.

I programmet ditt skal digitalRead() sjekke tilstanden til pinne 2 og lagre verdien i switchState-variabelen. Hvis det er spenning på pinnen når digitalRead() kalles, vil switchState-variabelen få verdien HIGH (eller 1). Hvis det ikke er spenning på pinnen, vil switchState få verdien LOW (eller 0).

Eksempel på loop-funksjon

8 void loop(){

9 switchState = digitalRead(2);

10 // Dette er en kommentar som ikke leses av Arduinoen. Arduinoen leser her bare verdien på pinne 2 og lagrer denne i variabelen switchState.

Kommentarer i koden

Kommentarer er notater i koden som du legger inn for din egen del. For å skrive en kommentar legger du til to skråstreker (//). Datamaskinen vil ignorere alt på linja som kommer etter disse skråstrekene.

if-setning

Med en if()-setning legger du inn et vilkår (en betingelse) som avgjør hva datamaskinen skal gjøre videre. I kodeeksempelet nedenfor er vilkåret er at trykk-knappen ikke er pressa (at verdien er LOW). Programmet sjekker om vilkåret er oppfylt (sant) eller ikke (usant) ved å sammenlikne betingelsen med aktuell brytertilstand.

Eksempel på if()-setning

11 if (switchState == LOW) {

12 // Hvis trykk-knapp er ikke pressa, gjør dette:

Doble likhetstegn

Når du sammenlikner to ting i programmering, bruker du doble likhetstegn (==). Hvis du bare bruker ett tegn, vil du angi en verdi i stedet for å sammenlikne den.

digitalWrite()

digitalWrite() er kommandoen som lar deg sende 5 volt eller 0 volt til en utgangspinne. Kommandoen tar to argumenter:

  1. hvilken pinne som skal kontrolleres

  2. hvilken verdi som skal angis for pinnen, HIGH eller LOW

Eksempel på bruk av digitalWrite()

Hvis du vil slå av de røde LED-ene og slå på den grønne LED-en, vil koden din se slik ut:

13 digitalWrite(3, HIGH); // Grønn LED, lys på

14 digitalWrite(4, LOW); // Rød LED, lys av

15 digitalWrite(5, LOW); // Rød LED , lys av

16 }


Pseudokode

En pseudokode er en strukturert beskrivelse av hva du vil at programmet skal gjøre. Den gjør det enklere for deg å skrive selve koden i etterkant. Vi tar et eksempel:

Du skal sjekke om switchState er HIGH (knappen er trykt) eller LOW (knappen er ikke trykt). Hvis knappen ikke er trykt, skal den grønne LED-en være slått på, mens de røde LED-ene er slått av. Hvis knappen er trykt, skal den grønne LED-en slås av, mens de røde LED-ene slås på.

I pseudokode kan setningen se slik ut:

  • Hvis switchState er LOW: slå på den grønne LED-en, slå av de røde LED-ene.

  • Hvis switchState er HIGH: slå av den grønne LED-en, slå på de røde LED-ene.

else()-kommando

Fram til linje 16 i programmet har du fortalt Arduinoen hva den skal gjøre når knappen ikke er trykt (LOW-tilstand). Nå skal du definere hva som skjer dersom knappen faktisk er trykt (HIGH-tilstand). Da bruker du en else()-kommando. Dette er en valgfri komponent til if()-setningen som definerer hva som skjer hvis vilkåret ikke er oppfylt.

Eksempel på else()-kommando

Når knappen trykkes, skal de røde LED-ene blinke og den grønne LED-en slas av. Da må du legge til denne else()-kommandoen i koden:

17 else { // Hvis trykk-knapp er aktivert, gjør dette:

18 digitalWrite(3, LOW); // Slår av strøm på pinne 3, lys av

19 digitalWrite(4, LOW); // Slår av strøm på pinne 4, lys av

20 digitalWrite(5, HIGH); // Slår på strøm på pinne 5, lys på

21 delay(250); // Venter i 250 millisekunder

22 // Endre lyssetting:

23 digitalWrite(4, HIGH); // Slår på strøm på pinne 4, lys på

24 digitalWrite(5, LOW); // Slår av strøm på pinne 5, lys av

25 delay(250); // Venter i 250 millisekunder

26 }

27 } // Kjører programkode i loop() på nytt.


Kommandoen delay

Delay er det engelske ordet for forsinkelse eller utsettelse. Ved programmering brukes kommandoen delay til å sette programmet på pause i en angitt tidsperiode. Pausen oppgis i sekunder. Koden delay(250); for eksempel betyr at programmet skal ta en pause på 250 millisekunder (et kvart sekund) før det hopper videre til neste programlinje.

Denne pausen er viktig, for Arduinoen går gjennom loop()-en sin tusenvis av ganger hvert sekund, og LED-ene vil slås av og på raskere enn vi kan oppfatte. Uten programmerte pauser vil vi oppleve LED-ene som litt svakt lysende, men ikke som blinkende.

Kjør programmet på Arduinoen din

Etter at du har skrevet ferdig programmet og kompilert (sjekka) det, overfører du det til din Arduino. Når Arduinoen er programmert, slås det grønne lyset på. Trykker du på bryteren, vil de røde lysa begynne å blinke, mens det grønne lyset slås av.

Oppgave

Du har nå laga ei enkel kopling som får lysdioder til å lyse. Kan du gjøre endringer i programmet som gir koplinga andre funksjoner?

Prøv å endre pausetidene

Prøv å endre tida for de to delay()-funksjonene. Legg merke til hva som da skjer med lysa, og hvordan både blinketempoet og responsen til systemet endres. Når du kaller en delay() i programmet ditt, settes all annen funksjonalitet på pause i den angitte tidsperioden. Forsinkelser er ofte nyttige, men du må også passe på at de ikke unødvendig forstyrrer grensesnittet ditt når du designer prosjektene dine.

Prøv å lage andre lyssignaler

Prøv for eksempel om du kan

  • få de røde LED-ene til å blinke når programmet starter

  • bytte ut den ene av de to røde lysdiodene med en gul og programmere de tre lysa som et trafikklys

  • lage et større eller mer komplekst panel ved å kople til flere lysdioder og brytere

Vurder brukeropplevelsen

Når du begynner å lage et grensesnitt (et design for brytere og lysdioder) for prosjektet ditt, må du også ta hensyn til brukernes forventninger. Vil brukerne ha umiddelbar tilbakemelding når de trykker på en knapp? Eller bør det være en forsinkelse mellom handlinga deres og reaksjonen fra Arduinoen? Prøv alltid å plassere deg selv i skoene til en vanlig bruker mens du designer.

Hva har du lært?

I dette prosjektet har du oppretta det første Arduino-programmet ditt. Programmet lar brukeren kontrollere oppførselen til noen lysdioder ved hjelp av en bryter. Du har brukt variabler, en if()/else()-setning og funksjoner for å lese tilstanden til en inngang og til å kontrollere utganger.

Eksempelkode og programfil

Her finner du den komplette eksempelkoden for denne oppgava. Koden ligger også som nedlastbar programfil sist i denne artikkelen. Koplingsskjemaet for prosjektet er lagt ved som PDF-fil.

Eksempel på komplett kode for oppgava

int switchState = 0; // Variabel for å lagre tilstanden til bryteren (trykk-knappen)

void setup() {

pinMode(3, OUTPUT); // Setter digital pin 3 som utgang for grønn LED

pinMode(4, OUTPUT); // Setter digital pin 4 som utgang for rød LED

pinMode(5, OUTPUT); // Setter digital pin 5 som utgang for rød LED

pinMode(2, INPUT); // Setter digital pin 2 som inngang for bryteren (trykk-knappen)

}

void loop() {

switchState = digitalRead(2); // Leser verdien på pinne 2 og lagrer den i variabelen switchState

if (switchState == LOW) {

// Hvis trykk-knappen ikke er trykt:

digitalWrite(3, HIGH); // Slår på den grønne LED-en (pinne 3)

digitalWrite(4, LOW); // Slår av den første røde LED-en (pinne 4)

digitalWrite(5, LOW); // Slår av den andre røde LED-en (pinne 5)

}

else {

// Hvis trykk-knappen er trykt:

digitalWrite(3, LOW); // Slår av den grønne LED-en (pinne 3)

digitalWrite(4, LOW); // Slår av den første røde LED-en (pinne 4)

digitalWrite(5, HIGH); // Slår på den andre røde LED-en (pinne 5)

delay(250); // Venter i 250 millisekunder

// Bytter hvilken LED som lyser:

digitalWrite(4, HIGH); // Slår på den første røde LED-en (pinne 4)

digitalWrite(5, LOW); // Slår av den andre røde LED-en (pinne 5)

delay(250); // Venter i 250 millisekunder

}

// Programmet går tilbake til starten av loop-funksjonen og kjører på nytt.

}

Forklaring:

int switchState = 0;

definerer en heltallsvariabel som lagrer tilstanden til bryteren (om knappen er trykt eller ikke)

void setup()

initialiserer pinnene som utganger eller innganger

pinMode(3, OUTPUT);

setter pinne 3 som utgang for grønn LED

pinMode(4, OUTPUT);

setter pinne 4 som utgang for første røde LED

pinMode(5, OUTPUT);

setter pinne 5 som utgang for andre røde LED

pinMode(2, INPUT);

setter pinne 2 som inngang for bryteren

void loop()

funksjon som kjører kontinuerlig

switchState = digitalRead(2);

leser tilstanden til bryteren på pinne 2 og lagrer den i variabelen switchState

if (switchState == LOW)

sjekker om bryteren ikke er trykt

digitalWrite(3, HIGH);

slår på den grønne LED-en

digitalWrite(4, LOW);

slår av den første røde LED-en

digitalWrite(5, LOW);

slår av den andre røde LED-en

else

hvis bryteren er trykt

digitalWrite(3, LOW);

slår av den grønne LED-en

digitalWrite(4, LOW);

slår av den første røde LED-en

digitalWrite(5, HIGH);

slår på den andre røde LED-en

delay(250);

venter i 250 millisekunder

digitalWrite(4, HIGH);

slår på den første røde LED-en

digitalWrite(5, LOW);

slår av den andre røde LED-en

delay(250);

venter i 250 millisekunder

Når loop()-funksjonen er ferdig, starter den på nytt og kjører kontinuerlig.

Skrevet av Arduino.
Sist oppdatert 16.08.2024