Programmering av Arduino med sensorer, aktuatorer og praktiske prosjekter.
Når koden møter virkeligheten
Fram til nå har programmene dine levd inne i datamaskinen. Med en Arduino kan koden plutselig gripe inn i den fysiske verden: tenne lys, lese temperaturen i rommet eller få en motor til å spinne. Arduino er en liten mikrokontrollerplattform som gjør elektronikkprosjekter overkommelige, og du programmerer den i C/C++.
Grunnmønsteret er alltid det samme. To funksjoner styrer alt: setup() kjøres én gang når brikken slås på, og loop() kjøres deretter om og om igjen, i det uendelige. I setup() gjør du klart -- bestemmer hvilke pinner som er innganger og utganger, og starter seriell kommunikasjon. I loop() skjer selve arbeidet.
I dette kapittelet skal vi lese av både digitale og analoge sensorer, styre lysstyrke og motorfart med PWM, og la Arduino-en prate med PC-en din over USB. Dette er broen mellom programmering og ekte elektro.
Grunnstrukturen og digital inn/ut
La oss bygge opp et typisk Arduino-program. Øverst deklarerer du gjerne noen globale variabler, for eksempel int ledPin = 13;. I setup() skriver du pinMode(ledPin, OUTPUT); for å gjøre pinne 13 til en utgang, og Serial.begin(9600); for å åpne en kommunikasjonskanal til datamaskinen. I loop() kan du så slå LED-en på med digitalWrite(ledPin, HIGH);, vente med delay(1000); (tusen millisekunder er ett sekund), og slå den av igjen med digitalWrite(ledPin, LOW);. Resultatet er en blinkende diode.
Noen funksjoner blir du kjent med raskt. pinMode(pin, modus) setter en pinne som INPUT eller OUTPUT. digitalWrite(pin, verdi) setter en utgang HIGH eller LOW. digitalRead(pin) leser en digital inngang og gir HIGH eller LOW tilbake. delay(ms) pauser i millisekunder.
Vil du la en trykknapp styre lyset, kobler du knappen til en inngang. Et lurt triks er INPUT_PULLUP, som slår på en intern motstand som holder pinnen HIGH når knappen ikke er trykket. Når du trykker, kobles pinnen til jord og leses som LOW. Da kan du i loopen skrive: if (digitalRead(knappPin) == LOW) slå på LED-en, ellers slå den av. Det føles kanskje bakvendt at "trykket" betyr LOW, men det er nettopp pull-up-motstanden som snur logikken.
Sensorer og PWM
Arduino kan lese to slags signaler. Digitale sensorer gir bare av eller på -- HIGH eller LOW -- som trykknapper, bevegelsessensorer (PIR) og magnetbrytere. Analoge sensorer gir et helt spenn av verdier. Med analogRead() får du et tall fra 0 til 1023, der 0 svarer til 0 V og 1023 til 5 V på en Arduino Uno. Temperatursensorer, lyssensorer (LDR) og potensiometre er typiske analoge sensorer.
La oss regne litt. Får du råverdien 512 fra analogRead(), hvilken spenning er det? Du bruker , som gir V -- omtrent halve referansespenningen, akkurat som du skulle vente når råverdien er omtrent halvparten av 1023. For en TMP36-temperatursensor regner du videre med .
Vil du styre lysstyrke eller motorfart jevnt, holder det ikke med av og på. Da bruker du PWM (pulsbreddemodulasjon): en digital utgang slås av og på så raskt at det ligner en analog spenning. Med analogWrite(pin, verdi) gir du en verdi fra 0 til 255, der 0 er alltid av (0 % duty cycle), 127 er halv tid på (50 %) og 255 er alltid på (100 %). PWM virker bare på bestemte pinner, merket med ~ på kortet. Kobler du et potensiometer til A0 og en LED til en PWM-pinne, kan du dele potensiometerets 0--1023 på 4 for å få området 0--255, og dimme lyset trinnløst.
Seriell kommunikasjon
Hvordan vet du egentlig hva som foregår inne i en Arduino? Den har jo ingen skjerm. Svaret er seriell kommunikasjon -- en kanal over USB-kabelen som lar Arduino-en sende og motta data til og fra datamaskinen. Dette er kanskje det viktigste feilsøkingsverktøyet du har.
Du starter kanalen med Serial.begin(9600); i setup() (tallet er hastigheten i baud). Deretter sender du data med to varianter: Serial.print("Verdi: "); skriver uten linjeskift, mens Serial.println(42); skriver med linjeskift, slik at neste utskrift havner på en ny linje. Forskjellen på de to er nettopp linjeskiftet -- ikke noe annet. Du kan også motta data: sjekker du if (Serial.available() > 0), kan du lese et tegn med Serial.read() og reagere på kommandoer du sender fra PC-en.
I Arduino IDE finner du Serial Monitor, et vindu som viser alt Arduino-en sender og lar deg skrive tilbake. Det er uvurderlig til tre ting: feilsøking, der du ser sensorverdier i sanntid; datalogging, der du lagrer målinger over tid; og styring, der du sender kommandoer til brikken. Med disse byggeklossene -- digital og analog inn/ut, PWM og seriell kommunikasjon -- kan du bygge alt fra et alarmsystem med PIR-sensor og buzzer, til en vifte som regulerer farten etter temperaturen i rommet.
Oppsummering
Vi har latt koden gripe inn i den fysiske verden. Hvert Arduino-program bygger på setup(), som kjøres én gang, og loop(), som gjentas i det uendelige. Med pinMode(), digitalWrite() og digitalRead() styrer og leser du digitale signaler -- og pull-up-trikset snur logikken så et trykk leses som LOW.
Analoge sensorer leses med analogRead(), som gir 0--1023, og vi regnet om råverdier til spenning. PWM med analogWrite() (0--255) lar deg dimme lys og regulere motorfart ved å pulse en digital utgang raskt. Til slutt gir seriell kommunikasjon med Serial.print(), Serial.println() og Serial Monitor deg øynene inn i brikken -- uunnværlig for feilsøking, datalogging og styring.
Dette kapitlet er skrevet av Anthropics toppmodeller (Claude Opus og Claude Fable) og er foreløpig ikke manuelt gjennomgått — kvalitetskontrollen gjøres av uavhengige KI-agenter, og innmeldte feil rettes fortløpende. Funnet en feil? Meld fra, så retter vi den. Les mer om hvordan innholdet lages.