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.

Lad os bygge en blinkende lysdiode (LED) lampe.

 

  • 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
}



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å 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.

 

Lad os bygge et termometer

 

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}}.

 

Opbygning:

 

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

 

  • NTC termistoren ene ben forbindes direkte til Arduinoens 5 V pin (rød forbindelse). Det andet ben forbindes til fumlebrættet hvor den skal have forbindelse til den anden modstand og til det analoge indput A0 på Arduinoen (gul forbindelse).
  • Her vælger jeg at lave en variabel resistor i området 5 kΩ til 15 kΩ ved at serieforbinde en 5 kΩ med en 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;
}
}



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);
}



More to come

More to come