Introduksjon til Arduino-plattformen, maskinvare og utviklingsmiljø.
Mikrokontrollere er små datamaskiner på én brikke som styrer alt fra vaskemaskiner til droner. I dette kapitlet skal vi lære å programmere Arduino - en av de mest populære mikrokontroller-plattformene for læring og prototyping.
Arduino gjør det enkelt å koble sammen sensorer (som måler temperatur, lys eller avstand) og aktuatorer (som LED, motorer og releer) for å lage interaktive prosjekter. Vi skal lære grunnleggende programmering, hvordan vi leser fra sensorer og hvordan vi styrer aktuatorer.
Arduino Uno (mest brukt):
- ATmega328P mikrokontroller
- 14 digitale I/O pins (6 med PWM)
- 6 analoge innganger
- 32 KB flash-minne, 16 MHz klokke
- USB-tilkobling for programmering
Andre modeller:
- Arduino Nano: Mindre, breadboard-vennlig
- Arduino Mega: 54 digitale pins, 256 KB minne
Arduino IDE: Gratis programmeringsmiljø med editor, eksempelkode, seriemonitor for debugging, og bibliotekbehandling. Lastes ned fra arduino.cc.
Hva betyr det at Arduino Uno har "14 digitale I/O pins hvorav 6 kan gjøre PWM"?
PWM (Pulse Width Modulation) på 6 av pinnene:
- Pins merket med ~ (3, 5, 6, 9, 10, 11)
- Kan simulere analoge verdier ved å slå av/på veldig raskt
- Brukes til å dimme LED-er eller kontrollere motorhastighet
- 256 nivåer (0-255) i stedet for bare av/på
I praksis: Du kan koble 14 ting som bare trenger av/på (LED, relé, knapp), men bare 6 av dem kan ha variabel styrke.
Hvilken Arduino-modell er best egnet for et prosjekt som trenger 40 digitale utganger?
Arduino programmeres i C/C++. Hver skisse har to hovedfunksjoner:
setup() - Kjører én gang ved oppstart:
- Initialiserer pins med pinMode()
- Starter seriell kommunikasjon
- Setter startverdier
loop() - Kjører i det uendelige:
- Hovedprogrammet
- Leser sensorer, tar beslutninger, styrer aktuatorer
Viktige funksjoner:
````
pinMode(pin, OUTPUT/INPUT) // Sett pin-modus
digitalWrite(pin, HIGH/LOW) // Skriv digital verdi
digitalRead(pin) // Les digital verdi
analogRead(pin) // Les analog (0-1023)
analogWrite(pin, 0-255) // PWM utgang
delay(ms) // Vent millisekunder
Skriv et Arduino-program som blinker en LED på pin 13 med 1 sekunds intervall.
``cpp
const int ledPin = 13; // LED på pin 13
void setup() {
pinMode(ledPin, OUTPUT); // Sett pin 13 som utgang
}
void loop() {
digitalWrite(ledPin, HIGH); // Slå på LED (5V)
delay(1000); // Vent 1 sekund (1000 ms)
digitalWrite(ledPin, LOW); // Slå av LED (0V)
delay(1000); // Vent 1 sekund
}
// loop() starter på nytt automatisk
`
Forklaring:
1. setup() kjører én gang og setter pin 13 som OUTPUTloop()` kjører i det uendelige:
2.
- Slår på LED → venter 1s → slår av LED → venter 1s → gjentar
Forklar forskjellen på setup() og loop() i en Arduino-skisse.
Skriv Arduino-kode som blinker en LED på pin 8 hvert annet sekund (1 sekund på, 1 sekund av).
analogWrite(pin, verdi) - PWM utgang:
- Verdi 0-255
- 0 = alltid av (0V gjennomsnitt)
- 255 = alltid på (5V gjennomsnitt)
- 128 = 50% duty cycle (2.5V gjennomsnitt)
- Kun på PWM-pins (~3, 5, 6, 9, 10, 11)
PWM (Pulse Width Modulation):
Digital pin slås raskt av/på for å simulere analog spenning. Forholdet mellom på-tid og av-tid (duty cycle) bestemmer gjennomsnittlig spenning.
Lag et program som leser et potmeter på A0 og bruker verdien til å styre lysstyrken på en LED på pin 9.
``cpp
const int potPin = A0; // Potmeter på analog pin A0
const int ledPin = 9; // LED på PWM-pin 9
void setup() {
pinMode(ledPin, OUTPUT);
// Analog pins trenger ikke pinMode
}
void loop() {
int potValue = analogRead(potPin); // Les 0-1023
int brightness = potValue / 4; // Konverter til 0-255
analogWrite(ledPin, brightness); // Sett LED-lysstyrke
delay(10); // Liten forsinkelse
}
``
Forklaring:
- analogRead() gir 0-1023, men analogWrite() tar 0-255
- Vi deler på 4 for å konvertere: 1023/4 ≈ 255
- Når potmeteret vris, endres LED-lysstyrken jevnt
Hva returnerer analogRead(A0) på Arduino Uno hvis spenningen på pinnen er 2.5V?
Forklar hva PWM er og hvordan analogWrite() bruker det til å dimme en LED.
Ultrasonisk avstandssensor (HC-SR04):
- Måler avstand 2-400 cm
- Sender ultralyd, måler tid til ekko
- Avstand = (tid × lydhastighet) / 2
Lysensor (LDR - Light Dependent Resistor):
- Motstand endres med lysnivå
- Kobles som spenningsdeler til analog pin
- Høy verdi = mye lys (eller motsatt, avhengig av kobling)
Knapp/bryter:
- Digital input: HIGH eller LOW
- Trenger pull-up eller pull-down motstand
- Kan bruke intern pull-up: pinMode(pin, INPUT_PULLUP)
Skriv kode som leser en knapp på pin 2 og slår på LED på pin 13 når knappen trykkes.
``cpp
const int buttonPin = 2;
const int ledPin = 13;
void setup() {
pinMode(buttonPin, INPUTPULLUP); // Intern pull-up
pinMode(ledPin, OUTPUT);
}
void loop() {
int buttonState = digitalRead(buttonPin);
if (buttonState == LOW) { // LOW = trykket med pull-up
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
}
``
Forklaring med INPUTPULLUP:
- Intern pull-up motstand holder pinnen HIGH når knappen ikke er trykket
- Når knappen trykkes, kobles pinnen til GND (LOW)
- Derfor: buttonState == LOW betyr "knappen er trykket"
- Dette unngår behov for ekstern motstand
Skriv Arduino-kode som leser en knapp på pin 2 og slår på LED på pin 13 når knappen trykkes. Bruk INPUT_PULLUP.
Servomotor: Posisjonerer seg 0-180 grader. Krever Servo-biblioteket.
````
#include
Servo myservo;
myservo.attach(pin);
myservo.write(vinkel); // 0-180 grader
DC-motor: Krever motor driver (L298N) fordi Arduino-pins bare gir 40mA/5V, mens motorer trenger 1-5A og ofte høyere spenning.
Relé: Bruker lavstrøm-signal til å slå av/på høyere spenning/strøm. Kan styre 230V apparater med 5V signal fra Arduino.
Skriv kode som beveger en servo fra 0 til 180 grader og tilbake.
``cpp
#include
Servo myservo;
void setup() {
myservo.attach(9); // Servo på pin 9
}
void loop() {
// Sving fra 0 til 180 grader
for (int pos = 0; pos <= 180; pos++) {
myservo.write(pos);
delay(15); // Vent litt mellom hver grad
}
// Sving tilbake fra 180 til 0 grader
for (int pos = 180; pos >= 0; pos--) {
myservo.write(pos);
delay(15);
}
}
``
Forklaring:
- Servo-biblioteket håndterer PWM-signalet servoen trenger
- myservo.write(vinkel) setter posisjonen
- delay(15) gir servoen tid til å bevege seg før neste posisjon
Hvorfor trenger vi en motor driver (som L298N) for å styre en DC-motor fra Arduino?
Beskriv tre ulike aktuatorer som kan styres fra Arduino, og forklar kort hvordan hver av dem brukes.
I dette kapitlet har vi lært grunnleggende Arduino-programmering:
Arduino-plattformen:
- Mikrokontroller-plattform med hardware og software
- Arduino Uno har 14 digitale og 6 analoge pins
- Arduino IDE er programmeringsmiljøet
Programstruktur:
- setup() kjører én gang ved oppstart
- loop() kjører i det uendelige
- pinMode(), digitalWrite(), digitalRead() for digitale pins
- analogRead() (0-1023), analogWrite() (0-255) for analog I/O
Sensorer og aktuatorer:
- Sensorer: Knapper, temperatursensorer, lyssensorer, avstandsmålere
- Aktuatorer: LED, servomotorer, DC-motorer (via driver), releer
- PWM simulerer analoge verdier med raske av/på-pulser
Arduino er et kraftig verktøy for å lære elektronikk og programmering, og kan brukes til alt fra enkle LED-prosjekter til komplekse roboter og IoT-løsninger.