Spaceship interface

Kort om oppgåva
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 "blir kalla" 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 int 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 konfigurerer 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:
kva pinne som skal kontrollerast
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 millisekund. 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.
- Spaceship interface(INO)