Landje robot cover

Leren programmeren

Over programmeren kun je heel veel lezen. Maar je leert het vooral door hetzelf te doen, fouten te maken en deze zelf op te lossen. Het zelf zoeken naar en oplossen van fouten heet debuggen.

Waarom heet het zoeken naar en oplossen van fouten debuggen ? Het woord “bug” betekent in het Engels, kever of insect. Lang geleden bestonden computers uit elektrische schakelaars. Tussen deze schakelaars kon wel eens een kever of vlieg vast komen te zitten waardoor de schakelaar vast kon komen te zitten. Door de vastzittende schakelaar werkte de computer niet meer goed. Om de computer weer goed te laten werken moest de ‘bug’, de kever of vlieg, gevonden en verwijderd worden om hem weer goed te laten werken. De lettergreep "de" in debuggen betekent ongedaan maken of verwijderen. Debuggen betekent dus letterlijk verwijderen van een insect en komt dus van het eerste programmafout dat ooit gevonden is.

By Courtesy of the Naval Surface Warfare Center, Dahlgren, VA., 1988. [Public domain] via Wikimedia Commons

Een voorbeeld van een computer verslag van de Mark II computer. Hier staat de eerste bug die men gevonden heeft geplakt in het computer verslag in 1947

Landje Robot

Je gaat dus vooral zelf veel proberen, puzzelen en leren van je eigen fouten! Dit ga je doen met een robot, Landje Robot. Landje Robot kan als je het het goed programmeert;

Programmeertaal

Om te programmeren gebruik je een taal. Een taal die jouw computer begrijpt zodat je kan uitleggen wat het moet doen. Zo zijn er heel veel talen, sommige talen zijn heel erg geschikt om spelletjes mee te schrijven, andere talen zijn weer betere beschikt om complexe berekeningen te maken. Als je begint met programmeren is er een grote kans dat je dit in Scratch doet. Met Scratch kun je met het in elkaar schuiven van blokken een programma'tje maken.

Scratch Hello World
Een simpel voorbeeld van een programma in Scratch.

Bijna geen enkele programmeertaal werkt zoals Scratch. Bij de meeste programmeertalen moet je een opdracht schrijven om de computer te laten weten wat je moet doen. Schrijven van een programma is moeilijker dan zoals bij Scratch. Dit komt omdat een computer heel precies en erg dom is (echt!). Een computer begrijpt je alleen als je heel erg precies vertelt wat je van hem wilt.

// Dit wordt door de computer begrepen
Serial.println("Hallo") ;

// Dit begrijpt de computer niet
Serial.Println("Hallo") ;

Zie jij het verschil tussen de twee opdrachten ?

Het programmeren van Landje Robot zal je in de programmeertaal C (see) gaan doen. Zoals je in het vorige voorbeeld al kon zien worden hier Engelse woorden gebruikt.

Les 1, Je eerste programma

Arduino Create

In deze les ga je het eerste programma schrijven. Programma’s kun je op veel manier schrijven, maar meestal doe je dit met een programma dat je help bij programmeren. Zo'n programma heet een geintegreerde ontwikkel omgeving of Integrated Development Environment. Een hele mond vol, daarom heeft iedereen het over een IDE. De IDE die jij gaat gebruiken staat ‘ in de cloud ’. Deze term zal je wel vaker gehoord hebben. Het betekent niets anders dan dat je het programma overal ter wereld kunt gebruiken als je maar een internet verbinding en een computer hebt.

Jij zult gebruik gaan maken van de IDE Arduino Create.

Arduino Create

Om de IDE te starten klik je op de knop Arduino Web Editor. In de IDE kun je links op diverse tabjes klikken. Klik op Sketchbook. Een programma in deze IDE noemt men een sketch, dit is Engels voor schets (tekening). Sketchbook is Engels voor schetsboek. Rechts naast het Sketchbook zie je schetsen die je in het boek hebt bewaard.

Arduino Create

Maak nu een nieuwe sketch door op NEW SKETCH te klikken. Een nieuwe sketch krijgt automatisch een naam bijvoorbeeld ‘sketch_jan11b’. Dit is vaak niet handig, het zou duidelijker zijn als de sketch mijn eerste sketch heet.

Doe
Probeer zelf uit te zoeken hoe je de naam van de sketch kan veranderen naar mijn_eerste_sketch.

Als je een nieuw programma maakt ziet dat er alsvolgt uit.

/*

*/

void setup() {

}

void loop() {

}

Commentaar

In het begin van het programma staat een /* en een */. Als de computer een programma uitvoert dan zal er niets gedaan worden met wat er tussen /* en */ staat, de computer negeert het. Dit kun je gebruiken om te beschrijven wat je in het programma doet. Je kunt op deze manier dus commentaar of een opmerking in het programma plaatsen. Je kunt het ook gebruiken om even een stukje van een programma 'uit' te zetten. Bijvoorbeeld;

/*
Hier leg ik uit wat het programma gaat doen.
Het programma gaat een tekst laten zien.
*/

Serial.println("Ik laat deze tekst zien") ;

/*
Serial.println("Deze instructie wordt genegeerd");
*/

Als je maar één regel commentaar wilt toevoegen of één instructie even wilt negeren mag je de regel ook beginnen met //. Je gebruikt /* en */ dus vaak als je meerdere regels wilt negeren en // voor één regel.

/*
 Alles tussen /* en */ wordt genegeerd.
*/

// Maar deze regel ook

Functies

setup() en loop() zijn functies. Een functie is een groep van instructies die bij elkaar horen. De instructies die bij elkaar horen staan tussen { en } na de naam van de instructie. Door nu in een programma in plaats van een instructie te geven de functie aan te roepen, kun je in één keer meerdere instructies uitvoeren. De functie setup() wordt automatisch één keer aangeroepen als je het programma start. Loop() is een functie die elke keer opnieuw wordt uitgevoerd als deze klaar is.

Jouw eerste programma

Type nu in de functie setup() de volgende instructies.

Serial.begin(9600);
delay(5000);
Serial.println("Hoi");

Je hebt nu je eerste programma geschreven! Maar hoe laat je dit programma draaien? Om een programma te kunnen gebruiken heb je een computer nodig. Omdat je niet een hele laptop op een robot kan zetten gaan we een hele kleine computer gebruiken. Deze computer heet een Arduino Nano. Nano betekent heel klein en komt van het Latijnse woord Nanos wat 'dwerg' betekent. Zoals elke computer heeft de Nano een processor of CPU, dit zijn de hersenen van de computer waarmee hij jouw programma gaat uitvoeren. Ook zit er een kleine reset-knop op, hiermee kun je de Nano opnieuw opstarten als dat nodig is. Omdat de Nano zo klein is kun je er geen toetsenbord of beeldscherm op aansluiten. Je gebruikt jouw computer als beeldscherm en om programma's naar de Nano te versturen.

Arduino Create
Doe
Verbind de Nano met een USB kabel met je Chromebook. Als het goed is kun je in de witte balk de Arduino Nano selecteren. Als je deze geselecteerd hebt wordt jouw Chromebook verbonden met de Nano.

Nu is het tijd om je programma te starten. Open weer je Arduino Create pagina en klik nu eerst links op Monitor. Rechts van de editor verschijnt een venster. In dit venster kunnen we tekst tonen die de Nano naar de Chromebook verstuurd. Je kunt dit dus vergelijken met een beeldscherm van je Chromebook. Start nu je eerste programma op de Nano. Doe dit door het programma te 'uploaden', het versturen van het programma, naar de Nano. Uploaden doe je door op de pijl te klikken die boven het programma getoond wordt. Wacht een paar seconden en als je alles goed gedaan hebt verschijnt er een tekst in de Monitor van de Nano.

Doe
Pas nu het programma aan zodat het "Hoi, " en dan jouw naam op de monitor laat zien. Dus bijvoorbeeld "Hoi, Willem".

De functie setup() wordt alleen één keer aangeroepen als je de Nano start. De functie loop() wordt telkens opnieuw aangeroepen. Dit ga je zien als je in de functie loop ook iets naar de monitor laat sturen. Hiervoor gebruiken we een deel van dezelfde instructies zoals we in setup() hebben gebruikt. De instructie Serial.begin(9600) mag alleen in setup() gebruikt worden. Deze instructie zorgt ervoor dat de Arduino een verbinding maakt met de Chromebook. Met de instructie delay() laat je het programma even wachten. Tussen de ronde haakjes moet je opgeven hoe lang je wilt wachten. Dit moet je opgeven in milliseconden, duizendsten van een seconde, dus als je delay(1000) opgeeft wacht de Nano 1000 * 1⁄1000s. Dit is dus precies 1 seconde. Met Serial.println() print je een tekst naar de Monitor in Create. Wat je wilt printen moet altijd tussen dubbele aanhalingstekens, dus ' " '.

Doe
Pas nu het programma aan zodat het iedere 5 seconden "Nog een keer!" op de monitor laat zien.

Gelukt ? Mooi!

Leesbaarheid

Zoals je misschien gezien hebt staat er na iedere instructe een ' ; '. Dit is voor de computer hetzelfde als de ruimte, spatie, die wij in gewone taal tussen de woorden plaatsen. Datmaaktheteenstukleesbaardervindjeniet? Je mag dus meerdere instructies op één regel plaatsen. Dus voor een computer is het linker als rechter-voorbeeld even goed leesbaar. Om een programma ook voor jou en de Nano goed leesbaar te houden spreken wij af om iedere instructie op een nieuwe regel te beginnen en te eindigen met een ' ; '

Serial.begin(9600);
delay(5000);
Serial.println("Hoi");
Serial.begin(9600);delay(5000);Serial.println("Hoi");

Les 2, in elkaar zetten van de robot, deel 1

De robot bestaat uit verschillende onderdelen. Met deze onderdelen ga je het eerste deel van de robot in elkaar zetten. Hieronder zie je een afbeelding met alle onderdelen met een nummer. Onder de afbeelding zie je een lijstje met nummers en de naam van het onderdeel en een korte uitleg waar dit onderdeel voor dient.

Nummer Naam Omschrijving
1 Robot frame Dit is het frame van de robot, hierop worden alle onderdelen vastgemaakt.
2 Robot hoofd Met het hoofd kan de robot 'kijken'. De robot kijkt door een voor ons onhoorbaar geluid te maken. Door te meten hoe lang het duurt voordat de echo van het geluid terugkomt kan de robot een afstand berekenen tot een voorwerp voor hem. Dit hoge geluid noemen we ultrasoon geluid. Ook vleermuizen en dolfijnen maken hier gebruik van om beter te kunnen kijken.
3 Batterijhouder De batterijhouder heeft ruimte voor 4 AA batterijen van 1,5 volt. Omdat de batterijen in serie, achter elkaar, zijn aangesloten geeft de batterijhouder ongeveer 6 volt.
4 Breadboard Een Breadboard is een plastic expirmenteer bordje waarin electronische componenten geplaatst kunnen worden. In het bordje zitten per rij gaatjes metalen stripjes die die rijen gaatjes verbinden. Door middel van de draadjes en het breadboard worden alle electronische onderdelen van de robot met elkaar verbonden
5 Zwenkwiel Dit is het achterwieltje van de robot. Deze kan rondraaien zodat de robot straks goed bochten kan maken
6 Voorwielen De robot heeft twee voorwielen met rubber bandjes. Deze twee wielen kunnen onafhankelijk van elkaar draaien
7 Darlington drivers Deze chips zorgen ervoor dat de Arduino computer de motoren kunnen bedienen. Computers kunnen vaak maar kleine signaaltjes in de vorm van kleine stroompjes sturen. Een motor heeft veel stroom nodig en kan dus niet direct werken op de kleine signaaltjes van de computer. De Darlington drivers vertalen de kleine signaaltjes naar sterkere signalen. Het is dus een soort versterker voor een computer.
8 Schroeven setje Sommige onderdelen moeten met schroefjes vastgezet worden. Er zijn verschillende soorten schroefjes. De grootte van een schroefje begint altijd van M. De M staat voor het Metrieke stelsel. In het metrieke stelsel drukken we afstanden, gewicht en temperatuur uit in milli-meters, kilogrammen en graden celcius. Er zijn ook andere stels zoals Imperiaal dat in Groot Brittanie of sommige amerikaanse landen wordt gebruikt. Zij gebruiken inches, pounds en graden Fahrenheit om afstanden, gewicht en temperatuur uit te drukken. Na de M komt een getal dat de diameter van de schroef in millimeters aangeeft. Na het eerste getal komt een 'X' en weer een getal. Dit laatste getal geeft de lengte van de schroef in millimeters aan. Een schroef van M3.5x6 heeft dus een diameter van 3,5mm en is 6 mm lang. In het schroevensetje zitten M3.5x6, M2.6x4, M1.7x8 en M1.5x4 schroeven.
9 Kabelbinders Kabelbinders of ty-raps zijn plastic stripjes waarmee je eenvoudig draadjes bij elkaar kunt binden.
10 Stappen motoren Stappen motoren of stepper-motors zijn zoals de naam al zegt motoren die stapjes kunnen maken. Deze motoren moeten 64 stapjes maken om een keer om hun as te draaien. In het motorje zitten ook nog een aantal radertjes die het motorje vertragen. Door deze vertraging moet het motorje uiteindelijk 4096 stapjes maken om het asje aan de buitenkant één keer rond te laten draaien. Hierdoor kan de robot heel precies een opgegeven afstand afleggen.
11 Reflectie sensors Deze twee meterjes meten of een voor ons onzichtbaar, infrarood, licht weerkaatst wordt. Deze sensors kunnen straks gebruikt worden om te meten of de robot over een donker of lichtgekleurde lijn rijdt.
12 Arduino Nano Een Arduino Nano is een mini-computer. De computer zorgt ervoor dat de robot straks doet wat jij geprogrammeerd hebt. De Arduino zorgt ervoor dat de motoren bewogen worden en gegevens van de sensors gelezen worden.
13 Reflectie sensor kabel rechts Deze kabel verbindt de rechter reflectie sensor met de Arduino
14 Reflectie sensor kabel links Deze kabel verbindt de linker reflectie sensor met de Arduino
15 Keuze schakelaar Met de keuze schakelaar kun jij straks bepalen wat de robot gaat doen.
16 Schroevedraaier Het gereedschap dat je nodig hebt om de robot in elkaar te zetten.
17 USB Kabel Hiermee verbind je de robot straks met je Chromebook zodat je hem kunt programmeren.
18 Servo motor Een servo motor is een motor waarvan je de as naar een positie kan laten draaien. Het motortje kan dus niet rondjes draaien, maar alleen een stukje linksom en een stukje rechtsom. Deze motor zorgt ervoor dat de robot naar links en rechts kan kijken.
19 Kabels Darlingon drivers Deze kabeltjes verbinden straks de Darlington drivers met de Arduino
20 Verbindingen Deze korte verbindingdraadjes verbinden straks de + en - van de batterijen met een rij op het breadboard zodat er meerdere motoren en sensors op de batterij kunnen worden aangesloten.

De eerste stap gaan we de stappen motoren op het frame monteren. Schuif de motoren één voor één in het frame zoals op onderstaande afbeeldingen. Let er op dat het blauwe kapje van de motor boven het frame uitsteekt. Schroef de motoren daarna vast met 4 M3.5x6 schroefjes.

Tip: Als je iets op de fotos duidelijker wilt zien, klik dan op de foto zodat hij automatisch wordt uitvergroot.

Je gaat nu het breadboard op het frame schroeven. Let op! Het breadboard heeft aan één van de lange zijden een nokje. Deze moet bij het vastschroeven naar de voorkant van de robot wijzen. Bekijk het breadboard eens van de achterkant. Zie je hoe de gaatjes met elaar verbonden worden door de metalen strookjes?

Schroef het breadboard nu met twee M1.7X8 schroefjes vast. Heb je opgelet op welke kant het nokje op het breadboard wijst ?

Draai het frame nu om en schroef de batterijhouder met twee M2.6x4 schroefjes vast. Zorg dat de draden van de batterijhouder links in het midden van het frame uitkomen.

Aan de batterijhouder zit een klein schakelaartje. Duw deze voorzichtig door de opening met de tekst "ON OFF". Kijk goed naar de foto's voor de stand van de de schakelaar als je deze door de opening drukt. Het nokje van de schakelaar moet eerst door de opening. Het is even priegelen, maar met wat geduld moet het lukken. Breekt er een draadje? Geen nood, deze kunnen we weer vastsolderen.

Duw de schakelaar nu van de bovenkant op zijn plek. De schakelaar moet wel met de goed gedraaid zijn. Als je aan de onderkant van de schakelaar kijkt zie je drie aansluitingen. Op twee van deze drie aansluitingen zit een draad gesoldeerd. De aansluiting zonder draad moet aan de kant van de tekst "OFF " zitten. Voer de overige draden nu door het gat.

Schroef de schakelaar vast met twee M1.7x4 schroefjes

Druk op de voorkant van het frame de reflectie sensors één voor één met de ledjes voorzichtig in de twee gaatjes. Let op dat je de sensor in de juiste richting plaatst. De componentzijde van het printplaatje, de kant waarop de onderdelen gesoldeerd zijn, moet naar voren wijzen. Beide gaatjes zijn nml. niet even groot. Het heldere ledje met het rubberen ringetje moet in het grootste gat. Als de ledjes ver genoeg doorgedrukt zijn, dan moet het kleine staafje door het gaatje van het printplaatje steken.

Nu de sensors op hun plaats zitten gaan we de Darlington drivers vastzetten. Rol de draad van de rechter stappenmotor een beetje op tussen de vier schroefgaten. Zorg dat de connector aan de voorkant nog een paar centimeter uit kan steken zoals op de eerste foto te zien is.

De Darlington driver heeft nog elektriciteit nodig om de motor te kunnen laten draaien. In een eerdere stap heb je de draden van de batterij houder door het gat aan de rechtzijde van het frame gehaald. Dit zijn drie zwarte (negatief) draden en drie rode (positief) draden. De draden hebben zowel een mannelijke stekers, de stekers met een pinnetje, als vrouwelijke stekers. Neem nu de langste zwarte en rode draad met een vrouwelijke steker. Plaats deze draden onder de draad van de stappenmotor in de richting van de schakelaar. Hou een vinger op de draden zodat ze op hun plaats blijven zitten.

Plaats nu een van de Darlington drivers over de draden zodat de gaten precies over de schroefgaten vallen. Let goed op hoe je de driver plaatst, de witte connector moet naar de buitenkant wijzen. Schroef de driver dan met vier M2.6X4 schroefjes vast.

Plaats nu de andere Darlington driver op dezelfde manier als de eerste. Alleen bij deze driver hoeven de draden van de batterij nog niet geplaatst te worden.

Druk nu voorzichtig een voor een de witte stekers op de connector van de Darlington driver. Kijk goed hoe je de steker plaatst, ze kunnen er maar op één manier op.

Zet de Arduino boven op het breadboard. Druk hem er nog niet gelijk ik. Zet de pinnetjes zo dat ze;

Staat de Arduino precies goed ?! Druk hem dan heel voorzichtig met twee duimen in het breadboard. Gebruik niet teveel kracht en let er op dat alle pootjes in het breadboard gedrukt worden en niet per-ongeluk verbuigen.

Voer de drie draden van de servo door het gat in en duw de servo op zijn plaats.

Schroef de servo-motor vast met twee M1.7x8 schroeven.

Plaats nu de tweede schakelaar vanaf de bovenkant van het frame door het gat met de tekst "1 MODE 2". De rode draad op de schakelaar moet aan de kant van de "2" staan. Trek de draden van de schakelaar dan vanaf de onderkant van het frame door de uitsparing van het frame aan de linkerkant. Schroef de schakelaar dan met de laatste twee M1.7x4 schroeven vast.

Je gaat nu de draden op de reflectie sensors zetten. Begin met de recht sensor. Zorg eerst dat je de goede kabel pakt, de kabel voor de sensors lijken erg op elkaar. Maar als je goed kijkt zie je dat voor de rechter sensor de rode draad langer is.

Houd het robotframe ondersteboven en kijk naar de tekst bij de pinnetjes van de sensor. Hier staat OUT, GND en VCC op. GND betekent hetzelfde als de - van de batterij, en VCC de +. Deze pinnetjes zijn dus voor de elektricteit naar de sensor. OUT betekent uit, met dit pinnetje heeft de sensor een signaal als hij een lijn detecteerd.

Druk de connector nu zo dat de rode draad op de pin met de tekst VCC wordt aangesloten en de gele draad op de pin met de tekst OUT.

Pak nu één kabelbinder een maar hiermee het kabeltje vast zoals op de foto's hieronder. Trek de kabelbinder niet te strak aan anders gaat de kabel stuk.

Gelukt? Zit de kabel netjes vast?! Mooi, herhaal dit dan voor de linker sensor.

Je gaat nu de sensors, schakelaars en motoren welke je op het frame hebt vastgemaakt aansluiten op de Arduino. Op de Arduino zitten heel veel aansluitingen. Op de onderstaande afbeeldingen staan per aansluiting veel verschillende labels. Elke kleur van de labels heeft een eigen betekenis. Jij hoeft alleen maar naar de paarse labels te kijken. Deze hebben een cijfer van 0 tot en met 19. Straks moet je draden verbinden naar een van deze aansluitingen. Dus als er in de instructie staat "Sluit de draad aan op verbinding 0", dan zoek je de aansluiting met het paarse label "0" op en sluit je hierop het draadje aan.

Naast de aansluitingen met de paarse labels gaan we nog drie verschillende aansluitingen op de Arduino gebruiken. Een hiervan is de aansluiting met het label "GND". Deze ben je al eerder tegen gekomen, weet je nog waar deze voor is ? Een andere aansluiting is "VIN", hier had ook "VCC" kunnen staan. Denk je al te weten waar deze verbinding op aangesloten moet worden ? Als laatste is de aansluiting "5V", deze aansluiting heeft altijd precies 5 volt.

Hieronder zie je hoe bij jou de Nano op het breadboard zit. Op dit breadboard zitten allemaal gaatjes. Deze gaatjes zijn, zoals op de foto getoond, verticaal met elkaar verbonden. Dit betekend dat als je draadjes, zoals op de foto getoond, boven en onder elkaar in de gaatjes prikt deze met elkaar verbonden zijn. Er zit nog een horizontale onderbreking in het midden van het breadboard. zodat de bovendste en onderste vijf gaatjes afzonderlijk van elkaar verbonden zijn.

Op de tweede foto rechts zie je een rode en zwarte streep. Deze strepen geven aan hoe deze pinnetjes met elkaar verbonden zijn.

Doe
Kijk nu naar de tekening van de Arduino en de rood en zwart gemarkeerde aansluitingen op het breadboard. Wat zou er aangesloten moeten worden op de rood en zwart gemarkeerde pinnetjes ?

Hieronder zie je hoe jouw robot er nu uit zou moeten zien. Je hebt nog veel draden die niet aangesloten zijn. Deze draden gaan we nu stap voor aansluiten op het breadboard zodat alle onderdelen aangesloten worden op de Arduino. Op de foto staat bij alle draden een label. Deze labels worden straks gebruikt om duidelijk te maken welke draad er in het breadboard geplaatst moet worden.

We beginnen met het aansluiten van de voeding, de elektriciteit, voor de sensors en computer. Zonder voeding kan een computer niet werken. Neem de draad VCC BREADBOARD en plaats deze in het breadboard zodat deze verbonden is met VCC van de Arduino.

Plaats vervolgens de draad GND BREADBOARD en verbind deze met de GND aansluiting op de Arduino. Kijk goed naar de foto's en let op dat de draadjes netjes liggen zoals getoond. Straks gaan we de draden vastzetten zodat het geen rommeltje wordt.

Op de Arduino zit de aansluiting +5V. Als de Arduino aangesloten is komt hier altijd precies 5 volt uit. Omdat we meer dan 4 draden moeten verbinden met +5V gaan we deze aansluiting verbinden met een nog vrije rij op het breadboard. Neem het rode korte verbindingsdraadje en verbind hiermee de +5V van de Arduino met de linker boven-rij op het breadboard zoals op onderstaande linker foto. Je hebt nu 7 in plaats van 4 aansluitingen met +5V. Deze aansluitingen zijn met een rode streep aangegeven op de foto rechtsonder.

We gaan nu wat we voor de +5V gedaan hebben herhalen voor de GND aansluiting op de Arduino. Neem de korte zwarte verbindingsdraad en verbind hiermee de GND aansluiting op de Arduino met de linker onder-rij op het breadboard. Je hebt nu 6 in plaats van 4 aansluitingen met GND. Deze aansluitingen zijn met een zwarte streep aangegeven op de foto rechtsonder.

De reflectie sensors hebben 5 volt nodig om te kunnen werken. Je hebt in de vorige stappen GND en 5V aangesloten op de linker twee rijen van het breadboard. Nu ga je de sensor aansluiten op deze twee rijen zodat de sensor straks voeding heeft. Neem de zwarte GND SENSOR Rdraad van de rechter reflectie sensor en plaats deze in een van de gaatjes links onder in het breadboard die aangesloten is op GND van de Arduino. Kijk goed naar onderstaande fotos hoe het draadje langs de Arduino is gelegd.

Nu de sensor is aangesloten op GND moet de sensor nog op 5V aangesloten worden. Plaats de rode VCC SENSOR R draad van de rechter reflectie sensor zoals op onderstaand fotos om de Arduino heen. Plaats dan het pinnetje in de linkerboven rij van het breadboard dat aangesloten is op de 5V aansluiting van de Arduino.

Er is nog één draad van de rechter reflectie sensor niet aangesloten, de OUT SENSOR R. Deze draad geeft een signaal af aan de Arduino als het een reflectie detecteerd. Deze draad moet aangesloten worden op verbinding 11 van de Arduino.

Nu moet je hetzelfde wat je voor de rechtersensor hebt gedaan herhalen voor de linker reflectie sensor. Sluit de GND SENSOR L en VCC SENSOR L draad van de sensor aan zoals bij de rechter sensor. Kijk goed naar onderstaande fotos.

Ook de draad OUT SENSOR L van linker reflectie sensor moet worden aangesloten. Sluit deze draad aan op verbinding 10 van de Arduino.

Beide sensoren zijn nu aangesloten. Nu ga je de voeding op de Darlington drivers aansluiten zodat de twee stappenmotoren straks kunnen gaan draaien. Als het goed is steken er nu nog twee draden van de batterij uit de opening van het frame, VCC DARL L en GND DARL L. Neem deze twee dradene en plaats ze onderlangs de Arduino naar de linker Darlington driver.

Sluit de draad GND DARL L aan op het pinnetje met de tekst '-' en VCC DARL L op de '+'

Sluit nu dezelfde draden voor de rechter Darlington driver aan op de '-' en de '+'. Dit zijn de draden VCC DARL R en GND DARL R.

Bijna alle draden zitten nu op hun plaats. De draden van de mode-schakelaar moeten nog aangesloten worden zodat je straks met deze schakelaar straks een opdracht aan de robot kan geven. Neem de draad GND MODE SWITCH en plaats deze in een van de laatste twee plaatsen links onder op het breadboard. Daarna sluit je de draad SIG MODE SWITCH aan op verbinding 0 van de Arduino. Kijk goed op het Nano Pinout overzicht waar deze aansluiting zit.

Dat zit er op! De draden zijn nog wel een beetje een rommeltje. Dat gaan we oplossen door de draden vast te zetten met de vijf overgebleven snelbinders. Leg de draadjes netjes neer en maak dan de snelbinder losjes vast. Plaats de draden dan nog wat netter en zet deze dan vast door de snelbinder strakker aan te trekken. Doe dit niet heel strak, het is alleen de bedoeling dat de draden netjes op hun plaats blijven zitten.

Ook aan de onderkant lopen een aantal draden, deze moet je ook netjes vastmaken met dezelfde kabelbinder. Bij sommige kabelbinders moet je dus aan de boven en onderkant draden vastzetten. Bij één van de vijf kabelbinders kun je de kabelbinder niet zomaar door het frame krijgen. Hoe ga je dit oplossen?

De Darlingtondrivers zijn aangesloten op de motoren, maar nog niet op de Arduino. Neem één van de twee Darling driver kabels. Sluit de kant met de pinnetjes aan op de Arduino. Voor de rechter motor moet deze aangesloten worden op verbinding 6 t/m 9. Verbind de andere kant van de kabel dan aan op de rechter Darlington driver. Je moet de kabel aansluiten op IN1 t/m IN4. Let op! Aansluiting IN1 moet verbonden zijn met verbinding 7 op de Arduino. Sluit je hem verkeerd aan, dan rijdt de robot straks precies de andere kant op dan dat jij wilt.

Nu ga je dit nog een keer doen maar dan voor de linker Darlington driver. Sluit de kabel aan op verbinding 2 t/m 5 op de Arduino. Aansluiting IN1 moet verbonden zijn met verbinding 3 op de Arduino

Hierna ben je voorlopig klaar met aansluiten van draden! De voorlopig laatste drie draden zijn GND SERVO, VCC SERVO en SIG SERVO. Sluit de draad VCC SERVO aan op verbinding 14 van de Arduino. De draad VCC SERVO sluit je aan op de meest linker bovenrij op het breadboard dat verbonden is met 5V

Als laatste sluit je GND SERVO aan op de GND verbinding van de Arduino

Het begint al op een robot te lijken vindt je niet ? Door het opzetten van de wielen maak je hem nog meer compleet! Zet de rubberen bandjes om de twee wielen en druk de wielen voorzichtig op de asjes van de motoren.

Druk de wieltjes niet recht op de assen, maar begin door het wieltje een beetje schuin op het asje te houden. Kijk goed hoe je begint, de asjes zijn aan het uiteinde niet rond maar rechthoekig. Zorg dat het wiel juist voor de as ligt voordat je hem er voorzichtig op duwt.

Het achterwiel plaats je door deze vanaf de onderkant in de uitsparing te schuiven.

Daar staat hij dan, je robot! Bijna helemaal klaar, het hoofd van de robot gaan je later vastzetten.

Les 3, variabelen

Misschien heb je er wel eens van gehoord, variabelen. Maar wat zijn variabelen eigenlijk ? Variabel betekend veranderlijk. Een variabele in een programma is iets wat kan veranderen. Een variabele in een programma heeft altijd een type, naam en een waarde.

Je kunt een variabele het best vergelijken met een laatje in een kast. Je kunt iets in het laatje leggen en op een later moment kijken wat er in het laatje zit. Ook kun je iets uit het laatje halen of wat er in ligt vervangen door iets anders. Variabelen zijn speciale laatjes die alleen geschikt zijn om één ding op te bergen van één soort. Als je meerdere dingen wilt opbergen moet je meerdere laatjes programmeren. Om aan te kunnen geven welk laatje je bedoeld in een programma heeft elke variabele zijn eigen naam.

Welk soort dingen je in een variabele kunt opslaan geef je aan met een type. Je bergt je spelcomputer ook niet op in een sokkenla en je sokken in een keukenla! Voorlopig zul je drie soorten variabelen gebruiken; strings, integers en booleans. Wat zijn dat ?

String betekent draad in het engels. Een string is een draad van lettertekens. Het maakt dus niet uit of het één of heel veel lettertekens als ze maar achter elkaar staan. Om het begin en einde van een string aan te geven zet je de lettertekens tussen twee dubbele aanhalingtekens, ". Dus "Dit is een String" is een string, en "123 :-)" ook.

Als je een variabele programmeert geeft je eerst aan van welke type het is, dan de naam. Door na de naam van de variabele een "=" te typen kun je aangeven wat er in de variabele opgeslagen moet worden. Na het = teken geef je aan wat er in de variabele opgeslagen moet worden. Dit noem je ook toekennen van een waarde. In onderstaande voorbeeld ken je de waarde Peter toe aan de variabele naam. Deze variabele is van het type String. Met String heeft je aan dat het type van de variabele String is.

String naam = "Peter" ;
Doe
Het = teken noemen we ook wel een "operator". Het woord operator komt uit de wiskunde en betekent 'bewerking'. Een operator zorgt er dus voor dat de waarde van een variabele wijzigt. Andere operatoren zijn *, +, - etc.

Naast variabelen van het type String heb je integers. In het Engels betekent integer, geheel getal. De getallen 0,1,1,2,3,5,8,42,1138 zijn integers, het getal 3,14159265359 niet. Omdat er aan een geheel getal altijd een duidelijk begin en einde zit plaats je hier geen dubbele aanhalingstekens aan het begin en einde van de waarde. Als je dit wel doet denkt de computer dat de waarde van het type String is.

Met het woord int geeft je aan dat de variabele van het type integer is. Deze variabele kan dus alleen gehele getallen bevatten.

int waarde = 42 ;

Je kunt dus ook dezelfde waarde toekennen aan een variabele van het type String.

String waarde = "42" ;

Er is alleen een groot verschil tussen de bovenstaande twee variabelen. De computer kan rekenen met de variabele waarde van het type int, maar omdat de computer de variabele waarde niet als getal herkent kan hiermee niet gerekend worden.

De computer kan dus wel uitrekenen van 2 x 21 is.

int waarde = 21 * 2 ;

Maar niet uitrekenen wat "2 x 21" is. De waarde van de variabele waarde is in het onderstaande voorbeeld '21 * 2'. Het is een String, een draad van, de tekens '21 * 2'.

String waarde = "21 * 2" ;

Het laatste type variabele is boolean. Deze variabele kent maar twee waarden, waar (true) en niet-waar (false). Dit type zal je veel gaan gebruiken, niet alleen in variabelen maar ook als uitkomst van vergelijkingen. Als je in een programma iets vergelijkt, bijvoorbeeld de waarde van twee variabelen, is de uitkomst altijd waar (true) of niet-waar (false).

Een variabele van het type boolean geef je aan met het woord boolean. In het onderstaande voorbeeld maak je de variabele waarofniet van het type boolean en ken je de waarde true (waar) toe.

boolean waarofniet = true ;

Opdracht 3.1

Sluit de Arduino Nano van de Robot aan op je Chromebook met de USB kabel en start een nieuwe sketch in Arduino Create. Weet je niet meer precies hoe dat moet, kijk dan bij Les 1. Schrijf vervolgens in de functie setup een programma waarin je drie variabelen maakt hier een waarde aan toekent en print.

De eerte twee regels van de functie setup() begin je met

  Serial.begin(9600);
  delay(2000);

Deze twee regels zorgen ervoor dat je in de monitor van Arduino Create de waarden kunt zien als jij ze print.

Het kan zijn dat als je jouw programma upload naar de Arduino dat je onder aan het scherm een rode balk ziet verschijnen met de text Executing command: exit status 1. Arduino create geeft met een waarde aan of het uploaden naar de Arduino goed is gegaan. Als alles goed is gegaan is de waarde 0, bij alle andere waarden is er iets fout gegaan en verschijnt er een rode balk.

Onder de rode balk wordt een log getoond. Een log is een lijst van gebeurtenissen, dingen die hebben plaatsgevonden. In een log worden belangrijke zaken bijgehouden, bijvoorbeeld als er iets fout gaat.

Als je een rode balk krijgt bij het uploaden van jouw programma kijk je in de log wat de mogelijk oorzaak is. Dit is niet altijd makkelijk te vinden of te begrijpen. Als je meerdere meldingen ziet welke lijken op de melding avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x00 dan staat waarschijnlijk de mode schakelaar op de robot in stand 2.

Zet de mode-schakelaar op stand 1 en probeer dan nog eens het programma te uploaden.


Zie je iets wat je niet verwacht bij de variabele waarofniet? Als je een waarde false toekent zal er 0 geprint worden, bij true een 1. Voor de computer is dit hetzelfde, je mag dus ook 0 invullen in plaats van false en 1 in plaats van true

Les 4, vergelijkingen

De inhoud van een variabele kun vergelijken met een waarde of een andere variabele. De uitkomst van een vergelijk is altijd waar of niet-waar, dus true of false.

Doe
Van welk type is de uitkomst van een vergelijking?

Gelijk aan

Als je de inhoud van twee variabelen met elkaar wilt vergelijken om te testen of deze gelijk zijn, dan geef je dit aan met "==". Hierbij moet aan iedere kant van de "==" een variabele staan. Onderstaande voorbeeld print dus "1" omdat de inhoud van var1 en var2 gelijk zijn.

String var1 = "abcd" ;
String var2 = "abcd" ;

Serial.println(var1 == var2);

Opdracht 4.1

Schrijf nu een programma "Les_4_vergelijkingen" dat drie variabelen maakt, var1, var2 en var3. De variabelen var1 en var2 geef je dezelfde waarde. Variabele var3 geef je een andere waarde.

Print nu de uitkomst van de vergelijking van variabele var1 en var2. Print ook de uitkomst van de vergelijking van var1 met var3. Test je programma. De uitkomst van de eerste vergelijking moet true (1) zijn en de uitkomst van de tweede vergelijking false (0)


Naast de waarden van twee variabelen kun je ook de waarde van een variabele vergelijken met een andere waarde die niet in een variabele zit. De uitkomst van onderstaande twee vergelijkingen is hetzelfde. Bij de eerste vergelijking vergelijk je de inhoud van var1 met var2. In de tweede vergelijking vergelijk je de inhoud van var1 met de waarde "abcd".

String var1 = "abcd" ;
String var2 = "abcd" ;

Serial.println(var1 == var2);
Serial.println(var1 == "abcd");

De uitkomst van een vergelijking geeft dus een boolean waarde. Deze waarde kun je ook weer opslaan in een andere variabele.

Opdracht 4.2

Ga nu verder met het programma dat je in opdracht 4.1 hebt gemaakt. Maak een extra variabele met de naam uitkomst. In deze variabele ga je de uitkomst van een vergelijking opslaan. Denk goed na welk type je voor deze variabele gebruikt!

Als je variabele hebt gemaakt moet je de waarde van de vergelijking van var1 en var2 aan de variabele uitkomst toekennen. Print vervolgens de waarde van de variabele uitkomst.


Je kunt alleen twee variabelen van hetzelfde type vergelijken. Het is dus niet mogelijk om een variabele van het type String met een andere variabele van het type int te vergelijken. Als je onderstaande programma probeert uit te voeren krijg je de foutmelding "error: no match for 'operator==' (operand types are 'int' and 'String')".

int var4 = 12 ;
String var5 = "12" ;

Serial.println(var4 == var5);
Doe
Probeer bovenstaande regels in je vorige programma toe te voegen en kijk welke foutmelding jij krijgt.

Kleiner en groter dan

Naast vergelijken of waarden gelijk aan elkaar zijn kun je nog meer vergelijkingen maken. Je kunt vergelijken of een waarde groter of kleiner is dan een andere waarde. Bij het vergelijken of twee waarden gelijk zijn gebruikte je "==", om te vergelijken of een waarde groter is dan een andere waarde gebruik je het teken ">".

De vergelijking geeft true (is waar) als het getal links van > groter is dan het getal aan de rechterkant. Je kunt dit makkelijker onthouden door het volgende ezelsbruggetje: Links van het > teken is de afstand tussen de lijntjes groot, rechts van het teken is de afstand klein. Het teken kun je ook zien als een pijl die wijst van groot naar klein. Als de waarden overeenkomen met de afstand tussen de lijntjes is de uitkomst true

In het volgende programmavoorbeeld staat links de waarde 7, recht staat de waarde 3. De pijl wijst van het grootste naar het kleinste getal. De uitkomst van deze vergelijking is dus true (1). De inhoud van variabele var1 is dus groter dan de inhoud van variabele var2

int var1 = 7 ;
int var2 = 3 ;

Serial.println(var1 > var2);

Naast een groter dan vergelijking is er ook een kleiner dan vergelijking. Hiervoor gebruik je het pijltje dat de andere kant op wijst "<". Als je in hetzelfde programma de groter dan (>) vergelijking vervangt door een kleiner dan (<) dan is de uitkomst false (0). Want, 7 is niet kleiner dan 3

int var1 = 7 ;
int var2 = 3 ;

Serial.println(var1 < var2);

Opdracht 4.3

Maak een nieuw programma Les_4_groterenkleiner. Maak in dit programma twee variabelen van het type int. Kies zelf de naam van de variabelen, bijvoorbeeld groot en klein. Zorg dat het programma de variabelen vergelijkt met de groter dan en kleiner dan vergelijking en het resultaat van de vergelijking toont.

Probeer het programma uit te voeren en kijk of de uitkomst van de vergelijkingen kloppen.


Naast het vergelijken van gehele getallen met > en <, kun je ook String waarden vergelijken. Dit is echter minder voor de hand liggend. Welk woord is groter "app" of "apen"? Het is "app" !

Het is vreemd, of niet ? Het woord "app" is korter dan "apen", maar bij het vergelijken van string waarden begint de vergelijking bij het eerste teken. Als dit teken gelijk is gaat de vergelijking verder bij het volgende teken. De eerste twee tekens van "app" en "apen" zijn gelijk. Bij het derde teken wordt "p" vergeleken met "e". De letter "e" komt eerder in het alfabet voor is dus kleiner net zoals bij vergelijken van waarden waar 0 kleiner is dan 5. Bij het vergelijken van strings wordt er dus per teken van links naar rechts vergeleken. Zodra er een verschil tussen de tekens is gelden de volgende tekens niet meer in de vergelijking.

Hieronder nog enkele voorbeelden van vergelijkingen die waar zijn.

app > apen
landje > OBS Landje
A > 1
1 < a
a4 > a3

Je ziet wel dat vergelijken van string waarden niet altijd heel erg makkelijk te begrijpen is. In de verdere oefeningen gaan we hier dan ook geen gebruik van maken.

Kleiner of gelijk en groter of gelijk

Nu heb je al geleerd hoe je kunt vergelijken of waarden gelijk, kleiner of groter zijn dan een andere waarde. Deze vergelijkingen kun je ook met elkaar combineren. Je kunt niet alleen vergelijken of een waarde groter is dan een andere waarde, maar ook groter of gelijk aan een andere waarde. De vergelijking 4 > 3 is waar, maar 4 > 4 niet. Stel dat je nu een waarde wilt vergelijken die groter of gelijk aan 4 is. Dan kan dat heel eenvoudig door de vergelijkingssymbolen te combineren, bijvoorbeeld >=. De uitkomst van de vergelijking 4 >= 4 is dan waar en 4 >= 3 ook!

Naast de vergelijking groter of gelijk , >= is er ook nog de vergelijking kleiner of gelijk, <=. Net zoals bij de groter of gelijk vergelijking is bij de kleiner of gelijk aan vergelijking zowel 3 <= 4 als 4 <= 4 waar.

Opdracht 4.4

Voeg in het vorige opdracht gemaakte programma Les_4_groterenkleiner vergelijkingen toe waarbij je gebruik maakt van de groter- en kleiner dan vergelijking.


Ongelijk aan

De laatste van de vergelijkingen is ongelijk aan, !=. De uitkomst van deze vergelijking is waar als beide vergelijkte waarden niet gelijk aan elkaar zijn, dus 3 != 7 is waar. Het uitroepteken voor het = teken in de vergelijking betekent niet (NOT) , er staat dus eigenlijk "niet-gelijk" aan.

Opdracht 4.5

Voeg in het vorige opdracht gemaakte programma Les_4_groterenkleiner vergelijkingen toe waarbij je gebruik maakt van de ongelijk aan vergelijking.


Les 5, conditionele statements

Leuk denk je die vergelijkingen, maar wat kun je er eigenlijk mee ? Nou je kunt ze gebruiken in conditionele statements ?! Tja denk je, wat is dat dan ? Een statement is een ander woord voor een programmeer instructie, conditie is een ander woord voor voorwaarde. Het wordt iets duidelijker aan de hand van het volgende voorbeeld.

Stel dat je met je vriend afspreekt dat jij hem een snoepje geeft als hij je heeft geholpen met je huiswerk . Dan is de voorwaarde, de conditie, dat hij je heeft geholpen met je huiswerk. De instructie is dan dat jij hem een snoepje geeft. Als je dit opschrijft zodat dit dan door een computer begrepen kan worden dan ziet dit er zo uit.

if (Geholpen met huiswerk) {
  Geef mijn vriend een snoepje
}

Je begint voor een computer dus met if om aan te geven dat je een voorwaarde, conditie stelt waaraan voldaan moet worden. If is het engelse woord voor "als". Deze conditie staat tussen de ronde haakjes en kan alleen waar of niet-waar zijn. De uitkomst van een conditie is dus een Boolean waarde. Na de conditie plaats je tussen kringelhaakjes de statements, instructies, die uitgevoerd moeten worden als de uitkomst van de conditie waar is. In het volgende voorbeeld programma staat als het waar is, toon dan "De conditie is waar".

if (true) {
  Serial.println("De conditie is waar") ;
}

De boolean waarde true is waar, dus als je het programma uitvoert zal de tekst "De conditie is waar" tonen./p>

Opdracht 5.1

Maak nu een nieuw programma, Les_5_conditie_als. Maak in de functie setup() twee nieuwe variabelen, groot en klein van het type int. Vul deze variabele met een getal. Het getal in variabele klein moet kleiner zijn dan in de variabele groot. Schrijf hierna een if-instructie welke de tekst "klein is kleiner dan groot" afdrukt als de waarde in variabele klein kleiner is dan in de variabele groot.


Als het goed is drukt het programma van Opdracht 5.1 nu de tekst af "klein is kleiner dan groot". Maar wat nu als de waarde van klein niet kleiner is dan groot, dus als de uitkomst conditie false is Dan wordt er nu niets afgedrukt! Bij een if-instructie kun je ook instructies uitvoeren als de uitkomst van de conditie niet-waar (false) is. Dit doe je met het woord else. Else betekent anders. Je gebruikt het woord else na de instructies tussen { en } die uitgevoerd wordt als de uitkomst van de conditie waar is. Na else gebruik je weer de { en } om aan te geven welke instructies je wilt uitvoeren als de uitkomst van de conditie niet-waar is. Kijk maar naar onderstaande voorbeeld.

if (true) {
  Serial.println("De conditie is waar") ;
} else {
  Serial.println("De conditie is niet-waar") ;
}

Opdracht 5.2

Pas nu het programma, Les_5_conditie_als aan. Zorg ervoor dat de tekst "klein is groter dan groot" afgedrukt wordt als de waarde in variabele klein groter is dan de waarde in variabele groot. Pas ook de waarde van één van de variabelen aan zodat de nieuwe tekst wordt afgedrukt.


Les 6, herhalingen

Herhalingen zijn saai! Maar soms wel nuttig. Denk maar aan het leren van de tafels. Als een computer een bepaalde opdracht elke keer moet herhalen kun je dit meer keer programmeren, bijvoorbeeld als je 5x "Dit herhaal ik" wilt afdrukken, kun je dit zo schrijven.

Serial.println("Dit herhaal ik") ;
Serial.println("Dit herhaal ik") ;
Serial.println("Dit herhaal ik") ;
Serial.println("Dit herhaal ik") ;
Serial.println("Dit herhaal ik") ;

Voor een paar herhalingen is dit nog overzichtelijk, maar stel dat je iets duizend keer moet herhalen. Dan wordt het programma erg lang en doet het dan nog bijna niets. Om dit overzichtelijker en makkerlijker te maken zijn er heralingen, of loop, instructies. Hiervan gaan we er twee behandelen, de for en de while loop.

De while-loop

While in het engels betekent zolang. De instructie while werkt ongeveer net zoals de instructie if. Je begint met de naam van de instructie, while, dan komt er tussen twee ronde haakjes een conditie en staan er instructies tussen de { en }. Deze twee laatste tekens noemen we ook wel accolade's.

while (true) {
  Serial.println("Dit herhaal ik") ;
}

Bij de while instructie worden de instructies tussen de accolade's herhaald zolang de uitkomst van de conditie waar is.

Doe
Weet jij hoe lang in de bovenstaande while loop het afdrukken van de tekst herhaald wordt?

Als je wilt dat een while loop op een gegeven moment stopt met herhalen, moet je dus zorgen dat de conditie tijdens het herhalen verandert van true naar false. Als je er niet voor zorgt dat de uitkomst van de conditie verandert zal de herhaling nooit stoppen.

Kijk eens naar het onderstaande voorbeeld en probeer te begrijpen wanneer de while conditie wijzigt.

int getal = 1 ;

while (getal < 10) {
  Serial.println("Dit herhaal ik") ;
  getal = getal + 1;
}
  

Het programma begint met het maken van een variabele getal en heeft deze de waarde "1". De conditie getal <= 10 in de while-loop is dan waar. De tekst "Dit herhaal ik" wordt dan ook afgedrukt. Hierna wordt de instructie getal = getal + 1 uitgevoerd. De variabele getal krijgt hier dus een nieuwe waarde. Deze nieuwe waarde is de huidige waarde in variabele getal, "1", plus 1. De nieuwe inhoud van variabele getal wordt dus 2. De uitkomst van de while-loop conditie is nog steeds waar, dus zullen de instructies tussen de { en } nog een keer herhaald worden.

Opdracht 6.1

Probeer nu uit te vinden hoe vaak de tekst "Dit herhaal ik" afgedrukt wordt door het laatste voorbeeld programma. Doe dit door stap-voor-stap door de programma regels te gaan en op te schrijven wat de inhoud van de variabele getal is en wanneer er iets wordt afgedrukt wordt.

Schrijf bijvoorbeeld zo op;

getal 1
"Dit herhaal ik"
getal 2
"Dit herhaal ik"


De for-loop

Met de for-loop kun je ook meerdere instructies herhalen. In plaats van alleen een conditie, zet je bij de for-loop de initialisatie, conditie en increment tussen de ronde haakjes. Maar wat zijn dat ? initialisatie, conditie en increment.

Initialisatie betekent opnieuw maken, het is het maken van een variabele en het toekennen van een waarde. De instructie int getal = 1 bij het while-loop voorbeeld programma is de initialisatie van de variabele getal

Een conditie hebben we al eerder behandeld, dit is bijvoorbeeld getal < 10 in het while-loop voorbeeld programma.

Increment is een ander woord voor ophoging. Je geeft hiermee aan met hoeveel de inhoud van een variabele opgehoogd wordt. In het while-loop voorbeeld programma werd dit in de loop uitgevoerd door de instructie getal = getal + 1.

De initialisatie, conditie en increment in een for-loop moeten dus tussen de ronde haakjes na de instructie for komen. Tussen de initialisatie, conditie en increment type je een punt-komma (;). Dus dat ziet er dan zo uit

for (initialisatie;conditie;increment) {
  // Instructies
}

Als we nu precies hetzelfde willen doen met een for-loop als in het "Dit herhaal ik" while-loop programma, dan ziet het programma er zo uit.

for (int getal=1;getal<10;getal=getal+1) {
  Serial.println("Dit herhaal ik") ;
}

Met een for-loop zet je eigenlijk alle instructies welke zorgen voor een goed verloop van de herhaling bij elkaar. De variabele wordt geinitialiseerd, getal krijgt de waarde 1. Elke herhaling wordt er 1 bij de inhoud van de variabele getal opgeteld. En de instructies worden herhaald zolang de inhoud van variabele getal kleiner is dan 10.

Als je de inhoud van een variabele met precies 1 wilt verhogen kun je dit ook anders opschrijven. Door na de naam van een variabele "++" te typen, bijvoorbeeld getal++, dan is dit hetzelfde als getal = getal + 1.Het vorige programma doet dus precies hetzelfde als het programma hieronder.

for (int getal=1;getal<10;getal++) {
  Serial.println("Dit herhaal ik") ;
}

Opdracht 6.2

Dit wordt al een moeilijkere opdracht, dus neem je tijd en denk rustig na. Schrijf een programma dat de macht van een getal uitrekent. Als je 2 tot de macht 4 wilt uitrekenen, reken je uit wat 2x2x2x2 is. Twee keer Twee is vier, vier keer twee is acht en twee keer acht is zestien. Twee tot de macht 4 is dus 16. Voor het berekenen van een macht van een getal heb je een grondtal en een exponent nodig. Het grondtal is het getal dat je wilt vermenigvuldigen, het exponent is het aantal keer dat je het getal wilt vermenigvuldigen.

Begin het programma door drie variabelen te maken, grondtal, exponent en uitkomst. Bedenk zelf welke type variabele je gebruikt. Maak de inhoud van de variabele uitkomst gelijk aan de waarde van grondtal en kies een eigen waarde voor de variabelen grondtal en exponent. Begin met kleine getallen zodat het nog overzichtelijk blijft.

Schrijf vervolgens in een for-loop de berekening van de macht van het getal in variabele grondtal. Gebruikt de variabele exponent in de conditie. In de for-loop gebruikt je een aparte variabele x bij de initialisatie, conditie en increment.

Druk nadat de for-loop klaar is de waarde van variabele uitkomst af. Test je programma met grondtal 3 en exponent 5. Als de uitkomst van het programma 243 is, dan werkt het programma goed.


Les 7, debuggen

Fouten uit een programma halen heet "debuggen". Er zijn twee soorten fouten in computerprogramma's, syntactische- en runtime fouten.

Syntactische fouten

Wat zijn dat voor fouten ? Een syntactische fout is zoiets als een spelvout 😉. Syntactische fouten kun je dus al zien voordat je een programma uitvoert. Als je je precies aan de regels van de programmeertaal houdt heb je nooit syntactische fouten. Maar er zijn heel veel regels. Dit is dus eigenlijk een klusje voor een programma om deze op te sporen. Dit programma zit ook in jouw IDE welke je start diir op de verify knop te klikken.

Opdracht 7.1

Maak in een nieuw programma in Arduino Create en noem dit Les_7_debuggen. Knip en plak dan onderstaand programma over de huidige standaard programmaregels. Zoek vervolgens in je Arduino Create IDE de verify knop. Gevonden? Klik hier dan op en kijk wat er gebeurt.

/*

*/

void setup() {

  Serial.begin(9600);
  delay(2000);

  Serial.println("Gaat het wel goed?")

}

void loop() {

}

Kijk eens goed naar de foutmelding in de rode balk onder het programma. Zie jij wat er fout is?


Als je het programma van Opdracht 7.1 controleert op syntactische fouten geeft de IDE aan expected ';' before '}' token. Expected betekent verwachtte en token betekent teken. De IDE verwachtte dus het teken ";" voor het "}" teken.

Maar waar dan? Want er staan wel meer "}" tekens in het programma. Onder de foutmelding wordt in het zwarte kader de foutmelding uitgebreider beschreven. Nog steeds is het niet gemakkelijk, maar als je vaak rustig leest staat er precies waar de fout zicht bevindt.

De eerste rode afgedrukte regel geeft bijvoorbeeld aan in welke functie de fout zit, In function 'void setup()':. De fout zit dus niet in de functie loop(), maar in setup().

In de volgend rode afgedrukte regel staat iets wat waarschijnlijk lijkt op debuggen.ino:12:1 error: expected ';' before '}' token. De tekst 12:1 geeft precies aan waar in het programma de fout zit, regel 12 en het eerste teken. De IDE verachte op die plek dus een ";" voor het "}" teken.

Opdracht 7.2

Haal nu met de aanwijzingen in de foutmeldingen de fout uit het programma. Waar zou jij de ";" zetten als je het netjes zou doen ?


Runtime fouten

Runtime fouten zijn fouten die ontstaan tijdens het uitvoeren van een programma. Uitvoeren noemen we in het Engels "runnen". Als er een runtime fout in een programma zit hoeft deze niet op te treden, maar het kan soms wel optreden. Hieronder zie je een programma waar een runtime fout in zit. Begin het programma te lezen vanaf de regel int getal = 5;. De programma regels voor deze regel zorgen er onder andere voor dat het programma een willekeurig getal kiest. De functie random(1,10) kiest een willekeurig getal van 1 tot en met 10.

void setup() {
  Serial.begin(9600);
  delay(2000);
  pinMode(A1,INPUT) ;
  randomSeed(analogRead(A1));

  int getal = 5;
  Serial.println("start getal");
  Serial.println(getal);

  int teller = random(1, 10);
  Serial.println("start teller");
  Serial.println(teller);

  while (getal != teller) {
    Serial.println("teller");
    Serial.println(teller);
    teller++ ;
  }

  Serial.println("Klaar!");

}

void loop() {

}
    
    

Eerst wordt in de variabele getal de waarde 5 gezet. Vervolgens wordt dit getoond in het console van je IDE. Daarna wordt in variabele teller een willekeurig getal van 1 tot en met 10 geplaats. Elke keer dat je het programma start zal hier dus een andere waarde in gezet worden.

Daarna gaat het programma een aantal programma regels herhalen. Dit blijft de computer herhalen zolang de waarde van getal ongelijk is aan teller. Daar lijkt niets mis mee toch ?

Opdracht 7.3

Maak een nieuw programma en knip en plak de bovenstaande programmaregels in het programma. Houd vervolgens een vinger op de pin A1 van de Arduino. Het maakt niet uit of je ook nog een andere pin aanraakt. Doordat je contact maakt met pin A1 zal er van de computer naar jou een heel klein stroompje electriciteit lopen. Hoeveel electriciteit er door jou heen loopt verschilt per keer, dit gebruikt de Arduino weer om een willekeurig getal te maken.

Start vervolgens het programma een paar keer.

Je ziet waarschijnlijk dat het programma netjes na een paar keer printen van een getal "Klaar!" print zoals in het voorbeeld hieronder.

start getal
5
start teller
2
teller
2
teller
3
teller
4
Klaar!

Dit gaat niet altijd zo, als er een fout runtime fout optreed in het programma blijft de teller maar doorlopen.

start getal
5
start teller
8
teller
8
teller
9
teller
10
teller
11
teller
12
teller
13
teller
14
teller
15
teller
16
...

Hoe komt dat? Runtime fouten zijn helaas niet heel eenvoudig te vinden. Belangrijk is dat je precies te werk gaat en stap voor stap het programma probeert te debuggen. Doe dit door stap-voor-stap door de programma regels te gaan en op te schrijven wat de inhoud van de variabelen zijn en wat de uitkomsten van condities zijn.

Hieronder zie je een voorbeeld hoe je dit op kan schrijven. Naast de inhoud van de variabelen staat ook nog het regelnummer in het programma waar de variabele van waarde wijzigt of de conditie getest wordt. Probeer nu aan de hand van onderstaande stappen te begrijpen hoe het programma verloopt. Op regel 12 krijgt de variabele tellerhet willekeurige getal 3.

Stap     Regel    Getal    Teller   Getal!=Teller
  1          8        5         -          -
  2         12        5         3          -
  3         16        5         3        True
  4         19        5         4          -
  5         16        5         4        True
  6         19        5         5          -
  7         16        5         5        False

Nu moet je zelf de stappen gaan opschrijven zoals in het voorbeeld hierboven. Alleen krijgt de variabele tellerop regel 12 hier de willekeurige waarde 6.

Stap     Regel    Getal    Teller   Getal!=Teller
  1          8        5         -          -
  2         12        5         6          -
  3

Zoals je ziet gaat er hier iets mis. Wat moet je aan het programma aanpassen om deze bug te verhelpen?


Les 8, de robot instructie set

Je kunt nu al programmeren en debuggen! In de volgende lessen zul je meer instructies leren. Naat de standaard C instructies heeft deze robot speciale instructies voor de robot. Deze instructies kun je vinden in de Landje robot instructieset

Met deze speciale instructieset kun je de robot laten rijden, kijken, afstand meten en lijnen op de vloer herkennen. Door deze functies te combineren in een programma kun je bijvoorbeeld de robot een lijn op de vloer laten volgen. Maar je kunt hem ook laten rondrijden zonder tegen iets op te botsen.

De eerste robot instructie, move

Move betekent "bewegen". In de volgende opdracht zul je robot door middel van de instructie move echt laten bewegen. Het is een opdracht waarin je best wel even moet lezen en dingen uitzoeken, dus neem je tijd.

Opdracht 8.1

Lees nu de Landjerobot instructieset tot aan de Instructies.

Om de Landjerobot instructies te kunnen gebruiken in je programma moeten deze instructies toegevoegd worden aan de bibliotheek van je IDE. Een bibliotheek, of library, is een verzameling van programma's die bij elkaar horen. Voor de Landjerobot is de library, je raad het al, LandjeRobot. Voordat je de library kan toevoegen, moet je hem eerst downloaden. Je kunt deze library hier downloaden

Nu je de library hebt gedownload kun je hem toevoegen in je IDE. Klik in je IDE in de linkerkolom op Libraries. Boven in de tweede kolom staat nu LIBRARY MANAGER met rechts hiervan een symbool met een pijl die naar boven wijst. Dit is de import knop. Klik op deze knop om de net door jouw downloaded LandjeRobot.zip te importen. Als dit goed is gegaan krijg je een melding zoals in de afbeelding getoond wordt.

Maak nu een nieuw programma robot_beweegt. Maak nu gebruik van de Landjerobot instructieset om in de functie setup() een instructie te schrijven waardoor de robot 10cm vooruit rijdt. Vergeet ook niet de instructies zoals deze bovenaan in de Landjerobot instructieset staan naar jouw programma te knippen en te plakken. Zorg ervoor dat je voordat je het programma naar de robot stuurt de ON/OFF schakelaar op OFF staat.

Denk je dat het programma goed is? Haal dan de USB kabel uit de robot, zet 4 batterijen in de batterijhouder en zet de robot aan.


Move herhalen

Zoals je gezien hebt kun je met de move instructie de robot vooruit laten rijden. Met een andere instructie turn kun je de robot in een richting draaien. Hoever je de robot draait geeft je aan in graden. Kijk eens in de Landje robot instructieset bij de instructie turn. Bij het plaatje van de robot zie je een cirkel die is verdeeld in 360 stukjes, deze stukjes noem je graden. Als je de robot 360 graden laat draaien, maakt hij een heel rondje. Bij 90 graden maakt de robot een rechte hoek.

Door gebruik te maken van de move en turn instructie kun je de robot een vierkantje laten rijden. Als je de robot eerst vooruit laat bewegen, en dan draait heeft hij de eerste zijde van een vierkant afgelegd en staat hij klaar voor de tweede zijde. Als je dit vier keer herhaalt rijdt hij precies een vierkant.

Dit is misschien in het begin moeilijk te begrijpen. Wat kan helpen is door zelf de instructies na te spelen. Print daarvoor het onderstaande afbeelding af van de robot, of teken hem na op een stuk papier. Knip deze vervolgens uit.

Gebruik nu onderstaande "instructies" en gebruik jouw papierenrobot om de instructies uit te voeren. Leg de robot neer op een tafel en beweeg hem volgens de instructies. Als je deze opvolgt zal de robot zich in een vierkant verplaatsen en weer uitkomen op de positie waar het begonnen was.

Beweeg 10cm vooruit
Draai 90 graden naar links
Beweeg 10cm vooruit
Draai 90 graden naar links
Beweeg 10cm vooruit
Draai 90 graden naar links
Beweeg 10cm vooruit
Draai 90 graden naar links

Opdracht 8.2

Nu je weet hoe je de robot in een vierkant kunt laten rijden mag je dit zelf gaan programmeren. De move en turn instructies hebben verschillende syntaxis (meervoud van syntax). Zo heb je voor de instructie move de syntax move( richting , afstand) ; en move( richting , afstand, wachten) ;

Het verschil tussen beide syntaxis is dat bij de eerste syntax alleen de richting en afstand kan worden opgegeven. Bij de tweede kan ook aangegeven worden dat de instructie wacht totdat de actie, het bewegen van de robot over een afstand, is afgerond. Als je bij de move en turn instructie niet aangeeft dat het moet wachten tot het afgerond is zal de robot alle move en turn instructies hebben afgerond voordat de robot een centimeter heeft gereden!

Maak nu een nieuw programma "beweeg_vierkant" en programmeer in de functie setup() de instructies om de robot zich in een vierkant te laten bewegen.

Als je denkt dat het programma goed werkt, upload het dan naar de robot en zet hem aan. Vergeet niet de USB kabel eruit te halen!


DRY

Dry betekent in het Engels "droog". Het is ook in het Engels een afkorting welke elke programmeur kent. Het is een afkorting van Don't Repeat Yourself, wat "herhaal jezelf niet" betekent. Waarschijnlijk heb jij in Opdracht 8.2 vier keer de move en turn instructie geschreven. Dit is goed, maar wat als je de robot in plaats van een vierkant van 10cm een vierkant van 15 centimeter wilt laten rijden ? Dan moet je het programma op 4 plekken aanpassen! Het is dus beter om herhalingen van instructies in programma's te voorkomen. Dus als je programmeert, DRY!

Opdracht 8.3

Pas het programma van Opdracht 8.2 aan zodat je nog maar èèn keer de move en turn instructies gebruikt om de robot in een vierkant te laten bewegen. Heb je even geen idee hoe je dit zou moeten doen, kijk dan eens in hoofdstuk 6, succes!

Sensors gebruiken

Landjerobot heeft meerdere sensors. Sensors waarmee je afstand kunt meten, een schakelaar en reflectiesensors. Deze sensors kun je gebruiken om een lijn op een vloer te detecteren. Deze sensors werken het beste op een donkere vloer welke een gelijkmatige kleur heeft. Op deze vloer ga je straks een stukje wit tape plakken zodat de sensor deze kan detecteren.

Opdracht 8.4

In deze opdracht ga je de refelectiesensors afstellen. De sensors geven een voor mensen onzichtbaar licht en meten dan of dat licht gereflecteerd wordt. Je kunt deze sensors afstellen zodat ze bij een bepaalde hoeveelheid gereflecteerd licht een signaal geven. Je kunt de sensor dus het beste gebruiken op een donkere vloer met witte tape of een lichte tape met een donkere vloer zodat de sensor het beste het verschil tussen vloer en tape kan detecteren. Je moet de reflectiesensors anders afstellen als je op een donkere vloer gaat rijden dan op een lichte vloer. In deze opdracht kun je voor jouw vloer de juiste stappen vinden om de reflectiesensors goed af te stellen.

Omdat je straks de robot aan moet zetten om de sensors af te stellen is het handig dat hij niet ineens begint te rijden. Maak daarom in je IDE een leeg programma en upload dit naar de robot.

licht gekleurde vloer

Haal de USB kabel uit de robot en zet hem aan. Op de reflectiesensors zit een klein blauw blokje met hier in het midden een klein schroefgaatje. Neem de kleinste Phillips schroevedraaier (die in de vorm van een kruisje) en draai heel voorzichtig het schroefjes van beide sensors naar links. Plak nu een stukje zwart tape op de vloer en zet een van de sensors boven het zwarte tape. Als het goed is brandt er maar één ledje op de sensor. Draai vervolgens het schroefje langzaam naar rechts totdat een tweede ledje gaat branden. Herhaal dit voor de andere sensor.

donker gekleurde vloer

Haal de USB kabel uit de robot en zet hem aan. Op de reflectiesensors zit een klein blauw blokje met hier in het midden een klein schroefgaatje. Neem de kleinste Phillips schroevedraaier (die in de vorm van een kruisje) en draai heel voorzichtig het schroefjes van beide sensors naar rechts. Plak nu een stukje wit tape op de vloer en zet een van de sensors boven het witte tape. Als het goed is brandt er maar één ledje op de sensor. Draai vervolgens het schroefje langzaam naar links totdat een tweede ledje gaat branden. Herhaal dit voor de andere sensor.

Als je een nieuw programma voor de robot start moet je altijd een aantal regels vanuit de Landjerobot instructieset kopieren. Een van deze regels ziet er zo uit.

const bool lineSensorInverse = true ;

Als je een donkere vloer hebt, moet je bij elk programma dat je maakt deze regel veranderen in.

const bool lineSensorInverse = false ;

Door de waarde van true naar false te veranderen, weet de robot dat je een licht gekleurde lijn op een donker gekleurde vloer gebruik, in plaats van een donker gekleurde lijn op een licht gekleurde vloer.


Met de instructie detectLine() kun je testen of de robot een lijn ziet en met welke, de linker of rechter, sensor. Als je in de Landje robot instructieset leest, zie je dat deze instructie vier verschillende waarden terug kan geven. Afhankelijk van

Opdracht 8.5

Schrijf nu een programma dat de robot recht vooruit laat rijden en laat stoppen als een van de sensors detecteert dat er over het witte of zwarte tape wordt gereden. Begin met de instructie move(richting); zodat de robot gelijk gaat rijden en niet wacht totdat de instructie is afgerond. Deze instructie zet je in de setup() functie. De setup() wordt maar één keer aangeroepen, als je de robot aanzet. Hierdoor start de robot met rijden als je hem aanzet, en zal hij niet meer gaan rijden nadat hij gestopt is. Schrijf daarna in de functie loop() je programma dat ervoor zorgt dat als de sensor niet niets detecteert de robot laat stoppen met rijden.

De detectLine instructie kan vier verschillende waarden teruggeven LandjeRobot::LINE::NONE, LandjeRobot::LINE::LEFT, LandjeRobot::LINE::RIGHT en LandjeRobot::LINE::BOTH. De robot moet dus stoppen als of deze de waarde LandjeRobot::LINE::LEFT, LandjeRobot::LINE::RIGHT of LandjeRobot::LINE::BOTH teruggeeft. Kun je dit misschien ook schrijven door alleen gebruik te maken van LandjeRobot::LINE::NONE ? Dat zou het schrijven van de code voor het stoppen van de robot namelijk wel veel eenvoudiger maken!


Les 9, Lijnen volgen

In deze les ga je leren om sensors te programmeren. Met sensors kun je dingen waarnemen, zoals met bijvoorbeeld de reflectiesensors, het verschil tussen lichte en donkere oppervlakken op een vloer. Met de gegevens van deze sensor ga je vervolgens de robot hierop laten reageren.

Volgen van een lijn

Je hebt nu al geleerd hoe je de robot in elkaar zet, eenvoudige programma's geschreven en de robot laten rijden en stoppen met robot instructies. In deze les ga je leren hoe je de robot zelfstandig langs een lijn laat rijden.

Met behulp van de reflectiesensors ga je detecteren wanneer een sensor over een lijn gaat. Als deze over een lijn gaat zult je iets moeten doen om ervoor te zorgen dat de robot weer netjes de lijn gaat volgen.

In het voorbeeld hiernaast zal de robot als deze recht vooruit blijft rijden geen enkele keer met de reflectiesensors over de lijn gaan. Je hoeft de robot dus niet bij te sturen om het de lijn te laten volgen.

Maar wat nu als de lijn niet zo recht is?

Dan zal een van de reflectiesensors op een bepaald moment de lijn detecteren.

In het voorbeeld hiernaast zal de linker reflectiesensor de lijn het eerst detecteren. In het onderstaande programma laat je de robot recht vooruit rijden en een letter afdrukken. Welke letter wordt afgedrukt hangt af van wat de sensoren detecteren. Welke letter denk jij dat er afgedruk wordt als de robot zich bevindt zoals in de afbeelding hiernaast?

void setup() {

   Serial.begin(9600);
   delay(2000);

   landjerobot.move(LandjeRobot::DIRECTION::FORWARD) ;

}

void loop() {

  if (landjerobot.detectLine() == LandjeRobot::LINE::NONE) {
    Serial.println("A");
  }

  if (landjerobot.detectLine() == LandjeRobot::LINE::LEFT) {
    Serial.println("B");
  }

  if (landjerobot.detectLine() == LandjeRobot::LINE::RIGHT) {
    Serial.println("C");
  }

  if (landjerobot.detectLine() == LandjeRobot::LINE::BOTH) {
    Serial.println("D");
  }

}

Als de linker sensor een lijn detecteert dan moet de robot ook naar links draaien om de lijn te blijven volgen.

En je raadt het al, als de rechter sensor een lijn detecteert, dan moet de robot naar rechts draaien.

Zo zal de robot de lijn netjes blijven volgen.

Opdracht 9.1

Plak nu met stukken tape een route op de vloer van ca. 1 meter die de robot moet gaan afleggen. Maak hier net zoals op de afbeeldingen hiervoven een paar bochten in. Maak ze niet te scherp anders zal tijdens het draaien van de robot de andere sensor de lijn detecteren en kan de robot vastlopen.

Maak nu een nieuw programma in Arduino Create. Geef het programma de naam "Mijn_Robot". In de verdere opdrachten ga je dit programma telkens verder uitbreiden. Programmeer nu dat de robot de lijn laat volgen. De robot moet dus:

In deze opdracht is het de eerste keer dat je de turn instructie gaat gebruiken. Zoek in de Landje robot instructieset op hoe je de deze instructie moet gebruiken. Denk goed na of je de move en turn instructie laat wachten met het uitvoeren van de volgende instructie totdat deze uitgevoerd is.

Denk je dat het programma goed is? Test het dan uit! Doet het programma niet wat je er van verwacht, probeer dan te debuggen wat er fout gaat. Het helpt als je met de "papieren robot" het programma probeert na te spelen.


Keren

De robot volgt als het goed is nu jouw op de vloer aangebrachte lijn. Maar aan het einde van de lijn gaat de robot er vandoor. Hij blijft rechtdoor rijden omdat er geen lijn meer gedetecteerd wordt.

Als je de robot aan het einde van de lijn kan laten keren, dan blijft hij de lijn de hele tijd volgen. Eerst van onder naar boven, zoals op de afbeelding hiernaast. Dan als hij keert zal hij weer van boven naar onder rijden.

Door een lijn, loodrecht, op het begin en het einde van de te volgen lijn te plakken kan de robot zien dat hij moet keren.

Als de robot over deze "keerlijn" rijdt zullen de linker en de rechte reflectiesensor een lijn detecteren.

Als de robot beide lijnen gelijktijdig ziet, dan kan hij 180 graden keren en weer verder rijden.

De robot zal dan in omgekeerde volgorde de lijn volgen, totdat hij weer een "keerlijn" detecteert. Dan zal hij weer omkeren en begint het volgen van de lijn opnieuw.

Maar wat gebeurt er nu als de robot niet precies met beide sensors de "keerlijn" ziet? Kijk eens naar de afbeelding hiernaast. De rechter sensor ziet de "keerlijn" net iets eerder dan de linker sensor.

Wat zou er dan gebeuren als je de robot laat rijden met het programma van opdracht 9.1?

De rechter sensor detecteert dat er een lijn is. In je programma staat iets dat waarschijnlijk lijkt op;

if (landjerobot.detectLine() == LandjeRobot::LINE::RIGHT) {
    landjerobot.turn(LandjeRobot::TURN::RIGHT,10,true) ;
}

De robot draait dus naar rechts als de rechter sensor een lijn detecteerd. Hierdoor komt de linker sensor boven de "keerlijn", maar staat de rechter sensor er weer naast. De robot zal dus nog steeds niet keren. Weet jij wat de robot nu blijft doen ?

De robot blijft dus heen en weer wiebelen voor de "keerlijn". Dit blijft hij doen totdat de batterijen op zijn.

Opdracht 9.2

Probeer nu met je papieren robot te verzinnen en je programma van opdracht 9.1 hoe je kunt voorkomen dat de robot blijft wiebelen voor de "keerlijn". Hoe kun je voorkomen dat de robot gelijk naar links of rechts gaat als hij niet helemaal perfect recht op de "keerlijn" uitkomt?

Tip: Kijk eens in de Landje robot instructieset naar de instructie delay, kun je hier misschien iets mee?.


Opdracht 9.3

Plak met tape de keerlijnen aan het begin en einde van de lijn die de robot moet volgen. Maak de lijnen breed genoeg, ongeveer net zo breed als de wielen van de robot uit elkaar staan. Maak de keerlijnen twee keer zo dik door twee stroken tape naast elkaar te plakken.

Omdat jij waarschijnlijk in opdracht 9.1 je eigen oplossing hebt gemaakt ga je verder met de oplossing zoals deze hieronder staat. Kopieer onderstaande oplossing voor opdracht 9.1 in jouw programma, "Mijn_Robot". Er staat ook commentaar bij dat uitlegt wat de instructies doen. Probeer dit programma dus eerst goed te begrijpen voordat je verder gaat.

void setup() {

       // Start met rijden als de robot aangezet wordt en
       // wacht niet
       landjerobot.move(LandjeRobot::DIRECTION::FORWARD) ;

}

void loop() {

    // Als er niet niets (!) gedetecteerd wordt door de
    // reflectie sensors doe dan iets
    if (landjerobot.detectLine() != LandjeRobot::LINE::NONE) {

        // Als de reflectie sensors links een lijn detecteren
        if (landjerobot.detectLine() == LandjeRobot::LINE::LEFT) {
            // Draai 10 graden naar links en wacht
            landjerobot.turn(LandjeRobot::TURN::LEFT,10,true) ;
        }

        // Als de reflectie sensors rechts een lijn detecteren
        if (landjerobot.detectLine() == LandjeRobot::LINE::RIGHT) {
            // Draai 10 graden naar rechts en wacht
            landjerobot.turn(LandjeRobot::TURN::RIGHT,10,true) ;
        }

        // Laat de robot weer verder rijden
        landjerobot.move(LandjeRobot::DIRECTION::FORWARD) ;

    } // einde if

}

Ga nu je programma uitbreiden. Zorg ervoor dat de robot bij een "keerlijn" omdraait. Als hij omgedraaid is moet de robot weer in de andere richting de lijn gaat volgen, om vervolgens bij de volgende "keerlijn" weer om te keren.

De robot moet dus keren als zowel de linker als rechte reflectiesensor de lijn ziet. Om dit te programmeren kun je de bestaande programmaregels welke de robot naar links en rechts laten draaien als voorbeeld gebruiken.

Dan moet je er nog voor zorgen dat de robot niet blijft wiebelen voor de "keerlijn". Programmeer wat je in opdracht 8.7 hebt verzonnen om de robot goed te laten keren en probeer of het werkt. Lukt het niet? Probeer dan te debuggen wat er fout gaat. Het helpt als je weer met je papieren robot het programma stap voor stap doorloopt.


De mode schakelaar

Je hebt nu een programma klaar dat er voor zorgt dat de robot langs een lijn rijdt en weer keert bij een keerlijn. Straks ga je de robot met een ander programma zelf laten rondrijden en om andere robots en voorwerpen heen rijden. Het zou handig zijn als je beide programma's op de robot kan opslaan en bij het aanzetten van de robot kan kiezen welk programma de robot dan gaat uitvoeren.

Hiervoor moet je wel iets hebben om dit aan de robot te kunnen doorgeven. Dat kan zonder dat je de robot weer op een computer moet aansluiten met de mode schakelaar. Deze schakelaar heeft twee standen, 1 en 2. Door middel van de instructie mode kun je bepalen in welke stand de schakelaar staat.

Opdracht 9.4

In deze opdracht ga je ervoor zorgen dat de robot jouw tot nu to geschreven programma, "Mijn_Robot", alleen start als de mode schakelaar op stand "1" staat. Als de schakelaar in stand "2" mag de robot niets doen. Later ga je ervoor zorgen dat in stand 2 een ander programma gestart wordt.

Als alles goed verlopen is heb je het eerste programma van de robot nu helemaal klaar! Test het programma nu.

Les 10, Meer sensors en motoren

Plaatsen van het robot hoofd

In het hoofd van de robot van de robot zitten een ultrasoon sensor en een led'je. De ultrasoon sensor kan afstand meten met een voor ons niet hoorbaar geluid. Het meet een afstand door een geluidje te maken en te wachten totdat de echo van dit geluid weer terugkomt. Door middel van de tijd welke ligt tussen het vezenden en het weer ontvangen van het geluid kan de computer de afstand berekenen. Het led'je in de mond van de robot kun je laten knipperen zodat het lijkt of het praat. Je kunt het led'je ook aan- of uitzetten en opvragen of het knippert.

Het hoofd van de robot komt op een motorje. Dit is geen gewoon motortje, maar een servo-motor. Een servo-motor kan niet rondjes draaien. Deze motor kan de as precies een half rondje, 180 graden, naar links en naar rechts draaien. Omdat de motor precies weet in welke stand de as staat, kun je aangeven hoevell graden het naar links of rechts moet bewegen.

Straks kun je met de instructie look de richting van de as sturen. De as kun je dan 45 en 90 graden naar links en rechts draaien en precies in het midden zetten. Door het draaien van deze as kun je straks, na het vastzetten van het hoofd van de robot, deze naar links en rechts laten kijken.

Nu is het wel zo handig dat je weet in welke stand de motor staat voordat je het hoofd er op schroeft. Anders is de kans groot dat de robot altijd een andere kan op kijkt dan dat jij wilt dat het kijkt. Daarom ga je eerst ervoor zorgen dat de as van de servo-motor precies in het midden staat voordat je het hoofd van de robot vastmaakt.

Opdracht 10.1

Open de Landje robot instructieset en lees de beschrijving bij de instructie look. Je gaat nu een nieuw programma schrijven dat je alleen zult gebruiken voor het juist instellen van de servo-motor.


De robot is nu compleet, alleen de draden van de sensor en het led-lampje op het hoofd van de robot moet nog aangesloten worden. Op het hoofd van de robot zitten vier draden GND HEAD, VCC HEAD, VCC MOUTH, SIG ULTRA.

De draad GND HEAD sluit je aan op de meest linker onderrij op het breadboard dat verbonden is met GND. De draad VCC HEAD moet op de meest linker bovenrij aangesloten worden.

Met de GND HEAD en VCC HEAD zorg je dat de sensors en het led op het hoofd van de robot aangesloten zijn op de batterij. Nu moet je nog de draden aansluiten om het signaal van de ultrasoon sensor te kunnen ontvangen en het led lampje aan- en uit te kunnen zetten. Sluit de draad VCC MOUTH aan op pin 15 van de Arduino, daarna sluit je de laatste draad SIG ULTRA aan op pin 13.

De robot laten 'praten' en'kijken'

De robot heeft nu mond waarmee het kan 'praten' en een paar ogen waarmee het echt kan kijken. In de volgende opdrachten ga je leren hoe je de robot kunt laten kijken en praten.

Opdracht 10.2

Nu je het hoofd van de robot heb aangesloten is de robot compleet. Op het hoofd van de robot zitten de ultrasoon sensor waarmee je afstanden kunt meten. Ook zit er een led in de mond dat je kunt laten branden. Je kunt de led aan of uit zetten. Ook kun je het laten knipperen voor een aantal seconden. Zoek in de Landje robot instructieset de instructies die je hiervoor nodig hebt. Maak een nieuw programma en probeer deze drie instructies uit. Schrijf bijvoorbeeld instructies die de led laat branden, uit zet en laat knipperen. Tussen deze instructies kun je de delay() instructie gebruiken om even te wachten.


In het hoofd van de robot zit een ultrasoon sensor om afstanden mee te meten, maar hoe werkt deze eigenlijk ? Als de sensor de afstand gaat meten maakt het geluid. Dit geluid is een hoge pieptoon die wij mensen niet kunnen horen. Dit geluid gaat in de richting waar de sensor heen gericht is. Als het geluid iets op zijn weg komt, wordt het geluid weerkaatst en komt het weer terug naar de sensor. Het weerkaatsen van geluid noemen we 'echo'. Zodra de sensor het verstuurde geluid weer ontvangen is, meet het hoe lang het geluid onderweg is geweest van de sensor naar het voorwerp en weer terug.

Geluid verplaatst zich met een snelheid van ongeveer 343 meter per seconde of ruim 1200 km/h! Omdat we weten hoe snel geluid zich verplaatst kunnen we met behulp van de gemeten tijd uitrekenen wat de afstand is tussen de sensor en het voorwerp.

Opdracht 10.3

Als je in de bergen een gil geeft naar een berg hoor je na 12 seconden de echo. Reken uit hoe ver de berg van je af staat.


Opdracht 10.4

In deze opdracht ga je de robot afstand laten meten met behulp van de ultrasoon sensor. Maak een in de Arduino Web editor een nieuw programma, meten_afstand

Om het alvast iets makkelijker te maken krijg je onderstaande programma. Knip en plak dit programma in het nieuwe programma meten_afstand. Vervang daarna op de 3 plekken met ... op met de juiste instructies

void setup() {

    int afstand = 400 ;

    Serial.begin(9600);
    delay(2000);

    // druk de gemeten afstand af zolang
    // de afstand groter is dan 5 cm.
    while (...) {
      ...
      Serial.println(afstand) ;
    }

    // Laat de robot 10 seconden praten
    ...

}

Test het programma door het programma te starten en de monitor in de Ardunio Web editor te openen. Beweeg nu je hand heel langzaam naar de sensor toe. Als het allemaal goed is zal de robot gaan 'praten' als je minder dan 5 cm vanaf de sensor is.


Les 11, Een nieuw programma

In de vorige lessen heb je het eerste programma voor de robot geschreven. Dit programma zorgde ervoor dat de robot een lijn kan volgen en aan het einde van een lijn omkeert. Je startte dit programma door ervoor te zorgen dat de mode schakelaar op "1" stond bij het aanzetten van de robot.

In de volgende lessen ga je het programma uitbreiden. Deze uitbreiding van het programma zal gestart worden als de mode schakelaar bij het aanzetten van de robot op "2" staat.

In plaats van het volgen van een lijn, zul je nu de robot binnen een gebied laten bewegen. Dit gebied maak je door met tape op de vloer de buitenkant te markeren, net zoals op het voorbeeld hier links. Als de robot tijdens het rijden een lijn detecteerd moet de robot draaien en verder rijden binnen het gebied.

Daarnaast ga je gebruik maken van de ogen van de robot, het kan nu immers zien of er iets staat waar omheen gereden moet worden.

Opdracht 11.1

Het is weer tijd om je papieren robot te gebruiken! Pak een vel papier en teken net zoals in de afbeelding hiernaast een rechthoek met een dikke stift. Plaats je papieren robot in het rechthoek en ga er mee rijden.

Kijk nu op hoeveel manieren de reflectie sensors van de robot de lijnen kunnen raken. Beschrijf per manier wat de robot moet doen om binnen de lijnen te blijven. Schrijf dit op de volgende manier op; "Als de [linker | rechter | beide] sensor de lijn detecteert, ... dan ... en ga dan ... ".

Dus bijvoorbeeld: "Als de linker sensor de lijn detecteert, draai dan 10 graden naar links en ga dan vooruit."


Je hebt nu in opdracht 11.1 bedacht wat de robot moet doen om netjes binnen de lijnen op de vloer te blijven. De programma regels die je gaat schrijven om dit te doen moeten herhaald worden zolang als de robot rijdt. Deze programma regels moeten dus in de functie loop() geplaatst worden. Er is alleen nog iets nodig in de functie setup() nodig om de robot goed te laten starten.

Opdracht 11.2

Pak de rol tape en maak hiermee een rechthoek op de vloer. Maak de rechthoek groot genoeg zodat de robot er goed in kan rondrijden. Maar maak hem natuurlijk niet zo groot dat het heel lang duurt voordat de robot een lijn raakt. Later in de lessen zul je een veel grotere rechthoek mogen maken. Nu is een lengte van ėėn tot anderhalve meter per zijde van de rechthoek heel mooi.

Zitten de lijnen mooi? Dan kun je de robot uitproberen. Zet de robot midden in het rechthoek en zet de mode schakelaar op stand 2. Zet de robot dan aan, en wat gebeurt er ?

Tja, er mist iets. De robot moet èèn ding doen zodra je hem aanzet! Open het programma "Mijn_Robot" en pas de functie setup() aan zodat de robot doet wat hij moet doen nadat je hem aanzet! Weet je het niet wat de robot moet doen ? Zet de mode schakelaar dan op stand 1 en zet de robot aan. Nu weet je het!


Tja nu beweegt de robot wel als je de mode schakelaar op 2 zet, maar blijft hij nog niet netjes binnen de lijnen! Dat ga je in de volgende opdracht oplossen.

Opdracht 11.3

Programmeer nu de instructies die je met de papieren robot hebt uitgewerkt zodat de robot binnen de lijnen blijft. Wat moet de robot gaan doen om binnen de lijnen te blijven ?

Tip: Kijk nog eens naar de programma regels die je geschreven hebt voor het volgen van de lijn!

Als je denkt dat het programma goed is, verstuur het dan naar de robot, zet de mode schakelaar op 2 en zet hem aan. Gaat er iets fout, kijk dan goed wat er fout gaat en probeer de fout in het programma te herstellen. Als je het helemaal niet meer begrijpt probeer dan één probleem per keer op te lossen. Als bijvoorbeeld de robot bij het raken van de lijn met de linker sensor niet doet wat jij wilt, zet de robot dan zo neer bij het testen dat hij altijd als eerste de linke lijn raakt. Soms helpt het ook om programma regels uit te zetten. Je kunt programmaregels makkelijk uit zetten door aan het begin van de regel // te typen. De robot weet dan dat het deze regels niet moet uitvoeren.


Zo nu ben je al een heel eind gekomen ! De robot blijft binnen de lijnen en rijdt zelfstandig rond. Alleen als er iets anders binnen de lijnen staat rijdt de robot er tegenaan omdat het nog niets kan zien. Dat gaan je nu in de volgende stappen programmeren. We beginnen eenvoudig en gaan het daarna wat moeilijker maken.

Opdracht 11.4

Zoals gezegd we beginnen eenvoudig. Is het je al opgevallen dat de robot elke keer dat je hem aanzet een andere kant op kijkt ? Je weet daardoor eigenlijk nooit welke kant de robot opkijkt als je hem aanzet. Als je niet weet naar welke kant de robot kijkt, weet je straks ook niet of de robot nu de afstand links, voor of rechts van de robot meet.

Breid nu je programma "Mijn_Robot" uit zodat bij het aanzetten het hoofd van de robot altijd naar voren wijst.


Nu je weet dat de robot altijd begint met vooruitkijken wordt het meten van de afstand vanaf de voorkant van de robot een stuk eenvoudiger. Door tijdens het rijden van de robot de afstand te meten tot een voorwerp voor je kun je ervoor zorgen dat de robot niet tegen andere dingen in het gebied van de robot oprijdt.

Opdracht 11.5

In deze opdracht ga je proberen om de robot te laten stoppen zodra er iets in de weg staat. Laat de robot ruim op tijd stoppen, dus stop als de robot iets ziet wat op 10 centimeter of minder voor de robot staat.

Begin met het meten van de afstand. Maak een variabele afstand en vul deze met de gemeten afstand. Let goed op waar je deze regel gaat plaatsen in je programma. Je moet de hele tijd dat de robot rijdt de afstand meten. Het is niet nodig, of zelfs beter van niet, om de afstand te meten als de robot een lijn detecteert. Weet je ook waarom niet ?

Voeg nu de programmaregels toe welke ervoor zorgen dat de robot stopt als de afstand tussen de robot en een voorwerp kleiner is dan 10cm.


Je robot staat nu stil als er iets op zijn weg ligt, maar wat dan ? Wat moet de robot doen ?

Je kun de robot om laten draaien en verder rijden. Maar het kan ook slimmer, je kunt de robot ook om het obstakel heen laten rijden, zodat het zijn weg verder kan vervolgen.

Maar hoe kun je de robot nu het beste om een obstakel laten rijden? Kijk eens naar de afbeelding rechts. Op deze tekening staan drie lijnen getekend. Iedere lijn wijst in een andere richting, links, vooruit en rechts. Elke lijn geeft de afstand van de robot ten opzichte van het obstakel.

Opdracht 11.6

Als de robot nu om het obstakel heen moet rijden, welke richting zou je hem dan sturen?

De robot kan met zijn hoofd draaien en met de ogen de afstand van de robot tot een voorwerp meten. Als je nu hiermee links, vooruit en rechts van de robot de afstand meet en deze afstanden vergelijkt. Naar welke kant zou de robot moeten rijden de kortste, middelste of langst gemeten afstand ?

Je robot kan nu rondrijden binnen de lijnen en stop als het 10cm voor zich iets ziet staan. Tijd om het programma "Mijn_Robot" weer verder uit te breiden. De robot moet nu gaan beslissen welke kant het op moet gaan rijden om het ding dat hij voor zich ziet staan heen te rijden.

Breid het programma uit na de instructie regel landjerobot.move(LandjeRobot::DIRECTION::STOP) ; wanneer gemeten is dat de afstand tussen de robot en het voorwerp minder dan 10cm is. Zorg nu dat de robot de afstand links en rechts van zich meet. Vergelijk deze twee afstanden en zorg dat de robot nu de juiste kant op draait zodat het om het voorwerp heen rijdt.

Tip: De robot meet de afstand beter als je na het draaien van het hoofd even wacht, 1 seconde is meer dan genoeg, voordat je de afstand meet.

Tijd om te testen ! Zet je robot neer, zet hem met de schakelaar op mode "2" en laat hem rijden binnen de lijnen. Pak nu een voorwerp en plaats deze ver genoeg voor de robot. Rijdt hij er omheen dan ben je geslaagd!


Les 12, Verbeteren van je programma

Je robot kan nu zelfstandig rondrijden. Maar zoals je waarschijnlijk al merkt gaat het nog niet altijd even goed. Soms raakt het nog het voorwerp dat in de weg staat of probeert robot het voorwerp opzij te duwen. Het kan zelfs nog voorkomen dat het over de lijnen rijdt en er vandoor gaat om de rest van de ruimte te verkennen.

In deze laatste les zitten nog vier opdrachten die je helemaal zelfstandig moet uitvoeren.

Opdracht 12.1

Soms als de robot vlak voor een voorwerp moet draaien kan het zijn dat het tijdens het draaien te weinig ruimte heeft en het voorwerp opzij duwt. Hoe kun je dit voorkomen ? Pas het programma aan zodat het bij het draaien geen voorwerpen meer raakt. Heb je geen idee hoe je dit moet oplossen ? Pak dan je papieren robot, teken een obstakel op een vel papier rijd er mee naar het obstakel. Laat je robot draaien bij het obstakel en kijk of je zo ziet wat je moet doen om bij het draaien het obstakel niet te raken.


Opdracht 12.2

Het is nooit leuk als je weer moet stoppen en ergens om heen moet rijden. Dit robot vindt dit ook niet laat de robot mopperen als er iets voor hem staat door het 5 seconden te laten praten!


Opdracht 12.3

Ook als er soms niets voor de robot in de weg staat ziet het iets voor zich en gaat dan een andere kant op. Dit kan komen omdat de robot soms een fout meet. Dit kan komen door echo van het geluid waarmee gemeten wordt of door geluid van een andere robot. Je kunt de robot beter laten zien of er iets voor hem staat. Als de robot denkt dat er iets voor hem staat laat je hem bijvoorbeeld nog eens 5 keer achter elkaar meten. De gemeten afstanden tel je bij elkaar op. Als de opgetelde metingen kleiner is dan 5 keer de afstand waarop de robot zou moeten stoppen heeft de robot zeker goed gezien.


Opdracht 12.4

Het kan zijn dat als er iets recht voor een robot staat er links en rechts nog minder afstand is. De robot kan er dan niet omheen rijden. Maak hier een oplossing voor en test het uit.