Arduino lessen/les 3: verschil tussen versies

Uit Lab
Naar navigatie springen Naar zoeken springen
 
(13 tussenliggende versies door dezelfde gebruiker niet weergegeven)
Regel 4: Regel 4:


== Opdracht 1. Dimmer zonder invoer ==
== Opdracht 1. Dimmer zonder invoer ==
Bij deze opdracht gebruik je een LED op het breadboard, aangesloten op pin 9 van de Arduino. De pinnen van de Arduino waarvoor een PWM-uitvoer mogelijk is, worden op het bord aangegeven door "~". Dit zijn de pinnen 3, 5, 6, 9, 10, 11.
Bij deze opdracht gebruik je een LED met serieweerstand op het breadboard, '''aangesloten op pin 9 van de Arduino'''. Zie hiervoor het schema van "Blink" voor de bedrading op het breadboard.
# Gebruik programma Voorbeelden-> 01.Basic-> Fade, met de LED aangesloten op pin 9, en probeer dit programma te begrijpen.
: De pinnen van de Arduino waarvoor een PWM-uitvoer mogelijk is, worden op het bord aangegeven door "~". Dit zijn de pinnen 3, 5, 6, 9, 10, 11.
# Pas het programma aan zodat de LED in een ander tempo verandert.
 
# Pas het programma aan zodat de LED varieert tussen de halve en de hele lichtsterkte.
Gebruik programma Voorbeelden-> 01.Basic-> Fade, met de LED aangesloten op pin 9.
 


Een samenvatting van het programma <code>Fade</code>:
Een samenvatting van het programma <code>Fade</code>:
Regel 31: Regel 32:
}
}
</syntaxhighlight>
</syntaxhighlight>
Uitleg bij dit programma:
# we gebruiken de variabelen <code>brightness</code> om het lichtniveau van de LED bij te houden;
# elke doorgang van de lus tellen we <code>fadeAmount</code> op bij deze <code>brightness</code>
## als <code>fadeAmount</code> negatief is, verlagen we hiermee de <code>brightness</code>
# het symbool <code> || </code> staat voor "or": de logische (inclusieve) ''of''. Deze levert ''true'' als tenminste één van de twee operanden ''true'' is.
## Dit is anders dan de exclusieve of die we in het dagelijks leven vaak gebruiken, bijvoorbeeld: ''de prijs is voor Jan of Joke''.
# als we aan het eind van het bereik komen (0 of 255), veranderen we het teken van <code>fadeAmount</code>
'''Let op''': 255 moet deelbaar zijn door <code>fadeAmount</code> - anders komen we aan het eind niet uit. Hoe zou je dat kunnen aanpassen?
=== Variaties ===


Opmerking: het symbool <code> || </code> staat voor "or": de logische (inclusieve) ''of''. Deze levert ''true'' als tenminste één van de twee operanden ''true'' is
# Pas het programma aan zodat de LED in een ander tempo verandert.
: Dit is anders dan de exclusieve of die we in het dagelijks leven vaak gebruiken, bijvoorbeeld: ''de prijs is voor Jan of Joke''.
# Pas het programma aan zodat de LED varieert tussen de halve en de hele lichtsterkte.


== Opdracht 2. Dimmer met drukknoppen ==
== Opdracht 2. Dimmer met drukknoppen ==
[[Bestand:Dimmer2-bb.png|thumb|right|350px|Dimmer met buttons en LED]]
[[Bestand:Dimmer2-schema.png|thumb|right|350px|Dimmer met buttons en LED]]
Bij deze opdracht gebruik je de drukknoppen om een hoger of een lager lichtniveau te schakelen. Hiervoor gebruik je de techniek voor het schakelen met een drukknop: zie [[../les 2]] - opdracht 2.
Bij deze opdracht gebruik je de drukknoppen om een hoger of een lager lichtniveau te schakelen. Hiervoor gebruik je de techniek voor het schakelen met een drukknop: zie [[../les 2]] - opdracht 2.
# sluit een LED aan (op de normale manier, via een serieweerstand) op één van de pinnen die als analoge output gebruikt kan worden (bijvoorbeeld Pin 9).
# sluit een LED aan (op de normale manier, via een serieweerstand) pin 9. Dit is één van de pinnen die als analoge output (PWM) gebruikt kan worden.
# sluit twee schakelaars aan op pinnen die als digitale inputs gebruikt kunnen worden.
# sluit twee schakelaars aan: op pin 2, voor de "up", en op pin 3 voor de "down" knop.


<syntaxhighlight lang="Cpp">
<syntaxhighlight lang="Cpp">
 
const int led = 9;      // PWM ("analog out")
const int ledPin = 9;      // PWM ("analog out")
const int upButton = 2;
const int upButtonPin = 2;
const int downButton = 3;
const int downButtonPin = 3;


int ledLevel = 1;    // always a power of 2, 1..256
int ledLevel = 1;    // always a power of 2, 1..256


void setup() {
void setup() {
   pinMode(ledPin, OUTPUT);
   pinMode(led, OUTPUT);
   pinMode(upButtonPin, INPUT);
   pinMode(upButton, INPUT);
   pinMode(downButtonPin, INPUT);
   pinMode(downButton, INPUT);
}
}


void loop() {
void loop() {
    
    
   if (digitalRead(upButtonPin)) {
   if (digitalRead(upButton)) {
     if (ledLevel < 256) {
     if (ledLevel < 256) {
       ledLevel = ledLevel * 2;
       ledLevel = ledLevel * 2;
Regel 63: Regel 76:
   }
   }


   if (digitalRead(downButtonPin)) {
   if (digitalRead(downButton)) {
     if (ledLevel > 1) {
     if (ledLevel > 1) {
       ledLevel = ledLevel / 2;
       ledLevel = ledLevel / 2;
Regel 70: Regel 83:
   }
   }


   analogWrite(ledPin, ledLevel - 1);  
   analogWrite(led, ledLevel - 1);  
}
}
</syntaxhighlight>
</syntaxhighlight>
Regel 83: Regel 96:
## een betere methode is om alleen te kijken naar het indrukken van de knop, niet naar het "ingedrukt zijn". Zie bijvoorbeeld:
## een betere methode is om alleen te kijken naar het indrukken van de knop, niet naar het "ingedrukt zijn". Zie bijvoorbeeld:


'''Vraag''': in hoeveel stappen heb je het maximale niveau bereikt?
'''Vragen''':  
* in hoeveel stappen heb je het maximale niveau bereikt?
* wat gebeurt er als je een knop ingedrukt houdt?


=== Variaties ===
=== Variaties ===
Regel 89: Regel 104:
* gebruik in plaats van verdubbelen of halveren, het veranderen van <code>ledLevel</code> met een vaste waarde, zoals in opdracht 1.
* gebruik in plaats van verdubbelen of halveren, het veranderen van <code>ledLevel</code> met een vaste waarde, zoals in opdracht 1.
** denk erom dat je de test voor de maximale en de minimale waarde hierop aanpast.
** denk erom dat je de test voor de maximale en de minimale waarde hierop aanpast.
== Achtergrondinformatie ==


Voor voorbeelden en een uitleg van de verschillende begrippen, zie:
Voor voorbeelden en een uitleg van de verschillende begrippen, zie:
* achtergrondmateriaal, Analoge uitvoer
* achtergrondmateriaal, Analoge uitvoer

Huidige versie van 23 sep 2015 om 13:41

Arduino lessen
  1. Blink - digitale uitvoer
  2. Button - digitale invoer
  3. Dimmer - PWM
  4. Dimmer - analoge invoer
  5. Seriële uitvoer naar host
  6. Analoge sensoren
  7. Beweging: servo
  8. Button - event
  9. Tijd - timers
  10. Blink - met timer

Les 3 Analoge uitvoer

Een Arduino heeft niet een echte analoge uitgang: er is geen Digitaal/Analoog-omzetter (D/A converter). Dit betekent dat het niet goed mogelijk is om een analoog signaal, zoals spraak of muziek, weer te geven. Maar als het gaat om een analoog niveau, bijvoorbeeld voor de lichtsterkte van een LED, of de snelheid van een motor, dan kunnen we de pulsbreedtemodulatie (pulse width modulation, PWM) van de Arduino gebruiken. De onderstaande opdrachten zijn bedoeld om hiermee te leren werken.

Opdracht 1. Dimmer zonder invoer

Bij deze opdracht gebruik je een LED met serieweerstand op het breadboard, aangesloten op pin 9 van de Arduino. Zie hiervoor het schema van "Blink" voor de bedrading op het breadboard.

De pinnen van de Arduino waarvoor een PWM-uitvoer mogelijk is, worden op het bord aangegeven door "~". Dit zijn de pinnen 3, 5, 6, 9, 10, 11.

Gebruik programma Voorbeelden-> 01.Basic-> Fade, met de LED aangesloten op pin 9.


Een samenvatting van het programma Fade:

int led = 9;           // the PWM pin that the LED is attached to
int brightness = 0;    // brightness state for the LED
int fadeAmount = 5;    // change in brightness state per step 

void setup()  { 
  pinMode(led, OUTPUT);     // use pin 9 as output
} 

void loop()  { 
  analogWrite(led, brightness);      // set LED to brightness state    

  brightness = brightness + fadeAmount;   // change brightness

  if (brightness == 0 || brightness == 255) { // at end of fade cycle
    fadeAmount = -fadeAmount ;         // reverse the fade direction 
  }     
     
  delay(30);                             // wait for 30 milliseconds                          
}

Uitleg bij dit programma:

  1. we gebruiken de variabelen brightness om het lichtniveau van de LED bij te houden;
  2. elke doorgang van de lus tellen we fadeAmount op bij deze brightness
    1. als fadeAmount negatief is, verlagen we hiermee de brightness
  3. het symbool || staat voor "or": de logische (inclusieve) of. Deze levert true als tenminste één van de twee operanden true is.
    1. Dit is anders dan de exclusieve of die we in het dagelijks leven vaak gebruiken, bijvoorbeeld: de prijs is voor Jan of Joke.
  4. als we aan het eind van het bereik komen (0 of 255), veranderen we het teken van fadeAmount

Let op: 255 moet deelbaar zijn door fadeAmount - anders komen we aan het eind niet uit. Hoe zou je dat kunnen aanpassen?

Variaties

  1. Pas het programma aan zodat de LED in een ander tempo verandert.
  2. Pas het programma aan zodat de LED varieert tussen de halve en de hele lichtsterkte.

Opdracht 2. Dimmer met drukknoppen

Dimmer met buttons en LED
Dimmer met buttons en LED

Bij deze opdracht gebruik je de drukknoppen om een hoger of een lager lichtniveau te schakelen. Hiervoor gebruik je de techniek voor het schakelen met een drukknop: zie Arduino lessen/les 2 - opdracht 2.

  1. sluit een LED aan (op de normale manier, via een serieweerstand) pin 9. Dit is één van de pinnen die als analoge output (PWM) gebruikt kan worden.
  2. sluit twee schakelaars aan: op pin 2, voor de "up", en op pin 3 voor de "down" knop.
const int led = 9;      // PWM ("analog out")
const int upButton = 2;
const int downButton = 3;

int ledLevel = 1;     // always a power of 2, 1..256

void setup() {
  pinMode(led, OUTPUT);
  pinMode(upButton, INPUT);
  pinMode(downButton, INPUT);
}

void loop() {
  
  if (digitalRead(upButton)) {
     if (ledLevel < 256) {
      ledLevel = ledLevel * 2;
     }
     delay(300);
  }

  if (digitalRead(downButton)) {
    if (ledLevel > 1) {
      ledLevel = ledLevel / 2;
    }
    delay(300);
  }

  analogWrite(led, ledLevel - 1); 
}

Uitleg bij dit programma:

  1. we gebruiken de variabele ledLevel om het niveau van de LED bij te houden. We zorgen ervoor dat dit een macht van 2 is (1, 2, 4, 8, ..., 256): die kunnen we altijd eenvoudig halveren en verdubbelen.
  2. voor het aansturen van de led gebruiken we ledLevel - 1: dat is een getal in het bereik 0..255, precies wat we nodig hebben voor een PWM uitvoer.
  3. als upButton ingedrukt is, verdubbelen we ledLevel, tot maximaal 256.
  4. als downButton ingedrukt is, halveren we ledLevel, tot minimaal 1.
  5. we gebruiken geen aparte variabele om de toestand van de button in te bewaren: we gebruiken direct het resultaat van de digitalRead(...) in de conditie van de if. We hebben dit resultaat alleen maar op deze plek nodig.
  6. de delay(300); gebruiken we om te voorkomen dat bij het indrukken van een button, direct het maximale of het minimale niveau bereikt wordt. Computers zijn erg snel!
    1. een betere methode is om alleen te kijken naar het indrukken van de knop, niet naar het "ingedrukt zijn". Zie bijvoorbeeld:

Vragen:

  • in hoeveel stappen heb je het maximale niveau bereikt?
  • wat gebeurt er als je een knop ingedrukt houdt?

Variaties

  • gebruik in plaats van verdubbelen of halveren, het veranderen van ledLevel met een vaste waarde, zoals in opdracht 1.
    • denk erom dat je de test voor de maximale en de minimale waarde hierop aanpast.

Achtergrondinformatie

Voor voorbeelden en een uitleg van de verschillende begrippen, zie:

  • achtergrondmateriaal, Analoge uitvoer