Arduino-opdrachten/LDR
Sjabloon
Voorkennis | spanning en stroom |
Leerdoelen | LED, weerstand, breadboard, schema |
Onderdelen |
breadboard, LED, weerstand 220 ohm (rood-rood-bruin-goud), weerstand 10K ohm (bruin-zwart-oranje-goud), Arduino/Arduino UNO |
Libraries en functies |
Inleiding
Een LDR is een lichtgevoelige weerstand: de weerstand neemt af als er meer licht op valt.
Met de analoge input van de Arduino kunnen we alleen spanning meten. We kunnen een veranderende weerstand in serie zetten met een vaste weerstand: we krijgen dan een spanningsdeler. De spanning op het aansluitpunt van de beide weerstanden verandert als de weerstand van de LDR verandert. We hebben een veranderende weerstand omgezet in een veranderende spanning.
Als eerste voorbeeld lezen we de lichtsterkte in als analoge waarde, en sturen het resultaat naar de host (seriële monitor).
Deze schakeling kunnen we daarna uitbreiden, bijvoorbeeld voor een "theremin" of voor een automatisch nachtlampje.
Opbouwen van de schakeling
Schema
De LDR vormt met de weerstand van 4.7kOhm een spanningsdeler: de spanning over de LDR verhoudt zich tot de spanning over de weerstand als hun weerstandswaarden:
Omdat de weerstand van de LDR verandert als er meer of minder licht op valt, zal ook de spanning op de aansluiting tussen de twee weerstanden veranderen. Deze spanning gebruiken we als analoge invoer voor de Arduino.
- als er meer licht valt op de LDR, neemt de weerstand af; daardoor neemt de spanning toe;
- als er minder licht valt op de LDR, neemt de weerstand toe.
Het verband tussen de weerstand van de LDR en de hoeveelheid licht is niet lineair. Als je precies de hoeveelheid licht wilt meten, moet je daarmee rekening houden. In ons geval is het vaak voldoende om een ruwe schatting te maken van "licht" en "donker".
Programma
void setup() {
Serial.begin(9600);
}
void loop() {
int lightLevel = analogRead(A0);
Serial.println(lightLevel);
delay(2000);
}
Uitleg van het programma
We lezen de waarde van de analoge input uit, en sturen die naar de host. Deze kun je dan aflezen in de seriële monitor.
De delay
dient er vooral voor om de waarden in de uitvoer elkaar niet te snel te laten volgen, zodat je de verschillen beter kunt zien.
- Voor de analoog-digitaalomzetting heb je een kleine delay nodig; 1ms is voldoende.
Vragen en opdrachten
Eerste experimenten
- welke waarden vind je (via de seriële monitor)
- bij normaal licht;
- in het donker (hoe donker kun je het maken?);
- bij fel licht?
Theremin
Een aardige toepassing van een LDR is om het niveau van het licht de toonhoogte van een luidspreker (buzzer) te laten bepalen. Als de lichtsterkte verandert, bijvoorbeeld doordat je je hand in de buurt van de LDR beweegt, krijg je een andere toon.
Hiervoor moet je de analoge waarde die je inleest omzetten in een toonhoogte. Als minimale toonhoogte gebruiken we de A2 (ook wel A groot oktaaf genoemd) met een frequentie van 110Hz. Als maximale toonhoogte gebruiken we A8 (880Hz). Je kunt die aanpassen naar eigen smaak.
De waarden die we uitlezen als lichtniveau variëren tussen "erg donker" en "erg licht". Deze uitersten bepalen we experimenteel (met het programma hierboven). Nadat we een lichtniveau-waarde ingelezen hebben moeten we deze omrekenen naar een frequentie: daarvoor gebruiken we de Arduino-functie map
(https://www.arduino.cc/en/Reference/Map).
int buzzerPin = 8;
int freqA2 = 110; // frequentie van A2 is 110 Hz
int freqA5 = 880;
int dark = 10;
int light = 700;
void setup() {
pinMode(buzzerPin, OUTPUT);
}
void loop() {
int lightLevel = analogRead(A0);
int tone = map(lightLevel, dark, light, freqA2, freqA5);
int period = 1000000 / tone;
digitalWrite(buzzerPin, HIGH);
delayMicroseconds(period / 2);
digitalWrite(buzzerPin, LOW);
delayMicroseconds(period / 2);
}
Opdrachten/vragen
- zoek uit wat een Theremin is, en welk geluid deze maakt. (Een echte Theremin maakt gebruik van elektromagnetische velden in het radio-spectrum, niet als licht.)
- pas de frequenties eventueel aan naar eigen smaak
- pas de waarden van "donker" en "licht aan op basis van je eigen metingen met het vorige programma.
- je kunt deze schakeling bespelen met je handen, maar je kunt ook spiegels of lampen erbij gebruiken.
Automatisch nachtlicht
Ontwerp een schakeling en een programma om een LED te laten branden als het donker wordt.
- de LED is uit, of brandt op volle sterkte;
- probeer te voorkomen dat in het schemer de LED steeds aan en uit gaat
- zorg ervoor dat het licht van de LED niet op de sensor (LDR) valt.
Verdiepingsvragen
Andere sensoren met variabele weerstand
Er zijn veel meer sensoren die een fysisch verschijnsel omzetten in een veranderende weerstand:
- LDR
- NTC
- PTC