Arduino-opdrachten/Analoge-dimmer

Uit basis
Naar navigatie springen Naar zoeken springen
Arduino opdrachten

Zie ook Regels en richtlijnen
Zie ook Artikelen bewerken

Analoge dimmer

Leerdoelen analoge invoer (A/D omzetting), PWM
Voorkennis Sweep
Onderdelen

LED, weerstand 220 ohm (rood-rood-bruin-goud), potmeter

Libraries en functies analogRead, Serial, analogWrite

Inleiding

Analoge dimmer

Opbouwen van de schakeling

Dimmer met potmeter
  • 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

Dimmer met potmeter

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.