Hopp til innhald
Nynorsk
Oppgåve

Spaceship interface

I denne oppgåva skal du kople og programmere eit kult kontrollpanel med ein brytar og tre LED-lys som blir slått på når du trykker på brytaren.

Kort om oppgåva

Læringsmål, tidsbruk, utstyr

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

Dette skal du lære om:

  • digital inngang og utgang

  • variablar

  • if-kommando

  • else-kommando

Tidsbruk

45 minutt

Nivå

1 av 5

Forkunnskapar

gjennomført modul 1

Nødvendig utstyr

  • Arduino mikrokontroller

  • koplingsbrett (breadboard)

  • leidningar

  • trykkbrytar (push-button)

  • tre lysdiodar (2 raude, 1 grøn)

  • tre resistorar på 220 ohm (Ω)

  • ein resistor på 10 kiloohm (kΩ)

Introduksjon

I dette prosjektet skal du bygge noko som kunne vore eit romskipsgrensesnitt i ein science fiction-film frå 1970-talet. Du lagar eit kontrollpanel med ein brytar og tre LED-lys som blir slått på eller av når du trykker på brytaren. Du kan avgjere om lysa betyr "Engage Hyperdrive" eller "Fire the lasers!". Ei grøn LED-lampe lyser heilt til du trykker på ein knapp. Når Arduinoen får eit signal frå knappen, vil det grøne lyset slå seg av, mens to andre lys vil begynne å blinke.

Kopling av Arduinoen

Du skal kople Arduinoen til koplingsbrettet (breadbord) og montere lysdiodane, trykkbrytaren og resistorane. Du kan velje kvar på brettet du vil plassere komponentane.

Koplingsbrett og diodar

Kople koplingsbrettet til Arduinoens 5V og jordsamband. Plasser dei to raude lysdiodane og ein grøn lysdiode på koplingsbrettet.

Fest katoden (kort bein) til kvar lysdiode til jord gjennom ein 220 Ω (220 ohm) motstand. Kople anoden (langt bein) til den grøne lysdioden til pinne 3. Kople anodane til dei raude diodane til høvesvis pinne 4 og 5.

Brytar

Plasser brytaren på koplingsbrettet. Fest den eine sida til straum og den andre sida til digital pin 2 på Arduinoen. Du må òg legge til ein 10 kΩ (10 kiloohm) motstand frå jord til brytarpinnen som blir kopla til Arduinoen.

Denne nedtrekksmotstanden koplar pinnen til jord når brytaren er open, og han les LÅG (LOW) når det ikkje kjem spenning inn gjennom brytaren.

Val av design

Du kan dekke koplingsbrettet med eit deksel etter malen som følger med i oppgåva, eller du kan lage ditt eige design.

Lysa som blir slått av og på, betyr ingenting i seg sjølve. Dei får først meining når du set dei i eit kontrollpanel og gir dei etikettar. Kva vil du at den grøne lysdioden skal signalisere? Kva skal dei blinkande raude lysdiodane bety? Du bestemmer!

Programmering av Arduinoen

For at lys og brytar skal gjere det du ønsker, må du programmere Arduinoen. Her får du forklart programmet, og du lærer litt grunnleggande Arduino-programmering.

Funksjonar

Funksjonar er kodeblokker eller delprogram som får ei datamaskin til å utføre éi bestemd oppgåve. Funksjonar har unike namn og "" ved behov.

Eit Arduino-program har to hovudfunksjonar, setup() og loop(). Funksjonen setup() blir berre køyrd éin gong, og det er med éin gong brukar koplar til straumen. Funksjonen loop() køyrer så lenge Arduinoen har straum.

Når du opnar programmeringsverktøyet Arduino IDE, er dei to hovudfunksjonane setup() og loop() allereie på plass. Dei skal fyllast med kode som fortel datamaskina kva ho skal gjere.

Startoppsett Arduino IDE

void setup(){

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

}

void loop(){

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

}

Sløyfeparentesar

Framfor og etter koden til ein funksjon set du sløyfeparentesar. All koden som står innanfor sløyfeparentesane, blir utført når funksjonen blir kalla opp.

Variablar

I programmet ditt skal du lage ein variabel før du kjem inn i hovuddelen til programmet. Ein variabel er ein lagringsplass for ein verdi i minnet til Arduinoen. Denne verdien kan forandre seg alt etter instruksjonane du gir i programmet.

Variablar bør ha eit namn som beskriv verdien dei lagrar. Til dømes fortel variabelnamnet switchState (brytartilstand) deg at denne variabelen lagrar tilstanden til ein switch (brytar).

For å lage ein variabel må du òg angi kva datatype han kan innehalde. I dømet nedanfor er datatypen vald. Då kan variabelen lagre eit heiltal, det vil seie eit tal utan desimalar. Når du deklarerer ein variabel, gir du han vanlegvis òg ein startverdi. Deklarasjonen av variabelen må ende med semikolon (;).

Døme på variabeldeklarering

1 int switchState = 0;

Nummerering

Programlinja i dømet startar med talet 1. Dette talet er berre ei linjenummerering, det er ikkje ein del av sjølve programmet. Dei neste linjene i programmet får tala 2, 3, 4 osb.

Inngangar og utgangar

Dei digitale pinnane til Arduinoen kan berre lese to tilstandar: om det er spenning på ein inngangspinne, eller om det ikkje er det. Desse tilstandane blir ofte omtalte som HØG (på) og LÅG (av).

Pinnane på Arduinoen kan fungere som anten inngangar eller utgangar. I koden din du dei ut frå funksjonen du vil dei skal ha. Viss pinnane er utgangar, kan du bruke dei til å slå på komponentar som LED-lys. Og viss du konfigurerer dei som inngangar, kan du sjekke om ein brytar blir trykt eller ikkje. Sidan pinnane 0 og 1 blir brukte til å kommunisere med datamaskina, startar du med pinne 2.

Du konfigurerer dei digitale pinnane i hovudfunksjonen setup(). Til dette bruker du ein funksjon kalla pinMode(). Pinnane som er kopla til lysdiodar, vil vere OUTPUT, og brytarpinnen vil vere ein INPUT.

Døme på konfigurering av inngangar og utgangar

2 void setup(){

3 pinMode(3,OUTPUT);

4 pinMode(4,OUTPUT);

5 pinMode(5,OUTPUT);

6 pinMode(2,INPUT);

7 }


Store og små bokstavar

Ver nøyaktig med bruk av store og små bokstavar i koden din. Til dømes er pinMode namnet på ein kommando i programvara til Arduinoen. Skriv du pinmode med liten m, får du ein kodefeil.

Loop-funksjonen

Funksjonen loop() køyrer kontinuerleg etter at setup() er fullført. loop() er sjølve programdelen der du vil sjekke for spenning på inngangane og slå utgangar på og av.

For å sjekke spenningsnivået på ein digital inngang bruker du funksjonen digitalRead(). Funksjonen må få beskjed om kva pinne som skal sjekkast. På fagspråket seier vi at digitalRead() treng eit argument. Eit argument er altså konkret informasjon som du sender til ein funksjon slik at han kan gjere jobben sin.

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

Døme på loop-funksjon

8 void loop(){

9 switchState = digitalRead(2);

10 // Dette er ein kommentar som ikkje blir lesen av Arduinoen. Arduinoen les her berre verdien på pinne 2 og lagrar denne i variabelen switchState.


Kommentarar i koden

Kommentarar er notat i koden som du legg inn for din eigen del. For å skrive ein kommentar legg du til to skråstreker (//). Datamaskina vil ignorere alt på linja som kjem etter desse skråstreka.

if-setning

Med ein if()-setning legg du inn eit vilkår som avgjer kva datamaskina skal gjere vidare. I kodedømet nedanfor er vilkåret at trykk-knappen ikkje er pressa (at verdien er LOW). Programmet sjekkar om vilkåret er oppfylt (sant) eller ikkje (usant) ved å samanlikne vilkåret med aktuell brytartilstand.

Døme på if()-setning

11 if (switchState == LOW) {

12 // Viss trykk-knapp er ikkje pressa, gjer dette:


Doble likskapsteikn

Når du samanliknar to ting i programmering, bruker du doble likskapsteikn (==). Viss du berre bruker eitt teikn, vil du angi ein verdi i staden for å samanlikne han.

digitalWrite()

digitalWrite() er kommandoen som lar deg sende 5 volt eller 0 volt til ein utgangspinne. Kommandoen tek to argument:

  1. kva pinne som skal kontrollerast

  2. kva verdi som skal angivast for pinnen, HIGH eller LOW

Døme på bruk av digitalWrite()

Viss du vil slå av dei raude LED-ane og slå på den grøne LED-en, vil koden din sjå slik ut:

13 digitalWrite(3, HIGH); // grøn LED, lys på

14 digitalWrite(4, LOW); // raud LED, lys av

15 digitalWrite(5, LOW); // raud LED , lys av

16 }


Pseudokode

Ein pseudokode er ei strukturert beskriving av det du vil programmet skal gjere. Pseudokoden gjer det enklare for deg å skrive sjølve koden i etterkant. Vi tek eit døme:

Du skal sjekke om switchState er HIGH (knappen er trykt) eller LOW (knappen er ikkje trykt). Viss knappen ikkje er trykt, skal den grøne LED-en vere slått på, mens dei raude LED-ane er slått av. Viss knappen er trykt, skal den grøne LED-en slåast av, mens dei raude LED-ane blir slått på.

I pseudokode kan setninga sjå slik ut:

  • Viss switchState er LOW: slå på den grøne LED-en, slå av dei raude LED-ane.

  • Viss switchState er HIGH: slå av den grøne LED-en, slå på dei raude LED-ane.

else()-kommando

Fram til linje 16 i programmet har du fortalt Arduinoen kva han skal gjere når knappen ikkje er trykt (LOW-tilstand). No skal du definere kva som skjer dersom knappen faktisk er trykt (HIGH-tilstand). Då bruker du ein else()-kommando. Dette er ein valfri komponent til if()-setninga som definerer kva som skjer dersom vilkåret ikkje er oppfylt.

Døme på ein else()-kommando


Når knappen blir trykt, skal dei raude LED-ane blinke og den grøne LED-en slåast av. Då må du legge til denne else()-kommandoen i koden:

17 else { // Viss trykk-knapp er aktivert, gjer dette:

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

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

20 digitalWrite(5, HIGH); // Slår på straum på pinne 5, lys på

21 delay(250); // Ventar i 250 millisekund

22 // Endre lyssetjing:

23 digitalWrite(4, HIGH); // Slår på straum på pinne 4, lys på

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

25 delay(250); // Ventar i 250 millisekund

26 }

27 } // Køyrer programkode i loop() på nytt.

Kommandoen delay

Delay er det engelske ordet for forseinking eller utsetjing. Ved programmering blir kommandoen delay brukt til å setje programmet på pause i ein angitt tidsperiode. Pausen blir oppgitt i sekund. Koden delay(250); til dømes betyr at programmet skal ta ein pause på 250 millisekund (eit kvart sekund) før det hoppar vidare til neste programlinje.

Denne pausen er viktig, for Arduinoen går gjennom loop()-en sin tusenvis av gonger kvart sekund, og LED-ane vil slåast av og på raskare enn vi kan oppfatte. Utan programmerte pausar vil vi oppleve LED-ane som litt svakt lysande, men ikkje som blinkande.

Køyr programmet på Arduinoen din

Etter at du har skrive ferdig programmet og kompilert (sjekka) det, overfører du det til Arduinoen din. Når Arduinoen er programmert, blir det grøne lyset slått på. Trykker du på brytaren, vil dei raude lysa begynne å blinke, mens det grøne lyset blir slått av.

Oppgåve

Du har no laga ei enkel kopling som får lysdiodar til å lyse. Kan du gjere endringar i programmet som gir koplinga andre funksjonar?

Prøv å endre pausetidene

Prøv å endre tida for dei to delay()-funksjonane. Legg merke til kva som då skjer med lysa, og korleis både blinketempoet og responsen til systemet endrar seg. Når du kallar ein delay() i programmet ditt, blir all annan funksjonalitet sett på pause i den angitte tidsperioden. Forseinkingar er ofte nyttige, men du må òg passe på at dei ikkje unødvendig forstyrrar grensesnittet ditt når du designar prosjekta dine.

Prøv å lage andre lyssignal

Prøv til dømes om du kan

  • få dei raude LED-ane til å blinke når programmet startar

  • byte ut den eine av dei to raude lysdiodane med ein gul og programmere dei tre lysa som eit trafikklys

  • lage eit større eller meir komplekst panel ved å kople til fleire lysdiodar og brytarar

Vurder brukaropplevinga

Når du begynner å lage eit grensesnitt (eit design for brytarar og lysdiodar) for prosjektet ditt, må du òg ta omsyn til forventningane til brukarane. Vil brukarane ha omgåande tilbakemelding når dei trykker på ein knapp? Eller bør det vere ei forseinking mellom handlinga deira og reaksjonen frå Arduinoen? Prøv alltid å plassere deg sjølv i skoa til ein vanleg brukar mens du designar.

Kva har du lært?

I dette prosjektet har du oppretta det første Arduino-programmet ditt. Programmet lar brukaren kontrollere åtferda til nokre lysdiodar ved hjelp av ein brytar. Du har brukt variablar, ein if()/else()-setning og funksjonar for å lese tilstanden til ein inngang og til å kontrollere utgangar.

Dømekode og programfil

Her finn du den komplette dømekoden for denne oppgåva. Koden ligg òg som nedlastbar programfil sist i denne artikkelen. Koplingsskjemaet for prosjektet er lagt ved som PDF-fil.

Døme på komplett kode for oppgåva

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

void setup() {

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

pinMode(4, OUTPUT); // Set digital pin 4 som utgang for raud LED

pinMode(5, OUTPUT); // Set digital pin 5 som utgang for raud LED

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

}

void loop() {

switchState = digitalRead(2); // Les verdien på pinne 2 og lagrar han i variabelen switchState

if (switchState == LOW) {

// Viss trykk-knappen ikkje er trykt:

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

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

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

}

else {

// Viss trykk-knappen er trykt:

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

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

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

delay(250); // Ventar i 250 millisekund

// Byter kva LED som lyser:

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

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

delay(250); // Ventar i 250 millisekund

}

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

}

Forklaring:

int switchState = 0;

definerer ein heiltalsvariabel som lagrar tilstanden til brytaren (dvs. om knappen er trykt eller ikkje)

void setup()

initialiserer pinnane som utgangar eller inngangar

pinMode(3, OUTPUT);

set pinne 3 som utgang for grøn LED

pinMode(4, OUTPUT);

set pinne 4 som utgang for første raude LED

pinMode(5, OUTPUT);

set pinne 5 som utgang for andre raude LED

pinMode(2, INPUT);

set pinne 2 som inngang for brytaren

void loop()

funksjon som køyrer kontinuerleg

switchState = digitalRead(2);

les tilstanden til brytaren på pinne 2 og lagrar han i variabelen switchState

if (switchState == LOW)

sjekkar om brytaren ikkje er trykt

digitalWrite(3, HIGH);

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

digitalWrite(4, LOW);

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

digitalWrite(5, LOW);

slår av den andre raude LED-en

else

viss brytaren er trykt

digitalWrite(3, LOW);

slår av den grøne LED-en

digitalWrite(4, LOW);

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

digitalWrite(5, HIGH);

slår på den andre raude LED-en

delay(250);

ventar i 250 millisekund

digitalWrite(4, HIGH);

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

digitalWrite(5, LOW);

slår av den andre raude LED-en

delay(250);

ventar i 250 millisekund

Når loop()-funksjonen er ferdig, startar han på nytt og køyrer kontinuerleg.

Skrive av Arduino.
Sist oppdatert 16.08.2024