ROBOTICS CCFZ Programmeren van een BoE­bot Versie maart 2009. Citaat Robotica, de naam voor de leer van de robotontwikkeling werd voor het eerst gebruikt in 1942 door de wetenschapper en schrijver Isaac Asimov die drie regels opstelde waar een goede robot aan diende te voldoen. A. Een robot mag niemand kwaad doen en moet B. altijd luisteren naar orders van mensen, tenzij zulke orders met de regels van de eerste wet in conflict komen. C. De robot moet altijd zijn eigen bestaan verdedigen ­ tenzij dat doel met de eerste of tweede regel in conflict zou komen. Inleiding Een robot programmeren is toch hartstikke moeilijk! Daarvoor moet je gestudeerd hebben! Hier proberen we op een eenvoudige manier uit te leggen hoe een programma voor een robot in elkaar steekt. Het is zeker niet de bedoeling van de auteur om een robotbouwvoorschrift te geven van de eerste tot de laatste handeling. Gepoogd wordt creativiteit te stimuleren, waarbij voor het programmeren ondersteuning wordt gegeven. Hopelijk werkt dat en starten veel lezers met deze heel interessante High Tech­activiteit. Als basis voor veel hobby­robots wordt vaak de BoE­ bot gekozen, die heel leerzaam is. (BoE = Board of Education, Leerplaatje, beschikbaar op de robot). Ze is ontwikkeld voor gebruik in Amerika voor leerlingen vanaf een jaar of tien. De engelstalige beschrijving is dan ook in een heel eenvoudige taal geschreven, met een beperkte woordenschat. Deze handleiding gaat over deze BoE­bot. De ervaring leert, dat jongeren vanaf een jaar of twaalf met hulp er aan kunnen beginnen. De BoE­bot en ook het BoE­board ervan, wordt geprogrammeerd in Parallax­Basic, een eenvoudige programmeertaal, die ontwikkeld is door de fabrikant van de BoE­bot. Bij het programmeren kun je kiezen uit heel veel opdrachten, commando’s. Er wordt gelukkig om te beginnen van een programmeertaal maar een beperkt aantal commando’s gebruikt, bijvoorbeeld om te bereiken, dat een robot met voelsprieten obstakelmijdend gedrag krijgt. Dit gedrag is nodig voor de robotrace, die Robotics CCFZ jaarlijks organiseert. Obstakelmijdend wil zeggen, dat als er een voorwerp in de baan van de robot aanwezig is de robot van zijn weg afwijkt om dat voorwerp te ontwijken. Het geschreven programma wordt bewerkt, gecompileerd en naar het geheugen van de robot overgebracht met een eigen programma, de compiler. De processor raadpleegt dat geheugen om de taak uit te voeren. Wat dat allemaal inhoudt wordt verderop toegelicht in de bijlage Programmaverwerking. Wat is een robot? Op basisscholen laat ik zien hoe een robot geprogrammeerd kan worden. Groep 8 leerlingen en ik doen dat samen. De eerste vraag van mij is daarbij altijd wat ze willen worden en of dat met techniek te maken heeft. Want dat wil ik proberen: de jeugd technische dingen laten zien om ze daar later hun brood mee te laten verdienen. Techniek is gewoon hartstikke leuk. De tweede vraag is: wat is een robot? Daar begint dan een discussie over. Ik vertel dan dat het woord “robot” is bedacht door de Tsjech Karel Capek in 1921 en betekent “arbeider, slaaf”. Een robot is bedacht om werk voor de mensen te laten doen. Bij de vraag wat een robot kan, komt de discussie. Een paar keer zijn we uitgekomen op: Een robot is een apparaat, dat zelfstandig een voor mij belangrijke taak verricht en dat kan doen, omdat er een computer in zit, die ik daarvoor heb geprogrammeerd. Er zijn in de wereld heel veel andere definities geschreven, maar ik vind deze best goed. Is een robot iets nieuws? Niet bepaald. Homerus, de grote Griekse schrijver, die leefde van 800 – 750 voor Christus, beschreef al mechanische huishoudelijke hulpen, gegoten in goud door Hephaestus, de god van de metaalsmeden. Ook de Hebreeërs hadden een mannelijke dienaar, geboetseerd uit klei en tot leven gebracht door Kabbalistische magie. Leonardo da Vinci schetste in de vijftiende eeuw plannen voor een mechanische man. Soorten robots Er zijn heel veel soorten robots, machines, die door een computer worden bestuurd. Vanaf mechanische armen, die de werkstukken verplaatsen of in een inpakdoos plaatsen, tot machientjes, die bloedmonsters in apparaten zetten, waarin die monsters onderzocht worden. Maar ook robots, die landmijnen zoeken en kunnen ruimen, en robots, die chemische tanks schoonmaken. Allemaal robots, die saai werk van de mensen overnemen, of die gevaarlijk werk doen. Er zijn ook robots, die veel op mensen (androïden) of dieren lijken. Firma’s maken die om te laten zien hoe knap ze zijn. Het is dus reclame. De Japanse bedrijven Honda en Sony doen dat. En er zijn allerlei robots, die door hobbyisten worden gemaakt. Die vinden dat gewoon leuk. Die robots worden bij CCFZ gemaakt in clubverband, waarbij iedereen elkaar helpt als je een keertje vastgelopen bent. Als de club er dan ook nog een wedstrijd aan verbindt, waarmee geldprijzen zijn te winnen, dan blijft het nog een beetje betaalbaar ook. Besturing robots De bestudering van een robot gebeurt heel gedetailleerd. Alle bewegingen gebeuren door een aandrijving, die moeten worden aangestuurd. Het is daarbij een heel werk om alles op de juiste volgorde in de juiste mate te programmeren. Om maar wat te noemen: Veel robots hebben twee wielen met elk een eigen motor. Voor een robot met twee aangedreven wielen moet elk wiel apart aangestuurd worden. Dat wil zeggen: elk wiel apart moet opdracht krijgen om met een bepaalde snelheid in een gewenste draairichting gedurende een vastgestelde tijd te draaien. Voorkant rijrichting rijrichting Voorkant Draairichting wiel Draairichting wiel Figuur 1 In figuur 1 kun je zien wat dat betekent: de robot, het blauwe karretje met de twee aangedreven grijze wielen en een paars sleepwiel, beweegt vooruit. Als je naar het rechterwiel kijkt (linker plaatje) moet dat wiel rechtsom draaien. Het linkerwiel moet juist linksom draaien om vooruit te bewegen. (rechter plaatje) En om rechtuit te rijden moeten beide wielen even snel draaien. Het is dus echt niet moeilijk; je moet er wel op letten. En je moet dat programmeren. Wil je deze robot op de eigen plaats laten draaien, (een pirouette laten maken) dan moeten de wielen alle twee rechtsom of alle twee linksom draaien. Wil je de robot een bocht laten rijden, dan zou de snelheid van een van de twee wielen kleiner of groter moeten zijn dan de snelheid van het andere wiel. En omdat het vooruitrijden meestal met maximale snelheid gebeurt, kun je de robot een bocht laten rijden door een van de twee wielen wat langzamer te laten gaan: een bocht naar rechts door het rechter wiel te vertragen, een bocht naar links door het linker wiel langzamer te laten draaien. Denk er maar eens over na of dit klopt. Probeer ook na te gaan welke kant de pirouette draait als beide wielen linksom draaien. Servomotoraansturing De signalen, die de processor moet leveren hangen natuurlijk af van het soort apparaat waarvoor ze bestemd zijn. Voor de aandrijving van wielen worden heel vaak servomotors gebruikt. Een servomotor bevat een gelijkstroommotor met een electronische schakeling. De servomotor heeft drie aansluitingen. Uit de voedingsbron, meestal 5­12 Volt wordt de energie geleverd door een vrij grote stroom, meer dan de processor op kan brengen. Die zou daarvan veel te warm worden en stuk gaan. De servomotor wordt daarom met de plus­ en de min­aansluitingen direct op de energiebron aangesloten. De snelheid van de servomotor wordt gestuurd door pulsen uit de processor naar de derde , de signaalaan­ sluiting. Deze pulsen vragen heel weinig energie, dus de processor kan ze direct aan de servomotor leveren. De pulsen komen met een ritme van 50 stuks per seconde. (50 Hz). Elke 20 duizendste van een seconde (20 milliseconde, 20 msec) komt er daarbij een nieuwe puls. De breedte van de pulsen bepaalt de draairichting en snelheid. Het aansturen van de servomotor vindt plaats door de ingebouwde schakeling, die processorpulsen ontvangt met een lengte tussen de 1,3 en 1,7 milliseconden (msec). Bij 1,5 msec staat de motor stil, bij 1,3 msec draait de servomotor met maximale snelheid linksom en bij 1,7 msec met maximale snelheid rechtsom. Voor onze processor betekent dat, dat tussen de 650 en 850 tijdseenheden van 2 µs (2 microseconden is 2 miljoenste seconde) moeten worden afgegeven. Je komt dan uit op 1,3 en 1,7 msec. Veel servomotoren kunnen niet in een draaiichting onbeperkt doordraaien: ze kunnen maar een half rondje draaien, waarna ze vastlopen en alleen nog maar terug kunnen. Deze worden vaak gebruikt in op afstand, radiografisch bestuurde autootjes voor het stuur­ mechanisme. Ze kunnen worden omgebouwd voor aandrijving van robots voor ons doel. In de bijlage Servomotors ombouwen wordt uitgelegd, hoe je zo’n servo kunt ombouwen in een servomotor die door kan draaien. Je moet daarvoor een nokje op een wiel verwijderen en de elektronische schakeling veranderen. Tenslotte is het nog nodig de servomotor fijn te regelen, zodat hij precies stopt bij de aan­ gestuurde waarde van 750. Hieronder staat dat allemaal beschreven. Krijgt de servomotor geen pulsen, dan staat hij gewoon stil. Hieronder is een kort programma vermeld, waarmee geëxperimenteerd kan worden met de aandrijving van de servomotor. Dit programma moet worden ingetypt in het bij de BoE­bot, of het BoE­board horende programma. Nadat de seriële kabel of de USB­kabel is aangesloten op het BoE­board en de computer, kun je op de groene pijl klikken om het gecompileerde programma in de BoE­bot te laden. Zet daarvoor wel de BoE­bot aan en wel in de middelste stand van de schakelaar. In de meest uiterste stand vanaf de uit­situatie zal het programma én de wielaandrijvingen functioneren en wellicht de robot wegrijden (van de tafel af??). In de middelste stand van de schakelaar wordt alles wel geladen, alleen de wiel­aandrijvingen staan dan nog uit. Als je tikfouten hebt gemaakt wordt dat gemeld. Na verbeteren opnieuw proberen, net zo lang totdat het programma meldt, dat alles goed is gegaan. Alleen de rood gedrukte regels moeten worden ingetypt. Sluit de servomotor aan op de 5 V van de BoE­board en de min op de aarde van het BoE­ board. De signaalaansluiting op punt 12 van de processor. Schrijf dan het programma. Motormeetprogramma Elk programma wordt geschreven in het Engels, Amerikaans. De opdrachten zijn engelse woorden, die verkort de opdracht aangeven. Ze zijn niet moeilijk te onthouden. De motorsturing is aangesloten op een van de aansluitpunten van de processor. We kozen voor punt 12. Het programma is: ‘ {$STAMP BS2} ‘ {$PBASIC 2.5} DO PULSOUT 12, 750 PAUSE 20 LOOP END Dat is pas een kort programma toch? De eerste twee regels zijn ervoor om aan te geven om welke processor het gaat (BS2) en met welk programma we aan het werk zijn. (Pbasic2.5) Daar hoeven we ons verder helemaal geen zorgen over te maken. DO … … LOOP Dit zijn twee bij elkaar horende commando’s. De opdrachten, die genoemd worden na DO worden telkens opnieuw uitgevoerd doordat bij LOOP weer teruggesprongen wordt naar DO. In dit geval zou dat dus oneindig lang door kunnen gaan. Met Do en Loop wordt in het programma een lus doorlopen. PAUSE 20 bepaalt de herhalingsfrequentie, de 50 Hz, het keer per seconde ritme. 20 milliseconden wachten en dan opnieuw beginnen, betekent 50 keer per seconde. Reken maar na. PULSOUT geeft op aansluitpunt 12 een puls met een breedte van 750 eenheden. Een eenheid is 2 microseconden (2 miljoenste van een seconde). 750 eenheden is dus 1,5 milliseconde. Voor de volledigheid: Dit is het programma voor de BoE, het door Parallax ontwikkelde printplaatje met daarom een processor op een zgn Stamp, postzegel. Zie ook www.parallax.com. Ze worden geleverd door Antratek: zie www.antratek.nl. De programmeertaal is PBasic. Kijk wat er gebeurt. En wat blijkt: de motor staat stil. Iets niet goed gedaan? Nee hoor. Bij deze pulsbreedte van 750 staat de motor immers stil. De pulsbreedte is daarbij precies 1,5 msec van de 20 msec. Verander het getal 750 maar eens in 650 in het programma en klik weer op RUN. En nu gaat de motor draaien. En verander het getal ook nog een in 850 en Run het weer. Het blijkt, dat de motor de andere kant opdraait dan voor 650 het geval is. Bij een niet goed afgeregelde servomotor staat de as niet helemaal stil bij 750 pulsbreedte. En het is handig dat wel goed af te stellen. Er zit een klein gaatje in de servomotor waar­ mee dat gebeurt. Een kleine schroevendraaier is daarvoor nodig. Draai voorzichtig het eronder liggende potentiometertje in die stand, dat de motor stil staat als het programma van hierboven met de waarde 750 uitgevoerd wordt. Je zou kunnen tekenen hoe snel een servomotor draait bij welk getal, een grafiek ervan maken. En dat is verstandig. Teken een lijn en zet daar op regelmatige afstanden bij de cijfers 400, 450, 500, 550, 600, 650, 700, 750, 800, 850, 900, 950 en 1000. Teken een lijn loodrecht op deze eerste lijn, waarop je de snelheid moet schrijven. Ik deed dat door de motor vijf seconden, vijf tellen te laten draaien tegen een teller van een cassetterecorder. Maar een tellertje van een kilometerteller van een fiets kan ook. Ik kreeg de volgende grafiek. Pulsbreedte Draaisnelheid 400 ­25 450 ­24 500 ­25 550 ­25 600 ­24 650 ­23 700 ­15 750 1 800 15 850 22 900 24 950 25 1000 25 12 10 8 6 4 2 0 Je kunt zien, dat onder 650 en boven 850 de snelheden linksom en rechtsom niet veel meer toenemen. Het heeft dus voor deze motor geen zin om een groter of kleiner getal te kiezen voor de pulsbreedte. Maar tussen 650 en 850 kun je heel precies de snelheid van de servomotor regelen. En dat is mooi, daar kun je gebruik van maken. Voor de andere motor moeten we hetzelfde doen. We sluiten die aan op de voeding van 5 volt en de pulssturing op aansluitpunt 13 van de processor. De eerste servomotor staat immers op aansluitpunt 12. De servomotor op stilstaan regelen met de waarde 750 met het schroefje en ook weer proberen of de grafiek er vergelijkbaar uitziet. Willen we de twee motoren tegelijk laten draaien, elk in tegenovergestelde richting, zodat de robot rechtdoor rijdt, dan hoort het programma te worden gemaakt als hieronder is aangegeven. Als je het vorige begrijpt, moet het programma niet moeilijk zijn. Rijprogramma ‘ {$STAMP BS2} ‘ {$PBASIC 2.5} DO PULSOUT 12, 650 PULSOUT 13, 850 PAUSE 20 LOOP END Hiermee rijdt de robot dus de ene kant uit. Wat moet je doen om hem de andere kant uit te laten rijden? Alle twee de servomotors een andere kant op laten draaien. Hoe? We kunnen nu door het programmeren van elk wiel in een heel kort programma een robot laten bewegen zoals we willen: vooruit, achteruit, een pirouette linksom en rechtsom laten draaien en slappe en scherpe bochten laten nemen. Door de getallen 650 en 850 te veranderen. Probeer dat maar eens. Denk eerst na, wat er volgens jou staat te gebeuren en controleer dat. Daarvan leer je het meest. Om dit hoofdstuk af te sluiten wordt nog een tweetal commando’s uitgelegd. In het programma gebruikten we DO en LOOP om de lus te maken. Met DO en LOOP wordt een programma nooit beëindigd, het gaat maar door. We kunnen de rijopdrachten ook een zelf te bepalen aantal keren laten uitvoeren door het aantal lussen te tellen met en teller. Hieronder zie je hoe dat gaat. Met uitleg. Loops tellen ‘ {$STAMP BS2} ‘ {$PBASIC 2.5} ‘variabelen bepalen teller VAR Word FOR teller = 0 TO 200 STEP 1 PULSOUT 12, 650 PULSOUT 13, 850 PAUSE 20 NEXT END We zien, dat we een variabele, “teller”, hebben benoemd, een variabele hebben gedeclareerd. De grootte van de teller, tot waar hij moet kunnen tellen, moet van te voren worden vastgesteld. Als we willen tellen tot slechts 2, dan kunnen we met een Bit volstaan: “teller VAR Bit”komt er dan te staan. Willen we tot 16 tellen, dan hebben we een Nib nodig. Met een Byte kun je tot 256 tellen. En met Word tot 65536. En hoe ruimer de mogelijkheden worden gekozen, des te grotere ruimte wordt er in het geheugen voor deze variabele gereserveerd. Voor dit geval zou een Byte ons niet beperken in onze mogelijkheden. We zagen al, dat de rijroutine 20 msec duurt. Er gaan er 50 in een seconde. Als we de rijroutine dus 200 keer laten doorlopen, dan rijdt de robot 4 seconden. Nemen we grotere stappen, bijvoorbeeld STEP 4, dan rijdt de robot dus 1 seconde. Ga dit allemaal maar na. Normaal hoef je STEP 1 niet op te nemen in je programma. Zonder nadere aanduiding van de stapgrootte wordt die op 1 gezet. Met deze kennis kunnen we de motors alle twee op alle mogelijke manieren laten draaien. Hebben we een rijdende robot met twee apart aangedreven wielen, dan kunnen we deze net zo nauwkeurig als we willen aansturen: de snelheid en richting kunnen we heel precies programmeren. Maar je hoeft niet met servomotors te werken. Verderop wordt een schakeling besproken, waarmee gelijkstroommotors kunnen worden aangestuurd. Het wordt ingewikkelder, maar ook de aandrijving en sturen als in een auto gebeurt, is natuurlijk mogelijk. Wat je maar bedenken kunt, zou best eens kunnen lukken als je maar heel precies weet wat je wil. Richting aangeven We kunnen met een linker en rechter lampje de richting aangeven, die de robot gaat inslaan. En dat is ook weer echt niet zo erg moeilijk. We moeten weten, dat een lichtgevende diode (LED) via een weerstand R van bijvoorbeeld 220 ohm aangesloten moet worden op 5 Volt. In een elektronisch schema ziet er dat uit als in Figuur 2: het aansluitpunt 4 van de processor wordt voor het linker lampje gebruikt. De weerstand R wordt op dat aansluitpunt aangesloten. De andere kant van de weerstand komt op de positieve aansluiting van de diode. Want een LED is polariteitgevoelig, wat wil zeggen dat de aansluiting van plus en min van de spanning niet willekeurig kan zijn, zoals van een weerstand. De langste aansluiting van de diode moet aan de plus komen, de kortste kunnen we daarna aansluiten aan de massa, de min van de robot. Als de aansluitingen van de diode zijn afgeknipt, dan kun je aan een plat kantje van de diode zien welke de min­aansluiting is. Het rechter lampje wordt bediend door aansluitpunt 8 van de processor. Ook weer via een weerstand R. De grootte van de weerstand R is 220 Ω . In de laatste bijlage staat beschreven hoe de grootte van de weerstand kan worden bepaald door naar de kleuren van de streepjes te kijken. Figuur 2 Het programma om de lampjes aan en uit te zetten is heel simpel. Voor beide lampjes geldt eigenlijk hetzelfde, alleen het cijfer voor de aansluiting moet je goed kiezen. Linker lampje Rechter lampje Do Do High 4 High 8 Pause 500 Pause 500 Low 4 Low 8 Pause 500 Pause 500 Loop Loop Met het commando High wordt er spanning van 5 V gezet op aansluitingen 4 (links) en 8 (rechts). De spanning wordt weer weggehaald (weer 0 V), door Low 4 en Low 8 voor het linker en rechter lampje. Pause 500 betekent, dat telkens een halve seconde wordt gewacht. De lampjes gaan dus steeds een halve seconde aan en een halve seconde uit. Natuurlijk kun je hiermee spelen. De lichtgevende diodes kun je vinden in allerlei kleuren. Zelfs met meer kleuren in één huisje. Voor de richtingaanwijzers neem je gewoonlijk rode LED’s. Koplampen kunnen wit licht uitstralen, een lampje, dat aangeeft dat het apparaat aan staat, kun je groen kiezen. Oranje misschien voor gevaar? Kijk maar op internet naar welke kleuren er bestaan voor de LED’s en maak er wat moois van. Omgeving bekijken met voelsprieten Tot nu toe stuurden we de servomotors aan zonder dat we naar de omgeving keken. De omgeving heeft zo geen invloed op het rijgedrag van de robot. Natuurlijk hoort dat wel zo te zijn. Als er wat in de weg staat, dan moet een robot daarop reageren. Dat kan natuurlijk door ervan weg te draaien (obstakelmijdend gedrag) of er juist naar toe te gaan (obstakelzoekend gedrag). Maar dan moet de robot wel een soort zintuigen hebben, waarmee de obstakels kunnen worden “gezien”. Voor de robotwedstrijd van Robotics CCFZ moet er voor obstakelmijdend gedrag worden gekozen. Figuur 3 Het “kijken” kan met verschillende soorten “zintuigen”, sensors, die constant alert zijn en ieder een eigen soort waarneming doen. Zo kan er op gereflecteerd (infrarood) licht worden gereageerd, op warmte, op gereflecteerd geluid, op gereflecteerde elektromagnetische golven, enzovoorts. Allemaal met sensors, die daarvoor geschikt zijn. Ze geven de waarnemingen door aan de processor, allemaal op hun eigen manier. De processor moeten we daarop programmeren, zodat de motors de robot de juiste richting opstuurt. Obstakels kunnen ook worden ontdekt door voelsprieten, door uitstekende delen, die bij aanraking bijvoorbeeld een signaal afgeven. Er kan bijvoorbeeld een schakelaar worden gesloten. De schakelaar verandert de spanning op een aansluitpunt van de processor,die daardoor weet, dat de robot iets “voelt”. Figuur 3 laat het schema van de aansluiting van het voelsprietcontact aan de processor zien. P7 is dus het aansluitpunt 7 van de processor voor de linker voelspriet; P5 het aansluitpunt 5 daarvan voor de rechter voelspriet. De werking van de schakeling is als volgt. Als de contacten open zijn, dus er wordt niets aangeraakt door de voelspriet, geen contact gemaakt met de omgeving, dan staat er via de weerstanden 10 K en 220 ohm ongeveer 5 volt op de processorcontacten 5 en 7. Raken de voelsprieten iets aan, dan sluiten de contacten zich en wordt 0 volt aan de punten 5 voor rechts en 7 voor links van de processor aangeboden. Hoe dat geprogrammeerd wordt staat verderop. Maar eerst wordt een voorbeeld van een goed bruikbare voelspriet getoond in figuur 4. Kijk maar na hoe dat werkt. De voelspriet is van buigzaam materiaal, bijvoorbeeld verenstaal. Sommigen gebruiken elektriciteitsdraad van koper, maar dat buigt slecht terug. De ring moet niet te dicht bij het schroefje, links op de tekening, zitten, want het buigtraject moet voldoende lang zijn om de voelspriet de ring te kunnen laten raken als er rechts iets in de weg staat. Het aansluitpunt van de processor wordt aangesloten via de weerstand van 220 ohm van het schema van figuur 3. Ik zag ook iemand, die een klein koperen pijpje vast soldeerde op de aardplaat en erdoorheen een veerdraad stak. Het werkt in principe hetzelfde. Natuurlijk kun je ook kiezen voor microswitches, die contact maken, de contacten sluiten, als de voelspriet een obstakel raakt, zoals hiernaast op de foto is te zien. Er zijn dus vele wegen, die hiervoor naar Rome leiden. Voelsprietprogramma Linker lampje op punt 4, rechter voelspriet op punt 5 van de processor. Die combinatie eerst. ‘ {$STAMP BS2} ‘ {$PBASIC 2.5} DO IF (IN5 = 0) THEN High 4 PAUSE 1000 LOW 4 ENDIF LOOP Als de van buiten Inkomende spanning op punt 5 van de processor 0 is door aanraking van de voelspriet en sluiting van het contact, dan gaat lampje 4: 1000 milliseconden aan. Dat is dus 1 seconde. (Als = IF; dan = Then). Afsluiten met ENDIF. En weer opnieuw kijken of de voelspriet iets raakt via de LOOP. Als de spanning op punt 5 niet nul is, dan slaat het programma een paar regels over en gaat naar ENDIF. Via LOOP wordt teruggegaan naar DO om opnieuw te controleren of er iets aan de hand is. Voor de andere combinatie moeten we iets vergelijkbaars invoeren. ‘ {$STAMP BS2} ‘ {$PBASIC 2.5} DO IF (IN7 = 0) THEN Hier staat het voelsprietprogramma. Hierin is geregeld, dat als de rechter voelspriet contact High 8 maakt, dat dan het linker lampje een seconde aan gaat. Als de linker voelspriet zich meldt, PAUSE 1000 dan gaat het rechter lampje een seconde aan. Daarna controleert het programma of de LOW 8 voelspriet weer vrij is. ENDIF LOOP De voelspriet op punt 7, het lampje op punt 8 van de processor. Voor de rest zelfde programma. Als het niet goed gaat, dan kunnen beide voelsprieten tegelijk een obstakel raken. We zouden dan moeten regelen, dat de robot achteruit gaat. Helemaal paniek natuurlijk. Het detectieprogramma kan als volgt luiden: beide lampjes gaan aan. ‘ {$STAMP BS2} ‘ {$PBASIC 2.5} DO IF (IN5 = 0) OR (IN7 = 0) THEN High 4 High 8 PAUSE 1000 LOW 4 LOW 8 ENDIF LOOP OR betekent of. Voelspriet rijprogramma Het rijprogramma om aan de hand van de informatie van de voelsprieten van obstakels weg te gaan (obstakelmijdend gedrag) gaan we nu behandelen. Want dat is natuurlijk de bedoeling: aan de hand van de voelsprieten zo gaan rijden, dat botsingen voorkomen worden: obstakelmijdend gedrag. Als de linker voelspriet aanspreekt, moet de robot iets rechts uitwijken. Als de rechter voelspriet contact maakt, dan moet de robot linksaf bewegen. Zo simpel is het dus. In eerste instantie wordt het recht toe ­ recht aan programma getoond. Daarna zullen we het programma wat structureren. Achter een ’ wordt de stap van het programma toegelicht. In het programma kan zo een commentaar worden toegevoegd. ‘ {$STAMP BS2} ‘ {$PBASIC 2.5} ‘ variabelen aanwijzen teller VAR Byte DO PULSOUT 12, 650 PULSOUT 13, 850 PAUSE 20 IF (IN7 = 0) THEN HIGH 8 FOR teller = 0 TO 25 STEP 1 PULSOUT 12, 650 PULSOUT 13, 800 PAUSE 20 NEXT LOW 8 ENDIF IF (IN5 = 0) THEN HIGH 4 FOR teller = 0 TO 25 STEP 1 PULSOUT 12, 700 PULSOUT 13, 850 PAUSE 20 NEXT LOW 4 ENDIF ‘ linker motor maximale snelheid ‘ rechter motor maximale snelheid ‘ check linker voelspriet. ‘Als er een obstakel is, dan is punt 7 geen nul volt. ‘ rechter lampje aan ‘ 25 keer, dus een halve seconde lang ‘ rechter motor vertraagt ' rechter lampje uit ‘ check rechter voelspriet ‘ linker lampje aan ‘ linker motor vertraagt. ‘ linker lampje uit LOOP END Als beide motors dezelfde snelheid hebben, maar wel in tegengestelde richting draaien, dan gaat onze robot rechtuit. Als geen voelspriet wordt geraakt, dan wordt dat geconstateerd voor de linker voelspriet doordat IN7 niet gelijk is aan 0. Dan springt het programma meteen door naar ENDIF en controleert of de rechter voelspriet contact maakt (IN5). Als die niet gelijk is aan 0, ook dan springt het programma door naar de andere ENDIF. Via de LOOP worden opnieuw de beide motors met maximale snelheid aangedreven. In dit langere programma zijn dus delen van de korte eerder besproken programma’s terug te vinden: dit lange programma is samengesteld uit delen van de vorige kortere program­ ma’s. Om de structuur van de kortere programma’s zichtbaar te houden kun je dit lange programma door middel van zogenaamde routines schrijven. Dan maak je een kort hoofd­ programma, waarin je aparte routines noemt, die verderop preciezer worden uitgeschreven. Een routine benoemen gebeurt met een naam, afgesloten door een dubbele punt, :. Het hoofdprogramma is maar heel kort en eindigt bij END. Vanuit dit hoofdprogramma worden de subroutines benoemd. Het voordeel is overzichtelijkheid. Vooral bij langere listings, programmateksten, is deze werkwijze voordeliger. Je ziet in de subroutines de korte programma’s van vorige voorbeelden terug. Voor sommige robots zijn deze subroutines voorbereid. Zo wordt bij de Conrad Robot Robby gewerkt met BLK’s, blokken programma, die aan elkaar geregen kunnen worden ongeveer zoals in het hoofdprogramma hierboven is gebeurd. Ook de Mindstream van LEGO werkt in wezen zo: grafische eenheden (NQC’s) duiden routines aan, die ook achter elkaar worden geplaatst. Enerzijds vergemakkelijkt deze werkwijze het programmeren, anderzijds heb je zelf minder invloed op de werkwijze binnen een subroutine. Of je moet deze blokken programma zelf kunnen redigeren. Vergt aparte studie. Ondertussen hebben we nu een programma geschreven, dat een robot met voelsprieten goed doet functioneren voor de jaarlijkse Robotwedstrijd van de Computer Club Fort­ Zeekant! ‘ {$STAMP BS2} ‘ {$PBASIC 2.5} ‘ variabelen aanwijzen teller VAR Byte DO GOSUB Rechtuit ‘ Spring naar subroutine Rechtuit IF (IN7 = 0) THEN GOSUB Buigrechts ‘ Spring naar subroutine Buigrechts ELSEIF (IN5 = 0) THEN ‘ Nieuw commando: ELSEIF, oftewel ofwel GOSUB Buiglinks ‘ Spring naar subroutine Buiglinks ENDIF LOOP END Rechtuit: PULSOUT 12, 650 PULSOUT 13, PAUSE 20 RETURN ‘Subroutine Rechtuit: ‘Terug naar waar vandaan gesprongen is Buigrechts: HIGH 8 FOR teller = 0 TO 50 STEP 1 PULSOUT 12, 650 PULSOUT 13, 800 PAUSE 20 NEXT LOW 8 RETURN ‘Subroutine Buigrechts: Buiglinks: HIGH 4 FOR teller = 0 TO 50 STEP 1 PULSOUT 12, 700 PULSOUT 13, 850 PAUSE 20 NEXT LOW 4 RETURN ‘Subroutine Buiglinks: ‘Terug naar waarvandaan gesprongen is ‘Terug naar waar vandaan gesprongen is Licht detecteren Bij het verkennen van de omgeving met voelsprieten wordt er door de voelsprieten contact gemaakt met de omgeving. Natuurlijk is het leuker om op een andere manier de omgeving te “bekijken”, meer vanaf een afstand. Daarvoor zijn andere onderdelen geschikt. Hiervan wordt de lichtgevoelige weerstand eerst behandeld. In figuren 2 en 3 zagen we al weerstanden. Deze zorgen voor een beperking van de stroom als er spanning op de uiteinden wordt gezet. Een spanning van 10 volt met een weerstand van 5 Ω geeft een stroom van 10/5 = 2 ampere. In de figuren 2 en 3 werden weerstanden gebruikt, die een vaste waarde hebben. 10 kΩ (= 10.000 Ω ), en 220 Ω . 200 Ω bij 5 volt geeft dus een stroom van 0,025 ampere, is 25 milliampere, 25 mA. We gaan er hier niet diep op in. Er zijn boekjes, waarin deze elektrotechniek duidelijk wordt uitgelegd. Om licht te detecteren kun je lichtgevoelige weerstanden gebruiken. (LDR = engels van Light Depending Resistance). Hiervan is de waarde van de weerstand in ohms afhankelijk van de hoeveelheid licht, die op de diode valt: hoe meer licht, des te kleiner de weerstand en andersom: bij volledige duisternis is de weerstand 100 kΩ , bij daglicht ongeveer 10 Ω . Daar kunnen we gebruik van maken om de robot te besturen. De schakeling van figuur 5 gaan we hiervoor gebruiken. Figuur 5 Zoals je ziet worden de schakelingen aangesloten op de punten 6 (links) en 3 (rechts) van de processor. Als het donker is, dus als er geen of weinig licht valt op de LDR’s, dan is de weerstand ervan hoog, waardoor een groter deel van de spanning over de LDR komt te staan. De spanning op de punten 6 en 3 zal daardoor lager worden, komt dichter bij Vss = 0 volt te liggen. Staan de LDR’s in het licht, dan daalt de weerstand ervan en wordt de spanning op de punten 6 en 3 hoger, komt dichter bij Vdd, de 5 volt. Nu is het zo, dat op de punten van de processor niet helemaal 0 volt of 5 volt hoeft te zijn voor een hoge of lage spanningsdetectie. De grens ligt bij 1,4 volt. Een hogere spanning dan 1,4 volt ziet de processor als een 1, een lagere als een nul. 1,4 volt wordt de drempel­ spanning genoemd. Met deze schakeling kan worden bepaald of er al dan niet een bepaalde hoeveelheid licht wordt waargenomen door de lichtgevoelige weerstanden. Het bijbehorende programmadeel staat hieronder. LDR­routine De loop en de algemene programmaregels laten we maar even weg, alleen het specifieke deel van het werken met de schakeling van figuur 5 wordt hier genoteerd. Moeilijk is het niet. Kort wel. IF (IN6 = 0) THEN GOSUB Buigrechts ENDIF IF (IN3 = 0) THEN GOSUB Buiglinks ENDIF We maken hierbij dus weer gebruik van de routines die we eerder bespraken. De enige informatie, die we uit de LDR’s betrekken is of er een bepaalde hoeveelheid licht op de LDR’s valt. Is er minder, dan ervaart de processor een 1, is er meer, dan merkt hij een 0. Het programma reageert navenant. Het is ook nog mogelijk om de hoeveelheid licht te meten met een LDR. Daar gaan we in het volgende deel naar kijken. Het wordt wel wat moeilijker. Hoeveelheid omgevingslicht meten Met een condensator, die lading opslaat en via een LDR sneller of langzamer afgeeft wordt een tijd gemeten tot aan de drempelwaarde van de processor. Figuur 6 is het schema. Figuur 6 De condensators C zijn 0,01 µ F groot. Een dergelijke schakeling heet een RC­circuit, dat als volgt werkt. Stel je de condensator voor als een kleine batterij. Als P6, respectievelijk P3 een 5 volts­ spanning afgeven, dan laadt de bijbehorende condensator op tot ongeveer 5 volt. De weerstand van de LDR is namelijk nogal wat groter dan de 220 ohm. Als de aansluiting van de processor na enkele milliseconden omschakelt van 5 volt naar observeren, dan verliest de condensator de lading en de spanning neemt af. Hoe lang dat duurt hangt af van de weerstand van de LDR: hoe minder licht, des te hoger de weerstand en des te langer daardoor de RC­tijd, de tijd, die de condensator nodig heeft om tot de 1,4 volt te ontladen. De processor laten we nu meten hoe lang het duurt voordat de spanning op punt 6 voor links en punt 3 voor rechts, afneemt tot minder dan 1,4 volt. Een testprogramma vind je hieronder. ' {$STAMP} ' {$BASIC 2.5} rctime VAR word do high 6 pause 2 rctime 6,1,rctime debug home,”rctijd = “,DEC5 rctime pause 1000 loop Een viertal nieuwe commando’s zijn in deze figuur op te merken. Dat zijn rctime, Debug en DEC. Die worden hieronder toegelicht. Rctime meet dus de tijd, die nodig is om de condensator te ontladen. Bij het testen van de schakeling varieerde die van 70 tot 2000 eenheden van 2 microseconden. Is dus eigenlijk maar heel kort. (een microseconde is een miljoenste seconde). Debug is een opdracht om de erachter staande gegevens naar de PC terug te sturen, waar ze in een apart Window worden getoond. Home plaatst daarbij de cursor daarbij in de linker bovenhoek. Na telkens 0,2 seconden (PAUSE 1000) wordt een nieuwe waarneming gedaan en het oude getal overschreven via de Do en Loop opdrachten. DEC geeft voor het getal aan hoeveel decimalen er getoond moeten worden. In dit geval dus vijf, vijf cijfers. Dit programma is dus alleen maar bedoeld om te werking van de LDR te meten. Als je wil dat er een reactie wordt geregeld in het gedrag van de Robot, dan moet je met IF … THAN ‘… (en eventueel ELSEIF) aangeven wat dat dan is, zoals Buiglinks of Buigrechts of nog andere dingen. Buiglinks en Buigrechts zijn in vorige voorbeelden al beschreven. Ultrasone obstakeldetectie Geluid, dat zo’n hoge frequentie heeft, zo hoge toon is, dat je het niet meer kunt horen, heet ultrasoon geluid. De mensen kunnen ongeveer geluid horen van 250 tot 4000 trillingen per seconde, 250 – 4000 Hertz. Ultrasone obstakeldetectie werkt bij ongeveer 40.000 trillingen per seconde, 40 kHz. Zelfs honden en katten horen (gelukkig) deze toonhoogte niet. (Anders zouden we in hun buurt problemen kunnen verwachten.) Ultrasone obstakeldetectie gebeurt met een schakeling, die vanuit een ultrasoon zender (klein, speciaal luidsprekertje) een toon uitzendt, die reflecteren, weerkaatsen kan tegen een obstakel. Het teruggekaatste geluid wordt opgevangen door een ultrasoon ontvanger, een soort microfoon. Het geluid verplaatst zich in onze gebieden met een snelheid van ongeveer 1 cm in 29 miljoenste seconde (29 microseconden). Ultrasone obstakeldetectie gaat met een vrij goedkope schakeling, die vaststelt of er zich een obstakel bevindt binnen een vastgestelde afstand. Dat komt, omdat het ultrasone geluid continue wordt uitgezonden. Als de ontvanger het teruggekaatste geluid opvangt, dan wordt het teken: obstakel aanwezig afgegeven. De detectiegevoeligheid hangt af van de sterkte van het geluid en de gevoeligheid van de ontvanger. Die worden met een potentiometer in­ gesteld. Deze soort ultrasoon afstandsdetectie (fabrikaat KEMO B124) kost nog geen € 10.­ en is bij veel zaken te koop, onder meer als parkeerhulp voor auto’s. Er gaat een lampje aan als je bij het achteruitrijden weinig ruimte meer over hebt. Het geluid gaat in een smalle bundel uit de zender. Het teruggekaatste geluid is, afhankelijk van het oppervlak van het obstakel, meer verspreid. Daardoor is het niet mogelijk om met twee ultrasoon sensors te werken. De hele ultrasoon obstakeldetector wordt op een mechanisme opgesteld, dat de detector heen en weer beweegt. Bij de verwerking van de gegevens door de processor moet dus rekening worden gehouden met de stand van de detector, met de richting van de geluidsstroom op het moment, dat het obstakel wordt gedetecteerd. De uitgang van de schakeling is normaal gesproken een LED. De spanning over die diode kan aan de processor worden aangeboden. Ultrasone afstandsmeting Er bestaat ook een schakeling, die echt de tijd meet, die het geluid er over doet om terug te kaatsen van het obstakel. Als je die tijd weet, dan kan de afstand tussen de afstandsmeter en het obstakel vaststellen. Je moet er bij die berekening wel op letten, dat het geluid de heen­ en terugweg af moet leggen. De geluidsbron geeft hiervoor elke 0,75 ms geluids­ pulsen van 0,2 ms af. De ultrasone afstandsmeter bevat een veel ingewikkelder schakeling en is dan ook nogal watl duurder. Ook hiervoor geldt, dat er slechts één afstandsmeter op een robot geplaatst kan worden, die heen en weer moet zwaaien om links en rechts naar obstakels te zoeken. Infrarood afstandsmeting Ging het hierboven om omgevingslicht, het is ook mogelijk om met eigen lampjes (van de robot) eventuele obstakels te ontdekken. Dat gaat onder meer goed met infrarood LED­ lampjes en infrarood detectors TSOP. Dit is echt wel een ingewikkeld verhaal, maar lees het rustig door. Als je het niet begrijpt, doe dan gewoon alle stappen en kijk wat er gebeurt. Ook dan kun je tot een goed werkende infrarood afstandmeting komen. De infrarood detectors werken niet bij een constante lichthoeveelheid, het licht moet met een bepaald ritme aan en uit worden gezet, worden gemoduleerd met een bepaalde frequentie. Die frequentie is ergens tussen de 33.000 en 43.000 keer per seconde, tussen 33 en 43 kHz (kiloHertz). Dat lijkt een nadeel, maar het heeft ook grote voordelen. Dat wordt uitgelegd. Voor het moduleren hebben we weer een nieuw commando voor Freqout, de schakeling staat in figuur 7. Laten we die eerst maar eens bekijken. Figuur 7 De aansluitpunten van de processor zijn nog niet gekozen. Het zal in de loop van de toelichting al wel duidelijk zijn geworden, dat je zelf een vrije aansluiting van de chip­ processor kunt kiezen, je hoeft dezelfde cijfers, aansluitpunten, die hier vermeld zijn, niet precies over te nemen, maar kunt andere kiezen. Het nummer van de aansluiting in het programma moet daarop natuurlijk worden aangepast. Dus wel even apart noteren wat je waar aansluit. De IR­detector heeft drie aansluitingen: een plus, de min en de signaalaansluiting. De IR­ diode, het IR lampje dus, heeft als alle andere lichtgevende diodes, twee aansluitingen. Deze wordt via een weerstand van 1 kΩ aangesloten op de processor. Het is mogelijk deze weerstand te verkleinen om meer licht te geven. Kleiner dan 200 Ω kun je hem niet maken zonder gevaar voor een te grote belasting voor de processor te krijgen. Op een printplaatje kan het er dan zó uitzien. Ik heb de IR­detectors op langere aansluit­ draden gemonteerd om twee redenen: In de eerste plaats kun je ze zo in de gewenste richting buigen om nog nauwkeuriger de werking in te stellen. (ze iets naar buiten laten 'kijken'. In de tweede plaats mag de detector zeker niet te warm worden van het solderen. Ik blies al eens twee exemplaren op door de soldeerbout te lang op de aansluiting te houden. Een gewaarschuwd mens telt voor twee! Ook kun je zien, dat de IR­lampjes in een zwart buisje zijn gemonteerd. Dit is om te voorkomen, dat het licht direct van het lampje naar de detector gaat. Want dan werkt het natuurlijk niet: de obstakels moeten het licht opvangen en terugkaatsen naar de detectors. De buisjes zijn een stukje van een oude balpenmet een geschikte diameter. Aan de onderkant zie je nog de zes aansluitpunten voor spanning en aarde en voor zowel een linker als een rechter IR­afstandmeetsysteem. Tel maar na. Ook op het schema. Elke combinatie van lichtgevende diode en IR­detector moet worden geijkt. Want we weten, dat de gevoeligheid van de detector afhankelijk is van de frequentie, waarmee het opvallen­ de IR­licht aan en uit gaat. In de volgende grafiek is dat weergegeven. De getallen op de horizontale as van de grafiek zijn kHertz. In het getekende geval is de combinatie het meest gevoelig bij 38 kHertz. Bij een lagere frequentie, en ook bij een hogere is de combinatie minder gevoelig. Dat betekent, dat bij 44 KHertz de meest veraf aanwezige obstakels nog kunnen worden gezien. Bij de hogere en bij de lagere frequenties moeten de obstakels dichterbij staan om nog te worden gedetecteerd. En bij nog lagere of hogere nóg dichterbij….. Realiseer je je dat je hiermee de afstand tot de detector kunt meten? Veraf is alleen zichtbaar bij 38 kHertz, Op bijvoorbeeld driekwart van die afstand ziet ook de combinatie dat obstakel bij 37 kHertz. Op de helft van de verste afstand wordt de het gezien bij 37 kHertz. Enzovoorts tot iets van 34 kHertz. Dan moet het obstakel heel dichtbij staan. En lagere frequenties werken helemaal niet meer. Frequentie (kHz) Gevoeligheid 30 31 32 33 34 35 36 37 38 39 40 41 42 5 6 8 15 24 28 30 29 26 18 8 6 5 12 10 8 6 4 2 0 Frequentiegevoeligheid van de IR­combinatie Elke combinatie moet worden geijkt. Daarbij moet blijken of inderdaad de top van de grafiek ligt bij 36 kHertz of misschien toch een beetje verschoven. Want elke diode en elke detector wijkt iets af. We moeten dus eerst weer experimenteren. Dat doen we met de processor en de IR­combinatie moeten we daarvoor aansluiten. Op de foto zien we het printplaatje gemonteerd op een voertuig van Fisher techniek. Het is aangesloten op de processor van de Board of Education van Parallax. Eerst proberen of de twee IR­combinaties goed werken. In het volgende plaatje staat het programma. We zien weer een aantal nieuwe commando’s. ' {$STAMP} ' {$BASIC 2.5} irdetectielinks VAR Bit irdetectierechts VAR Bit freqselect VAR Nib irfreqency Var Word DO DEBUG Home FOR freqselect = 0 to 4 LOOKUP freqselect, (35500, 36500, 37500, 38500, 39500), irfrequency FREQOUT 0,1, irfreqeuncy irdetectielinks = IN1 FREQOUT 14,1, irfrequency irdetectierechts = IN15 DEBUG CR, “IR­frequentie; “dec5 irfrequency DEBUG “IR­detectielinks = “,BIN1 irdetectielinks DEBUG “IR­detectierechts = “,BIN1 irdetectierechts NEXT LOOP Vier variabelen zijn vastgesteld. Gedefinieerd: irdetectielinks, irdetectielinks, freqselect en irfrequency. DEBUG betekent weer: stuur het volgende terug naar je computer en HOME wil zeggen: ga helemaal links bovenin het scherm staan met de cursor. En dan LOOKUP. Die zoekt het getal op met het volgordenummer freqselect van 0 tot 4, dat wil zeggen vijf keer en bepaalt, dat dat getal kan worden opgeroepen door irfreqency. 0 tot 4 wordt geregeld met For freqselect = 0 to 4 en, op het laatst, next. Als freqselect = 0, dan wordt dus irfrequency 37500, het eerste getal, de eerste waarde. Freqout stuurt dan op aansluiting 0 gedurende 1 tijdseenheid van 2 microseconden de frequentie naar het lampje links. Irdetectielinks kijkt dan of er iets wordt waargenomen. Is dat niet het geval, dan is irdetectie 1. Staat er iets dichtbij genoeg in het licht van het lampje, dan wordt irdetectielinks 0. Freqout 14, en IN15 doet hetzelfde voor de rechterkant. Op de computer wordt het resultaat zichtbaar gemaakt met de DEBUG­regels, die hierop volgen. Eerst wordt de irfrequency in niet meer dan 5 cijfers getoond, en er naast of iets zichtbaar is. Voor zowel links als rechts. Kijk maar, dit is de schermafdruk. Er was een stuk wit papier zo ver van detectors gehouden, dat er in het midden een nul komt te staan. Daar is de detector het meest gevoelig dus: bij 40.000 Hertz, bij 40.000 trillingen per seconde. De gevoeligheid van deze detector ligt dus bij een hogere frequentie dan bij ons programma. Hangt af van de IR­detector. Koop de juiste met zo laag mogelijke frequentie. We kunnen de juiste frequenties invullen voor de afstandsmeting. Hiervoor gebruiken we het volgende programma. ' {$STAMP} ' {$BASIC 2.5} freqselect VAR Nib irfrequency VAR Word afstandlinks VAR Nib afstandrechts VAR Nib Do afstandlinks = 0 afstandrechts = 0 DEBUG Home FOR freqselect = 0 to 4 LOOKUP freqselect, [37000,38000,38700,39500,40000], irfrequency FREQOUT 0,1, irfrequency irdetectielinks = IN1 afstandlinks = afstandlinks + irdetectielinks FREQOUT 14,1,irfrequency irdetectierechts = IN15 afstandrechts = afstandrechts + irdetectierechts NEXT DEBUG “Afstandlinks = “,DEC1 afstandlinks DEBUG “Afstandrechts = “, DEC1 afstandrechts LOOP In dit programma halen we nog een grapje uit, door telkens als er geen obstakel wordt gezien, en er dus een 1 als resultaat van het kijken met een frequentie ontstaat, dat die 1­en worden opgeteld. Afstandlinks wordt daarom eerst 0 gemaakt. Na een keer meten wordt afstandlinks verhoogd met het resultaat van de meting irdetectielinks. Daarna gaat de loop, de lus verder en begint de meting van de volgende frequentie. Als daar weer een 1 als resultaat gevonden wordt, dan wordt afstandlinks, die 1 is, verhoogd met weer 1 tot 2. En zo 5 keer achter elkaar. Het resultaat staat hierboven. Een wit stuk papier is redelijk dichtbij de IR­detectors gehouden en wordt goed ontdekt door onze schakeling. Houdt het papiertje verder weg en de getallen nemen toe. Haal je het papier helemaal weg, dan staat er twee keer een vijf. Op deze manier werkt dus de Infrarood detector en dit programma is heel geschikt om de processor er goed op te laten reageren. De programmaregels zijn best wel ingewikkeld. Maar als je stap voor stap alle regels netjes overtikt, en kijkt wat er gebeurt, dan krijg je deze afstandmeting vast goed aan het werk. Robots programmeren moeilijk? Dat weten we pas echt als we voor een rijdende robot een programma hebben geschreven en dat hebben ingevoerd in de computer van die robot. Daarbij gaan we uit van een robot met obstakelmijdend gedrag, geschikt voor de race van Robotics CCFZ, zoals die elk jaar wordt georganiseerd, in 2006 voor het eerst. Laten we eerst maar bepalen van welke apparaten die robot is voorzien. Apparaten, die iets met het programma te doen geven. De foto laat de robot zien. Een robot met twee aangedreven wielen, IR­afstandmeting en twee rode richtingaanwijzers. Dit is een ander printplaatje voor de IR­afstandsmeting dan hierboven is getoond. De schakeling en de werking zijn wel hetzelfde. Je kunt ook de blauwe batterij zien, die onder het printplaatje is gemonteerd. Deze batterij is oplaadbaar, wat best wel handig is. Ben jij de eerste, die vergeten heeft een goede plaats voor de batterij in je voertuig te reserveren? Opmerking: deze robot nam inderdaad deel aan die wedstrijd. Je kunt hem zien opereren op de site van Computer Club Fort­Zeekant. Daar kun je ook constateren, dan de snelheid van deze robot niet groot genoeg is, ondanks dat de bouwer er grotere wielen (twee afsluitdeksels van rioolpijpen) op gemonteerd heeft. Jammer voor hem… Alle aansluitpunten van de processor op een rijtje. Aansluitfunctie Rechter wiel Linker wiel Rechter IR Lamp Rechter IR detector Linker IR lamp Linker IR detector Rechter richtingaanwijzer Linker richtingaanwijzer Nummer 12 13 2 0 8 9 1 10 Wil je andere aansluitpunten gebruiken, dan is daar natuurlijk helemaal geen bezwaar tegen. Het programma moet dan wel daaraan worden aangepast. Maar dat kan eenvoudig. Als je een dergelijk lijstje maakt, dan kun je goed in de gaten houden, dat elk aansluitpunt maar één keer wordt gebruikt. We kunnen de gebruikte variabelen ook even nagaan. Dat helpt sneller te programmeren en voorkomt fouten, als we dat achteraf nog moeten doen, of, als er achteraf nog aanvullingen nodig zijn. Naam teller irfrequentie freqselect irdetectierechts irdetectielinks afstandrechts afstandlinks Het programma zal er dan zo uit kunnen zien. Grootte Byte (tot 256) Word (Tot 65536) Nib (tot 16) Bit (tot 2) Bit Nib Nib ‘{$STAMP BS2} ‘{$PBASIC 2.5} ‘variabelen teller irfrequentie freqselect irdetectierechts irdetectielinks afstandrechts afstandlinks VAR VAR VAR VAR VAR VAR VAR Byte Word Nib Bit Bit Nib Nib ‘Hoofdprogramma, IR­afstandsmetingen DO afstandrechts = 0 ‘ het meetresultaat moet worden opgeteld. Dus met 0 ‘ beginnen afstandlinks = 0 FOR freqselect = 0 to 4 LOOKUP freqselect, [37500, 38250, 39500, 49500, 41500], irfrequentie FREQOUT 2, 1, irfrequentie ‘rechter IR meetset Irdetectierechts = IN0 afstandrechts = afstandrechts + irdetectierechts FREQOUT 8, 1, irfrequentie ‘linker IR meetset Irdetectielinks = IN9 Afstandlinks = afstandlinks + irdetectielinks NEXT IF (afstandlinks < 3) AND (afstandrechts < 3) THEN ‘ < betekent ‘is kleiner dan” GOSUB letop ENDIF IF (afstandrechts < 3) then ‘ rechts wordt een object “gezien” GOSUB buiglinksaf ELSEIF (afstandlinks < 3) THEN ‘ links wordt een object “gezien” GOSUB buigrechtsaf ELSE GOSUB voorwaarts ENDIF LOOP ‘subroutines ‘alle subroutines moeten nu in detail worden beschreven letop: IF (afstandlinks = 0) AND (afstandrechts = 0) THEN ‘ in dit geval is er flink wat mis HIGH 1 ‘ we rijden dan ook maar even achteruit HIGH 10 ‘ waarna we twee keer draaien GOSUB terug GOSUB draailinks GOSUB draailinks LOW 1 LOW 10 ENDIF ‘vervolg van vorige bladzijde terug: ‘Let op de draairichting van de wielen FOR teller = 1 TO 40 PULSOUT 12, 650 PULSOUT 13, 850 PAUSE 20 NEXT RETURN draailinks: HIGH 10 FOR teller = 1 TO 20 PULSOUT 12, 650 PULSOUT 13, 650 PAUSE 20 NEXT LOW 10 RETURN buigrechtsaf: HIGH 1 FOR teller = 1 to 10 PULSOUT 12, 760 PULSOUT 13, 650 PAUSE 20 NEXT LOW 1 RETURN buiglinksaf: HIGH 10 FOR teller = 1 to 10 PULSOUT 12, 850 PULSOUT 13, 730 PAUSE 20 NEXT ‘de wielen draaien nu elk dezelfde kant op ‘het voertuig maakt dan een pirouette. ‘het rechterwiel draait langzamer ‘het linkerwiel draait langzamer LOW 10 RETURN END De volgende toelichtingen kunnen nog worden belangrijk zijn. Bij voorwaarts is PAUSE 10 gekozen, omdat telkens terug wordt gesprongen naar het hoofdprogramma. Dat kost ook tijd. De toelichtingen achter de ‘ zijn niet dik gedrukt. Je zou ze weg kunnen laten. Overzicht behandelde sensors Hieronder een overzicht van alle behandelde sensors met de voor­ en nadelen. Voelsprieten Voordeel: onafhankelijk van kleur of oppervlaktesoort van het obstakel. Nadeel: reikwijdte is beperkt; je ziet het obstakel niet “aankomen”. Een ander nadeel is Lichtdetectie Voordeel: reikwijdte groter. Het obstakel kan helderder of donkerder zijn. Nadeel: het obstakel moet altijd minstens in een bepaalde mate afsteken tegen de achtergrond, het helderder of donkerder zijn. Lichthoeveelheid meten Voordeel: reikwijdte groter. Hiermee kan de absolute hoeveelheid licht worden bepaald. Nadeel: de kleur van het obstakel beïnvloedt de meting. Ultrasoon obstakeldetectie Voordeel: de sensor produceert het eigen meetmedium: ultrasoon geluid. Nadeel: het meetresultaat wordt beïnvloed door de aard van het oppervlak van het obstakel: harde of zachte delen. Ook de grootte van het obstakel beïnvloedt de meting. Het werken met één sensor, die heen en weer zwaait maakt het programma complexer. Ultrasoon afstandsmeting Voordeel: de sensor produceert het eigen meetmedium. Nauwkeurige afstandmeting kan worden bereikt. Nadeel: het meetresultaat wordt beïnvloed door de aard van het oppervlak van het obstakel. Evenals de grootte ervan. De sensor is veel complexer. Het zwaaien van de sensor maakt het programmeren complexer. Infrarood afstandsmeting Voordeel: de sensor produceert het eigen meetmedium: infrarood licht. Nauwkeurig meetresultaat kan worden bereikt. Nadeel: het meetresultaat wordt beïnvloed door de aard van het oppervlak van het obstakel. Zoals in de inleiding al staat geschreven: er zijn heel veel soorten sensors mogelijk. Hier zijn nu de belangrijkste, de meest gebruikte behandeld. In de handel komen we verder nog tegen: aardmagnetismemetingen, drukmetingen, radioactiviteitmetingen, hoogtemetingen, enzovoorts. Deze sensors kunnen deel uit gaan maken van een complexer geheel. Bijvoorbeeld kan een druksensor toegepast worden bij het maken van een evenwichtsorgaan. Zo zijn er meer mogelijkheden. Belangrijk is je fantasie en creativiteit alle ruimte te geven. Hiermee hebben we een robot gemaakt, waarbij de besturing plaatsvindt door een processor, die door signalen van zintuigen zijn weg vindt. De robot heeft twee apart aangedreven wielen. En eigenlijk is dit alles: afhankelijk van waarnemingen via een processor met programma conclusies trekken en motoren aansturen, zodat een bestuurd apparaat optimaal het werk doet, waarvoor het is gemaakt . Programmaverwerking De besturing van een robot gebeurt door een processor met en al dan niet op de chip gemonteerd geheugen. In dat geheugen wordt het door de programmeur gemaakte programma opgeslagen. Dat gebeurt in de vorm van nullen en enen in een zeer compacte vorm, die direct geschikt is voor de processor. Een voorbeeld wordt hieronder getoond, waarbij steeds zestien nullen en enen omgecodeerd zijn in een cijfer­ en lettercombinatie: de hexadecimale codering. (het blauwe deel van de tabellen). Rechts zie je de hoeveelheid geheugen, die wordt gebruikt voor het programma. D 2 kB geheugenruimte van de EEPROM is ruim voldoende. Ook met deze hexadecimale codering kunnen programma’s worden geschreven. Maar dat vergt een zeer grote precisie, ook al omdat de opeenvolgende tekens ons weinig zegt. Een dergelijke wijze van programmeren hoeven we gelukkig niet te doen: daar zijn programma’s voor, heel veel verschillende. Elk van die programma’s helpt op zijn eigen manier om een programma voor de processor te maken. De programma’s worden daarmee geschreven in een eigen programmeertaal. BASIC is een eenvoudige taal. Maar ook Java, C++, Fortran, Pascal en nog meer worden er gebruikt. En sommige van deze talen hebben ook nog meerdere uitgiftes, elk met eigen commando’s, opdrachten, die in de juiste volgorde moeten worden genoteerd. Toch lijken ze allemaal wel een beetje op elkaar. Welk programma de voorkeur heeft is moeilijk te zeggen. Want in de verschillende programmeertalen gemaakte hexadecimale codes kunnen onderling nogal afwijken. De ene taal leent zich gemakkelijker tot compileren, waardoor een meer effectieve werking bereikt wordt. BASIC is gemakkelijker te leren en alle voorbeelden uit dit boekje zijn hiermee gemaakt. Een geschreven programma in welke taal dan ook, kan meestal door het programma worden gecontroleerd. Of er geen fouten in jouw programma zitten. Als die er zijn, dan wordt je daarop geattendeerd, zodat je de fouten kunt verbeteren. Als alles in orde is, wordt jouw programma gecompileerd, omgezet in de nullen en enen, die naar het geheugen van de processor moeten gezonden. Afhankelijk van de lengte van jouw geschreven programma duurt dat langer of korter, maar meestal valt de tijdsduur nogal mee. Servomotors ombouwen We zagen eerder al, dat servomotors een aparte voeding hebben naast een aansluiting, waarop 50 pulsen per seconde worden gezet. En de duur van die pulsen bepaalt de draairichting en de snelheid van de as. Nu zijn er daarvan twee soorten servomotors: een met neutrale stand, en een soort zonder. De servomotor met de neutrale stand kan niet doordraaien: er zit een stop in, zodat de as maar over een boog van ongeveer 170 graden kan draaien. Verder gaat niet. In het midden, dus op ongeveer 85 graden, is er een neutrale stand. Als er geen pulsen worden gestuurd over de stuuraansluiting, dan keert deze soort servomotor terug naar de neutrale stand. Voor radiografisch bestuurde voertuigen bijvoorbeeld is dat handig. Als er geen signaal komt stuurt deze servomotor het voertuig rechtuit. Voor ons doel is dat niet zo handig. Wij willen er wielen mee aandrijven en daarvoor kunnen we geen maximale draaiing gebruiken. De andere soort servomotor is dus voor ons doel beter geschikt. Heb je een motor met eindstop, dan kan die wel worden omgebouwd. Dat is een nauwkeurig werkje, maar mij lukte het en hier beschrijf ik hoe ik te werk ging. Schroef eerst de servomotor voorzichtig open en kijk hoe de tandwielen gemonteerd zijn. Die moet je later weer terug kunnen plaatsen. Bij mij zat een tandwiel op een as van een potentiometer, een variabele weerstand. Je ziet op de foto hiernaast dat een servomotor aardig ingewikkeld in elkaar zit. Het motortje zit op een printplaatje met daarnaast wat elektronische onderdelen, zoals transistors, condenstors en weerstanden. De potentiometer zat rechts, naast het gaatje. Op de foto heb ik die al losgeknipt: drie draden doorgeknipt. Als je goed kijkt zie je ze nog op het printplaatje zitten. De potentiometer ligt naast het printplaatje. De potentiometer blijkt een weerstand te hebben van 5000 ohm. (5 kΩ , spreek uit 5 kilo­oom). Die potentiometer, die een met een middenaftakking heeft, moeten we vervangen door twee vaste weerstanden. Soldeer dus eerst de drie achtergeleven stukken aansluitdraad van de potentiometer los. Let er wel op, dat je bij het solderen de print deze niet beschadigt. Gebruik bijvoorbeeld desoldeerdraad om het soldeer te verwijderen. Ik koos voor twee weerstanden van elk 3300 ohm (3,3 kΩ ) als vervanger voor de potentiometer van 5 kΩ . De kleurcodering van deze weerstand is oranje­ oranje­rood. De rechter van de twee kijkt op de foto hiernaast om het hoekje. Omdat de aansluitpunten van de potentiometer dik zijn kon ik de ene aansluiting van de twee weerstanden in een gat solderen. Daar zat dus de middenaansluiting van de potentiometer. De andere zijden van de weerstand komen in de eindaansluitingen van de potentiometer. Hiermee is de helft van de ombouw gereed. We moeten nu nog de nok van een tandwiel verwijderen. Zoek het bewuste tandwiel op. Bij mij was dat tandwiel gemonteerd op de as van de potentiometer. Hieronder op de linker foto is het afgebeeld met nok rechts. Op de rechter foto zie je dat ik de nok heb weggeknipt, de stukjes liggen ernaast. Het is altijd spannend hoe het resultaat er uit ziet: werkt het? Nou, nadat ik alles weer voorzichtig in elkaar heb gezet, ook alle tandwieltjes op de juiste plaats in de juiste volgorde, de proef op de som genomen: de aansluitingen gemaakt en het testprogramma geschreven. En dan draaien maar? Ja hoor, in beide richtingen en met snelheden, die netjes te regelen zijn. Zo moet het dus. En als ik dat kan ….. Weerstandswaarden in code Kleur Zwart Bruin Rood Oranje Geel Groen Blauw Violet Grijs Wit Waarde 0 1 2 3 4 5 6 7 8 9 Ezelsbrug Zal Beste Rie Ons Geen Groenten Blijven Verkopen Grijs Wit Op weerstanden staan gekleurde bandjes, die een code zijn voor de weerstandswaarde ervan. Om de kleuren te onthouden is er een ezelsbruggetje toegevoegd, dat vaak gebruikt wordt. Als je heel veel met weerstanden werkt hoef je dat ezelsbruggetje op den duur niet meer te kennen. De kleur van het eerste bandje bepaalt het eerste cijfer. De kleur van het tweede bandje bepaalt de kleur van het tweede cijfer. De kleur van het derde bandje bepaalt het aantal nullen, dat moet worden toegevoegd. De kleur van het vierde bandje bepaalt de nauwkeurigheid van de weerstand: Zilver 10 %, goud, 5 % tolerantie. Voor robotica is eigenlijk maar een beperkt aantal weerstanden belangrijk. De waarden met de codes vind je in onderstaande tabel. Weerstandsgrootte 100 Ω 220 Ω 470 Ω 1000 Ω = 1 kΩ 10 kΩ Eerste bandje bruin rood geel bruin bruin Tweede bandje zwart rood violet zwart zwart Derde bandje zwart zwart zwart rood oranje Met een universeelmeter, waarmee ook weerstanden kunnen worden gemeten, kun je de weerstand natuurlijk ook even vaststellen. Voor robotica worden ook een paar condensators gebruikt. Dat zijn 0,01 µ F (microfarad) en 0,1 µ F. Met heel kleine letters en cijfers staat de waarde hierop aangegeven. Slotopmerkingen: Martin Lange dank ik zeer voor de vele opmerkingen en correcties, die hoog nodig bleken. Correcties, aanvullingen en suggesties: [email protected]. Deze worden zeer op prijs gesteld. Dank, H. Dorst