Arduino-opdrachten/Analoge-dimmer
Analoge dimmer
Leerdoelen | analoge invoer (A/D omzetting), PWM |
Voorkennis | Sweep |
Onderdelen |
Libraries en functies | analogRead, Serial, analogWrite |
Inleiding
Opbouwen van de schakeling
- Plaats een LED met serieweerstand op het breadboard, en verbind deze met pin 9 (PWM);
- Plaats een potmeter van 10kOhm op het breadboard;
- de montage is afhankelijk van het model potmeter dat je gebruikt;
- soms is het handig om de potmeter over de lege middenlijn te monteren;
- verbind de linker aansluiting van de potmeter met 5V
- verbind de rechter aansluiting van de potmeter met 0V
- verbind de middelste aansluiting (de "loper") van de potmeter met pin A0 (analoge input).
- Verbind de 5V-lijn van het breadboard met de 5V pin van de Arduino;
- Verbind de 0V lijn van het breadboard met de GND-pin van de Arduino.
Je kunt de schakeling testen door de aansluiting van de LED te verplaatsen van pin 9 naar de kolom van de middelste aansluiting van de potmeter (de "loper"). Als je dan aan de potmeter draait moet de LED feller of minder fel gaan branden.
Schema
Programma
int led = 9; // PWM pin
int potmeter = A0;
int ledState = 0;
void setup() {
pinMode(led, OUTPUT);
Serial.begin(9600);
}
void loop() {
ledState = analogRead(potmeter) / 4;
analogWrite(led, ledState);
Serial.println(ledState);
}
Uitleg van het programma
Voor de invoer van een analoge waarde gebruiken we analogRead
. Het resultaat van deze functie is een waarde tussen 0 (voor 0V) en 1023 (voor 5V). Deze input maakt gebruik van de 10-bits analoog-digitaal omzetter van de Arduino.
Het bereik van de analoge invoer is 0..1023 (10 bits). Het bereik van de analoge uitvoer is 0..255 (8 bits). Dit betekent dat we een invoer-waarde terug moeten brengen ("schalen") naar het uitvoer-bereik: hiervoor delen we deze waarde door 4.
De functie analogWrite(led, ledState);
schrijft de waarde van ledState
naar de PWM-uitvoer. De intensiteit van de LED neemt toe met de waarde van ledState
.
De functie Serial.println
stuurt de gegevens naar de host; je kunt deze bekijken via het seriële monitor-venster van de Arduino-omgeving: Hulpmiddelen->Seriële monitor.
- de snelheid in het programma (
Serial.begin(9600);
) moet gelijk zijn aan de snelheid die voor dit venster ingesteld is (9600 baud).
Het programma bevat een aantal onderdelen die alleen voor het testen nodig zijn:
- het gebruik van
Serial
- het gebruik van de variabele
ledState
.
Als je deze onderdelen weglaat, houd je de volgende opdracht over in de loop
-functie:
analogWrite(led, analogRead(potmeter) / 4);
Deze regel geeft goed weer dat je in de software een directe verbinding maakt van de potmeter-invoer naar de LED-uitvoer.
Het schalen van 10 naar 8 bits is in dit geval eenvoudig. Voor lastiger schalingsproblemen kun je de functie map
gebruiken, zie https://www.arduino.cc/en/Reference/Map. In dit geval wordt dat:
ledState = map(analogRead(potmeter), 0, 1023, 0, 255);
Voor deze toepassing is de precisie van de analoge invoer niet zo belangrijk. Als de precisie wel van belang is, zoals voor een analoge temperatuursensor, dan kun je met een aantal maatregelen deze verbeteren. Zie Analoge input.
De A/D omzetter van de Arduino is niet erg snel en niet erg precies. Deze is geschikt voor zoiets als een temperatuurmeting, maar niet voor geluidssignalen.
Vragen en opdrachten
Eerste experimenten
Verdiepingsvragen
- laat de deling door 4 (voor de schaling) weg uit het programma.
- wat verwacht je dat er gebeurt, en waarom?
- voer het experiment uit.
- verklaar het resultaat.