Arduino-øvelser

Digitalisering og automatisering vil være et uundgåeligt vilkår for de ansatte på langt de fleste af fremtidens arbejdspladser i trit med udviklingen inden for digital robot-automatisering og machine learning.
Derfor er der et øget fokus på praktiske øvelser til udvikling af elevers/studerendes færdigheder inden for automatisering og digitalisering. Her findes et antal projekter til undervisningsbrug baseret på den lettilgængelige Arduino UNO.

Opsætning af Arduino UNO

Arduino UNO (og de fleste andre typer) forbindes til computeren gennem det medfølgende USB kabel.

Med hensyn til software/driver:

  • Gå ind på Arduino: https://www.arduino.cc/en/Main/Software
  • Download den version af Arduino styresoftwaren (IDE) der passer til dit Windows/Linux/Mac OS system.
  • Husk at vælge installationsfilen og ikke app’en.

Formål:

Målet for dette projekt er at bygge en blinkende lysdiode (LED) lampe.

 

Baggrund:

På figuren til højre ses det kredsløb som I skal opbygge. Lysdioden skal kobles i serie med en såkaldt for-modstand så ikke strømstyrken bliver for stor. Ved at bruge en digital udgang på Arduminoen kan en spændingsforskel på 5 V, i forhold til den valgte jord (GND), påtrykkes lysdioden når udgangen sættes til HIGH. Selve kredsløbet bygges op således:

  • Forbind den digitale ’pin 7’ på Arduinoen til en række på fumlebrættet.
  • Forbind en modstand på 120 Ω og derefter det ene ben på en LED i serie på fumlebrækket som vist på figuren til højre.
  • Forbind det andet ben på LED’en til jord (GND) på Arduinoen.

 

Nu kan Arduinoen styre om der løber strøm i kredsløbet, og derfor om LED’en lyser, digitalt.

 

Indfør koden i vinduet på Arduino IDE’en. Når USB stikket er tilsluttet Arduinoenheden kan man uploade programmet til Arduinoen ved at klikke på det ikon  der viser en pil der venter mod hørje.

Herefter blinker lysdioden med 1 sekunds intervaller.


Koden




void setup() {
pinMode(7, OUTPUT); // vælg ’pin 7’ på Arduinoen som output
}

void loop() {
// blink med LED’en
digitalWrite(7, HIGH); // tænd LED’en
delay(1000); // vent 1 sekund
digitalWrite(7, LOW); // sluk LED’en
delay(1000); // vent 1 sekund
}



Formål:

Målet med dette projekt er at bygge et termometer der bestemmer temperatur i Celsiusskalaen.

 

Teori:

De fleste kender allerede et gammeldags kviksølv termometer, der virker ved at den termiske udvidelse får kviksølvsøjlen til at rejse sig i et glasrør med afmærkninger der passer med temperaturintervallerne i Celsiusskalaen.

 

Men hvordan virker et elektrisk termometer?

 

Ligesom temperaturen medvirker en termisk udvidelse, vil den også i metaller bevirke at den elektriske modstand ændre sig. Alle metallers (gode elektriske ledere) resistans har en temperaturafhængighed der er stiger omtrent lineært med temperaturen

R = R_0 \left( 1 +  \alpha t \right).

Et typisk metal til denne type måling er platin, Pt, der har en temperaturafhængighedskoefficient på \alpha = 3,\!87 \times 10^{-3}~^{\circ}\textrm{C}^{-1}. En almindeligt anvendt industristandard er Pt100, der er lavet således at R_0 = 100~\Omega.

 

Man kan også bruge en såkaldt halvleder. En halvleders resistans temperaturafhængighed er mere kompliseret end et metal. Eksempelvis kan man fremstille en NTC (negative temperature coefficient) termistor, som er en resistor der består af et halvleder-materiale hvis resistans ikke stiger  når temperaturen i halvlederen stiger, den falder derimod. Dette er fordi der bliver flere elektroner tilgængelige der kan lede strømmen i halvlederen. Dette ses på figuren herunder.

 

En simpel model for en NTC termistors resistans har en temperaturafhængighed der er eksponentiel,

R = R_0 e^{ B \left( \frac{1}{T} - \frac{1}{T_{0}} \right) },

hvor B er en konstant der afhænger af hvilket halvledermateriale der er brugt i NTC komponenten. Man kan yderligere vise at  den eksponentielle sammenhæng mellem temperatur og resistivitet leder til

\frac{1}{T} = a + b\ln \left( R \right).

I den moderne litteratur er der generel enighed om, at en bedre model for resistivitet i en NTC termistor er den såkaldte Steinhart-Hart formel

\frac{1}{T} = a + b\ln \left( R \right) + c\ln \left( R \right)^{3},

som bruges til at kalibrerer NTC termistorer og som vi også vil gøre brug af i det følgende.

 

For at kunne måle en ændring i resistivitet i NTC termistoren forbindes den i spændingsdeler (se noter om spændingsdeleren) med en resistor, R, af lignende resistivitet. Udgangsspændingsfaldet er således givet ved spændingsdelerligningen.

U_{\textrm{ud}} = \frac{R}{R_{\textrm{NTC}}+R} U_{\textrm{ind}},

Forholdet mellem udgangs- og indgangsspændingsforskellen ses på figur 1. Vi ser at forholdet stiger når temperatur (fordi R_{\textrm{NTC}} som forklaret ovenfor falder). NTC termistoren har som udgangspunt en indre resistans på 10 kΩ og vælges den anden modstand også til 10 kΩ forventes det at \tfrac{U_{\textrm{ud}}}{U_{\textrm{ind}}} = \tfrac{1}{2}.

Men der kan dog være andre kilder til resistans i et kredsløb, eksempelvis i alle samlingerne mellem komponenterne, derfor vil den effektive resistans af modstandene  i realiteten forekomme lidt højere end de 10 kΩ. For at kunne finindstille den præcise værdi, således at jeres termometer måler præcist i det temperaturinterval hvor det skal bruges kombineres en 5 kΩ resistor med en 0-10 kΩ variabel resistor (eller blot en variabel resistor med større spændvidde hvis en sådan er tilgængelig).

Resistansen af R_{\textrm{NTC}} isoleres i formlen

R_{\textrm{NTC}} = R \left( \frac{U_{\textrm{ud}}}{U_{\textrm{ind}}} - 1 \right),

hvor U_{\textrm{ud}} måles ved at forbinde denne udgang til et af de analoge input. I dette projekt vælges A0. Arduino UNOen har en 10-Bit analog-til-digital konvertering som omformer det analoge input til et tal, x, mellem 0 og 1023. Sammenhængen mellem x og det målte spændingsfald er givet ved U_{\textrm{ud}} = \tfrac{x}{1023} U_{\textrm{ind}}, og derfor bliver resistansen af R_{\textrm{NTC}}

R_{\textrm{NTC}} = R \left( \frac{x}{1023} - 1\right).

Når R_{\textrm{NTC}} kendes, kan temperaturen bestemmes ved hjælp af Steinhart-Hart formlen

T = \frac{1}{a+b\ln\left( R_{\textrm{NTC}} \right) +c\ln\left( R_{\textrm{NTC}} \right)^{3}}.

 

Baggrund:

På figuren til højre ses det kredsløb som I skal opbygge.

Spændingsdeleren bygges ved at NTC termistorens ene ben forbindes direkte til Arduinoens 5 V pin (rød forbindelse). Det andet ben forbindes til fumlebrættet. NTC termistoren skal forbindes i serie til den anden resistor i spændingsdeleren og til det analoge indput A0 på Arduinoen (gul forbindelse).

 

De kalibreringsværdier der er angivet i koden herunder, antager at man bruger en anden modstand der mancher termistoren men hvis man bare bruger en anden 10 kΩ resistor, vil de små forskelle i absolut resistans der naturligt vil forekomme, genrelt resulterer i en fejlbestemmelse af temperaturen. Dette kan umiddelbart afprøves ved at bestemme stuetemperaturen i rummet man bygger termometeret i, ved sammenligning med et almindeligt termometer man har liggende ved siden af. Derfor anbefales det at I laver en variabel resistor i området 5 kΩ til 15 kΩ ved at serieforbinde en 5 kΩ med en 10 kΩ variabel resistor.

 

Efter den variable resistor føres en ledning tilbage til GND på Arduinoen.

 

Indfør koden i vinduet på Arduino IDE’en.

 

Når USB stikket er tilsluttet Arduinoenheden kan man uploade programmet til Arduinoen ved at klikke på det ikon  der viser en pil der venter mod hørje.

 

For at se aflæsningerne kan man trykke på det ikon der viser et forstørrelsesglas. Dette åbner et nyt vindue der viser aflæsningerne som de kommer ind.


Koden




// introducer de nødvendige konstanter
float R = 10000;
float RNTC;
float T;

// ------------------------------------ //
// værdier til Steinhart–Harts formel:
float a = 1.009249522e-03;
float b = 2.378405444e-04;
float c = 2.019202697e-07;
// ------------------------------------ //

void setup() {
Serial.begin(9600);
}

void loop() {
// beregner resistansen i NTC Thermistoren
RNTC = R * ( ( 1023.0 / analogRead(A0) ) - 1 );
// beregner temperaturen ud fra Steinhart–Harts formel
T = (1.0 / (a + b*log(RNTC) + c*log(RNTC)*log(RNTC)*log(RNTC)));
// omregner fra Kelvin til celsius
T = T - 273.15;
// Skriv den aktuelle ASCII værdi til 'Seriel Monitor'
Serial.print("Temperatur: ");
Serial.println(T);
}



 

Der må forventes at være naturlige variationer i de enkelte aflæsninger hvis årsag enten ikke kan bestemmes med sikkerhed eller ikke kan afhjælpes. Dette bevirker at der kommer støj på målingerne. Sådan en støj er et eksempel på en kilde til tilfældig fejl på hver måling. Nogle gange må det forventes at støjen giver en lidt for høj måling mens andre gange en lidt for lav. Modsat, hvis eksempelvis afvigelsen altid bevirkede en måling der var lidt for høj, som er en eksemlpel på en systematisk fejl.

Fordelen ved en tilfældig fejl er at hvis man gentager målingen under så ens forhold som muligt, så burde gennemsnittet af målingerne repræsenterer et bedre bud på en faktiske værdi, det vil sige den værdi som vi ville have målt hvis ikke der var støj tilstede.

Nedenstående kode bestemmer gennemsnittet af 10 punkter. Prøv at uploade den til Arduinoen i stedet for og se hvor meget mere stabil målingerne bliver. Prisen for mere stabile målinger er selvfølgelig tid – nu får I kun 1 måling på den tid hvor i før fik 10 – men når man laver metrologi kan præcission ofte være at fortrække fremfor hastighed.

 


Koden (gennemsnit)




// Introducer de nødvendige konstanter
const int num = 10; // Antal punkter der skal midles.
float R = 10000; // Værdien af den anden resistor.
float RNTC; //
float T; //
float sum = 0; // Den akkumulerende sum.
float gms = 0; // Det udregnede gennemsnit.
float val[num]; // De akkumulerende værdier.
int idx = 0; // Index af den nuværende aflæsning.

// ------------------------------------ //
// værdier til Steinhart–Harts formel:
float a = 1.009249522e-03;
float b = 2.378405444e-04;
float c = 2.019202697e-07;
// ------------------------------------ //

void setup() {
Serial.begin(9600);
// Begynd den vektoren med 0 i alle elementer
for (int cnt = 0; cnt < num; cnt++) {
val[cnt] = 0;
}
}

void loop() {
// fratræk den seneste aflæsning:
sum = sum - val[idx];
// beregner resistansen i NTC Thermistoren
RNTC = R * ( ( 1023.0 / analogRead(A0) ) - 1 );
// beregner temperaturen ud fra Steinhart–Harts formel
T = (1.0 / (a + b*log(RNTC) + c*log(RNTC)*log(RNTC)*log(RNTC)));
// omregner fra Kelvin til celsius
T = T - 273.15;
// read from the sensor:
val[idx] = T;
// adder den seneste aflæsning:
sum = sum + val[idx];
// ryk videre til næste element i vektoren:
idx = idx + 1;
// udregn gennemsnitte hvis idx er 10
if (idx >= num) {
// beregner gennemsnittet:
gms = sum / num;
// skriv den aktuelle ASCII værdi til 'Seriel Monitor'
Serial.print("Temperatur: ");
Serial.println(gms);
// genstart idx på 0
idx = 0;
}
}



Formål:

Målet med dette projekt er at bygge en lampe der kan tændes og slukkes med et relæ, som styres af en Arduino.

 

Baggrund:

Et relæ giver mulighed for at overføre en styring – eksempelvis tænd/sluk – fra Arduinoenheden, der maksimal kan levere en spændingsforskel på 5 V, til en anden del af et kredsløb hvor en ekstern spændingsforsyning levere en væsentlig højere spændingsforskel end Arduinoen kan, hvis man eksempelvis ønsker at tænde for en 12 V halogenlampe.

 

Et eksempel på sådan et kredsløb er vist på figuren til højre.

 

Arduinoen styrer kontakten i relæet ved at tilslutte 5 V eller 0 V for hhv. at tænde og slukke halogenlampen.

 

BEMÆRK: en halogenpære bliver hurtig MEGET varm. Husk at holde god afstand.

I skal opbygge et kredsløb som vist på figuren til højre.

 

Indfør koden i vinduet på Arduino IDE’en. Når USB stikket er tilsluttet Arduinoenheden kan man uploade programmet til Arduinoen ved at klikke på det ikon der viser en pil der venter mod højre.

 

Herefter blinker halogenlampen således at den er tændt i 5 sekunder og slukket i 10 sekunder.

 


Koden




void setup() {
pinMode(7, OUTPUT); // vælg ’pin 7’ på Arduinoen som output
}

void loop() {
// blink med 12 V halogenlampe
digitalWrite(7, HIGH); // slå relæ til
delay(5000); // vent 5 sekund
digitalWrite(7, LOW); // slå relæ fra
delay(10000); // vent 10 sekund
}



Formål:

Målet for dette projekt er at ombygge en varmluftovn i en sodavandsdåse og holde en bestemt temperaturen så godt som muligt over flere minutter. I dette projekt skal I altså lave et kredsløb der kan styre temperaturen i en varmluftovn.

 

Baggrund:

Meget industriel produktion skal foregå ved en bestemt temperatur. Derfor er det vigtigt at kunne holde temperaturen konstant over nogen tid.

 

Hvis der er behov for at holde en temperatur der er højere end omgivelserne, består den simpleste temperaturstyring man kan lave, af et varmelegeme der hæver temperaturen når det er tændt og et termometer til at afgøre om den ønskede temperatur er nået. Hvorefter varmelegemet slukkes. En skitse af sådan et kredsløb ses på figuren herunder.

 

Som varmelegeme bruges en halogenpære i dette projekt. Halogenpæren skal have 12 V, hvilket Arduinoen ikke kan levere, og kræver derfor en eksterne spændingskilde. Halogenpæren skal derfor også styres med et relæ.

 

Et relæ giver mulighed for at overføre en styring – eksempelvis tænd/sluk – fra Arduinoenheden, der maksimal kan levere en spændingsforskel på 5 V, til en anden del af et kredsløb hvor en ekstern spændingsforsyning levere en væsentlig højere spændingsforskel end Arduinoen kan, hvis man eksempelvis ønsker at tænde for en 12 V halogenlampe.

 

Et eksempel på sådan et kredsløb er vist på figuren til højre.

Arduinoen styrer kontakten i relæet ved at tilslutte 5 V eller 0 V for hhv. at tænde og slukke halogenlampen.

 

BEMÆRK: en halogenpære bliver hurtig MEGET varm. Husk at holde god afstand.

 

Selve varmluftovnen kan laves på flere måder, men det letteste er at bruge en sodavandsdåse. Man kan eventuelt isolere dåsen med noget stof. Der skal være plads til både Termistor, halogenlampe og blæser inde i sodavandsdåsen.

 

Indfør koden i vinduet på Arduino IDE’en. Når USB stikket er tilsluttet Arduinoenheden kan man uploade programmet til Arduinoen ved at klikke på det ikon der viser en pil der venter mod højre.

 


Koden




// introducer de nødvendige konstanter
float R = 10000;
float RNTC;
float T;
// Vælg setpunkt og tolerance for temperaturen i ovnen
const float Tset = 35;
const float Ttol = 0.5;

// ------------------------------------ //
// værdier til Steinhart–Harts formel:
float a = 1.009249522e-03;
float b = 2.378405444e-04;
float c = 2.019202697e-07;
// ------------------------------------ //

void setup() {
Serial.begin(9600);
pinMode(7, OUTPUT); // vælg ’pin 7’ på Arduinoen som output
}

void loop() {

// beregner resistansen i NTC Thermistoren
RNTC = R * ( ( 1023.0 / analogRead(A0) ) - 1 );
// beregner temperaturen ud fra Steinhart–Harts formel
T = (1.0 / (a + b*log(RNTC) + c*log(RNTC)*log(RNTC)*log(RNTC)));
// omregner fra Kelvin til celsius
T = T - 273.15;

// temperaturstyring
if(T < Tset-Ttol) {
digitalWrite(7, HIGH) // slå relæ til
}
elseif(T > Tset+Ttol) {
digitalWrite(7, LOW) // slå relæ fra
}
// Skriv den aktuelle ASCII værdi til 'Seriel Monitor'
Serial.print("Temperatur: ");
Serial.println(T);
}



Formål:

Målet med dette projekt er at sample og kalibrere en pH-elektrode.

 

Baggrund:

Kemiske reaktioner der foregår i vandig opløsning er involveret i overvældende grad i mange forskellige brancher i industri, og mange af disse reaktioner skal foregå i enten et surt eller et basisk miljø. Fælles for disse er, at pH, som måler i hvilken grad et vandigt miljø er enten surt eller basisk, skal være kendt og skal kunne ændres på en kontrolleret måde. Derfor er det vigtigt at kunne bestemme pH i en vandig opløsning.

Opstillingen består af en pH-elektrode, et pH sensor modul og en Arduino. Dette ses på figure til højre.  pH-elektroden kobles til sensormodulet via et kabel med BNC (Bajonet Neill–Concelman) fatning.

 

pH modulet har 2 skruer. Den skrue der sidder tættest på BNC stikket har formålet at man kan parallelforskyde den spændingsforskel som der udlæses på PO stikket. Når man tager modulet i brug første gang, står denne skrue på en tilfældig position, og hvis denne forskydning er meget stor kan det ske at man rammer 0 V eller 5 V, som jo er grænserne for Arduinoen, når man kalibrerer pH elektroden. Derfor er det good practice at begynde med at indstille denne skrue så en pH på 7 svare til 2,5 V.

 

pH modulet har 6 pins benævnt med TO, DO, PO, G, G og V+. TO er udlæsningen af den termistor der sidder på sensormodulet. Hvis målingen af pH foregår i normal stuetemperatur kan man antage at pH er temperaturuafhængigt. Derfor behøves denne pin ikke at forbindes til Arduinoen. Sensormodulet har en rød LED som lyser når pH udlæsningen kommer over en vis værdi, kaldet pH grænsen. Når dette sker sættes spændingsforskellen på DO til 3,3 V, ellers er spændingsforskellen på DO 0 V. Ligeledes behøves denne pin ikke at forbindes til Arduinoen. PO er pH udlæsning. PO forbindes til en analog pin på Arduinoen. Derudover; G, som er jord til pH udlæsningen.G, som er jord til sensormodulet og V+  som er 5 V DC forsyningsspænding til sensormodulet.

 

Figuren til højre viser sensor modulet og pH-elektroden.

 

Kalibrering af pH elektroden:

I denne øvelse skal I kalibrere en pH elektrode ved hjælp af 3 referencevæsker med velkendt pH. En referencevæske har en pH værdi der er sporbar til en primærnormal.  pH elektroden udlæser ikke pH direkte, men derimod spændingsforskellen imellem glaselektroden og referenceelektroden [se K2 kompendiet].

  1. Hæld 3 forskellige pH referencevæsker op. Gerne en med pH under 7, en med pH på 7 og en med pH over 7.
  2. Indstil skruen der parallelforskyder spændingsforskellen, så en pH på 7 svare til 2,5 V.
  3. Mål spændingsforskellen i de 3 væsker og noter resultaterne og de tilhørende pH værdier. På grund af virkemåden af pH-elektroden, så forventer man at sammenhængen mellem spændingsforskel og pH er lineær

\textrm{pH}(U) = a \cdot \textrm{U}+b,

hvor konstanter a og b findes ved lineær regression.

 

 

More to come