Introductie
Niet gehinderd door een teveel aan kennis van elektronica, mechanica, de programmeertaal C, het bouwen van een simpel robotje in het algemeen besloot ik inmiddels al weer een flink aantal jaren geleden om er zelf maar eens aan te beginnen. Dat werd ingegeven door de gedachte dat we bij de Ai-interessegroep boeiende en leuke onderwerpen bespreken en programmeren, maar het blijft uiteindelijk altijd bij een software simulatie.
Daar is niets mis mee, maar ik werd nieuwsgierig naar AI in de echte wereld. En zo stapte ik binnen bij de Robotica - interessegroep en begon iedereen het hemd van het lijf te vragen. Ik wil niet weten wat ze er op den duur van dachten want van bouwen kwam nog niets. Maar iedereen gaf geduldig antwoord. Heren en dame, mijn dank is groot.
Ik probeer hier verslag te doen van mijn avonturen met Madeleine. Ik streef naar leesbaarheid, maar al schrijvende werd het me duidelijk hoe moeilijk dat is in een wat technisch georiënteerd artikel. Veel zaken verdienen een apart verhaal. Ik hoop dan ook dat zowel starters als kenners wat van hun gading vinden in de algemene documentatie.
Het doel: een simpel robotje bouwen.
- Dat wilde voor mij zeggen dat er gemakkelijk mee geëxperimenteerd kon worden. Zowel hardwarematig als softwarematig.
-
Eenvoudige constructie.
De robot moet gemakkelijk in- en uit elkaar te zetten zijn. Hopelijk zoveel mogelijk door een modulaire opbouw. Sensoren moeten gemakkelijk vervangen kunnen worden. Ik wilde insteekcontacten gebruiken, zodat er weinig gesoldeerd hoefde te worden. -
Simpele software.
Een robot neemt via allerlei sensoren kennis van zijn wereld. Die informatie wil je weten om het gedrag van de robot aan te kunnen passen. Een van de manieren om de info te presenteren is een led-display op de robot. Ik kan daar echter niet enthousiast over worden, want je loopt continu achter je machine aan. Zodoende besloot ik de robot continu met de pc te laten communiceren.Op de pc/laptop gebruik ik Visual Prolog. Dat is een computertaal waar ik zeer vertrouwd mee ben. Op de robot wilde ik c gebruiken. Ik hoopte daarmee de software op de robot zo eenvoudig mogelijk te houden. De pc-software moet het brein voorstellen. De robot-software zorgt voor de uitvoering.
-
Eis: goede, vindbare documentatie.
-
Geen al te dure onderdelen.
Dat was/is soms enigszins strijdig met de documentatie-eis.
Algemene documentatie
- Microcontrollers en de taal C. De schrijver Wim Dolman verdient hulde voor het plaatsen op het internet van dit boek, dat inmiddels is uitverkocht. En een gouden griffel voor de inhoud. Via zijn home-site zijn ook de bronteksten van de voorbeelden uit het boek te downloaden.
- Bouw een robot. Een artikelenreeks van de Belgische RobotMC-club over het bouwen van een robot. Bijvoorbeeld: De bouw van planck
- Bouw een robot. Een vracht aan korte Engelse artikelen over het bouwen van je eerste robot.
- Motorberekening.
De onderdelen
De mechanische opbouw.
- chassis: aluminium plaat. Te krijgen via bijvoorbeeld een bouwmarkt of internetbedrijf.
- achterwielen: Tamya (doorsnede 3.6 cm).
- neuswiel: zwenkwieltje (caster).
- motoren: Tamya (in een behuizing met de versnelling).
- batterijhouders.
- 2 x 4 oplaadbare NIMH batterijen voor controllerbord en 4 oplaadbare NIHM batterijen voor motoren.
Elektronische componenten
- moederbord: Olimex Avr P40 8535.
- microcontroller: Atmega32.
- bluetooth: Sparkfun Bluesmart silver.
- motordriver: L298 dual motordriver.
- sensoren: Sharp GB2D12 IR-sensor.
Besturingssoftware.
- Op robot: c-programma geschreven met Atmel Studio 7.0 Voor de eerste vingeroefeningen heb ik gebruikt gemaakt van een "starterkit en ontwikkelingssysteem" stk500 van Atmel (tegenwoordig Microchip). Het is geïntegreerd in atmel-studio. Het voordeel is ook dat je een externe microcontroller kunt programmeren. Je hebt dus geen programmer nodig. Er is inmiddels een opvolger.
- Op pc: prolog-programma geschreven in Visual Prolog
- communicatie: draadloos via bluetooth of bedraad via usb to 232 kabel
Het bouwproces
Het chassis
Omdat de afstand tussen de achterwielen vastlag was ik gebonden aan de maten voor de grondplaat. Toen ik later begon met sensoren te monteren bleek dat toch wat aan de krappe kant. Bij een volgende robot komen dus losse motoren. Aluminium gezaagd met decoupeerzaag. En twee platen verbonden met lange m3 schroeven omdat ik de juiste hoogte nog niet wist. Later werden dat afstandsbussen.
Differentiële motorbesturing
Om een robot tijdens het rijden van richting te laten veranderen kun je differentiële motorbesturing gebruiken. Daarbij draait het ene achterwiel sneller dan het andere door stroompulsen naar de motoren korter of langer te laten duren. De techniek daarvoor heet pulsbreedtemodulatie.

Uitgebreide uitleg daarover staat in hoofdstuk 22 van "Microcontrollers en de taal C".Ook routines voor gelijkstroommotoren. Dat heb ik eerst maar eens uitgeprobeerd met het ontwikkelbordje (stk500). De microcontroller zit hier dus op het ontwikkelbord. Op de robot zit uitsluitend het motordriverbordje.
Aanvankelijk uitsluitend de ledjes op de stk500 gebruikt. Vervolgens aansluiting naar de robot en tenslotte een atmega32 op de robot geplaatst en geprogrammeerd met behulp van de stk500. Verbonden met insteekcontacten.
Hier is de code. Overigens nog zonder de pulsmodulatie-functies die door timers wordt geregeld.
En dan een eerste testrit. Vervolgens de aansluitingen op het controllerbordje gemaakt.
Communicatie
Aanvankelijk verliep de communicatie bedraad met een RS232-verbinding. Maar als je de robot zichzelf wil laten besturen vanuit een laptop ontkom je niet aan een draadloze verbinding. De enige mogelijkheid op Madeleine is bluetooth. Dat zit niet op het controllerbordje. Er moest dus een printje bij. Ik koos voor Bluesmirf silver vanwege de uitgebreide documentatie. Die had ik wel nodig. Bovendien brandt er een groen lampje op de print zodra er een verbinding tot stand is gekomen. Heel handig. De default baud-rate van de bluetooth-chip op Madeleine is 115200 baud. Dat is een hoge snelheid en dat wilde ik graag zo houden. De baud-rate op de microcontroller hangt af van de kloksnelheid van de atmega32. De kans op transmissiefouten is niet voor alle kloksnelheden gelijk. Daarom koos ik voor een quartz crystal oscillator met een kloksnelheid van 14.7456 Mhz. Dat is een van de "magische" oscillatoren met een gunstige 0 error-rate bij 115200 baud.
Omdat er continue uitwisseling van gegevens nodig was, moest er een protocol ontworpen worden om de structuur van een tekenreeks vast te leggen. De tekenreeks begint met een zogenaamde "header" van 5 bytes waarvan er tot nu toe 3 worden gebruikt: "start of header", "commandnumber", en "start of text". Dan mag een gewone tekst volgen van onbepaalde lengte. Het einde wordt aangegeven door een "end of text" teken.
Uiteraard gebruiken laptop en robot beide dit protocol.
Wat de software betreft had ik aan de laptop-zijde de beschikking over zelfgeschreven routines voor het uitlezen van een RS232-buffer in Microsoft-Windows. Met behulp daarvan kon ik de bluetooth verbinding testen.
Aan de robot zijde een c-programma met routines voor het luisteren naar binnenkomende tekens, een opdracht-menu, het ontcijferen van het protocol, en het terugzenden van een bericht. De code staat hieronder.
De gang van zaken is nu als volgt: De laptop stuurt een opdracht met eventueel argumenten. De robot beschikt over een seriële interrupt. Deze luistert continu naar zijn RS232-buffer (regel 383). In huiselijke termen: Madeleine staat op de post te wachten. Zodra er wat in de bus wordt gegooid m.a.w. zodra daar een "start of header" verschijnt wordt de buffer uitgelezen (case 0). Elk commando wordt herkend aan een eigen vast nummer (case 3). De opdracht wordt opgezocht (regel 95 e.v.) en uitgevoerd. Dan wordt een bericht teruggestuurd naar de laptop. De laptop wacht tot hij antwoord heeft ontvangen en kan dan een volgende opdracht zenden.
"De laptop wacht" staat er zo eenvoudig maar het bleek lastiger dan verwacht. Voor de liefhebbers: het hoofdprogramma gebruikt een timer om te zorgen dat er niet eindeloos wordt gewacht terwijl er geen antwoord van de robot binnenkomt. Maar het kan voorkomen dat het signaal van de robot iets langer op zich laat wachten. Bijvoorbeeld omdat Windows het te druk heeft met zichzelf. Omdat probleem op te lossen heb ik een extra buffertje ingebouwd dat recursief wordt aangeroepen. Met een waitable timer die wat lucht verschaft.
Het verkeer op beide machines is goed te zien op het laptop-programma. Er is een venster om de berichten te zien die laptop en robot elkaar sturen gemixt met berichten van windows en commentaar dat ik op sommige plaatsen in de Visual Prolog code heb gezet om te volgen wat het programma doet..
Hieronder een voorbeeld.
In de eerste 4 regels zoekt bluetooth verbinding en als het goed gaat meldt Madeleine zich. Dan volgt een opdracht om een afstandssensor (zie hierna) uit te lezen. Op regel 15 heeft Madeleine een bericht teruggestuurd en is dat door de laptop ontvangen. Daarna ontcijferd en op regel 21 het resultaat gemeld.
Afstandssensor
Na wat vingeroefeningen op het stk500-bordje met een geïmproviseerde joystick heb ik een sharp-ir-distance-sensor-gp2d12 geplaatst op Madeleine voor metingen tussen de 10 en 80 centimeter. Madeleine is dus enigszins bijziende! Dat ging aanvankelijk mis. Maar op een bijeenkomst van de AI vermoedde Abraham dat waarschijnlijk een hardwareverbinding de oorzaak zou zijn van de niet werkende sharpsensor. Hij bood aan om met een Bascom programma te checken of dat inderdaad zo was. En inderdaad: slechte soldeerverbindingen bleken de oorzaak. Abraham heeft ook andere soldeerverbindingen nagelopen en zo nodig hersteld. Dank, dank. Nu Madeleine uit het herstellingsoord was teruggekeerd heb ik natuurlijk eerst wat metingen verricht.
Je kunt ze vergelijken met de gegevens van de datasheet.
Rijden maar
Met in gedachten de roboramawedstrijden van 2016 besloot ik dat Madeleine nu eerst maar eens langs een wand moest rijden en omkeren. Dat werd de eerste opgave. Er werden een linker- en rechtersensor bij geplaatst. De route van de robot is in Visual Prolog geprogrammeerd in slechts één predicaat met de "naam heen en weer".
Aan de hand van de binnenkomende sensorwaarden zoekt Visual Prolog op de laptop naar een passende opdracht en stuurt die naar de robot die hem vervolgens uitvoert.
Het resultaat werd gefilmd door Abraham Vreugdenhil en op youtube geplaatst.
maidentrip van MadeleineIs Madeleine intelligent?
Met andere woorden: valt dit alles onder kunstmatige intelligentie? Het antwoord kan kort zijn: Ja. Althans volgens de beschouwingen van Russell en Norvig. Madeleine is een doelgerichte robot. Zie daarvoor de volgende link.
Doelgerichte agenten.Goal-based agents breiden de mogelijkheden van de modelgebaseerde agents verder uit, door gebruik te maken van "doel"-informatie. Doelinformatie beschrijft situaties die wenselijk zijn. Hierdoor kan de agent een keuze maken uit meerdere mogelijkheden, waarbij hij degene selecteert die een doeltoestand bereikt. Zoeken en plannen zijn de subvelden van de kunstmatige intelligentie gewijd aan het vinden van actie sequenties die de doelen van de agent bereiken. Vertaald met www.DeepL.com/Translator (gratis versie) \
Het afleggen van een route langs de wand is het doel van Madeleine. De "doel"-informatie ligt vast in de clauses van het predicaat "heenEnWeer". De positie waarin ze zich bevindt wordt aangegeven door de waarden van het het domein richting (start, heen, keren, tussenstop, terug, stop). De afstanden die ze "ziet" zijn uiteraard de waarden van de linker-,midden- en rechtersensor. Ze kiest dus een mogelijkheid uit de combinaties van positie en afstandsgegevens en bepaalt zo haar route. De actie die ze moet ondernemen ligt vast in de resultaatwaarde van het predicaat "heenEnWeer"
Tenslotte
- Zoals geschreven wil ik een volgende keer losse motoren gebruiken.
- De metalen caster die ik gebruikte als neuswiel, is wat lawaaïg en stroef. Ook de positie moet wat aan te passen zijn, zodat minder wordt afgeweken van de juiste richting. Ook al is de constructie wat lastiger, een los neuswieltje bevalt waarschijnlijk beter.
- De toegankelijkheid van de batterijen verdient een volgende keer meer aandacht.
- Bij de aluminium grondplaten maak je als beginneling wat sneller kans op kortsluiting. Ze buigen ook iets door dus ik had twee extra afstandsbusjes nodig voor de stevigheid.
- De afstandsensoren zijn maar op een punt bevestigd. Dat was een slecht idee. Dit had als duidelijke oorzaak dat ik er van te voren niet bij had stilgestaan.
- De 4 oplaadbare batterijen leveren 5 volt. De motortjes gebruiken 3 volt. Dat moet beter. Het maakt het instellen van de differentiële motorbesturing gemakkelijker.
- Enigszins tot mijn verrassing bleven de insteekcontacten goed zitten.
- Wat bluetooth betreft: dat heeft in feite prima gewerkt. Al kende windows10 onlangs een periode met veel bluetoothproblemen. Inmiddels heb ik de indruk dat het weer inorde is.
- De communicatie-software op Visual Prolog en Madeleine werkt goed. Aanvankelijk: testen, testen en nog eens testen.
- Door gebrek aan ervaring had ik van te voren geen goede voorstelling van de robot. Inmiddels heb ik ontdekt dat je een robot moet ontwerpen aan de hand van zijn leefwereld. Net als levende wezens functioneert hij het beste als hij goed is aangepast aan zijn omgeving.
- Na al deze avonturen wilde ik aan de slag met allerlei andere sensoren. En ook onderzoeken of bepaalde software beter op de robot kon staan. Door persoonlijke omstandigheden ging dat niet door. Toen ik na enkele jaren de draad weer kon opnemen zag de wereld er anders uit. Maar dat komt in een ander artikel.
