Arduino lessen/les 6
Analoge sensoren
In alle toepassingen van de Arduino speelt de interactie met de buitenwereld een grote rol. Voor interactie zijn er twee zaken nodig: invoer, bij de Arduino in de vorm van sensoren; en uitvoer, in de vorm van actuatoren. Veel sensoren zijn gericht op het meten van een analoge grootheid; het resultaat is een analoge grootheid die we via de analoog/digitaal omzetter van de Arduino omzetten in een bruikbare digitale vorm. We zullen in een volgende les ook digitale sensoren zien, waar de analoog/digitaal-omzetting al deel uitmaakt van de sensor.
Sensor met variabele weerstand
De eenvoudigste analoge sensoren zijn variabele weerstanden, waarbij de weerstand verandert ten gevolge van een fysische grootheid. Enkele voorbeelden:
- PTC, NTC: temperatuurgevoelige weerstanden; bij de PTC (positive temperature coefficient) neemt de weerstand toe bij toenemende temperatuur, bij de NTC neemt de weerstand af bij toenemende temperatuur.
- LDR: lichtgevoelige weerstand (Light dependent resistor); de weerstand neemt toe met toenemend lichtniveau.
- potmeter: deze kun je ook gebruiken om een hoek of een verplaatsing te meten.
Met de Arduino kun je geen weerstand meten, en dus ook geen veranderende weerstand. Maar met een eenvoudige schakeling kunnen we de variabele weerstand omzetten in een variabele spanning. Deze spanning kunnen we via de analoog/digitaal omzetter omzetten in een getal waar we in de software verder mee kunnen rekenen.
Voor het omzetten van een variabele weerstand in een variabele spanning gebruiken we een spanningsdeler. We sluiten een bekende vaste weerstand aan in serie met de variabele weerstand. De combinatie sluiten we aan op een vaste bekende spanning, bijvoorbeeld 5V (tussen de 5V en GND van de Arduino). Het verbindingspunt tussen de vaste en variabele weerstand levert dan de variabele spanning die we kunnen meten.
Opdracht 1: meten van licht met LDR
Voor dit experiment kun je de sketch Voorbeelden->0.1Basics->AnalogReadSerial gebruiken, om te kijken of de lichtsensor (LDR) werkt.
Een samenvatting van AnalogReadSerial
:
void setup() {
Serial.begin(9600); // init serial link: 9600 bits per second
}
void loop() {
int sensorValue = analogRead(A0); // read the input on analog pin 0
Serial.println(sensorValue); // print out the value just read
delay(1); // delay for stability of analog read
}
Opdracht 1a. Met dit programma kun je de waarde van de analoge invoer te zien krijgen in het Seriële Monitor-venster van de IDE (denk om de bitsnelheid). Je kunt daarmee ook controleren of de LDR inderdaad reageert op licht en donker. "Donker" betekent in dit geval echt donker, bijvoorbeeld door er een zwart doosje overheen te schuiven; de hand erop leggen levert niet zo'n groot effect.
- Wat zijn de waarden die je meet voor "licht" en "donker"?
- (**) Reken uit wat de bijbehorende weerstand is.
Opdracht 1b. Een volgende stap is om met de uitgelezen waarde een LED aan te sturen. Het programma Voorbeelden->Analog->AnalogInOutSerial laat de LED feller branden als er meer licht op de LDR valt. (Zie ook het programma in Arduino lessen/les 4, Opdracht 1.)
- Pas het programma zo aan dat de LED feller brandt als er minder licht op de LDR valt. (Een "nachtlichtschakelaar", bijvoorbeeld voor een fietslamp.)
AnalogInOutSerial
const int analogInPin = A0; // Analog input pin: potentiometer
const int analogOutPin = 9; // Analog output pin: LED
int sensorValue = 0; // value read from the potmeter
int outputValue = 0; // value output to the LED ( PWM)
void setup() {
// initialize serial communications at 9600 bps:
Serial.begin(9600);
}
void loop() {
// read the analog in value:
sensorValue = analogRead(analogInPin);
// map it to the range of the analog out:
outputValue = map(sensorValue, 0, 1023, 0, 255);
// change the analog out value:
analogWrite(analogOutPin, outputValue);
// print the results to the serial monitor:
Serial.print("sensor = " );
Serial.print(sensorValue);
Serial.print("\t output = ");
Serial.println(outputValue);
// wait 2 milliseconds before the next loop
// for the analog-to-digital converter to settle
// after the last reading:
delay(2);
}
Opdracht 2: meten van temperatuur
De temperatuursensor LM35DZ geeft direct een spanning af. Deze spanning kun je meten met een analoge ingang van de Arduino. De relatie tussen de spanning U (in V) en de temperatuur is: T = U * 100 (C). Met andere woorden: de spanning 0V komt overeen met 0 graad Celcius; elke 10mV hoger komt overeen met een graad hoger.
- De variant LM35DZ werkt van 0 graad C tot 100 graad C, met 10mV per graad Celcius; andere varianten werken ook voor negatieve temperaturen, en/of in graden Fahrenheit.
- De precisie bedraag bij kamertemperatuur ongeveer +/- 0,25C.
Opdracht a. Test eerst de temperatuursensor met het programma AnalogSerial (analoge invoer naar Seriële Monitor). Controleer of de temperatuur verandert als je de sensor vastpakt, of als je erop blaast. Klopt de aanwijzing van de temperatuur met je verwachtingen?
Het genoemde programma heeft voor het meten van de temperatuur twee tekortkomingen:
- het programma geeft een digitale waarde, niet een temperatuur.
- de maximale spanning van de sensor (1V, voor 100'C) is veel minder dan de maximale spanning van de analoog-digitaal-omzetter (in dit geval: 5V). Je gebruikt niet het volledige bereik van de A/D-omzetter, en dus niet de volledige precisie van de A/D-omzetter.
Opdracht b. Verander het programma zo dat de temperatuur afgedrukt wordt, in plaats van de digitale waarde die uitgelezen wordt. Doe dit in twee stappen:
- geef eerst de temperatuur weer als een geheel getal, in 1/10 van graden Celcius. 21,3 geeft je dan weer als 213.
- geeft de temperatuur weer als een komma-getal. Gebruik hiervoor
Opdracht 3. Precisie-metingen
We hebben gezien dat de aanpak in opdracht 2 niet de volledige precisie van de A/D omzetter gebruikt. Verander het programma zodat deze veel beter benaderd wordt. (Hint: gebruik een andere referentiespanning voor de A/D omzetter.)