Bij deze activiteit zullen we de werking van de EV3 banner printer programmeren.
Het printmechanisme gebruikt drie motoren. De motoren doen een pen of stift bewegen of doen het papier door de printer rollen. Elke motor heeft een naam en een functie:
penLeftRight
genaamd.penUpDown
genaamd. transport
genaamd.Je kan een motor starten of stoppen en je kan ook de snelheid instellen waarmee elke motor moet draaien.
Open in het programma BlueJ het project Printer en dubbelklik op oranje rechthoek met de tekst MijnPrinter
.
In het venster dat nu verschijnt, zullen we straks de instructies of opdrachten intypen die de printer moet uitvoeren.
Op de figuur hieronder staan er op de plaats aangeduid door de grote pijl op de figuur al enkele instructies voor de printer. Wat deze instructies betekenen, zullen we dadelijk uitleggen.
We zullen deze reeks instructies nu naar de printer versturen. Zorg dat de EV3-steen volledig opgestart is. Volg daarna de volgende stappen:
Wanneer het printprogramma nog niet ingesteld werd als startprogramma, volg dan volgend stappenplan
Wanneer het printprogramma ingesteld staat als startprogramma of defaultprogramma, volg dan volgend stappenplan
Telkens je een oefening uitvoert, moet de printer gekalibreerd (goed afgesteld) worden. In de figuur hieronder staat aangegeven wat de verschillende knoppen van de EV3 doen. Zorg ervoor dat de pen ongeveer in het midden van het papier staat en controleer of het papier goed rolt. Vergeet niet om de pen na het kalibreren weer helemaal naar beneden op het papier te zetten.
Na het calibreren druk je op de middelste knop drukt. De printer zal nu afdrukken wat jij geprogrammeerd hebt.
De printer voert de instructies uit het voorbeeldprogramma uit: er wordt een verticale lijn getekend.
Nadat de printer alle instructies uitgevoerd heeft, kun je opnieuw kalibreren en begint alles weer van vooraf aan.
Om het programma te stoppen (zodat je nieuwe instructies kan doorgeven), druk je tegelijk op de middelste en onderste knop van de EV3.
Wanneer je het MijnPrinter
venster opnieuw opent in BlueJ,
dan zie je precies vier zogenaamde instructies staan (één per lijn). Een instructie eindigt steeds met een puntkomma. Zo weet de printer wanneer de volgende isntructie begint.
De printer zal deze instructies één voor één uitvoeren.
Elke instructie die je aan de printer zal geven, bestaat steeds uit enkele onderdelen:
Tools
(zie verder).We bekijken nu elke instructie afzonderlijk in detail om zo te achterhalen hoe het komt dat de printer een verticale lijn heeft getekend.
transport.setVelocity(0.1);
transport
zal bewegen in. De parameter
0.1
geeft aan dat de snelheid 0,1 m/s moet bedragen.
Tussen de haakjes kan je eender welke snelheid in meter per seconde
invullen. Let wel op, gebruik voor kommagetallen de punt en niet de komma
(Engelstalige notatie)! Als je de snelheid eenmaal ingesteld hebt,
dan "onthoudt" de motor die snelheid.transport.forward();
Tools.delay(5000);
transport.stop()
uitgevoerd wordt.transport.stop();
Opdracht: Pas de instructies aan zodat de motor één seconde draait aan een snelheid van 1 m/s.
Opdracht: Pas de instructies aan zodat de motor eerst één seconde draait aan een snelheid van 1 m/s en vervolgens twee seconden aan een snelheid van 0,1 m/s.
Opdracht:
penLeftRight.setVelocity(0.5);
penLeftRight.forward();
Tools.delay(1000);
penLeftRight.stop();
penLeftRight.backward();
Tools.delay(1000);
penLeftRight.stop();
Let hierbij goed op welke letters hoofdletters zijn en welke letters kleine
letters zijn, dit is belangrijk. Je ziet dat er nu penLeftRight
in plaats van
transport
voor de punt staat. Dit betekent dus dat we nu de motor
zullen aansturen die de pen van links naar rechts beweegt.Vraag: Bij de instructies hierboven staat er één soort procedure
die we nog niet eerder besproken hebben. Dit is de procedure backward
.
Met backward
draait de penLeftRight
motor achteruit
en met forward
draait de penLeftRight
motor vooruit.
Maar wat komt dan overeen met links en wat met rechts?
Vraag: transport.forward()
hebben we reeds gebruikt.
In welke richting deed forward
het papier bewegen? Leid hieruit
af in welke richting transport.backward()
de rol papier zal doen bewegen.
Opdracht: Print de letter "L", het verticale stukje van deze letter moet ongeveer twee keer zo lang zijn als het horizontale stukje. Na het uitvoeren van jouw printinstructies moet dit op de rol papier staan (van bovenaf gezien):
L
Opdracht: Teken nu de letter "L" maar negentig graden gedraaid in tegenwijzerzin.
Opdracht: Teken een vierkant.
Opdracht: Teken een rechthoek waarbij de verticale zijden ongeveer twee keer zo lang zijn als de horizontale zijden.
Als de pen op het blad papier staat, kan je deze "opheffen" van het blad
papier door de penUpDown
motor te gebruiken, dit doe je met deze instructie:
penUpDown.rotateTo(200);
Als de pen niet op het blad papier staat, kan je deze weer "neerzetten" met volgende instructie:
penUpDown.rotateTo(-200);
Hier zijn de getallen 200 en -200 precies goed gekozen om de pen op te heffen en weer neer te zetten. Het kan zijn dat je iets andere getallen moet kiezen of dat je de positie van de pen wat moet aanpassen zodat een volledig opgetilde pen het blad niet raakt, en een volledig neergelaten pen het blad wel raakt.
Opdracht: teken een verticale stippenlijn zoals in de figuur hieronder:
| |
Wat als je nu een aanzienlijk langere stippenlijn wil tekenen?
Bijvoorbeeld een stippenlijn met drie streepjes?
Dit zou er dan zo kunnen uitzien:
penUpDown.rotateTo(200);
transport.forward();
Tools.delay(1000);
transport.stop();
penUpDown.rotateTo(-200);
transport.forward();
Tools.delay(1000);
transport.stop();
penUpDown.rotateTo(200);
transport.forward();
Tools.delay(1000);
transport.stop();
penUpDown.rotateTo(-200);
transport.forward();
Tools.delay(1000);
transport.stop();
penUpDown.rotateTo(200);
transport.forward();
Tools.delay(1000);
transport.stop();
penUpDown.rotateTo(-200);
transport.forward();
Tools.delay(1000);
transport.stop();
Dat is natuurlijk heel veel typwerk!
En wat dan met een stippenlijn met tien, twintig, honderd streepjes?
Op die manier is een fout natuurlijk snel gemaakt, zelfs als je niet alles
zelf intypt maar kopiëren en plakken gebruikt.
Gelukkig kan dit veel beter opgelost worden.
Opdracht: Typ onderstaande instructies over in BlueJ en verstuur ze naar de printer.
transport.setVelocity(0.1);
for (int i = 1; i <= 3; i++) {
penUpDown.rotateTo(200);
transport.forward();
Tools.delay(1000);
transport.stop();
penUpDown.rotateTo(-200);
transport.forward();
Tools.delay(1000);
transport.stop();
}
Vraag: Wat is het resultaat op het papier?
De instructie for (int i = 1; i <= 3; i++)
betekent:
herhaal alles wat tussen de accolades staat drie keer. Op de plaats van het
getal 3 kan je eender welk ander getal groter dan of gelijk aan 1 invullen.
In programmeren heet zo'n instructie een lus, met een lus kunnen andere
instructies herhaald worden.
Opdracht: teken een stippenlijn met 5 streepjes, maak gebruik van een lus.
Opdracht: teken een stippenlijn met 3 streepjes die nu start met een streep in plaats van "lege ruimte".
transport.setVelocity(0.1);
penLeftRight.setVelocity(0.1);
transport.forward();
penLeftRight.forward();
Tools.delay(1000);
penLeftRight.stop();
transport.stop();
Opdracht: Analyseer de bovenstaande reeks instructies. Wat denk je dat er op het papier zal verschijnen als je deze instructies naar de printer verstuurt? Verstuur dan de instructies naar de printer. Was je veronderstelling juist?
Opdracht: teken een schuine lijn die "schuiner" is dan die uit het voorbeeld, en teken een lijn die "minder schuin" is dan in het voorbeeld.
Teken achtereenvolgens deze letters: