Artikel top billede

(Foto: Computerworld)

Arduino, programmering af hjemmeelektronik - del 3

Her i vores sidste afsnit om Arduino, viser vi, hvordan du går i dybden og kan arbejde med komplekse opstillinger.

Af Kenneth Geisshirt, Alt om Data

Denne artikel er oprindeligt bragt på Alt om Data. Computerworld overtog i november 2022 Alt om Data. Du kan læse mere om overtagelsen her.

I de to første afsnit i serien om Arduino og hjemmeelektronik, introducerede vi dig til physical computing. Vi viste dig, hvordan du satte et udviklingsmiljø op og forklarede, hvordan du kunne skrive mindre programmer til små, basale opstillinger. Her i den sidste del af Arduino, vil vi se på, hvordan du kan arbejde med mere komplekse opstillinger – helt uden det bliver kompliceret.

Hvad er shields?

Et Arduino-board er en basal computer med en microcontroller og en række porte/ben til enten digitalt eller analogt input eller output. Med en smule elektronik kan du bygge opstillinger, men det kræver, at du har et godt kendskab til elektronik.

Der findes imidlertid en anden og lettere mulighed: En lang række firmaer udvikler og producerer det, der hedder »shields«. Et shield er et stykke elektronik, som let monteres på Arduino-boardet. Du trykker blot dit shield ned over portene, og du er klar. Langt de fleste shields overtager alle portene på Arduino-boardet.

Et shield udvider funktionaliteten af Arduino-boardet på samme måde, som et pci-kort udvikler funktionaliteten i din pc. Og på samme måde som med et pci-kort, styres et shield af cpu’en – i Arduino-verdenen er det så bare programmet i den lille microcontroller. Endvidere får de fleste shields strøm fra Arduino-boardet, så du kan nøjes med at bruge samme usb-kabel eller batteri-pakke, som du hele tiden har brugt.

Der findes mange shields ude i den store verden. Du finder netværksshields (både til Ethernet og WiFi), gps, Zigbee og motorstyring. Zigbee er en standard til automatisering og overvågning af bygninger. Kommunikationen sker trådløst, og du kan med kombinationen af et Auduino-board og et Zigbee-shield bygge små enheder til styring af dit hjem.

En samlet pris på under 600 kroner (199 kroner for et Arduino-board og 389 kroner for et Zigbee-shield med antenne og lidt elektronik), kan du selv udvikle forskellige overvågnings- og styreenheder til dit hus, for eksempel kontrol af temperatur og luftfugtighed i dit drivhus.

Med den åbenhed, som Arduino-udviklerne udviser, kan elektronikkyndige folk forholdsvis let udvikle shields. I infoboks »Få mere at vide« finder du links til flere leverandører af shields. Du kan enten købe dem direkte fra leverandøren eller bruge den danske butik Let Elektronik.

Seeeduino shield

I denne artikel ligger fokus på et generelt shield ved navn Electronic Brick Chassis v1.1 fra firmaet Seeeduino Studio. Det består af en række porte, hvortil du kan tilslutte sensorer og andre ydre enheder fra samme firma. Portene er – modsat dem på et Arduino-board – egentlig stik, og du tilslutter ydre enhederved hjælp af små kabler (samling af tre ledninger).

Der er fem analoge input-porte, mens der er tre analoge output-porte. Endelig er der fem digitale porte, som kan sættes op til at være enten input eller output.

Midt på dette shield finder du tre databusser. Du kan bruge dem til kommunikation med andre enheder - det kan for eksempel være et andet shield, så du kan udvide antallet af porte.

En meget udbredt anvendelse af denne shieldbus er at tilslutte et lcd og på den måde vise data indsamlet med forskellige sensorer. Der findes en lang række lcd’ere, og senere i denne artikel vil du se, hvordan du kan bruge et lcd fra Seeeduino Studio.

Sensorer

Der findes, som nævnt, en lang række sensorer og andre ydre enheder, som du kan tilslutte dit shield. Det er muligt at købe et begyndersæt (Electronic Brick Starter Kit) der består af et shield og en række sensorer.

Du finder her sensorer til temperatur, lys, rotation samt orientering. Endvidere finder du i sættet »en stor knap« (den er i virkeligheden ikke så stor) samt en række output-enheder. Output-enhederne omfatter lysdioder og en lydkilde (beep-tone).

Du kan altid købe sensorer i løs vægt. En temperatur-sensor koster under 40 kroner, og du kan købe sensorer til måling af blandt andet CO-(kulmonooxid) indholdet i luften, røgdetektor, flowmåler og mikrofon. Med dit shield kan du også styre for eksempel motorer og relæer.

Tricket ved at bruge disse sensorer er, at Seeeduino Studio har monteret de elektroniske komponenter, som er nødvendige for funktionsevnen. Du slipper med andre ord for at tage stilling til modstande, kapacitatorer og andre komponenter.

I opstillingen i denne artikel er sensorer til lys og temperatur valgt. Begge sensorer er analoge, og de skal derfor tilsluttes to af de fem analoge input-porte.

Rent programmeringsmæssigt er det meget let at aflæse værdien af en sensor. Du bruger funktionen »readAnalog«, og du får en værdi i intervallet 0 og 1023 som en digital repræsentation. Men inden du kan aflæse værdien af en sensor, skal du i »setup«-funktionen sætte en port op med funktionen »pinMode«.

I »Kildeteksten» kan du se, at temperatur-sensoren er placeret på port 5 (den globale variable Temp), mens lys-sensoren er placeret på port 4 (den globale variable Lys):

Kildeteksten

#include <stdio.h>
#include <stdlib.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(10, 11, 12, 13, 14, 15, 16);
int Temp = 5; // temp.måler på port 5;
int Lys = 4; // lysmåler på port 4

void updateDisplay(int temp, int lys) {
float x;

lcd.clear();

lcd.setCursor(0, 0);
lcd.print(”Lys:”);

lcd.setCursor(7, 0);
lcd.print(lys);

lcd.setCursor(0, 1);
lcd.print(”Temp.:”);

lcd.setCursor(7, 1);
x = map(temp, 250, 700, 13, 439);
x /= 10.0;
lcd.print(x);
}

void waitXsec(int n) {
for(int i=0; i<n; i++) { // vent 10 sekunder
delay(1000);
}
}

void setup() {
lcd.begin(16, 2);
for(int i=0; i<16; i++) {
lcd.clear();
lcd.setCursor(i, 0);
lcd.write(’.’);
delay(100);
}
lcd.clear();
pinMode(Temp, INPUT);
pinMode(Lys, INPUT);
}

void loop() {
float temp = analogRead(Temp);
float lys = analogRead(Lys);
updateDisplay(temp, lys);
waitXsec(5);
}

Selve aflæsningen af værdierne for de to sensorer sker i funktionen »loop«. Værdierne i sensorerne er ikke nødvendigvis i enheder, som vi normalt bruger, og det kan det være nødvendigt at oversætte dem. I tilfældet med temperatur-sensoren måler sensoren ikke direkte i Celcius.

I databladet for sensoren finder du en række kalibreringskurver, og du skal bruge dem til at oversætte med. Standard-biblioteket til Arduino har en funktion ved navn »map«. Den kan du bruge, idet den kan foretage en lineær interpolation.

Som argumenter, tager »map« sensorens værdi samt minimum og maximum for henholdsvis før og efter oversættelse. Det er dog vigtigt at vide, at »map« ikke returnerer et komma-tal, og du kan med fordel sætte værdierne en faktor 10 for højt (svarende til at du glemmer kommaet i kommatallet).

Efter oversættelsen kan du dividere med 10 og få flyttet kommaet en plads til venstre. Du finder et eksemplet på bruges af »map« og divisionstricket i funktionen »updateDisplay« i infoboksen »Kildeteksten«.

Lys-sensoren skal egentlig også oversættes, men programmet i infoboksen »Kildeteksten« sker der ingen oversættelse. Det er for at vise dig, at du kan bruge de rå sensordata direkte i dine programmer, hvis du ikke har brug for tal i enheder.

Display

Som tidligere omtalt, kan du tilslutte et lcd til bussen på dit shield. Med begyndersættet følger et lcd med 2 linjer med hver 16 tegn.

Du kan kun skrive tegn, det vil sige, at det ikke er muligt adressere den enkelte pixel. Der findes dog andre lcd’ere, hvor det er muligt at slukke/tænde for hver enkel pixel, og derved åbner der sig en verden af grafiske muligheder.

Med Arduino-udviklingsmiljøet følger et bibliotek til håndtering af lcd’ere. Muligvis skal du opdatere biblioteket, hvis Seeeduino Studio har opdateret det, inden Arduino-udviklerne når det.

Opdatering består i, at du downloader den nye version af C- og header-filerne fra Seeeduino Studio og kopierer dem til udviklingsmiljøets installation. Under Ubuntu Linux finder du installation i folderen »/usr/share/arduino/libraries/LiquidCrystal«.

For at bruge et lcd sammen med dit shield skal du før erklære en global variable ved hjælp af funktionen »LiquidCrystal«. Du skal i kaldet til funktionen angive hvilke porte, som dit lcd er placeret på.

I infoboks »Kildeteksten« kan du se, at den globale variable lcd erklæres og peger på en række porte. Med hele tre busser på dit shield, er det naturligvis muligt at have flere lcd’ere sat til, men i opstillingen i denne artikel er der kun ét lcd.

Som altid skal du i funktionen »setup« gøre dine enheder klar. Med et lcd bruger du funktionen »lcd.begin«. De to parametre angiver størrelsen på lcd’et – i dette tilfælde 2 linjer med 16 tegn hver.

Funktionen »lcd.clear« fjerner alt indhold fra lcd’en. Det vil sige at efter retur fra denne funktion, er lcd’en helt blank. Det er muligt at tænde og slukke for cursoren med funktionerne »lcd.cursor« og »lcd.noCursor«.

Endvidere kan du flytte cursoren med funktionen »lcd.setCursor«. Her skal du være opmærksom på, at Arduino-programmering sker i en C-verden. Med andre ord, du skal tælle fra 0 og ikke 1 – første linje er nummer 0, og tegnet længst til venstre har nummeret 0.

Der findes to funktioner til skrivning i lcd’en. Den første er »lcd.write«, som skriver ét tegn ved cursorens placering. Har du brug for at skrive lidt mere end et tegn, kan du bruge funktionen »lcd.print«. Det fine ved »lcd.print« er, at den selv finder ud af, om du forsøger at udskrive et heltal, et kommatal eller en string – og gøre det rigtige i de forskellige tilfælde.

Der findes i biblioteket en række andre funktioner, som giver dig mange forskellige kontrolfaciliteter af, hvordan lcd’en opfører sig.

Løkken i »setup«, hvor der skrives et punktum ud, har ingen praktisk betydning for funktionaliteten af programmet. Det er indsæt for at vise dig, hvor en lille (tegn-baseret) animation kan programmeres på en Arduino med et lcd.

Vi runder af

Med et Arduino-board sætter kun din fantasi – og kundskaber i elektronik og programmering – grænserne for, hvad du skal udvikle. Kundskaberne kan heldigvis trænes, og der er masser af eksempler på folk med både kundskaber og fantasi på internettet.

Det er ikke kun hobby-folk, som i dag bruger Arduino. Der er eksempler på egentlige produktioner baseret på Arduino, for eksempel pda’ere og spillekonsoller.

Endvidere bruges Arduino i mange kunstinstallationer, hvor kunstneren ønsker at styre lys og lyd. Du skal ikke lede langt for at finde eksempler på Arduinos anvendelse i undervisning og forskning. Danske datalogiske institutter har taget Arduino i brug i projekter med sensor-netværk.

Forhåbentlig har denne lille serie om Arduino givet dig mod på physical computing. Moderne computere er komplekse apparater, og programmering kræver ofte stor tålmodighed. Med et Arduino-board og et sæt sensorer kan du hurtigt bygge og skrive små sjove dimser.

[themepacific_accordion]
[themepacific_accordion_section title="Fakta"]

Få mere at vide

[/themepacific_accordion_section]
[/themepacific_accordion]