Arduino-opdrachten/LED-sweep: verschil tussen versies
Geen bewerkingssamenvatting |
k (Eelco heeft de pagina Arduino-opdrachten/Sweep hernoemd naar Arduino-opdrachten/LED-sweep zonder een doorverwijzing achter te laten) |
(geen verschil)
|
Huidige versie van 25 mei 2016 om 09:59
LED-sweep
Leerdoelen | analoge uitvoer (PWM: pulsbreedte modulatie); sweep; variabele |
Voorkennis | spanning en stroom |
Onderdelen |
LED, weerstand 220 ohm (rood-rood-bruin-goud), weerstand 10K ohm (bruin-zwart-oranje-goud), |
Libraries en functies | Serial.begin, Serial.println |
Inleiding
Je laat de lichtsterkte van de LED geleidelijk toenemen (en afnemen).
Opbouwen van de schakeling
- Plaats een LED en serieweerstand op het breadboard.
- Verbind de LED aan pin 9(!) van de Arduino
In plaats van pin 9 kun je ook de andere pinnen gebruiken die als PWM-uitvoer gebruikt kunnen worden. Deze herken je aan de "~" naast het pinnummer: 3, 5, 6, 9, 10, 11 (voor de Arduino UNO).
Schema
Programma
int led = 9;
int ledState = 0;
int step = 15;
void setup() {
Serial.begin(9600);
}
void loop() {
analogWrite(led, ledState);
Serial.println(ledState);
ledState = ledState + step;
if (ledState > 255) {
ledState = 0;
}
delay(100);
}
Uitleg van het programma
De constructie ledState = ledState + step;
lees je als volgt:
- (i) reken de waarde uit van de uitdrukking (expressie)
ledState + step
; - (ii) ken deze waarde toe aan de variabele
ledState
.
Je kunt dit ook omschrijven als: "hoog ledState
op met step
".
De waarde van de variabele step
kan positief of negatief zijn, zodat de variabele ledState
toeneemt of afneemt. Als ledState
de grootste waarde voor de analoge output (i.e., 255)overschreden heeft, beginnen we weer opnieuw.
We gebruiken in dit programma ook de seriële uitvoer naar de host-computer. Daarmee kun je volgen wat er op de Arduino gebeurt. Dat is vaak handig als je fouten wilt opsporen.
- met
Serial.begin(9600);
in de setup open je de seriële verbinding;- deze 9600 is de baudrate; deze moet gelijk zijn aan de baudrate in het seriële monitor-venster op de host;
Serial.println(ledState);
stuurt de waarde vanledState
naar de host (als een string).
Vragen en opdrachten
Eerste experimenten
Snellere of tragere sweep
Je kunt de snelheid van de "sweep" op twee manieren veranderen:
- door de waarde van de
delay
aan te passen; - door de waarde van de
step
aan te passen.
Wat is het verschil? (Hint: probeer dit uit voor verschillende situaties; probeer ook eens een paar uitersten.)
Fade in - fade out
- plaats een tweede LED met serieweerstand op het breadboard (bijvoorbeeld een groene LED).
- verbind deze met een andere PWM-pin, bijvoorbeeld pin 10.
int greenLed = 10;
- zorg ervoor dat deze LED altijd de "complementaire lichtsterkte" heeft van de eerste LED.
- de som van beide lichtsterktes is 255:
analogWrite(led,ledState);
analogWrite(greenLed, 255 - ledState);
Symmetrische sweep
De "sweep" is nu niet symmetrisch: de lichtsterkte neemt geleidelijk toe, en gaat in één keer terug naar 0. Verander het programma zodat de lichtsterkte vanaf de grootste waarde (255) ook geleidelijk afneemt. Hint:
- als
ledState
de grootste waarde (255) voorbijgaat, keer je het teken van de stap om: (step = -step;
). Neem dan voorledState
deze grootste waarde.- de toekenning
ledState = ledState + step;
verhoogt of verlaagt de waarde vanledState
, afhankelijk van het teken vanstep
- de toekenning
- voor de kleinste waarde (0) voeg je een vergelijkbare actie toe.
Dit "sweep" patroon kun je voor verschillende toepassingen gebruiken. (Zie bijv. Arduino-opdrachten/Servo-sweep)