Arduino Zomerproject 2020

Op maandag 27 juli verzorg ik een zomerworkshop in Vught en op woensdag 29 en donderdag 30 juli ben ik bij de Bossche Talentschool.

De Arduino is een computerbordje (microcontroller) dat je zelf kan programmeren. Op de pinnen van de Arduino kan je van alles aansluiten.

In dit zomerproject sluiten we een ledstrip en een schakelaar aan. Daarna gaan we die programmeren.

Solderen

Je krijgt deze onderdelen:

Arduino Nano Ledstrip Schakelaar USB-kabel

Aan de ledstrip en de schakelaar zitten al gekleurde draden die op de Arduino Nano moeten worden gesoldeerd.

Oefenen

Chris laat je eerst oefenen op een oefenprintje met wat losse onderdelen.

Ledstrip en schakelaar aan Arduino solderen

Hieronder zie je hoe de schakelaar en de ledstrip op de Arduino Nano worden gesoldeerd.

Schakelaar solderen
  • De zwarte draad komt op pin GND
  • De groene draad komt op pin D3.
Ledstrip solderen
  • De zwarte draad gaat naar de andere GND-pin
  • De rode draad naar 5V
  • De gele draad naar pin D5

Programmeren in twee stappen

Op de laptops die we in dit zomerproject gebruiken zijn het Arduinoprogramma (IDE), de Adafruit Neopixel bibliotheek en de CH340 driver al geïnstalleerd. Als je op een eigen laptop werkt dan staat hier hoe je deze programma’s zelf kunt installeren en instellen.
  • Stap 1: Het programma (schets/sketch) voor jouw Arduino Nano schrijven we eerst in een programma dat Arduino IDE wordt genoemd.
  • Stap 2: Als je de schets hebt geschreven dan wordt deze via de USB-kabel naar de Arduino Nano geüpload.

We gaan dit nu oefenen met een schets die led L op de Arduino Nano laat knipperen. Deze led is intern verbonden met pin D13 en wordt vaak gebruikt om te testen of de Nano het doet.

Stap 1: Schets schrijven/kopiëren

  1. Start Arduino IDE op jouw laptop
  2. Kopieer de schets hieronder en plak dit in de Arduino IDE.
void setup() {
  pinMode(13, OUTPUT);      // Pin 13 wordt als Output gebruikt
}

void loop() {
  digitalWrite(13, HIGH);   // Zet de led op de Nano AAN
  delay(1000);              // Wacht 1 seconde (= 1000 milliseconde)
  digitalWrite(13, LOW);    // Zet de led op de Nano UIT
  delay(1000);              // Wacht 1 seconde (= 1000 milliseconde)
}

ZP00_knipper

Het ziet er nu zo uit:

Stap 2: Schets uploaden naar Arduino Nano

Voordat we de schets kunnen uploaden moeten we uitzoeken wat het nummer is van de USB-poort waarop de Nano is aangesloten.

Check poortnummer
  1. Zorg ervoor dat de Nano NIET op de laptop is aangesloten.
  2. Ga in het menu naar Hulpmiddelen – Poort en kijk welke poortnummers er worden herkend. In dit voorbeeld zijn dat COM20 en COM21.
  3. Sluit de Nano nu aan op een USB-poort en kijk nogmaals in het menu Hulpmiddelen – Poort. Er is nu één poortnummer bijgekomen. In dit voorbeeld is dit COM6.

    Selecteer deze poort.
Schets uploaden

Klik op de knop met het pijltje. Jouw schets wordt nu eerst omgezet in code die de Nano begrijpt (dit heet compileren) en daarna geüpload naar de Arduino Nano.

Als de schets is geüpload zie je dat led L op de Nano langzaam knippert.

Uitdaging: Lukt het jou om de schets zo aan te passen dat de led sneller knippert?

Als je zelf een schets schrijft let dan op …

  • hoofdletters en kleine letters die in de opdrachten worden gebruikt. Als je kleine letter gebruikt in plaats van een hoofdletter dan krijg je een foutmelding;
  • dat je overzicht houdt. Hier staan een paar handige tips;
  • je in het menu Help – Naslagwerk een overzicht hebt van alle opdrachten in de Arduino programmeertaal:

Als het niet werkt …

  • controleer dan of je geen fout hebt gemaakt met hoofdletters en kleine letters
  • controleer dan of alle regels met een opdracht zijn afgesloten met een puntkomma;
  • druk dan op de toetsen [Ctrl][T]. De code wordt dan opnieuw geformateerd waardoor het makkelijker is om te zien of je ergens een haakje of accolade teveel of te weinig hebt.

Project 1: Aansturen ledstrip

Je hebt net je eerste schets gemaakt en op de Nano gezet. Hierna gaan we verder met een schets voor het aansturen van de ledstrip. Als je echter eerst wat meer wilt weten over de opbouw van een schets klik dan hier.

Hieronder staat een schets waarmee je iedere led om de beurt groen maakt. Je kan deze schets zo kopiëren naar de Arduino IDE en daarna uploaden naar de Uno.

#include 
// Hieronder is aangegeven dat:
// - De ledstrip uit 8 leds (pixels) bestaat
// - De strip is aangesloten op pin 5
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(8, 5, NEO_GRB + NEO_KHZ800);

void setup() {
  pixels.begin();            // We beginnen met de pixels (leds) in de strip
  pixels.setBrightness(100); // Helderheid stellen we in op 100
}

void loop() {
  loopGroen(); // start functie loopGroen
}

void loopGroen() {
  // deze functie werkt met een tellertje (i) dat telkens telt van 0 tot 7
  for (int i = 0; i < 8; i++) {
    // Hieronder wordt voor de led met het nummer i de kleur groen klaargezet
    pixels.setPixelColor(i, pixels.Color(0, 255 , 0)); // Rood: 255, Groen: 255 en Blauw: 0
    pixels.show();                                    // Laat de leds zien
    delay(100);                                       // Wacht 100 milliseconde
    pixels.setPixelColor(i, pixels.Color(0, 0, 0));   // Rood: 0, Groen:0 en Blauw:0
    pixels.show();                                    // Laat de leds zien
  }
}

ZP01_loop_groen

  • #include <Adafruit_NeoPixel.h>
    Om de ledstrip aan te sturen heb je een bibliotheek nodig met het stuurprogramma. Deze bibliotheek wordt met deze regel aan de schets toegevoegd.
  • Adafruit_NeoPixel pixels = Adafruit_NeoPixel(8, 5, NEO_GRB + NEO_KHZ800);
    Hiermee stel je de ledstrip in. belangrijk zijn de parameters 8 en 5. De 8 betekent dat de strip 8 leds heeft en de 5 geeft aan dat de strip is aangesloten op pin 5.
  • void loopGroen()
    Dit is een functie die je zelf hebt geschreven. Deze functie wordt aangeroepen vanuit de loop().

Project 2: Werken met de schakelaar

Je weet nu hoe je de leds van de ledstrip kunt laten branden. In deze schets worden de leds gestart als je op de knop drukt.

#include 
// Hieronder is aangegeven dat:
// - De ledstrip uit 8 leds (pixels) bestaat
// - De strip is aangesloten op pin 5
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(8, 5, NEO_GRB + NEO_KHZ800);

void setup() {
  pixels.begin();            // We beginnen met de pixels (leds) in de strip
  pixels.setBrightness(100); // Helderheid stellen we in op 100
  pinMode(3, INPUT_PULLUP);  // Stel pin 3 in als INPUT
}

void loop() {
  // Deze lus controleert de hele tijd of de schakelaar op pin 3 is ingedrukt
  if (digitalRead(3) == LOW) {
    loopGroen(); // start functie loopGroen
  }
}

void loopGroen() {
  // deze functie werkt met een tellertje (i) dat telkens telt van 0 tot 7
  for (int i = 0; i < 8; i++) {
    // Hieronder wordt voor de led met het nummer i de kleur groen klaargezet
    pixels.setPixelColor(i, pixels.Color(0, 255, 0)); // Rood: 0, Groen: 255 en Blauw: 0
    pixels.show();                                    // Laat de leds zien
    delay(100);                                       // Wacht 100 milliseconde
    pixels.setPixelColor(i, pixels.Color(0, 0, 0));   // Rood: 0, Groen:0 en Blauw:0
    pixels.show();                                    // Laat de leds zien
  }
}

ZP02_loop_groen_met_schakelaar

Project 3: Dobbelsteen

#include 
// Hieronder is aangegeven dat:
// - De ledstrip uit 8 leds (pixels) bestaat
// - De strip is aangesloten op pin 5
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(8, 5, NEO_GRB + NEO_KHZ800);

void setup() {
  pixels.begin();            // We beginnen met de pixels (leds) in de strip
  pixels.setBrightness(100); // Helderheid stellen we in op 100
  pinMode(3, INPUT_PULLUP);  // Stel pin 3 in als INPUT
}

void loop() {
  // Deze lus controleert de hele tijd of de schakelaar op pin 3 is ingedrukt
  if (digitalRead(3) == LOW) {
    pixels.clear(); // Zet alle leds uit
    // Hieronder wordt met "random(8)" een willekeurig nummer tussen 0 en 8 gekozen.
    // Dit is dan het nummer van de led die gaat branden.
    // Het getal 8 kan niet worden gekozen
    pixels.setPixelColor(random(8), pixels.Color(0, 0, 255)); // Rood: Uit Groen: Uit Blauw: Aan
    pixels.show();                                    // Laat de leds zien
    delay(100);                                       // Wacht 100 milliseconde
  }
}

ZP03_dobbelsteen

Project 4: Teller

#include 
// Hieronder is aangegeven dat:
// - De ledstrip uit 8 leds (pixels) bestaat
// - De strip is aangesloten op pin 5
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(8, 5, NEO_GRB + NEO_KHZ800);
int teller = 0; // Dit is een variable (stukje geheugen met de naam "teller")

void setup() {
  pixels.begin();            // We beginnen met de pixels (leds) in de strip
  pixels.setBrightness(100); // Helderheid stellen we in op 100
  pinMode(3, INPUT_PULLUP);  // Stel pin 3 in als INPUT
}

void loop() {
  // Deze lus controleert de hele tijd of de schakelaar op pin 3 is ingedrukt
  if (digitalRead(3) == LOW) {
    // Hieronder krijgt de led met het nummer dat is opgeslagen in de variabele "teller" een kleur.
    // Als de loop() begint heeft teller de waarde 0.
    pixels.setPixelColor(teller, pixels.Color(255, 0, 255)); // Rood: Aan Groen: Uit Blauw: Aan
    pixels.show();           // Laat de leds zien
    teller = teller + 1;     // Verhoog de waarde van teller met 1
    delay(500);              // Wacht 500 milliseconde
    if (teller == 9) {       // Alle leds zijn nu aan (let op dat er twee =-tekens staan)
      teller = 0;            // Zet de variabele teller weer op 0
      pixels.clear();        // Zet alle pixels uit ...
      pixels.show();         // ... en laat dit ook zien
    }
  }
}

ZP04_teller

Over een schets/sketch

Een programma voor een Arduino noemen we een schets (scetch op zijn Engels). We pakken de eerste schets er weer even bij om een paar algemene dingen uit te leggen.

void setup() {
  pinMode(13, OUTPUT);      // Pin 13 wordt als Output gebruikt
}

void loop() {
  digitalWrite(13, HIGH);   // Zet de led op de Nano AAN
  delay(1000);              // Wacht 1 seconde (= 1000 milliseconde)
  digitalWrite(13, LOW);    // Zet de led op de Nano UIT
  delay(1000);              // Wacht 1 seconde (= 1000 milliseconde)
}

ZP00_knipper

setup() en loop()

De schets bestaat uit twee functies:

  1. void setup()
    Dit deel van de schets wordt maar één keer uitgevoerd bij de start. Hier worden de algemen instellingen gedaan. In dit voorbeeld leggen we vast dat pin13 wordt gebruikt voor output. De led L op de Nano is intern doorverbonden met deze pin.
  2. void loop()
    Dit deel van de schets wordt de hele tijd uitgevoerd (loop = lus)
Puntkomma’s (semicolons)

Een opdracht in de schets moet worden afgesloten met een puntkomma. Als je dit niet doet dan krijg je bij het compileren een foutmelding:

Hierboven staat er achter de opdracht op regel 7 geen puntkomma. Bij het compileren wordt regel 8 gemarkeerd en staat er onderin de melding expected ‘;’ before ‘digitalWrite’ (verwacht puntkomma vóór digitalWrite).

Haakjes (…) (brackets)

Gebogen haakjes (brackets) staan om de parameters van een opdracht of een functie. Met parameters geef je aan wat een opdracht of functie precies moet doen.

Dit zijn de opdrachten die we tot nu toe zijn tegengekomen.

Opdracht Toelichting
pinMode(13, OUTPUT); Met de opdracht pinMode(pin, mode) geef je aan of een poort van de Arduino gebruikt wordt als OUTPUT of als INPUT. De opdracht heeft twee parameters:

pin Het nummer van de pin waar het over gaat.
mode Of de pin als OUTPUT of als INPUT wordt gebruikt.
digitalWrite(13, HIGH); Met digitalWrite(pin, value) geef je opdracht om een pin AAN (HIGH) of UIT (LOW) te zetten.

pin Het nummer van de pin die we willen besturen.
value HIGH of LOW
delay(1000); De opdracht delay(ms) heeft maar één parameter. Hiermee wordt aangegeven hoe lang gewacht moet worden.

ms Wachttijd in milliseconde
Accolades {…} (Curly brackets)

In onze eerste schets zitten er vier opdrachten (regels) in de functie loop(). Deze worden bij elkaar gehouden door twee accolades ({…})

Overzicht houden

Zeker als je voor het eerst een schets schrijft kan je het overzicht wel eens verliezen. Hieronder drie tips op het overzicht te houden:

Haakjes en accolades

Als je in de Arduino IDE met de cursor bij een haakje of accolade komt dan komt er automatisch een rechthoekje om het bijbehorende andere haakje of accolade:

Automatische opmaak

Hierboven zie je dat regel 2 inspringt ten opzicht van de regels 1 en 3. Op deze manier ziet de programmeur makkelijker welke opdrachten er tussen de accolades horen.

Als je nu zelf regels toevoegt of verwijdert dan kan je de code weer netjes formatteren via het menu Hulpmiddelen – Automatische opmaak.

Voeg commentaar toe aan je schets

Het is een goede gewoonte om je schets van commentaar te voorzien. Als dan later iemand anders in de schets gaat werken dan ziet deze wat de bedoeling van een regel is. In de regel hieronder is alles wat na de twee schuine strepen staat commentaar. Het programma doet hier verder niets mee:

digitalWrite(13, HIGH);   // Zet de led op de Nano AAN

Wat heb je nodig om de Arduino thuis te programmeren?

Instellingen Arduino IDE

Als eerste moet je ervoor zorgen dat deze instellingen hebt in het menu Hulpmiddelen (Tools):

  • Board: “Arduino Nano”
  • Processor: “Processor: “ATmega328P (Old Bootloader)”
Nederlands Engels
Aanpassen taal

Via het menu Bestand – Voorkeuren (File – Preferences) kan je de taal van het Arduino programma aanpassen.

Je programmeert de Arduino met de programmeertaal C++, dit gaat altijd in het Engels.

Bibliotheek Adafruit Neopixel toevoegen

Om met de ledstrip te werken is speciale programmeercode nodig. Deze staat in een bibliotheek (library) die je moet toevoegen aan de Arduino IDE. Dit gaat zo:

  1. Ga in het menu naar Hulpmiddelen – Bibliotheken beheren … (Tools – Manage Libraries …)
  2. Zoek hier naar Adafruit Neopixel en klik op de knop Installeren.
  3. Klik op de knop Sluiten.

Over de CH340 driver

Er bestaan veel verschillende soorten Arduinos. In deze workshop werken we met een populaire goedkope variant van de Arduino Nano. Het programma met de CH340 driver zorgt er voor dat jouw Nano door het Arduino-programma wordt herkend.

Download projectbestanden