Inleiding: werking van de printer

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:

  1. Een motor die de pen van links naar rechts doet bewegen, penLeftRight genaamd.
  2. Een motor die de pen op en neer doet bewegen, penUpDown genaamd.
    (Deze motor kan je gebruiken om de pen als het ware van het blad op te heffen.)
  3. Een motor die het papier in de ene of de andere richting rolt, transport genaamd.

Je kan een motor starten of stoppen en je kan ook de snelheid instellen waarmee elke motor moet draaien.

Instructies aan de printer doorgeven

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.

Screenshot van BlueJ met een pijl die aanduidt waar de code moet ingetikt worden.

We zullen deze reeks instructies nu naar de printer versturen. Zorg dat de EV3-steen volledig opgestart is. Volg daarna de volgende stappen:

  1. Compileer het project.

    Compileren

  2. Transfereer het project naar de Lego Mindstorm-steen.Kies in het lint bij Tools voor de optie Transfer to EV3

    Transfereren

Wanneer het printprogramma nog niet ingesteld werd als startprogramma, volg dan volgend stappenplan

  1. Stappenplan uit voorpagina.html overnemen

Wanneer het printprogramma ingesteld staat als startprogramma of defaultprogramma, volg dan volgend stappenplan

  1. ToDo
  2. ToDo

De printer calibreren

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.

Afbeelding van de EV3 met uitleg wat de verschillende knoppen doen bij het kalibreren.

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.

Een instructie ontleed

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.

Screenshot van BlueJ met een pijl die aanduidt waar de code moet ingetikt worden.

De printer zal deze instructies één voor één uitvoeren.

Elke instructie die je aan de printer zal geven, bestaat steeds uit enkele onderdelen:

  1. De naam van de moter die bediend moet worden. Let op: bij instructie 3 is dit het speciale Tools (zie verder).
  2. Met een punt zeggen we dat we voor de gekozen motor een commando oproepen die de motor dan kan uitvoeren
  3. Na het punt staat de naam van het commando. Een commando is een soort voorgeprogrammeerde opdracht voor de printer. Informatici noemen het soort commando die we hier gebruiken ook wel een procedure.
  4. Haakjes
  5. Bij de procuedure in de eerste en derde regel staat er tussen de haakjes nog een getal. Dergelijke getallen noemen we een parameter van de procedure. Parameters dienen om aan de procedure extra informatie door te geven.

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);
Deze instructie stelt de snelheid ("velocity" in het Engels) waarmee de motor 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();
Deze instructie start de motor transport met een voorwaartse draairichting.
Tools.delay(5000);
Met deze instructie geven we aan de printer de opdracht om 5000 milliseconden te wachten vooraleer verder te gaan met het uitvoeren van de volgende instructie. Dit betekent dus dat de motor vijf seconden aan een snelheid van 0,1 m/s gedraaid zal hebben vooraleer de instructie transport.stop() uitgevoerd wordt.
transport.stop();
Deze instructie doet de motor transport stoppen met draaien.

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.

Oefeningen

Oefening 1: De bewegingsrichting

Opdracht:

  1. Verwijder alle instructies van de vorige opdrachten en typ nu de onderstaande instructiereeks over:
    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.
  2. Stuur die instructies vervolgens door naar de printer (volg hiervoor opnieuw de stappen onder het titeltje "Instructies aan de printer doorgeven").
  3. Bekijk goed wat er gebeurt.

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.

Oefening 2: De letter "L"

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.

Oefening 3: vierkanten en rechthoeken

Opdracht: Teken een vierkant.

Opdracht: Teken een rechthoek waarbij de verticale zijden ongeveer twee keer zo lang zijn als de horizontale zijden.

Oefening 4: de stippenlijn

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:

|

|

Oefening 5: de lange stippenlijn

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".

Oefening 6: gelijktijdige bewegingen

        
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.

Oefening 7: het alfabet

Teken achtereenvolgens deze letters:

  1. Z
  2. X
  3. A
  4. G

Uitbreidingsoefeningen