Arduino-øvelser

Sensorer til målinger og overvågning af processor i industriel produktion eller klimaet danner grundlaget for at vores globale samfund kan bevæge sig i en mere bæredygtig retning. I industriel sammenhæng betyder et velunderbygget kendskab til optimale procesparametre både at der er mindre spild af materialer og energi, men også en højere omsætning. I den sammenhæng står metrologi centralt som garant for troværdighed og kvalitet.

Her på siden findes et antal projekter omm sensorer til undervisningsbrug baseret på den lettilgængelige Arduino.

Opsætning af en Arduino

I det følgende er der taget udgangspunkt i en Arduino af typen Arduino UNO. Arduinoer og tilhørende sensorer kan købes hos flere forhandlere, eksempelvis kan nævnes:

www.arduinotech.dk

www.arduinoshoppen.dk

www.dk.rs-online.com

 

Arduino UNO (og de fleste andre typer) forbindes til computeren gennem et USB kabel.

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.

Når Arduinoenheden er forbundet til computeren skal enhedstypen (her Arduino/Genuino Uno) og COM porten (her COM 3) vælges i softwaren under fanebladet “Tools”. Man kan se COM porten i computerens “Device Manager” (se figuren herunder).

 

Og nu er I klar….

 

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.

 

I det følgende er der brugt:

NTC termistor af typen: https://arduinotech.dk/shop/ntc-thermistor-10k-med-ledning/ 

 

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{ind}}}{U_{\textrm{ud}}} - 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{1023}{x} - 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.

 

I det følgende er der brugt:

Relæ af typen: https://arduinotech.dk/shop/arduino-relae-modul-1-kanal-2/

 

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.

 

I det følgende er der brugt:

NTC termistor af typen: https://arduinotech.dk/shop/ntc-thermistor-10k-med-ledning/

Relæ af typen: https://arduinotech.dk/shop/arduino-relae-modul-1-kanal-2/

Blæser af typen: https://arduinotech.dk/shop/blaeser-til-3d-printer-30x30mm-a4988-stepper-motor-mm/

 

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.

 

I det følgende er der brugt

pH sensor af typen: https://arduinotech.dk/shop/ph-analytical-survey-electrode-sensor/

pH modul af typen: https://arduinotech.dk/shop/ph-sensor-module-bnc/

 

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]. Fremgangsmåden er som følgende:

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. Brug nedenstående kode til at udlæse spændingsforskellen med Arduino-UNO enheden.


Koden




// introducer de nødvendige konstanter
int DAQpH;
float UpH;
float pH;

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

void loop() {
// DAQ udlæsning
DAQpH = analogRead(A0);
// beregner spændingsforskellen
UpH = 5.0 / 1023 * DAQpH;
// Skriv den aktuelle ASCII værdi til 'Seriel Monitor'
Serial.print("Spændingsforskel: ");
Serial.println(UpH,3);
delay(1000); // kun for at gører det lettere at se udlæsningen.
}



 
3) Mål spændingsforskellen i de 3 væsker og noter resultaterne samt 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} = a \cdot \textrm{U}+b,

hvor konstanter a og b findes ved lineær regression [se A2a kompendiet]. Resultatet skulle gerne ligne nedenstående graf.

 

På figuren til højre ses pH-skalen og nogle eksempler på væsker fra hverdagens kemi der kan bruges som referencevæsker hvis ikke der kan skaffes sporbare referencevæsker.

 

Det sidste der mangler er nu at opdaterer koden som vist herunder.

 


Koden




// introducer de nødvendige konstanter
int DAQpH;
float UpH;
float pH;

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

void loop() {
// DAQ udlæsning
DAQpH = analogRead(A0);
// beregner spændingsforskellen
UpH = 5.0 / 1023 * DAQpH;
// beregner pH ud fra lineær model
pH = 21,4 - 5,76 * UpH;
// Skriv den aktuelle ASCII værdi til 'Seriel Monitor'
Serial.print("Spændingsforskel: ");
Serial.println(UpH,3);
delay(1000); // kun for at gører det lettere at se udlæsningen.
}



Formål:

Målet med denne øvelse er at skabe kendskab til den elektriske målebro – Wheatstonebroen.

Øvelse 1

Baggrund:

Figuren til højre viser et elektrisk diagram over en Wheatstonebro. Broen består af en spændingskilde U_{\mathrm{ind}} og fire modstande R_{1,2,3,4} placeret sådan, at de serieforbundne modstande R_1 og R_3 er placeret i en parallelforbindelse med de serieforbundne modstande R_2 og R_4.

Målingen, som foretages med en Wheatstonebro, vil typisk være spændingsforskellen U_\mathrm{bro} mellem broens to midterpunkter A og B (se figur). For at finde et udtryk for denne spændingsforskel betragter vi først strømmene, der løber i broen. Fra Ohms lov fås

I_A = \frac{U_{\mathrm{ind}}}{R_1 + R_3} \hspace{0.5 cm} \mathrm{og} \hspace{0.5 cm} I_B = \frac{U_{\mathrm{ind}}}{R_2 + R_4},

Ved brug af disse to udtryk kan vi bestemme spændingsfaldet hen over modstandene R_3 og R_4. Da disse to modstande er forbundet til jord, er spændingsfaldene også lig spændingspotentialerne ved punkterne A og B. Igen ved brug af Ohms lov får vi

U_A = I_A R_3 = \frac{R_3}{ R_1 + R_3 } U_\mathrm{ind} \hspace{0.5 cm} \mathrm{og} \hspace{0.5 cm} U_B = I_B R_4 = \frac{R_4}{ R_2 + R_4 } U_\mathrm{ind},

hvilket leder til en spændingsforskel mellem broens to midterpunkter på

U_\mathrm{bro} = U_B - U_A = \left( \frac{R_4}{ R_2 + R_4 } - \frac{R_3}{ R_1 + R_3 } \right) U_\mathrm{ind} .

Dette udtryk udgør basis for alt arbejde med en Wheatstonebro, og i mange tilfælde vil man arbejde med en såkaldt \textit{balanceret} bro, hvilket vil sige, at spændingsforskellen U_\mathrm{bro} = 0. Fra samme udtryk kan det vises, at dette sker såfremt

R_1 R_4 = R_2 R_3.

Det simpleste eksempel på en balanceret bro findes derfor, når de fire modstande er ens.

Eksperiment:

For at bygge en simpel Wheatstonebro med en Arduino skal vi gøre følgende:

  • Forbind Arduinoens 3.3 V spændingsudgang til boardet (rød).
  • Placer fire 220~\Omega modstande i en broforbindelse.
  • Forbind broens slutning til jord (GND) på Arduinoen (blå).

Dette afslutter broforbindelsen. For at udlæse spændingsforskellen mellem broens to midterpunkter kan vi også bruge Arduinoen. Dette gøres ved at forbinde broens to midterpunkter til Arduinoens “Analog IN” kanaler A0 og A1 som vist (gule).

Udlæsning af spændingsforskellen sker ved brug af koden nedenfor.


Koden




// Introducer de nødvendige variable
float V1;
float V2;

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

void loop() {
// Konverterer analogt spændingssignal
V1 = 3.3*analogRead(A0)/1023.0;
V2 = 3.3*analogRead(A1)/1023.0;
// Udksriv broen spændingsforskel
Serial.println(V2-V1);
}



Kommentarer:

Grundet indre forbindelser i fumlebrættet (og usikkerheder på den faktiske værdi af de anvendte modstande) er det usandsynligt, at spændingsforskellen U_\mathrm{bro} går i nul. Brugen af et fumlebræt medfører generelt, at der er en relativt stor usikkerhed forbundet med målingerne — dette skal man huske at have in mente, når man laver sit usikkerhedsbudget!

  • For at undersøge om afvigelsen fra nulspænding stammer fra usikkerheder på modstandende eller fra fumlebrættet, kan man prøve at bytte om på modstandene R_1 og R_2 og modstandene R_3 og R_4.
  • Hvad sker der, såfremt man benytter fire modstande på 1.2~\mathrm{k \Omega} i stedet for dem på 220~\mathrm{\Omega}?

Øvelse 2

Baggrund:

En af Wheatstonebroens anvendelser er som modstandsmåler. Som vist på figuren nedenfor ønsker vi her at bestemme den ukendte modstand R_4. Dette kan gøres ved brug af to kendte modstande R_1 og R_2 samt en justerbar modstand R_3.

For at måle den ukendte modstand justeres R_3 således, at broen er balanceret, dvs. U_\mathrm{bro} = 0. Herefter kan R_4 findes ved brug af formlen

R_4 = \frac{R_2 R_3}{R_1}.

Modstandsmålinger med en Wheatstonebro afhænger altså af, at man laver en elektrisk nulmåling (måler nul volt på tværs af broen) — dette kan gøres meget nøjagtigt, og er i øvrigt uafhængigt af den brugte spændingskilde og dennes støj. Dermed afhænger usikkerheden på modstandsmålingen primært af, hvor nøjagtigt man kender de tre referencemodstande.

Eksperiment:

Med udgangspunkt i broen bygget ovenfor omformer vi nu Wheatstonebroen til en modstandsmåler. For at opnå dette foretages disse to ændringer:

  • Erstat den faste modstand R_3 med en variabel modstand (et såkaldt potentiometer).
  • Erstat den kendte modstand R_4 med en testmodstand, som ønskes målt.

Når broen er genopbygget justeres den variable modstand for at balancere broen, således at U_\mathrm{bro} = 0. Når broen er balanceret måles modstanden af den variable modstand R_3 ved brug af et multimeter. Den ukendte modstand beregnes nu ved brug af ligningén ovenfor (i baggrundsmaterialet), hvori værdier for de kendte og den målte modstande R_1, R_2 og R_3 indsættes.

Foretag nu modstandsmålinger for en række forskellige testmodstande — det kan være nødvendigt at udskifte de faste referenceemodstande for at gøre det muligt at balancere broen. 

Kommentarer:

  • Husk at udarbejde et usikkerhedsbudget for målingerne af testmodstandene. Ligger modstandenes faktiske værdier inden for de målte værdiers usikkerhed?
  • Forsøg at bestemme sammenhængen mellem spændingsforskellen U_\mathrm{bro} og den variable modstand R_3. Omkring den balancerede indstilling bør sammenhængen mellem U_\mathrm{bro} og R_3 være lineær. Denne lineære sammenhæng udnyttes fx i måleapparater til at måle stræk (såkaldte strain gauges).

Formål:

Målet for dette projekt er at bygge og kalibrere en højdemåler der udnytter at atmosfæretrykket aftager op igennem  Troposfæren.

I det følgende er der brugt:

Trykmåler af typen BMP180: https://arduinotech.dk/shop/barometer-bmp180-bmp280/

Baggrund:

Tryk er resultatet af en kraftpåvirkning fordelt ud over et areal. Derfor mærkes trykket fra en spids høj hæl, der jo har en lille overflade, som højt hvis man bliver trådt over foden, hvorimod en fakir der ligger på en seng af søm har sin tyngdekraft fordelt over mange søm og derfor føles trykket på hver søm småt.

Det barometriske tryk i atmosfæren er et resultat af tyngdekraften for den søjle af atmosfærisk luft der er over jordoverfladen fordelt på jordoverfladens areal. Normalt opgøres dette tryk i enhederne newton [N] per kvadratmeter [m²], dette kaldes også pascal [Pa].

Formlen for at udregne trykforskellen, \Delta p, mellem højderne h og h + \Delta h som er højere oppe i atmosfæren end h, er

(1)     \Delta p = \rho g h - \rho g (h + \Delta h) = - \rho g \Delta h,

hvor minustegnet betyder at trykket i højden h + \Delta h er mindre end ved h. Jo længere op i atmosfæren man kommer, jo lavere bliver trykket. Det giver mening, fordi definitionen på tryk jo netop afhang af tyngdekraften af den luftsøjle der er ovenover den overflade kraften fordeles på. Det vil sige at man kan beregne sig frem til en relativ højdeforskel ud fra en måling af barometrisk tryk.

Trykvariationen i forhold til højden kan ifølge ligning (1) udtrykkes som

(2)     \frac{\Delta p}{\Delta h} = - \rho g,

og afhænger således kun af tyngdeaccelerationen g = 9,82 m/s² og atmosfærens massefylde, ρ.

Figur 1: Et volumenudsnit af atmosfæren over en overflade med arealet A.

Modeller for atmosfærens massefylde:

Tør atmosfærisk luft indeholder hovedsageligt Nitrogen (kvælstof) og Oxygen (ilt) samt ædelgassen Argon. Dertil kommer CO2 (Kultveilte) og andre gasser. Tabel 1 viser de hyppigst forekommende grundstoffer i atmosfæren.

Gasserne i atmosfæren kan med god tilnærmelse opfattes som værende uafhængige af hinanden, forstået på den måde at de kun sjældent møder hinanden og hvis de gør reagerer de ikke kemisk med hinanden. Derfor kan massefylden af tør atmosfærisk luft udtrykkes som

(3)     \rho = \frac{M_0}{R}\frac{p}{T}

hvor M_0 = 29,097 g/mol er luftens molarmasse, R = 8,31451 Pa·m3/mol/K er (ideal)gaskonstanten, p er trykket målt i pascal og T er temperaturen målt i kelvin.

Ægte tør luft er dog en sjældenhed i troposfæren, fordi der fra jordoverfladen afdamper vanddamp der giver anledning til en luftfugtighed. Vandmolekyler opfører sig anderledes end resten af gasserne i atmosfæren. Vanddamp kondenserer eksempelvis ud på vinduer når temperaturen falder om natten. Kondens på vinduer sker fordi den mængde vanddamp som atmosfæren kan indeholde afhænger af temperaturen. Atmosfæren siges at være mættet når kondensation af vand i luften, som tilbageføres til det flydende vand på jordoverfladen sker i lige så vid udstrækning som fordampning fra jordoverfladen. Luftfugtighed påvirker især trykket tæt ved jordoverfladen og skal således tages højde for i kalibreringen af tryksensoren ellers bliver den udregnede højde tilført en systematisk fejl.

Tabel 1: Sammensætning af gasser i atmosfæren
Grundstof
Navn
Grundstof
Betegnelse
Procentdel af atmosfæren

Molarmasse

[g/mol]

Nitrogen N_2 78,084 % 28,014
Oxygen O_2 20,9476 % 31,998
Argon Ar 0,934 % 39,948
Carbondioxid CO_2 0,04 % 44,009
Neon Ne 0,00182 % 20,183
Helium He 0,000524 % 4,002
Metan CH_4 0,0002 % 16,043
Krypton Kr 0,000114 % 83,800
Hydrogen H_2 0,00005 % 2,016
Dinitrogenoxid N_2O 0,000027 % 44,013
Carbonmonooxid CO 0,000019 % 20,010
Xenon Xe 0,0000087 % 131,300

 

Modeller for luftens temperatur og tryk:

Det viser sig, at temperaturen varierer en del op gennem de forskellige lag af atmosfæren. Eksempelvis aftager temperaturen fra ca. 15 °C til omkring -55 °C i løbet af troposfæren. Troposfæren er ca. 11 km høj og er den del af atmosfæren der ligger tættest på jordoverfladen. Det meste der er skabs af os mennesker eksisterer således i troposfæren, selv kommercielle rutefly flyver typisk i grænselaget mellem troposfæren og den efterfølgende stratosfære. Figur 2 viser en grov skitse af opdelingen af atmosfæren i henholdsvis troposfæren, stratosfæren, mesosfæren og termosfæren og den tilknyttede udvikling i temperaturen.

Erfaringsmæssigt ved man at temperaturfaldet i troposfæren tilnærmelsesvis er lineært. Det vil sige, at vi kan beskrive temperaturen i højden h med en ligning

(4)     T(h) = T_0 - \Gamma h,

hvor \Gamma = 6,5 K km^{-1} og T_0 = 288 K. Det viser sig at luftfugtighed ikke har nogen nævneværdig indflydelse på hvordan det atmosfæriske tryk udvikler sig i højden, selvom temperaturen varierer i troposfæren. Dette skyldes især at temperaturen bliver mindre jo højere man kommer op i troposfæren, så luften kan indeholde mindre og mindre vand og forskellen på tør og fugtig luft bliver således også mindre og mindre.

Hvis ligning (2), (3) og (4) kombineres, kan man vise at det barometriske tryk i højden h i troposfæren følger den såkaldte barometriske formel

(5)     p(h) = p_0 \left( 1 - \frac{\Gamma}{T_0} h\right)^{ \frac{M_0 g}{R \Gamma} },

hvor p_0 = 101325 Pa som er trykket ved jordoverfladen. Bemærk dog at, modsat trykket i højden, så er trykket ved jordoverfladen under indflydelse af både temperatur og fugtighed. Temperaturen varierer typisk 10 garder celsius hen over et døgn og luftfugtighed kan variere med 20 %. Hertil kommer at mange bygninger har klimakontrol, hvor blandt andet luftfugtighed kontrolleres og typisk holdes under 45 % for at undgå svamp og husstøvmider. Samtidig kan der udenfor i Danmark være en luftfugtighed på 95 %. Så dette må der tages højde for når højdemåleren kalibreres således at den virker under alle forhold.

 

Atmosfæretrykket op igennem Troposfæren beregnes ved hjælp af ligning (5). Dette er vist på figur 3. Ligning (5) kan godt se lidt kompliceret ud. Heldigvis kan vi, så længe vi befinder os tæt ved jordoverfalden, med en god tilnærmelse antage, at trykket kan beskrives med en lineær tilnærmelse

(6)     p(h) \approx p_0 - a h,

hvor hældningskoefficienten a, som udtrykker hvor meget trykket aftager pr. højdeenhed, og trykket p0, som er trykket ved ’havoverfladen’ nu er parametre der skal bestemmes under en kalibrering. I denne øvelse lader vi som om at gulvet i den bygning målingerne foretages i er havoverfladen selvom dette selvfølgelig ikke er helt korrekt.

Figur 2: Skitse af atmosfæren opbygning.

Figur 3: Trykfaldet igennem stratosfæren op til 10 km udregnet fra ligning (5). I indsættet ses det tilnærmelsesvise lineære trykfald over få meter.

Konstruktion af trykmåleren:

 Til Arduino produceres en række tryksensorer der måler barometrisk tryk. Disse er ofte af typen BMP180 eller BMP280 som kommunikerer med Arduinoen via en I2C protokol.

 Selve trykmåleren sidder på et modul med følgende pins Vin, GND SCL SDA og 3.3, hvoraf kun de 4 første skal bruges. Dette vises på figur 4 til højre. Vin (hedder nogle gange Vcc) er modulets forsyningsspænding og skal forbindes til 3,3 V på Arduinoen, ligeledes forbindes GND (ground) til en GND på Arduinoen.

 I2C bruger altid de analoge pins A4 til datalinje og A5 til tidslinje. Disse forbindes derfor således. SCL til A5 og SDA til A4.

Kode:

For at kunne benytte BMP180 sensorerne har fabrikanten leveret et bibliotek der håndterer selve kommunikationen mellem sensor og Arduino. Biblioteket skal hentes i Arduinoens ”Library Manager” som findes i ”Tools”-menuen, som det ses på figur 5 og 6.

Efterfølgende kaldes biblioteket som:

#include <Adafruit_BMP085.h>

Herunder findes et eksempel på en kode der udlæser det barometriske tryk (BMP180.readPressure()) fra en BMP180 sensor (Adafruit_BMP085 BMP180) ved hjælp af Adafruit_BMP085 biblioteket (Adafruit_BMP085.h).

Grundet udlæsningens fluktuerende natur, skriver koden herunder en gennemsnitlig værdi fra 100 udlæsninger ud til monitor.


Koden




// Biblioteker
#include <Wire.h>
#include <Adafruit_BMP085.h>
// Sensoren navngives BMP180
Adafruit_BMP085 BMP180;
// Konstanter
int num=100;
float val[num];
float sum=0;
float avg=0;
int idx=0;

void setup() {
Serial.begin(9600);
BMP180.begin();
// Initialiser val med nul
for (int cnt = 0; cnt < num; cnt++) {
val[cnt] = 0;
}
}

void loop() {
sum = sum - val[idx];
val[idx] = BMP180.readPressure();
sum = sum + val[idx];
idx = idx + 1;
// Genstart
if idx >= num) {
idx = 0;
}
avg = sum / num;
// Skriv den aktuelle værdi
Serial.println(avg);
}



Figur 4: Tilkobling af BMP180/ BMP280 sensor til Arduino.

Figur 5: I Tools vælges Library Manager.

Figur 6: I Library Manager søges efter Adafruit_BMP085 hvorefter dette bibliotek installeres.

Kalibrering:

Ved hjælp af en tommestok måles en række sammenhørende værdier af højde (målt i meter) og tryk (målt i pascal), som udlæses fra BMP180 sensoren. Disse indføres i et regneark som vist herunder.

Højde [m] Tryk [kPa]
0 101325
0,5

Lav mindst 5 punkter. Det er vigtigt at der tages en gennemsnitsværdi over noget tid.

  • Brug lineær regression til at bestemme det lineære udtryk der bedst passer til dine målinger. Lineær regression er beskrevet i kompendiet A2a i vores download sektion. Det er vigtigt at både p0 og α bestemmes med usikkerheder.
  • Nu kan ligning (6) bruges til at bestemme højden, givet en vilkårlig udlæsning fra BMP180 sensoren. Det ses direkte fra ligning (6) at

(7)     h = \frac{p_0 - p}{a}

Som indføres i koden som vist herunder (husk at bruge dine værdier af p_0 og a):


Koden




// Biblioteker
#include <Wire.h>
#include <Adafruit_BMP085.h>
// Sensoren navngives BMP180
Adafruit_BMP085 BMP180;
// Konstanter
const int num = 100;
const int h = 0;
const int p0 = 101325.0000;
const int a = 15.0000;
float val[num];
float sum=0;
float avg=0;
int idx=0;

void setup() {
Serial.begin(9600);
BMP180.begin();
// Initialiser val med nul
for (int cnt = 0; cnt < num; cnt++) {
val[cnt] = 0;
}
}

void loop() {
sum = sum - val[idx];
val[idx] = BMP180.readPressure();
sum = sum + val[idx];
idx = idx + 1;
// Genstart
if idx >= num) {
idx = 0;
}
avg = sum / num;
h = (p0 - avg) / a;
// Skriv den aktuelle værdi
Serial.println(h);
}


Et af de vigtige bidrag til usikkerhedsbudgette for den højdemåler I netop har bygget er knytte til den tilfældige variation der er mellem målinger af tryk foretaget under sammen betingelser. Eksemplvis målinger foretaget lige efter hinanden. Det ses med det samme at målingen af højde ikke helt stabil. Figur 10 viser et eksempel på hvordan upræcise trykmålinger leder til usikkerheder i højdemålingen. Derfor må der, med dette billige udstyr, måles i et stykke tid og derefter mildes for at kunne bestemme en højde nogenlunde præcist. Derfor må der laves et usikkerhedsbudget.

Usikkerhedsbudgetter er beskrevet i kompendiet A2 og eksempler på usikkerhedsbudgeter er samlet i kompendiet A3 i vores download sektion.