Ben's prikbord. (Over robot Madeleine)

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.

Algemene documentatie

De onderdelen

De mechanische opbouw.

chassis met wielen,motoren,batterijhouders
chassis met wielen,motoren,batterijhouders

Elektronische componenten

Besturingssoftware.

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

testopstelling met stk500 en motordriverbordje
testopstelling met stk500 en motordriverbordje

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.

PWM gemiddelde waarde
PWM gemiddelde waarde.

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.

aansluitingen naar de poorten op de atmega32
aansluitingen naar de poorten op de atmega32A.

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.

Afstandmetingen
Meetopstelling voor adc-sensor

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 Madeleine

Is 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

Staatsieportret van Madeleine
Staatsieportret van Madeleine anno 2020. Kicking and alive.