Arduino lessen/les 2: verschil tussen versies

Uit Lab
Naar navigatie springen Naar zoeken springen
Geen bewerkingssamenvatting
 
(47 tussenliggende versies door dezelfde gebruiker niet weergegeven)
Regel 6: Regel 6:
De eenvoudigste vorm van invoer voor een computer is een schakelaar - bijvoorbeeld een druktoets. In deze les behandelen we het aansluiten en gebruik van druktoetsen.
De eenvoudigste vorm van invoer voor een computer is een schakelaar - bijvoorbeeld een druktoets. In deze les behandelen we het aansluiten en gebruik van druktoetsen.


== Opdracht 1 - elementaire schakeling met drukknop ==
== Opdracht 1 - elementaire schakeling met drukknopschakelaar ==
# Begin met een breadboard met daarop een LED (met serieweerstand, 220 Ohm, rood-rood-bruin) aangesloten op pin 13. Plaats op het breadboard een schakelaar (druktoets) met een "pull down weerstand" van 10kOhm (bruin-zwart-oranje), volgens bijgaande figuur. Sluit een draad van het contactpunt van de schakelaar en de "pull down" weerstand aan op pin 2 van de Arduino. Als de schakelaar gemonteerd is als op de figuur aangegeven, dan verbind je door het indrukken de punten in de linkerkolom met de punten in de rechterkolom van de schakelaar.
# Begin met een breadboard met daarop een LED (met serieweerstand, 220 Ohm, rood-rood-bruin) aangesloten op pin 13. Plaats op het breadboard een schakelaar (druktoets) met een "pull down weerstand" van 10kOhm (bruin-zwart-oranje), volgens bijgaande figuur. Sluit een draad van het contactpunt van de schakelaar en de "pull down" weerstand aan op pin 2 van de Arduino. Als de schakelaar gemonteerd is als op de figuur aangegeven, dan verbind je door het indrukken de punten in de linkerkolom met de punten in de rechterkolom van de schakelaar.
# Gebruik het programma Voorbeelden->02. Digital->Button waarmee je de LED op pin 13 laat branden als de schakelaar ingedrukt is.
# Gebruik het programma Voorbeelden->02. Digital->Button waarmee je de LED op pin 13 laat branden als de schakelaar ingedrukt is.
Regel 24: Regel 24:
void loop() {
void loop() {
   buttonState = digitalRead(buttonPin);  // read the button state
   buttonState = digitalRead(buttonPin);  // read the button state
   digitalWrite(ledPin, buttonState);         // copy to LED
   if (buttonState == HIGH) {        // pushbutton is pressed.
    digitalWrite(ledPin, HIGH);      // turn LED on   
  }
  else {
    digitalWrite(ledPin, LOW);       // turn LED off
  }
}
}
</syntaxhighlight>
</syntaxhighlight>


== Opdracht 2 ==
Opmerking: het if-statement hierboven kun je korter schrijven als:
De schakeling van opdracht 1 is nogal primitief: de LED brandt alleen als je de schakelaar ingedrukt houdt. Een volgende stap is om het indrukken van de schakelaar te gebruiken om de LED om te schakelen: van aan naar uit, of omgekeerd. Hiervoor hoeven we alleen de software aan te passen: we kunnen dezelfde hardware-schakeling gebruiken.
<syntaxhighlight lang="Cpp">
  digitalWrite(ledPin, buttonState);
</syntaxhighlight>


'''Opdracht'''. Pas de software van  de "Button"-sketch zo aan, dat het indrukken van de schakelaar de LED omschakelt: van ''uit'' naar ''aan'', of omgekeerd. Hints:
== Opdracht 2: twee knoppen: aan en uit ==
# de software moet niet reageren op de toestand van de schakelaar, maar op de ''verandering'' van de toestand - bijvoorbeeld van "niet ingedrukt" (input is <code>LOW</code>) naar "ingedrukt" (input is <code>HIGH</code>). Om deze overgang in de software vast te stellen, moet je de vorige toestand van de input onthouden in een variabele (bijvoorbeeld: <code>int prevButtonState;</code>). Je kunt dan de actuele toestand en de vorige toestand vergelijken.  Hoe initialiseer je deze extra variabele?
In de vorige opdracht moesten we de knop ingedrukt houden zolang we de LED willen laten branden. Dat is geen praktische oplossing. We gebruiken nu twee knoppen: één om de LED aan te doen, en één om deze weer uit te schakelen. (Later zullen we zien dat dit ook met één drukknopschakelaar kan).
# je moet de toestand van de LED omschakelen. Dit betekent dat je de toestand van de LED in een variabele moet bijhouden (bijvoorbeeld: <code>int ledState;</code>). Als je een overgang in de schakelaar detecteert, moet je deze variabele "omschakelen" van <code>LOW</code> naar <code>HIGH</code>, of omgekeerd. Daarna gebruik je deze variabele om de waarde van de LED-uitvoer aan te passen.
 
Voeg eerst aan de schakeling op het breadboard een tweede drukknop toe, met een pull-down weerstand. Sluit deze aan op pin D3.


<syntaxhighlight lang="Cpp">
<syntaxhighlight lang="Cpp">
const int buttonPin = 2;    // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin
int buttonState = LOW;      // variable for reading the pushbutton status
int prevButtonState = LOW;  // previous pushbutton state
int ledState = LOW;          // variable for keeping the LED state (HIGH=on)


const int onButtonPin = 2;    // pin nr of "on" button
const int offButtonPin = 3;    // pin nr of "off" button
const int ledPin =  13;        // pin nr of LED
int onButtonState = 0;        // variable for reading "on" button
int offButtonState = 0;        // variable for reading "off" button
void setup() {
void setup() {
   pinMode(ledPin, OUTPUT);     // initialize the LED pin as an output:
   pinMode(ledPin, OUTPUT);     // initialize LED pin as output  
   pinMode(buttonPin, INPUT);  // initialize the pushbutton pin as an input:   
   pinMode(onButtonPin, INPUT); // initialize button pin as input
   pinMode(offButtonPin, INPUT); // initialize button pin as input
}
}
void loop() {
  onButtonState = digitalRead(onButtonPin);
  if (onButtonState == HIGH) {
    digitalWrite(ledPin, HIGH);
  }


void loop(){
   offButtonState = digitalRead(offButtonPin);
   buttonState = digitalRead(buttonPin); // read the state of the pushbutton value
   if (offButtonState == HIGH) {
   if ((prevButtonState == LOW) && (buttonState == HIGH)) {
     digitalWrite(ledPin, LOW);
    ledState = HIGH - ledState; // switch ledState
     digitalWrite(ledPin, ledState);
    prevButtonState = HIGH;    // update prev. state
    delay(100);                        // to avoid bouncing
  } else if ((prevButtonState == HIGH) && (buttonState == LOW)) {
    prevButtonState = LOW;
    delay(100);                       // to avoid bouncing
   }
   }
}
}
</syntaxhighlight>
</syntaxhighlight>


Het omschakelen van een binaire waarde <code>state</code>, van LOW (0) naar HIGH(1) of omgekeerd, kan via de toekenning: <code>state = HIGH - state;</code>. Controleer dit voor beide waarden van <code>state</code>
'''Vraag''': wat gebeurt er als je beide knoppen tegelijk indrukt? Dit kun je controleren voor elke <code>digitalRead</code> een <code>delay(200);</code> toe te voegen.
 
=== Opdracht 2b: ontdenderen ("deboucing") ===
Mogelijk heb je met bovenstaand programma last van ''contactdender'' van de schakelaar: de schakelaar verandert dan in een korte periode een aantal malen. Hierdoor is niet te voorspellen wat de uiteindelijke toestand van de LED is, als je een schakelaar indrukt. Je kunt dit (mechanische) probleem voorkomen door een bepaalde periode te wachten (bijvoorbeeld <code> delay(100);</code>) nadat je een overgang van de schakelaar gedetecteerd hebt.
 
== Opdracht 3 ==
 
# Verander de code voor de "debounce" (opdracht 2.3) zodat deze geen gebruik maakt van <code>delay()</code>. Hint: gebruik een timer.
# De schakelaars die wij gebruiken hebben niet zo snel last van dender - maar je kunt een eenvoudige schakelaar maken door twee draden te gebruiken die je met de hand tegen elkaar houdt. Een dergelijke "schakelaar" geeft vrijwel zeker contactdender. ''Hoe kun je zien of je last hebt van contactdender?''
# Maak een "hotelschakelaar" met twee schakelaars die allebei gebruikt kunnen worden om de toestand van de LED om te schakelen. Een dergelijke schakeling kun je bijvoorbeeld gebruiken om het licht bij onderaan en bovenaan een trap aan- en uit te kunnen schakelen.

Huidige versie van 26 aug 2015 om 12:38

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 2. Schakelaars (digitale invoer)

Button en LED aan Arduino
Button en LED aan Arduino

De eenvoudigste vorm van invoer voor een computer is een schakelaar - bijvoorbeeld een druktoets. In deze les behandelen we het aansluiten en gebruik van druktoetsen.

Opdracht 1 - elementaire schakeling met drukknopschakelaar

  1. Begin met een breadboard met daarop een LED (met serieweerstand, 220 Ohm, rood-rood-bruin) aangesloten op pin 13. Plaats op het breadboard een schakelaar (druktoets) met een "pull down weerstand" van 10kOhm (bruin-zwart-oranje), volgens bijgaande figuur. Sluit een draad van het contactpunt van de schakelaar en de "pull down" weerstand aan op pin 2 van de Arduino. Als de schakelaar gemonteerd is als op de figuur aangegeven, dan verbind je door het indrukken de punten in de linkerkolom met de punten in de rechterkolom van de schakelaar.
  2. Gebruik het programma Voorbeelden->02. Digital->Button waarmee je de LED op pin 13 laat branden als de schakelaar ingedrukt is.

De tekst van het Button-programma samengevat (zie http://www.arduino.cc/en/Tutorial/Button)

const int buttonPin = 2;      // the number of the pushbutton pin
const int ledPin =  13;       // the number of the LED pin
 
int buttonState = 0;          // variable for reading button status
 
void setup() {
  pinMode(ledPin, OUTPUT);      // initialize LED pin as output 
  pinMode(buttonPin, INPUT);    // initialize button pin as input 
}
 
void loop() {
  buttonState = digitalRead(buttonPin);   // read the button state
 
  if (buttonState == HIGH) {         // pushbutton is pressed.
    digitalWrite(ledPin, HIGH);      // turn LED on    
  } 
  else {
    digitalWrite(ledPin, LOW);       // turn LED off
  }
}

Opmerking: het if-statement hierboven kun je korter schrijven als:

  digitalWrite(ledPin, buttonState);

Opdracht 2: twee knoppen: aan en uit

In de vorige opdracht moesten we de knop ingedrukt houden zolang we de LED willen laten branden. Dat is geen praktische oplossing. We gebruiken nu twee knoppen: één om de LED aan te doen, en één om deze weer uit te schakelen. (Later zullen we zien dat dit ook met één drukknopschakelaar kan).

Voeg eerst aan de schakeling op het breadboard een tweede drukknop toe, met een pull-down weerstand. Sluit deze aan op pin D3.

const int onButtonPin = 2;     // pin nr of "on" button
const int offButtonPin = 3;    // pin nr of "off" button
const int ledPin =  13;        // pin nr of LED
 
int onButtonState = 0;         // variable for reading "on" button
int offButtonState = 0;        // variable for reading "off" button
 
void setup() {
  pinMode(ledPin, OUTPUT);      // initialize LED pin as output 
  pinMode(onButtonPin, INPUT);  // initialize button pin as input
  pinMode(offButtonPin, INPUT); // initialize button pin as input
}
 
void loop() {
  onButtonState = digitalRead(onButtonPin);
  if (onButtonState == HIGH) {
    digitalWrite(ledPin, HIGH);
  }

  offButtonState = digitalRead(offButtonPin);
  if (offButtonState == HIGH) {
    digitalWrite(ledPin, LOW);
  }

}

Vraag: wat gebeurt er als je beide knoppen tegelijk indrukt? Dit kun je controleren voor elke digitalRead een delay(200); toe te voegen.