Light Seeker

Af Christian Skjerning, Sebastian Andresen & Jakob Tøttrup

 

 

Systemets opbygning

En robot der drejer om en akse vil have et problem med ledninger hvis der ikke er fundet en god løsning inden robotten bygges. Hvis ledningerne fører til en microcontroller ved siden af robotten, vil ledningerne blive viklet ind i robottens drejeakse ved flere omdrejninger om denne. Det blev hurtigt fastlagt at controlleren og resten af elektronikken skulle side over aksen og derved dreje med rundt når robotten drejer. For at undgå en ledning imellem robot og computer, burde kredsløbet også køre over en ekstern og bærbar strømkilde. Aksen kunne drejes med en række tandhjul på en tynd pind, men alle plausible akselløsninger blev set som for tynde til at bære vægten af en sådan robot i bevægelse Akslen blev det størst mulige hjul der ligger fladt mellem robot og fod, dog med en pind til at holde hjulet i centrum af foden. Alt vægt ligger på det store hjul, og mindsker derfor friktionen og kraften nødvendig for at dreje robotten.

Gearing

Som et eksperiment ville robotten være forsøgt opført uden tandhjul. Dog var en gearing nødvendig for et pænt resultat, da motorerne bevæger sig meget ad gangen, og altid begynder og stopper med store ryk. Gearing ville derfor blive lavet imellem et lille hjul og en stor cirkel. Ved at placere et lille hjul for enden af en lang pind, imens robottens center er i den anden ende af pinden, vil der blive skabt en gearing. Hvis omkredsen af hjulet f.eks. er 4cm og hjulets rute rundt om robottens fod er 20cm, vil motoren skulle dreje 5 omgange for at dreje robotten én omgang.

I begyndelsen blev der brugt et hjul med en diameter på 81.6mm. Det giver en omkreds på 256mm eller 25,6cm. Med en armlængde på 68cm vil hjulet have en rute på 213cm. Motoren skal dreje hjulet 8.5 gang for at dreje robotten en omgang. Det viste sig at denne gearing ikke var nok. Hjulet blev skiftet ud med et mindre, og der blev tilføjet en lille gearing med to tandhjul. Et tandhjul med 8 tænder sidder på motoren og trækker et tandhjul med 24 tænder der sidder på hjulet. Det gav en gearing på 1:3. Diameteren på det nye hjul er 24mm der giver det en omkreds på 75mm eller 7,5cm. Hjulets gearing mod ruten omkring robottens fod er derfor 1:28, der med tandhjulsgearingen giver en total gearing på 1:84.

Motorens placering

Da hjulet er placeret helt ude i enden af en lang pind, var det logisk at placere motoren i nærheden, da det var nemmere at trække en lang ledning langs armen end en lang akse.

Sensorer

Til robotten er der benyttet to LDR (lys-afhængig modstande), der basalt er variable modstande, der ændres i takt med den mængde lys de rammes af. Disse LDR sensorer har en modstand på mellem 20k og 100k ohm alt efter lysstyrke.
LDR-sensorerne er placeret øverst på robotten, i en konfiguration, hvor der i mellem sensorerne er en skillevæg, så effekten af solskin fra siden kun rammer én sensor.

 

Idéen var i første omgang, at bygge en relativ stor ring, hvor der på indersiden skulle køre et hjul på indersiden af ringen og dreje hele den midterste konstruktion. Da det ikke var helt simpelt, blev konstruktionen ændret til den nuværende.
Sensorerne fik et glascover over, så lysmængden blev begrænset, da sensorerne ellers reagerede alt for sensitivt på belysningen.
Hjulet for enden af drejestangen blev reduceret i størrelse, for at minimere drejehastigheden, da solens position ikke ændres så hurtigt. Dette gav samtidigt en større gearing, da relationen mellem robottens radius og hjulets størrelse øges.

 

Sammensætning af hardware

Diagramtegning

 

Komponentbeskrivelse

 

 

Problemer ift. at få hardware til at fungere

Til selve opsætningen af hardwaren har ikke været de store udfordringer. Men til at få systemet til at reagere korrekt ud fra input som LDR-sensorene modtager var lidt udfordrende. Det virkede fint ved indendørstest med lommelygte som lyskilde. Her fulgte robotten lyskilden uden problemer. Udfordringen kom da systemet skulle testes udenfor i solskin. Her virkede det som om der simpelthen var for meget lys, og løsningen derfor var at mindske mængden af lys. Første forsøg var en toiletpapirsrulle skåret midt over, hvor hver del blev sat om en sensor. Denne løsning blev erstattet med et “cover” af farvet plastik der simulerede solbriller for sensorene. Ved den første reviderede test blev modstanden forøget for de to sensorer. Da det kun blev værre blev det i stedet reduceret og “solbrillen” anvendt, hvorefter systemet fungerer som det skal.

 

Robottens opførsel

Imellem to lyssensorer er placeret en skillevæg. Så længe robotten ikke vender direkte mod en lyskilde, vil skillevæggen kaste en skygge på en af sensorerne. Robotten vil altid forsøge at vende sig imod den sensor med mest lys. Der vil altid være små forskelle imellem de to sensorer. Hvis forskellen imellem dem er lille, bør robotten ikke forsøge at bevæge sig. Robotten vil justere sin hastighed i forhold til hvor stor forskellen mellem sensorerne er.

 

Flowdiagram

Kodebeskrivelse

Der gemmes en reference til hver pin der er tilsluttet en sensor. Dette vil gøre det lettere at rette pin-numre hvis ledninger flyttes senere i processen (linje 2-3). Til at styre motoren, bruges et motorshield. Et motorshield behøver kun at kende motorens hastighed (PWM) og retning (HIGH/LOW). En reference gemmes til disse pins (linje 5-6).

Motorens hastighed angives i et helt tal mellem 0 og 255 da det gives med et PWM-signal. Da hastigheden kan nå værdier helt op til 1023 under udregning af hastigheden, bruges en integer fremfor en enkelt byte (linje 9). Værdien af de to sensorer gemmes i integers, da også de kan have en værdi mellem 0 og 1023, da signalet læses gennem arduinoens analog porte (linje 12). I tilfælde af at de to sensorer ikke har nøjagtigt den samme modstand i sig og derved ikke læser den samme værdi selv hvis lysstyrken er ens på de to sensorer, medregnes et offset så sensorerne vil opføre sig ens. Gennem tests af robotten viste det sig at lyssensor1 måler en værdi 30 højere end lyssensor2 (linje 13). En boolean fortæller om robotten bør forsøge at rykke sig (linje 15). Hvis forskellen imellem de to sensorer er mindre end en angivet margin, vil robotten stå stille. Her er margin sat til 4 (linje 16). Grundet robottens vægt på motoren samt friktion i gearingen, vil motoren ikke kunne rykke sig hvis hastigheden sættes for lavt. Samtidigt vil motoren ikke kunne modtage et signal højere end 255, da det er begrænset af arduinoens grænser for PWM. Disse ekstremer gemmes til let ændring i fremtiden hvis motoren bliver i stand til at køre ved lavere hastighed eller hvis et PWM-signal på 255 viser sig at være for hurtigt (linje 19-20).

Ved opstart af robotten, sættes sensorernes pins til input, så arduinoen kan læse sensorernes værdier (linje 24-25). Motorshieldets pins sættes til outputs, så arduinoen kan angive hvilke værdier shielded skal have (linje 26-27).

Værdien af de to sensorer læses og gemmes. Et offset lægges til den ene sensor, så de vil fungere på samme niveau selv trods bygningsfejl (linje 32-33). Hvis forskellen imellem de to sensorer er større end en angivet margen, må robotten forsøge at rykke sig for at udligne sensorerne. Hvis forskellen imellem dem er mindre end denne margen, skal robotten ignorere forskellen, og i stedet vente på at forskellen øges. Dette vil få robotten til at stå stille ved en nogenlunde placering, fremfor for evigt at forsøge at nå et uopnåeligt perfekt mål (linje 36). Motorens hastighed angives med en boolean der her sættes af spørgsmålet om, om sensor1 er større end sensor2. Hvis dette er sandt, vil robotten dreje mod én retning, og dreje mod den modsatte retning hvis det er falskt (linje 37). Motorens hastighed sættes til forskellen imellem de to sensorer (linje 39). Da hver sensor kan nå værdier mellem 0 og 1023, vil forskellen også kunne nå disse værdier i ekstreme tilfælde. Hvis hastigheden er udregnet til en værdi mindre end den mindste tilladte værdi, vil robotten sætte hastigheden op til sin minimumsgrænse, da mindre værdier ikke vil kunne rykke robotten grundet motorens kraft. Hvis hastigheden er udregnet til en større værdi end motorens maksimale tilladte hastighed, sættes hastigheden til motorens højeste grænse. I tilfælde af at hastigheden er udregnet til en værdi imellem motorens angivne grænser, beholdes hastigheden. Dette vil medføre at motorens hastighed er justeret efter forskellens størrelse, så store forskelle imellem sensoren vil dreje robotten hurtigere mod sit mål, imens den vil dreje langsomt mod nærme mål. Da denne hastighed udregnes i hver eneste gennemløbning af kodens loop, vil robotten også selv sænke hastigheden når den når tæt på sit mål. Alt dette angives på linje 40. Til sidst sendes de udregnede værdier ud på de rette pins der vil aktivere robottens egentlige bevægelse (linje 42-43). Hvis robotten tidligere har udregnet at den ikke bør forsøge at rykke sig, vil den sætte motorens hastighed til 0 (linje 43).

Konklusion

Kravet er at konstruere en robot, der kan positionere en flade (solcelle) så vinkelret som muligt på solens stråler via én motor. Dette gør robotten i stor udstrækning og opfylder derfor projektkravet.

Robotten kan kun dreje efter solen på én akse, nemlig rundt om sig selv. En forbedring til bedre dette ville være at tilføje en ekstra motor med gearing og et vippepunkt om en anden akse, således vinklen ift. solens højde også kan indstilles. Robotten benytter allerede en lille form for PID-regulering til positionering, en optimering af denne vil give robotten hurtigere og mere præcis positionering til solen.

 

Video

Leave a Reply