Min første robot – LDRbot

Min første robot – LDRbot

Min første robot – LDRbot

For mig har robotter altid være meget interessante. Det kombineret med min interesse for elektronik og programmering har gjort at jeg har kastet mig over et robotprojekt. Det er der kommet LDRbotten ud af.

cropped-ldrbot-01.jpg

LDRbot på LEGO chassis

 

Baggrund

Stærkt inspireret af diverse sider på Internettet omkring hjemmebyggede robotter gik jeg i gang med at bygge en lille autonom robot. Der var nogle helt klare kriterier for projektet, nemlig at prisen skulle holdes på et rimeligt leje og at sværhedsgraden skulle være sådan at der var lidt udfordring i det, men samtidigt på en niveau hvor jeg var rimelig sikker på at det kunne lykkes. 🙂 Selvom projektet nu er blevet lidt mere advanceret og prisen er gået lidt op, så lykkedes det mig i første omgang at overholde de opstilledes kriterier.

Princippet for min LDRbot er ret simpel. Et chassis, to servomotorer til fremdrift, lidt elektronik til styring og et batteri. LDRbotten er glad for lys, og vil søge mod lys. I det følgende vil jer forsøge at gennemgå hvordan jeg har bygget det op, og hvordan LDRbotten virker.

Chassiset

Chassiset er en væsentlig del af alle robotprojekter, uanset robotstørrelse og ambitionsniveau. Til at starte med bruge jeg noget overgemt LEGO fra min barndom, men har nu lavet et virkeligt lowcost chassis er der lidt mere stabilt. Det består af de servomotorer, som er sat sammen med malertape, bunden af en kildevandsflaske som er fikseret med malertape. Rent faktisk er chassiset mere robust end jeg turde håbe på til at starte med. Elektronikken er sat fast med en postelastik. Batteri og lyssensorer er sat fast med malertape. Det gør det nemt at justere placeringen af sensorerne.

De hjul jeg bruger er fra noget LEGO Technic jeg havde liggende, da de uden de store modifikationer kunne fastgøres direkte på servoerne.

Billederne fortæller bedre hvordan det er bygget op.

servobasechassis_01 chassis_02

 

Fremdrift og styring

LDRbotten bruger 2 stk. Continuous Rotation (CR) servomotorer til både fremdrift og styring. Det at det er en CR-servo gør dem lidt specielle, da de, som navnet antyder, bliver ved med at køre rundt, modsat en normal servo som typisk har 180° udsving. Der er flere der bruger almindelige servo som de ombygger til CR-servoer, men da jeg alligevel skulle købe det hele og prisen var ca. det samme, valgte jeg at købe CR-servoer istedet. Det sparer en arbejdsgang, hvor noget kan gå galt.

Jeg har brugt HiTec HSR 1425CR servoer, som jeg købte hos www.electrokit.se til ~170 SEK pr. stkHSR1425CR.

 

Servomotorer, som integrerede enheder, bliver styret med Pulse Width Modulation (PWM) og skal have en puls for hver 20 ms. Det er længden af pulserne, der for almindelige servoer styrer udsvinget, og på CR-servoer hastighed og retning. En puls på 1,5 ms får servoen til at stå stille, og en puls på 1 ms giver fuld hastighed den ene vej og 2 ms giver fuld hastighed den modsatte vej.

Ved at køre motorerne med samme hastighed, vil robotten køre ligeud. Når man vil dreje, så skal hastigheden på den ene motor være højere end den anden, og robotten vil dreje væk fra den side, hvor motoren kører hurtigst. Skal man dreje skarpere, kan man stoppe den anden motor helt, eller endda køre den baglæns. Ved den sidste løsning, vil robotten praktisk talt kunne dreje om sin egen akse. Denne form for styring kaldes differentialstyring, og jeg synes det er den simpleste styringsform til dette brug.

Elektronikken

Elektronikken er bygget op omkring en Atmel ATmega168 Microcontroller, som til dette projekt er noget overkill, men da jeg har en plan om at udvide robotten til at kunne noget mere, faldt valget på denne. Man kunne også have brugt en ATmega8, som passer benforbindelser med 168’eren, men prisforskellen var så lille, at det ikke kunne svare sig.

electronicsFor at have en stabil 5V forsyning fra et batteri med større spænding, bruger jeg en LM7805 regulering til at forsyne microcontrolleren.

2 stk. lysfølsomme modstande, hver koblet som en spændingsdeler med en ekstra modstand, er robottens lysfølere. Disse er forbundet til en af de analoge indgange på microcontrolleren. For at finde den rigtige størrelse på modstandene i spændingsdelerne, kan man bruge denne formel:

modstand = √(R_mørke * R_lys)

hvor modstand er den ekstra modstand til hver spændingsdeler, R_mørke er den modstand den lysfølsomme modstand har i mørke og R_lys er den lysfølsomme modstands modstand i lys. Det gælder her om at måle modstanden i de lysfølsomme modstande i det miljø, hvor man forventer at skulle bruge sin robot. Jeg lavede først den fejl at måle modstanden ved noget nær total mørke og direkte under en halogenlampe. Det resulterede i at ved “normalt” brug, var der så lille difference i udgangsspændningen at det var ubrugeligt. Modstanden måtte derfor ændres lidt. Min erfaring er, at ved at bruge et Breadboard og bruge den beregnede modstand, så er det nemt at måle den resulterende spændning i lys og mørke. På den måde kan man nå at ændre sin modstand og finde den rette inden man lodder det hele sammen. Jeg har i øvrigt loddet modstandene direkte på de lysfølsomme modstande og så trukket lidt krympeflex over dem, således det bliver en færdig sensor der kan bruges i mange sammenhænge.

Styringen er bygget op på et stykke stripboard, for at gøre det lidt nemt. Der indgår naturligvis flere komponenter end dem nævnt her, men de er en del af det samlede kredsløb for at få microcontrolleren til at køre. Disse komponenter og opstillinger kan ses mere i dybden i databladet for microcontrolleren. I diagrammet her på siden, kan du se hele styringens opbygning med alle komponenter.

ldrbot_schematics

Programmeringen

Assembler programmering har jeg prøvet en enkelt gang for nogle år tilbage, og jeg fandt det så bøvlet og uoverskueligt, at jeg mistede interessen for overhovedet at bruge microcontrollere. Derfor har jeg valgt at bruge C som programmeringssprog til projektet her. De der kan programmere i assembler, synes sikkert det er noget pjat og at C compileren laver noget dårlig kode der fylder meget og ikke er optimeret, MEN… I den her sammenhæng er det ikke noget problem overhovedet. Microcontrolleren er ikke nær hverken belastet eller fyldt. Men hatten af for dem der gider assembler… 🙂

Nå, men det faktum at det skulle være i C, var med til at valget af microcontroller faldt på netop Atmels ATmega serie, da der er en fuldt funktionsdygtig freeware C compiler til, og freeware er jo godt. Hvis man eks. vil bruge en af MicroChips PIC Microcontroller koster compileren eller også er de begrænset på en eller flere måder. Programmerings enheden til ATmega’en var også billigere, så alt i alt var der ikke noget at være i tvivl om for mit vedkommende.

Firmwaren er lavet med WinAVR og AVR Studio, begge dele freeware. WinAVR kan hentes her: http://winavr.sourceforge.net/ og AVR Studio kan hentes på Atmels hjemmeside. Man skal lade sig registrere for at kunne hente AVR Studio, men det er gratis – http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2725

Jeg vil ikke gå i detaljer med selve firmwaren, da den kan hentes i sin fulde form, men blot beskrive funktionen med lidt pseudocode:

læs sensorer
hvis(sensor1 > sensor2) 
	servo1 stop
	servo2 frem
hvis(sensor2 > sensor 1) 
	servo1 frem
	servo2 stop
hvis(sensor1 = sensor2)
	servo1 frem
	servo2 frem
goto læs sensorer

Se mere i kildekoden som kan hentes her

LDRbotten som den ser ud nu… Ikke den store forskel fra LEGO chassiset… 🙂

LDRbot på vandflaske chassis