VAN START MET DWENGUINO VIA C++

advertisement
VAN START MET
DWENGUINO VIA C++
Francis Wyffels, Dirk De Muynck en Peter Bertels
geïllustreerd door Manon De Ridder
Copyright © 2016 Dwengo vzw
ISBN 978-90-819917-2-8
D/2016/Dwengo/1
NUR 257, 980
We willen graag dat zoveel mogelijk mensen kennis kunnen maken met microcontrollers of leren
programmeren met Dwengo.
Daarom brengen we dit boek uit onder Creative Commons:
De gebruiker mag:
•  het werk kopiëren, verspreiden en doorgeven
•  remixen – afgeleide werken maken
Onder de volgende voorwaarden:
•  Naamsvermelding: de gebruiker dient bij het werk steeds Dwengo vzw te vermelden (maar zonder de
indruk te wekken dat Dwengo vzw instemt met je werk of jouw gebruik van het werk).
[email protected]
http://www.dwengo.org
VOORWOORD
Vandaag de dag zijn elektronische apparaten niet meer weg te
denken uit onze maatschappij. Veel van die apparaten worden
aangestuurd door microcontrollers. In dit boekje verkennen we
stap voor stap de prachtige wereld van de microcontrollers. En we
zetten jou aan het werk, zodat je op het einde van dit boekje je
eigen digitale piano kan programmeren! Als je hierin slaagt, heb je
zelf een ingebed systeem ontwikkeld: een digitaal systeem dat
interageert met zijn omgeving.
Je zal dit doen met behulp van de Dwenguino. Dit eenvoudige,
multifunctionele microcontroller-platform is voorzien van tal van
handigheidjes om je op weg te zetten. Dankzij zijn compatibiliteit
met Arduino IDE kan je bovendien rekenen op weldoordachte tools
om grafisch en tekstueel te programmeren.
Experimenteren met microcontrollers kan zowel thuis als in de
klas. Dit boekje is in de eerste plaats bedoeld voor leerkrachten die
in hun lessen aandacht besteden aan informatica, elektronica of
techniek. Maar jongeren kunnen het ook perfect zelfstandig
ontdekken. Dat maakt hun leerervaring nog intenser.
Veel succes!
OVERAL MICROCONTROLLERS
De voorbije decennia nam het aantal digitale apparaten in huis, in
de tuin en op de werkvloer exponentieel toe. Het begon eenvoudig,
met kleine toestellen als wekkerradio's en elektrische
tandenborstels. Maar ondertussen is zo goed als elk apparaat
intelligent. Misschien heb je thuis wel een stofzuigrobot, en ook
zelfrijdende auto's zijn allang geen sciencefiction meer.
En dat is nog niet alles. Deze apparaten staan steeds vaker in
verbinding met het internet en vormen zo samen het Internet of
Things. Experts voorspellen dat tegen 2020 meer dan 50 miljard
apparaten verbonden zullen zijn met het internet. Ze doelen
daarmee niet alleen op smartphones en tablets, maar bijvoorbeeld
ook op slimme rookmelders, intelligente koelkasten en robots.
De basis van al deze apparaten zijn digitale rekensystemen die
instaan voor de noodzakelijke intelligentie. De microcontroller is
hiervan een mooi voorbeeld. Hij bevat alles wat nodig is om
sensorgegevens te verwerken, berekeningen uit te voeren en de
gepaste acties te ondernemen.
MOGEN WE JE VOORSTELLEN
AAN DE DWENGUINO…
In dit boekje duiken we de wondere wereld van de microcontrollers in, geholpen door de Dwenguino. Dit microcontrollerplatform bevat heel wat extra’s waarmee je snel je eigen apparaat
kan bouwen, zoals handige drukknoppen, analoge ingangen, een
2x16 lcd-scherm, een zoemer, alles om motoren aan te sturen,
enzovoort.
Verder zijn er nog de uitbreidingsconnector en het uitbreidingsbord. Met die eerste kan je contact maken met elke pin. Zo’n pin
verbindt de microcontroller met de buitenwereld en stuurt
apparaten aan (bijvoorbeeld een led). Dankzij het uitbreidingsbord
kan je de Dwenguino dan weer uitbreiden met je eigen circuit of
een van de vele Arduino shields.
De Dwenguino is compatibel met de Arduino en kan dus
geprogrammeerd worden in Arduino IDE, ArduBlock, Google
Blockly en Scratch4Arduino. Dankzij alle handige voorzieningen
op de Dwenguino en het gebruiksgemak van de software, kan jij
eenvoudig leren programmeren. Kortom: de Dwenguino is de
perfecte tool voor starters – hobbyisten, leraren en leerlingen.
1
uitbreidingsconnector
2
led op pin 13
3
contrast aanpassen van lcd-scherm
4
4
USB-connector
5
UART-connector
6
zoemer
7
batterij-connector
8
power led
9
aan- en uitschakelaar
10
motor-connector
11
servo-connector
12
vijf drukknoppen
13
acht leds
14
resetknop
15
lcd-scherm
16
bevestingsgaten
5
3
7
6
8
2
9
1
10
11
15
16
14
13
12
De Dwenguino is volledig open source:
alle schema's, alle ontwerpbestanden
en de softwarebibliotheek staan online.
Zo kan je de Dwenguino-hardware tot in het
kleinste detail bestuderen, jouw eigen
uitbreidingsbord in elkaar steken of zelf
een Dwenguino-variant maken.
DE MICROCONTROLLER ONTLEED
De microcontroller is het kloppende hart van elk digitaal apparaat.
Om te begrijpen wat hem zo speciaal maakt, vergelijk je hem het
best met een klassieke processor, zoals er bijvoorbeeld eentje in
jouw pc zit. Zo’n processor doet beroep op een extern geheugen,
een externe bus of chip, en externe ingangs- en uitgangspinnen (I/
O) om te kunnen interageren met andere componenten. De
microcontroller daarentegen bundelt alles wat hij nodig heeft om
te kunnen functioneren op één chip. Hierdoor kunnen compacte en
zuinige digitale systemen gebouwd worden. Terwijl de klassieke
processor een gespecialiseerde component is met veel meer
rekenkracht dan de microcontroller, is de microcontroller eerder
een manusje-van-alles.
Om de microcontroller te laten functioneren, moet je hem
programmeren. Jouw programma kan bijvoorbeeld vertellen dat
de microcontroller twee motoren moet aansturen wanneer de
knopjes ingedrukt zijn. In dit boekje gebruiken we hiervoor de
tekstuele programmeertaal C++. Maar ook andere talen zijn
mogelijk, zoals de grafische programmeertalen Google Blockly en
Ardublock.
klok
timers
interrupts
I/O
I/O
adres-, data- en controlebus
CPU
watchdog
RAM
ROM
de microcontroller
Wist je dat jouw programma in de praktijk wordt omgezet naar een sequentie van
instructies die de microcontroller begrijpt? Elke instructie wordt voorgesteld door
een getal, waardoor jouw programma eigenlijk neerkomt op een opeenvolging van nullen
en enen. Bij elke tik van zijn interne klok zal de microcontroller deze nullen en enen
overlopen, omzetten naar een gekende instructie en ze uitvoeren.
De microcontroller op de Dwenguino kent in totaal 135 instructies. Sommige daarvan zijn
verantwoordelijk voor berekeningen zoals optellen, aftrekken, vermenigvuldigen en delen.
Andere sturen dan weer de ingangs- en uitgangspinnen van de microcontroller aan, de
timers of de communicatie met andere apparaten.
DIGITALE INPUT & OUTPUT
Een microcontroller heeft een heel aantal ingangs- en
uitgangspinnen (I/O). Hierdoor kan je hem verbinden met externe
componenten zoals leds (Light Emitting Diodes) en knopjes. Het is
dus dankzij deze pinnen dat de microcontroller in staat is om te
interageren met de fysieke wereld. De meeste van deze pinnen zijn
digitaal. Dat wil zeggen dat ze de toestand '0' of '1' kunnen
aannemen. Op het Dwenguino-bord komt een '0' overeen met 0
Volt en een '1' met 5 Volt.
I/O-pinnen krijgen een functie toegekend: in- of uitgang. Als een I/
O-pin geconfigureerd is als digitale uitgang, dan kan hij externe
componenten aansturen. Een voorbeeld van zo'n component is
een led die oplicht wanneer een spanning aangelegd wordt.
I/O-pinnen kunnen ook geconfigureerd worden als digitale ingang.
Dan kunnen ze de toestand van een externe component lezen,
zoals bijvoorbeeld een knopje. Een knop is meestal via een pull-up
weerstand verbonden met de pin. Als de knop niet ingedrukt is, zal
de pin op 5 V staan (de pin wordt als het ware omhoog getrokken
door de weerstand) en dus een '1' lezen. Als je de knop indrukt,
leest de pin een '0'.
afbeelding
platte zijde
symbool
anode (+)
anode (+)
kathode (-)
kathode (-)
schematisch
grond (-)
weerstand (R)
5V-spanning (+)
De stroom die zo'n pin
kan leveren, is beperkt tot
20 mA. Een grotere
hoeveelheid stroom (bijvoorbeeld
door een kortsluiting) kan de
microcontroller beschadigen.
Om de stroom te beperken, wordt
tussen de uitgangspin van de
microcontroller en de anode van
de led een weerstand gezet. Op
het Dwenguino-bord plaatsten we
een weerstand van 470 Ω. De wet
van Ohm (U=R · I) vertelt ons dat
de stroom die de pin moet leveren
gelijk is aan
7 mA (I = (U5 - ULED)/R met
U5 = 5 V, R = 480 Ω, ULED = 1,6 V).
HET LCD-SCHERM
De Dwenguino geeft je niet alleen feedback via leds, maar ook via
een Liquid Crystal Display of lcd-scherm. Hierop verschijnen
letters of cijfers. Op het lcd van de Dwenguino passen maximaal
32 karakters, verspreid over twee lijnen.
Voor het aansturen van het lcd zijn er in totaal 16 pinnen nodig.
Een aantal van die pinnen zijn verbonden met dezelfde microcontroller-pinnen als de leds. Hierdoor zullen de leds flikkeren als
je iets naar het lcd schrijft. Het omgekeerde geldt niet: als je de
leds verandert, heeft dit geen invloed op het lcd. Hoe dit komt? Het
lcd luistert alleen naar de datapinnen (de I/O-pinnen die
informatie van de microcontroller naar het scherm sturen, zoals de
karakters die erop moeten verschijnen) als de controlepinnen
(R/W, E en RS) goed staan (de I/O-pinnen waarmee de
microcontroller aangeeft dat het scherm moet luisteren).
Wist je dat elk karakter dat je naar het scherm schrijft (Latijnse letters, cijfers en
leestekens), wordt voorgesteld door een unieke ASCII-code? Naast de standaard
letters met een ASCII-code kan je ook zelf symbolen toevoegen. Elk karakter op het
scherm bestaat immers uit een rechthoek van 40 pixels die je aan en uit kan zetten.
Hiermee kan je in alle vrijheid bijvoorbeeld gepersonaliseerde smileys maken.
Als je aandachtig naar het schema van de
Dwenguino kijkt, zie je hoe het scherm die
16 pinnen precies gebruikt:
• 
2 als voeding (VSS en VCC),
• 
2 om de achtergrondverlichting aan te
schakelen (LDCK en LCDA),
• 
1 om het contrast te regelen,
• 
8 om karakters te verzenden
(de datapinnen DB0 t.e.m. DB7),
• 
En 3 om te controleren of die karakters toch
wel geldig zijn (R/W, E en RS)
DE ZOEMER
Geluid is eigenlijk een luchtdrukgolf die veroorzaakt wordt door
een trillend object, zoals een instrument of een luidspreker. De
amplitude van deze golf bepaalt de sterkte van het geluid, terwijl
de frequentie van de trillingen de toonhoogte beïnvloedt. Als mens
kan je alleen geluiden horen waarvan het aantal trillingen tussen
de 20 Hz en 20.000 Hz ligt. Een zuivere toon ontstaat wanneer de
luchtverplaatsing verloopt volgens een sinus-signaal (met andere
woorden: wanneer de luchtdruk sinusoïdaal varieert).
Om geluid te maken, moet je een luidspreker kunnen aansturen
met een sinusgolf. Maar microcontrollers hebben geen analoge
uitgangen: de pinnen kunnen alleen de toestand ‘0’ of ‘1’
aannemen. Je omzeilt dit probleem door een sinusgolf na te
bootsen met de digitale uitgangen van de Dwenguino. Dit doe je
met een blokgolf, een signaal dat typisch aan of afstaat en
waarvan je de frequentie kan wijzigen. Hiermee kan je eenvoudige
geluiden genereren. Let op: de amplitude van het geluidssignaal
kan je niet wijzigen: de blokgolf alterneert steeds tussen 0 en 5 V.
De eenvoudige piëzo-elektrische zoemer van de Dwenguino zet de
blokgolf om in hoorbaar geluid.
In de methode die we hiernaast beschreven, pas je enkel de frequentie van de
blokgolf aan. Er zijn echter nog betere methodes om geluid te genereren. Door
continu de breedte van de blokgolf te wijzigen, kan je een geluidssignaal (dat in feite
bestaat uit een samenstelling van verschillende sinussignalen) heel dicht benaderen.
Zeker als je er nog een aantal elektronische filters achter plaatst om ruis weg te
filteren.
PROGRAMMEREN:
DRIE-TWEE-EEN… START!
De Dwenguino is compatibel met de Arduino. Dit betekent dat je
de vele mogelijkheden van je microcontroller-platform kan
programmeren met behulp van Arduino IDE en andere beschikbare
hulpmiddelen zoals Google Blockly en ArduBlock. Standaard
gebruik je de tekstuele programmeertaal C++, waarmee je meteen
aan de slag kan na het installeren van Arduino IDE.
Probeer het zelf! Installeer Arduino IDE en de bijbehorende Dwenguinobibliotheken via http://www.dwengo.org/nl/install
Is de installatie voltooid? Dan kan je beginnen schrijven aan je
eigen programma. Hiervoor vertrek je het best vanuit een bepaald
probleem dat je wil oplossen. Vervolgens bedenk je een algoritme
voor dat probleem: een reeks van stappen die in de juiste volgorde
moeten uitgevoerd worden om vanuit de begintoestand tot het
gewenste eindresultaat te komen.
Het bedenken van een goed algoritme is niet altijd even evident. Twijfel je
hieraan? Kijk dan eens naar het beroemde filmpje ’How to program your
teacher to make a jam sandwich’. Je vindt het door via Google te zoeken
naar ’Sandwich Bot’.
Tijdens het programmeren zet je jouw algoritme om in code. Dit
zijn tekstuele (of grafische) opdrachten die eenduidig beschrijven
wat jouw programma moet doen.
De microcontroller van de Dwenguino kent slechts 135
eenvoudige instructies.
Jouw code is uiteraard
veel complexer. Daarom is
nog een tussenstap
nodig: compileren. Dit
proces dankt zijn naam
aan de compiler die zorgt
voor het omzetten van
jouw code in een
sequentie van instructies
die verstaanbaar zijn voor
de microcontroller. Deze
instructies worden
opgeslagen in een binair
bestand, waarin elke
instructie wordt voorgesteld
door een uniek getal.
In dit boekje ga je aan de slag met de tekstuele programmeertaal C++. Als je je
onzeker voelt over leren programmeren, kan je eventueel ook ons boekje ’Van start
met Dwenguino via Google Blockly’ bekijken. Daarin gebruiken we de grafische
programmeertaal Google Blockly om de Dwenguino te programmeren.
1-2-3 PIANO
Aan de basis van heel wat muziek ligt een pentatoniek, een
toonreeks van vijf tonen. Met een beetje programmeerkennis kan
je je Dwenguino-bord omtoveren tot een heus pentatonisch
instrument. Hiervoor koppel je elk van de vijf drukknoppen (N, E, S,
W en C) aan een bepaalde toon. Voor de tonen kiezen we C, D, E, G
en A (met als toonnamen do, re, mi, sol en la).
Zoals je net las, zijn geluiden hoorbare trillingen in de lucht. Om
muziek te spelen, komt het er dan ook op aan om een instrument
te laten trillen met bepaalde goedgekozen frequenties. De tonen C,
D, E, G en A van onze pentatoniek komen overeen met sinusoïdale
trillingen met een frequentie van respectievelijk 262, 294, 330, 392
en 440 Hz.
Probeer het zelf! Er bestaan heel veel pentatonieken. Zoek er een paar op en
probeer ook de frequenties van de geluidsgolven te weten te komen. Straks,
wanneer jouw instrument af is, kan je ze uitproberen.
toonnaam (BE)
toonnaam (NL)
frequentie (Hz)
drukknop
STAP 1: 1-2-3 PIANO
Je eerste taak is het opzetten van een raamwerk voor alle
toekomstige Dwenguino-projecten. In C++ bestaat zo’n raamwerk
altijd uit drie delen:
(1) het inladen van de nodige bibliotheken,
(2) het setup-blok,
(3) en de oneindige lus (of de loop in het Engels).
Belangrijk om te weten: alles in het setup-blok wordt maar één
keer uitgevoerd, namelijk bij het opstarten of aanzetten van de
Dwenguino. De I/O-pinnen van de Dwenguino moeten juist
geconfigureerd worden om het lcd-scherm, de leds, … correct te
laten werken. Hiervoor roepen we de initDwenguino-functie op.
Daarnaast zetten we nog de boodschap ‘1-2-3 piano’ op het
scherm door de print-functie op te roepen op het
dwenguinoLCD-object. Nu kan je het programma beginnen
uittesten!
Wie tekstueel programmeert moet oog hebben voor detail!
Ieder haakje, hoofdletter en puntkomma telt. Indien je je
vergist dan zal de compiler een foutmelding geven.
#include <LiquidCrystal.h>
#include <Wire.h>
#include <Dwenguino.h>
Inladen van bibliotheken:
hiermee voegen we specifieke
functies toe aan C++ voor de
Dwenguino.
void setup() {
initDwenguino();
dwenguinoLCD.setCursor(0,0);
dwenguinoLCD.print("1-2-3 piano");
}
Het setup-blok:
wordt slechts 1x uitgevoerd,
bij het opstarten van de
Dwenguino.
void loop() {
De oneindige lus:
wordt na het setup-blok
uitgevoerd, alle code in dit
blok zal herhaaldelijk
opgeroepen worden.
}
Probeer het zelf! Begin met het ontcijferen van het programma en probeer
te voorspellen wat het zal doen. Doe de test:
1. 
Sluit de Dwenguino aan
2. 
Open Arduino IDE en typ het programma in de lege sketch
3. 
Selecteer de Dwenguino in het menu Hulpmiddelen > Bord
4. 
Selecteer de poort waarop de Dwenguino is aangesloten in het menu
Hulpmiddelen > Poort
5. 
Klik op het upload-icoontje
in Arduino IDE en kijk wat er gebeurt!
Breid het programma uit. Kan je op de tweede lijn van de lcd ’Daar gaan we!’
schrijven? Experimenteer met de tekst en de andere argumenten van de lcd-functies
(met ’argumenten’ bedoelen we: getallen, letters, zinnetjes… die je kan meegeven aan
een functie en die je dus – in dit geval – op het scherm laat verschijnen).
STAP 2: DE EERSTE TOETS
Tijd voor de eerste echte uitdaging, namelijk: de Dwenguino zo
programmeren dat de toon C (de do-toon met frequentie 262 Hz)
wordt afgespeeld én dat led 0 oplicht wanneer je knop N indrukt.
Om te beginnen moet de Dwenguino kunnen detecteren of knop N
ingedrukt is of niet. Hiervoor heb je een keuzestructuur nodig, de
if-clausule, waaraan je een voorwaarde toekent. Als (if) de
voorwaarde voldaan is, dan wordt de code in de if-clausule
uitgevoerd. De conditie die je in dit geval meegeeft, gaat over de
toestand van de knop N (SW_N), die je kan uitlezen met de functie
digitalRead.
Als je wil dat een toon weerklinkt en led 0 oplicht, dan moet je dit
als een actie meegeven aan je if-clausule. Daarom stel je de leds
in op 0b00000001 en roep je de functie tone op. Deze functie
heeft drie argumenten:
1.  de pin waarop de zoemer is aangesloten (aangeduid met het
Engelse BUZZER),
2.  de toonhoogte (262 Hz),
3.  de tijdsduur (in milliseconden).
Deze if-clausule zet je vervolgens in de loop. In tegenstelling tot
bij de setup zal alle code in de loop steeds opnieuw uitgevoerd
worden. Met andere woorden, je programma zal altijd opnieuw
gaan kijken naar de toestand van knop N en – als hij ingedrukt is
– een toon afspelen en een led laten branden.
#include <Wire.h>
#include <Dwenguino.h>
#include <LiquidCrystal.h>
void setup(){
initDwenguino();
dwenguinoLCD.setCursor(0,0);
dwenguinoLCD.print("1-2-3 piano");
}
void loop(){
if (digitalRead(SW_N) == PRESSED)
{
LEDS=0b00000001;
tone(BUZZER, 262, 100);
}
}
De if-clausule: de code binnen
de haakjes wordt uitgevoerd als
de voorwaarde is voldaan. In dit
geval: de knop SW_N is
ingedrukt.
Probeer het zelf! Ga de volgende uitdagingen aan om de Dwenguino
beter te leren kennen:
1. 
Pas de code aan zodat led 7 brandt in de plaats van led 0.
2. 
Verklaar waarom de led niet uitgaat als je de knop loslaat.
3. 
Zorg ervoor dat de led uitgaat wanneer de knop niet meer ingedrukt is.
STAP 3: EEN PENTATONIEK
Nu heb je natuurlijk nog geen volwaardig pentatonisch instrument
gemaakt. Om dit voor elkaar te krijgen, moet je de tonenreeks C, D,
E, G en A (262, 294, 330, 392 en 440 Hz) koppelen aan de vijf
drukknoppen op de Dwenguino (N, E, S, W en C). Je kan dit
eenvoudigweg doen door vijf if-clausules te implementeren,
waarbij je aan elke drukknop de juiste conditie meegeeft (je kan
kiezen uit SW_N, SW_E, SW_S, SW_W en SW_C) terwijl je ook de
acties aanpast.
Analyseer de voorbeeldcode, programmeer de code op de
Dwenguino en test
ze uit! Herken jij het
volgende deuntje van
Edvard Grieg? Elke
letter staat voor een
knop, de vlaggetjes aan
de noten geven het
tempo aan: hoe meer
lijnen hoe sneller.
#include <Wire.h>
#include <Dwenguino.h>
#include <LiquidCrystal.h>
void setup(){
initDwenguino();
dwenguinoLCD.setCursor(0,0);
dwenguinoLCD.print("1,2,3 piano");
}
void loop(){
if (digitalRead(SW_N) == PRESSED){
LEDS=0b00000001;
tone(BUZZER, 262, 100);
}
if (digitalRead(SW_E) == PRESSED){
LEDS=0b00000010;
tone(BUZZER, 294, 100);
}
if (digitalRead(SW_S) == PRESSED){
LEDS=0b00000100;
tone(BUZZER, 330, 100);
}
if (digitalRead(SW_W) == PRESSED){
LEDS=0b00001000;
tone(BUZZER, 392, 100);
}
if (digitalRead(SW_C) == PRESSED){
LEDS=0b00001111;
tone(BUZZER, 440, 100);
}
}
Meerdere if-clausules: de
toon die afgespeeld wordt,
hangt af van de toets die je
indrukt.
Probeer het zelf!
Verander de
argumenten van de
tone-functie eens. Zoek
bijvoorbeeld de
frequenties op van
andere pentatonische
reeksen en gebruik die
in de code. Een ander
interessant experiment
is de tijdsduur van de
tonen te laten variëren.
VAN PIANO TOT THEREMIN
Een Theremin, genoemd naar zijn uitvinder Léon Theremin, is een
elektronisch instrument dat je kan bespelen zonder het aan te
raken.
Om zelf zo’n Theremin te maken, heb je een sonar-sensor nodig.
Een sonar-sensor meet de afstand tot aan een object. Hoe hij dat
doet? De sensor stuurt een ultrasoon geluidssignaal uit. Als er een
voorwerp binnen bereik is, dan zal deze ultrasone geluidsgolf
hierop weerkaatsen. Door de tijd te meten tussen het verzenden
van het geluidssignaal en het ontvangen van een ‘antwoord’, kan
de sensor de afstand tot het object nauwkeurig bepalen. Met
andere woorden, de sonar-sensor detecteert obstakels zoals
vleermuizen en walvissen dat doen.
Vooraleer je de Theremin programmeert, moet je dus een sonarsensor aansluiten. Dit gaat het makkelijkst via het
uitbreidingsbord, ook wel breadboard, dat in de Dwenguino past.
De afstand Δ (in meter) tussen het obstakel en de sonar-sensor kan je
bepalen met een eenvoudige formule: Δ = 340 · (δt/2), met δt de gemeten
tijd (in seconden) tussen het uitsturen en het ontvangen van het ultrasoon signaal,
waarbij we veronderstellen dat de geluidssnelheid gelijk is aan 340 m/s.
DE SONAR-SENSOR AANSLUITEN
De sonar-sensor kan je het gemakkelijkste aansluiten via het
breadboard. Op dit breadboard vind je gaatjes die in twee
kolommen met elkaar verbonden zijn, zoals aangegeven op de
figuur. Daarnaast vind je er ook de connector van de Dwenguino
terug met onder meer:
• 
aansluitingen voor de referentiespanning of de grond
(aangeduid met GND of -),
• 
3.3 V (3.3) of 5 V-spanning (5 of +),
• 
digitale in- en uitgangen (aangeduid met een nummer),
• 
analoge ingangen (aangeduid met A<x>).
De sonar-sensor heeft vier pinnen:
1.  VCC: de 5 V-voeding, soms ook aangeduid met een +;
2.  Trigger: deze pin geeft aan wanneer de ultrasone sensor moet
beginnen meten;
3.  Echo: deze pin geeft aan wanneer het weerkaatste ultrasone
signaal ontvangen is;
4.  Ground: de referentiespanning of de grond, soms ook
aangeduid met een -.
Connecteer de 5 V- en de GND-pin van de sonar-sensor met
respectievelijk de + en de - op het uitbreidingsbord. Je volgt het
best de conventie om een rode draad te gebruiken voor de 5 V en
een zwarte draad voor de grond.
Vcc
TRIG
ECHO
GND
Tot slot kan je de trigger- en de echo-pin connecteren met eender
welke beschikbare digitale I/O-pin (aangeduid met een nummer).
In dit voorbeeld sluiten we de trigger-pin
aan op pin 11 en de echo-pin op pin 12.
De gaatjes van elke rij zijn
met elkaar verbonden
Om te vermijden dat
er iets stukgaat, is het een
goed idee om de elektronica
los te koppelen van je computer
en/of de batterij wanneer je de
sensoren gaat aansluiten.
Daarnaast controleer je jouw
schakeling best grondig voordat
je de Dwenguino terug aanzet (via
de computer of de batterij). Zijn
alle pinnen wel aangesloten zoals
op het schema? Kijk bovendien
heel goed na of er nergens een
kortsluiting is: de 5 V (de +) mag
nooit rechtstreeks verbonden zijn
met de grond (de -).
MEETWAARDE UITLEZEN EN OPSLAAN
Nu heb je de sonar-sensor aangesloten, maar je kan hem nog niet
uitlezen. Hiervoor moet je eerst nog een nieuwe bibliotheek
toevoegen, NewPing. Vervolgens creëer je een nieuw NewPingobject dat je sonar noemt (je kan eventueel ook een andere naam
kiezen). Als je dit object aanmaakt, geef je mee op welke pinnummers de sonar-sensor is aangesloten en wat het
maximumbereik van de sensor is (meestal 200 cm). In ons
voorbeeld zijn de trigger- en echo-pinnen respectievelijk
aangesloten op de pinnen 11 en 12.
Hierna voer je op dit object een meting uit door de functie
ping_cm op te roepen: sonar.ping_cm. Zo krijg je de afstand tot
het object in centimeter. Om deze meting te gebruiken (om hem te
tonen op het scherm, om er wiskundige bewerkingen mee te
doen, ...) sla je haar op in een variabele van het type integer
(afgekort als int) waarin je gehele getallen kan opslaan.
Tot slot toon je de meting op het scherm. Dit doe je simpelweg
door de variabele afstand naar het scherm te schrijven met de
print-functie.
#include <Wire.h>
#include <Dwenguino.h>
#include <LiquidCrystal.h>
#include <NewPing.h>
#define TRIGGER_PIN 11
#define ECHO_PIN
12
#define MAX_AFSTAND 200
Macro’s: definiëren een aantal
waarden die in het programma
gebruikt kunnen worden (maakt de
code leesbaarder).
NewPing sonar(TRIGGER_PIN,
ECHO_PIN, MAX_AFSTAND);
Het sonar-object: definieert de
functionaliteit van de sonar-sensor
die we aansloten op pinnen 11 en 12.
int afstand = 0;
De variabele afstand: een stukje
geheugen waarin je gehele
getallen (integers) kan opslaan.
void setup(){
initDwenguino();
}
void loop(){
afstand = sonar.ping_cm();
dwenguinoLCD.clear();
dwenguinoLCD.print("Sonar = ");
dwenguinoLCD.print(afstand);
dwenguinoLCD.print(" cm");
delay(100);
}
De afstandsmeting: we meten de
afstand tot een object en slaan het
op in de variabele afstand.
De wachtfunctie: met de functie
delay kunnen we bepalen om de
hoeveel tijd de lus doorlopen
wordt.
Een variabele kan je beschouwen als een plek in het geheugen waaraan je een
naam (in ons voorbeeld de naam afstand) kan toekennen, zodat je dit
geheugen later in jouw programma kan gebruiken. Merk op dat je de variabele moet
declareren voordat je haar kan gebruiken. In onze code declareren we de variabele
afstand tussen het inladen van de bibliotheken en de setup. Hierdoor wordt hij
beschikbaar in zowel het setup- als het loop-blok. Achteraf kan je de variabele
gebruiken door er een nieuwe waarde aan toe te kennen met de toekenningsoperator
’=’. Daarnaast kan je hem bijvoorbeeld in een conditie of functie oproepen. In ons
voorbeeld kennen we de meetwaarden (via de functie sonar.ping_cm) toe aan de
variabele afstand.
Probeer het zelf! De
’Dwenguino Starterskit+’
bevat heel wat extra
sensoren om zelf een Theremin
te maken. In dit boekje gebruik
je de sonar-sensor, maar
waarom ga je ook eens niet aan
de slag met de lichtsensor, de
temperatuur-sensor…? Meer
uitleg over de verschillende
sensoren vind je op
www.dwengo.org/nl/sensors
VAN AFSTAND NAAR GELUID
Als je de sonar-sensor wil gebruiken om de frequentie van het
geluidssignaal te bepalen, dan moet je deze eerst uitlezen en
vervolgens herschalen naar een bereik dat voor de mens hoorbaar
is. De afstand die de sonar-sensor uitleest (tussen 0 en 200 cm),
moet met andere woorden worden omgezet naar een hoorbare
frequentie (tussen 200 en 20.000 Hz).
De sonar zal dus een waarde tussen 0 en 200 teruggeven, terwijl
geluidssignalen tussen 200 Hz en 12000 Hz afspeelbaar zijn op de
buzzer. Je moet er daarom voor zorgen dat een 0 wordt afgebeeld
op 200, en dat 200 wordt afgebeeld op 12.000. Hiervoor
programmeer je de volgende formule: frequentie = a · afstand + b.
Hierin is a = 11800/200 en b = 200.
Merk op dat je nu twee variabelen van het type integer gaat
gebruiken:
1.  De variabele afstand waarin de sonar-meting wordt
opgeslagen.
2.  De variabele frequentie die de afspeelbare frequentie zal
bevatten (na omrekening van de afstand).
Een variabele van het type integer kan, zoals je ondertussen weet,
gebruikt worden om gehele getallen op te slaan. De Dwenguino slaat
integers op in geheugenplaatsen van 16 bit. Hierdoor kunnen integers waarden
aannemen van -32768 (215) tot 32767 (215 - 1): er worden 15 bits gebruikt voor het
getalbereik en 1 bit om aan te duiden of een getal al dan niet negatief is. Wanneer
je enkel positieve getallen gebruikt, kan je het getalbereik vergroten van 0 tot en
met 65535 (216 - 1) door het type unsigned int te gebruiken in plaats van int.
Je hebt het misschien al gehoord: als er geen object voor de sonarsensor staat, klinkt er een lage bromtoon. Dit komt omdat de sonarsensor een 0 teruggeeft als hij geen obstakel ziet. Wijzig het programma
zodat het stil blijft wanneer er geen obstakel gedetecteerd wordt (tip: je zal
hiervoor de if-clausule moeten gebruiken).
Verschillen in lage frequenties zijn voor de mens makkelijker waar te nemen dan
verschillen in hogere frequenties. Vervang in de code de lineaire omzetting door
een kwadratische omzetting: frequentie = a’ · afstand2 + b’. Merk je verschil bij
het testen?
KUNST IN DE KLAS?
Het Theremin-project kan je op verschillende manieren gebruiken
in de klas: als integraal STE(A)M-project (Science, Technology,
Engineering, Art en Mathematics) of als losstaand project om de
beginselen van programmeren en elektronica uit te leggen.
In dit project voor beginners legden we bewust de link met kunst.
Op school kan je deze link versterken door het project te koppelen
aan vakken zoals plastische opvoeding, tekenen, architecturale
vorming of esthetica. De ervaring leert dat veel meer leerlingen
zich dan aangesproken voelen. Bovendien leidt het project tot een
resultaat dat je bijvoorbeeld op een opendeurdag kan
tentoonstellen.
Een mogelijke didactische aanpak bestaat erin om de leerlingen
per 2 à 3 te laten samenwerken en hen elk lesuur een nieuwe
uitdaging voor te schotelen, gekoppeld aan een specifieke
leerdoelstelling. Door deze opdrachten stap voor stap te
doorlopen, komen de leerlingen steeds dichter bij de realisatie. Het
is motiverend en ontroerend om te zien hoe ze hun successen
vieren.
De grootste uitdaging voor de leerkracht? Die ligt misschien wel in
het opzoeken van de grens waarop je de leerlingen net genoeg
informatie geeft om hen toch zo zelfstandig mogelijk tot een
oplossing te laten komen. Te veel informatie geven is verleidelijk,
maar zo hou je de leerlingen niet voldoende gemotiveerd en
intellectueel geprikkeld.
Hoewel je voor dit boekje in principe geen programmeerervaring
nodig hebt, is een zekere basiskennis wel handig (bijvoorbeeld van
een grafische programmeertaal). Mocht C++ een te grote drempel
zijn, kan je bijvoorbeeld de ‘Google Blockly’-versie van dit boekje
uitproberen.
Dit boekje kwam tot stand in samenwerking met de leerlingen van de tweede
graad van het Secundair Kunstinstituut Gent. Een filmpje van het volledige
proces vind je op http://www.dwengo.org/nl/theremin
SPIEKBRIEFJE
// Dit is een eenvoudig programma
// dat de LEDS laat knipperen
Een standaard programma
#include <Wire.h>
#include <LiquidCrystal.h>
#include <Dwenguino.h>
Inladen van bibliotheken:
hiermee voegen we
specifieke functies toe aan
C++ voor de Dwenguino.
void setup(){
initDwenguino();
}
Het setup-blok:
wordt slechts 1x uitgevoerd,
bij het opstarten van de
Dwenguino.
void loop(){
LEDS = 0b01010101;
delay(50);
LEDS = 0b10101010;
delay(50);
}
De oneindige lus:
wordt na het setup-blok
uitgevoerd, alle code in
dit blok zal herhaaldelijk
opgeroepen worden.
delay(t);
Pauzeren van de code:
pauzeer jouw code voor
t milliseconden.
// zo zet je commentaar in jouw code
Commentaar:
door uitleg aan jouw code
toe te voegen wordt de
code leesbaarder.
// wissen van het LCD-scherm:
dwenguinoLCD.clear();
LCD-functies:
wissen en afbeelden van
tekst en variabelen op het
LCD-scherm.
// de cursor verplaatsen:
dwenguinoLCD.setCursor(0,0);
// afbeelden van de tekst “hallo”:
dwenguinoLCD.print(“hallo”);
// de variabele var tonen op het LCD:
dwenguinoLCD.print(var);
tone(BUZZER,440,100);
Geluid maken:
een toon afspelen met
als frequentie 440 Hz
gedurende 100
milliseconden. Uiteraard
kan je de frequentie en
duur naar wens
aanpassen.
if(conditie) {
// code die uitgevoerd wordt als de
// conditie waar is
} else {
// code die uitgevoerd moet worden
// als de conditie onwaar is
}
Keuzes maken:
if…else...
int variabele = 0;
Variabelen gebruiken:
stap 1: declareren van de
variabele. Vergeet niet om
het juiste type mee te
geven, bijv. int voor
gehele getallen.
Door de variabele te
declareren wordt er een
stukje geheugen
gereserveerd.
variabele = variabele + 1;
stap 2: gebruiken van de
variabele. Je kan een
waarde toekennen aan de
variabele met de
toekenningsoperatie ‘=’.
Daarnaast kan je
bijvoorbeeld wiskundige
bewerkingen +-/*
toepassen of de variabele
gebruiken in een conditie
(bijv. d.m.v. de operatoren
< > == !=).
#include
#include
#include
#include
<Wire.h>
<LiquidCrystal.h>
<NewPing.h>
<Dwenguino.h>
De sonar-sensor gebruiken
Inladen van bibliotheken:
de bibliotheek NewPing is
nodig voor de sonarfunctionaliteit.
int afstand1, afstand2;
Aanmaken variabelen:
hierin kan je de meetwaarden
opslaan.
NewPing sonar1(11,12,200);
NewPing sonar2(13,14,200);
Aanmaken sonar-object:
geef de juiste pin-nummers
mee: het 1ste getal geef de
TRIG-pin aan, het 2e getal
de ECHO-in. Je moet ook
een maximaal bereik
meegeven (hier 200 cm).
void setup(){
initDwenguino();
}
void loop(){
afstand1 = sonar1.ping_cm();
afstand1 = sonar1.ping_cm();
}
dwenguinoLCD.clear();
dwenguinoLCD.setCursor(0,0);
dwenguinoLCD.print(afstand1);
dwenguinoLCD.setCursor(0,1);
dwenguinoLCD.print(afstand2);
delay(100);
Sonar-sensor uitlezen:
de metingen sla je best op
in een variabele zoals hier.
Afprinten meetwaarden:
met behulp van deze code
kan je de meetwaarden
onder elkaar afprinten op
het LCD-scherm.
Werken met Dwenguino is leuk omdat het erg praktisch gericht is.
Het opent ook mogelijkheden om technologie in de kunst te
verwerken.
– Britt, 4de middelbaar
Mijn collega ICT verraste mij met zijn vraag om samen te werken
aan een project; nooit gedacht dat de symbiose ICT en Beeldende
Vorming tot zo'n mooie, krachtige ontwerpen zou leiden!
– Grietje Vandaele, leerkracht Beeldende Vorming,
Secundair Kunstinstituut Gent
Je maakt iets praktisch, je leert werken met hardware en je kan
zelf iets nieuws creëren.
– Matthias en Bruno, 4de middelbaar
Bekijk alle boeken van Dwengo op htttp://dwengo.org/nl/books
Download