ARDUINO PROGRAMMERING DIGITALE/ANALOGE INNDATA/UTDATA LYSDIODER ÅPEN SONE FOR EKSPERIMENTELL INFORMATIKK STUDIELABEN FRITZING Roger Antonsen INF1510 30. januar 2012
Arduino Cookbook, Michael Margolis Denne boken inneholder det meste man trenger å vite. Flere av illustrasjonene og eksemplene i denne forelesningen er tatt derfra. Making Things Talk, Tom Igoe En mer avansert, men veldig bra, bok!
PROGRAMMERING I ARDUINO
pinmode(pin, Mode) pin angir pinnen og Mode er INPUT eller OUTPUT digitalwrite(pin, verdi) verdi er HIGH eller LOW digitalread(pin) returnerer HIGH eller LOW analogwrite(pin, verdi) verdi er tall mellom 0 og 255 analogread(pin) returnerer et tall mellom 0 og 1023
Variable brukes til å lagre data. Noen viktige begreper er følgende. deklarasjon: å sette av plass i minnet int x; boolean y; tilordning: å sette en verdi x = 20; y = true; skop: der hvor variablene er synlige
int: 16-bits verdi mellom -32 768 og 32 767 int x = 32767; x++; // gjør at x blir -32768 unsigned int: 16-bits verdi mellom 0 og 65535 kun positive verdier long: 32-bits verdi mellom -2147483648 og 2147483647 usigned long: 32-bits verdi mellom 0 og 4294967295 float/double: 32-bits flyttall avrundede verdier; husk at dette kan medføre nøyaktigheter
byte: 8-bits verdi mellom 0 og 255 byte x = 130; byte x = B10000010; // samme resultat char: en byte som lagrer et tegn (egentlig bare en verdi mellom -128 og 127) char x = G ; char x = 71; // samme resultat boolean: true eller false array: en samling av indekserte variable
array: en samling av indekserte variable deklarasjon (og tilordning): int mittarray[6]; // kun deklarasjon int minetall[] = {3,7,1,2,8}; // automatisk int mineverdier[3] = {32,64,-8}; // både-og char beskjed[6] = "hello"; // strenger er arrayer av tegn (char) // siste tegn er et nulltegn som avslutter hente og sette inn verdier: mineverdier[0] returnerer 32. mineverdier[5] gir feilmelding. mineverdier[0] = 100; // erstatter første tall
type til returverdi (eller void hvis ingen type) navn på funksjonen type og navn på argumentene til funksjonen returverdi; må være av riktig type int multipliser(int x, int y) { int resultat; resultat = x * y; return resultat; } Viktig å huske på: skop semikolon klammeparenteser kommentarer deklarasjon av variabel tilordning av variabel
Aritmetikk: int y; y = 9 / 4; // y blir satt til 2 y = y + 3; // øker verdien til y med 3 y++; // samme som y = y + 1; y /= 2; // samme som y = y / 2; Sammenlikninger: x == y // x lik y x!= y // x ulik y x <= y // x mindre enn eller lik y Logiske operatorer: x > 0 && x < 5 // OG - sann hvis begge er sanne x > 0 x < 5 // ELLER - sann hvis en er sann!x < 0 // IKKE - sann hvis uttrykket er usant
if (x < 100) { // gjør A } if (x < 100) { // gjør A } else { // gjør B }
switch (x) { case 1: // hvis x er lik 1, gjør dette break; case 2: // hvis x er lik 2, gjør dette break; default: // hvis ingen matcher, gjør følgende // default er valgfritt }
switch (x) { case 1: // hvis x er lik 1, gjør dette break; case 2: // hvis x er lik 2, gjør dette break; default: // hvis ingen matcher, gjør følgende // default er valgfritt }
deklarere variabel sett startverdi test endre verdi kropp for (int x = 0; x < 100; x++) { Serial.println(x); } // skriver tallene fra 0 til 99
DIGITALE INNDATA
Arduinofunksjonen for å lese digital input heter digitalread og forteller om spenningen på en pinne er HIGH (5 volt) eller LOW (0 volt). Arduinofunksjonen for å fortelle at en pinne skal brukes til dette er pinmode(pin,input). I utgangspunktet er alle konfigurert som inputpinner, men det er god praksis å sette dem allikevel.
void loop() { digitalwrite(ledpin, digitalread(inputpin)); // turn LED ON if input pin is // HIGH, else turn OFF }
void loop() { int val = digitalread(inputpin); // read input value if (val == HIGH) // check if the input is HIGH { } digitalwrite(ledpin, LOW); } else { digitalwrite(ledpin, HIGH); } // turn LED OFF // turn LED ON
PÅLITELIG SJEKK AV BRYTERE Når en bryter slås på hender det som regel at verdiene går mellom høy og lav mange ganger veldig fort. Vi kan kompensere for dette i koden vår. Dette kalles på engelsk for debouncing.
const int buttonpin = 2; const int ledpin = 13; int ledstate = HIGH; int buttonstate; int lastbuttonstate = LOW; // the number of the pushbutton pin // the number of the LED pin // the current state of the output pin // the current reading from the input pin // the previous reading from the input pin long lastdebouncetime = 0; // the last time the output pin was toggled long debouncedelay = 50; // the debounce time; increase if the output flickers void setup() { pinmode(buttonpin, INPUT); pinmode(ledpin, OUTPUT); } void loop() { int reading = digitalread(buttonpin); if (reading!= lastbuttonstate) { lastdebouncetime = millis(); } if ((millis() - lastdebouncetime) > debouncedelay) { buttonstate = reading; } } digitalwrite(ledpin, buttonstate); lastbuttonstate = reading;
ANALOG INNDATA
ANALOG INPUT Arduinofunksjonen for å lese analog input heter analogread og forteller hvor høy spenningen er, fra 0 til 5 volt, ved å gi et tall mellom 0 og 1023. (Det er altså 10-bits analog-til-digital konvertering som skjer.)
int sensorpin = A0; // select the input pin for the potentiometer int ledpin = 13; // select the pin for the LED int sensorvalue = 0; // variable to store the value coming from the sensor void setup() { // declare the ledpin as an OUTPUT: pinmode(ledpin, OUTPUT); } void loop() { // read the value from the sensor: sensorvalue = analogread(sensorpin); // turn the ledpin on digitalwrite(ledpin, HIGH); // stop the program for <sensorvalue> milliseconds: delay(sensorvalue); // turn the ledpin off: digitalwrite(ledpin, LOW); // stop the program for for <sensorvalue> milliseconds: delay(sensorvalue); }
ENDRE REKKEVIDDEN Hvis vi trenger verdier mellom 0 og 100 i stedet for mellom 0 og 1023 kan vi bruke funksjonen map. map(verdi, fralav, frahøy, tillav, tilhøy) F.eks. vil map(verdi, 0, 1023, 0, 255) gjøre jobben.
DIGITALE UTDATA
DIGITAL UTDATA Alle pinner kan også brukes som digitale ut-pinner. Da må de settes med pinmode(pin,output). Deretter kan vi bruke digitalwrite(pin,output), hvor OUTPUT er enten HIGH eller LOW.
ANALOGE UTDATA
ANALOGE UTSIGNALER Analog betyr her at vi skal kunne variere spenningen fra 0 til 5 volt. Her kan vi bruke funksjonen analogwrite(pin,output), hvor OUTPUT er et tall fra 0 til 255. Dette kan kun gjøres på pinner 3, 5, 6, 9, 10 og 11. Metoden som ligger under kalles pulsbreddemodulasjon.
PULSBREDDEMODULASJON Pulse Width Modulation (PWM) Ved å slå av og på strøm veldig raskt, klarer Arduinokortet å simulere en spenning mellom 0 og 5 volt. Frekvensen er ca. 500 Hz.
LITT OM LYSDIODER
LYSDIODER En LED er en diode som kun slipper strøm gjennom i én retning. Den har to ben, anode (vanligvis litt lenger) og katode, og når spenningen fra anode til katode er høy nok, så slippes strøm gjennom og den lyser. Spenningen som skal til for at den lyser (forward voltage) er vanligvis på 1,8 volt.
LYSDIODER + MOTSTANDER Strømmen gjennom en lysdiode må begrenses med en motstand. Hver Arduinopinne kan gi opp til 40 ma. En lysdiode trenger typisk 20 ma for å lyse.
FRITZING
FRITZING Dette er programvare for å dokumentere prosjekter og lage design av kretskort. Det forenkler prosessen fra prototype til endelig design. Også åpen kildekode og i samme familie som Processing og Arduino. Se http://fritzing.org/ for mer informasjon!
AREF GND 3 1 2 1 L 1 1 PWM 0 1 PWM 9 8 7 6 5 4 3 2 1 0 DIGITAL PWM PWM PWM PWM TX RX TX RX Arduino PWR 1 PWR SEL USB EXT ICSP RESET 3V3 www.arduino.cc POWER ANALOG IN 5V Gnd 9V 0 1 2 3 4 5