Solarbot 3000

Michael Holton | Bjørn Hansen | Josephine Plass-Nielsen | Oliver Nielsen

Formål

Robotten har til formål at følge solens bane hen over himlen, hvormed det skal være muligt at påsætte et solcellepanel. Solcellen vil da udnytte position og vinkel optimalt, i forhold til at udvinde mest mulig energi fra solen. Robotten består af to foto-resistorer, der sender signaler til en Arduino microcontroller. Mikrokontrolleren er koblet til en motor, der roterer robottens solfanger-platform, så den følger solens lys.   

Robottens opbygning

Tanken med opbygningen af robotten er, at den skal have en roterbar flade, der er delt i to af en ”væg”. På hver side af denne væg, skal der sidde en foto-resistor i midten. Hvis der måles væsentlig forskel af lysstyrke på de to sensorer, skal robotten dreje fladen mod højre, indtil begge sensorers værdier er inden for en margin på 2% . Det er besluttet, at motoren kun skal kunne rotere fra venstre mod højre, da den skal følge solens bane, som er fra øst mod vest. Robotten holder dog styr på, hvor mange “steps”, at den tager. Denne løsning er blevet implementeret, da robotten skal køre tilbage til udgangspunktet for at kunne fange solen, når dens står op igen i øst. Det maksimale antal af steps, som robotten kan tage, er sat til 16. Tallet 16 er valgt på baggrund af praktisk efterprøvning, og det svarer til, at robotten holder sig til at bevæge sig cirka 180 grader, hvilket også stort set passer med solens bane, før den går ned i vest. Da robotten kun skulle bevæge sig 180 grader, fandt gruppen, at det ikke var nødvendigt at fastmontere ledningerne direkte på robotten. Ved tidligere tests var det problematisk, men efter implementationen af de max 16 steps, var det ikke længere et problem.
Motoren er udstyret med én gearing, da den ellers ville køre stærkere end det ville have været ønskværdigt i forhold til solen.. Selve motoren er placeret i midten med mundingen opad. Dette var umiddelbart den simpleste opbygning, også i forhold til antallet af legoklodser, som skulle bruges til opbygningen af robotten.

Som udgangspunkt har det været ganske problemfrit at bygge robotten. Foden er dog blevet lavet større i løbet af processen, for at den blev mere stabil. Ligeledes er der i processen også blevet skiftet et lille tandhjul med et større, så motoren kom til at køre langsommere.

 

Robottens Hardware

Robotten er blevet bygget til at fremstå så simpelt som muligt. Følgende komponenter er blevet anvendt:

 

  • 1x Arduino Mikrokontroller
  • 1x Motorshield  
  • 1x LEGO-motor
  • 2x LDR sensorer
  • 4x Batterier med 1,2 V
  • 2x LEGO-tandhjul
  • 2x 10K ohm resistorer
  • Ledninger

 

Mikrokontrolleren bruges til at modtage analog input fra lyssensorerne, behandle dataen i programkoden, og output et signal til aktuatoren.

Et motorshield anvendes, da Arduino-controlleren ikke er beregnet til at håndtere så store mængder strøm, som en DC motor trækker. Motorshield’et kan håndtere op til to motorere, men i dette projekt, er der kun anvendt en.
LEGO motoren er en aktuator i dette projekt. Sol-platformen er koblet på motoren, så den kan rotere.
Fotosensorerne (LDR) modtager et analog input, afhængigt af lysforhold i det fysiske rum. Det bruges til at måle lysinput fra solen.
Fire 1,2 volts batterier udgør robottens energikilde. Der bliver derfor leveret 4,8 volt i alt.
To LEGO tandhjul bruges til at geare robottens motor, således at solplatformen roterer langsommere end motoren drejer rundt.
Resistorere og ledninger benyttes i forbindelse med kredsløbet.

På billedet vises robottens elektroniske komponenter og hvor de sidder.

 

Sensorerne og motoren er sat i parallelforbindelse, mens sensorerne og resistorer sidder i serieforbindelse. Kredsløbet kan ses på nedenstående tegning og TinkerCAD kredsløbet.

 

Herunder ses der beregninger for kredsløbet.

Der er henholdsvis blevet udregnet spændingsfald over en LDR sensor, ved højt og lavt lys. Og der er blevet beregnet strømdeling over LDR sensorer, når den ene sensor får højt lys, og den anden får lavt lys.

   

 

 

Robottens opførsel

Når enheden aktiveres, starter den fra step nul. Step er en variabel, vi selv har oprettet. Disse steps bruges til at fortælle enheden, hvornår den skal køre tilbage til startpositionen. Solen vil gå ned på et tidspunkt og når det sker, er der mørkt. Derfor er enheden programmeret til at have en startposition svarende til solens position ved daggry. Enhedens lyssensorer aktiveres, når den tændes og begynder at måle lysforholdet. Når procent-differencen mellem den højre (set oppefra) lyssensor (LDR1) og den venstre (LDR2) er større end to, vil motoren starte. Programmet venter i 0,01 sekund, og slukker derefter motoren igen. Dette gør, at motoren ikke drejer for meget ad gangen, og derfor risikerer at dreje forbi solens position. Herefter vil der blive talt én op i step-tælleren. Når stepvariablen har nået 16, vil enheden dreje tilbage til startposition. Dette symboliserer, at solen er gået ned, og robotten derfor skal nulstilles, så den er klar til at modtage data igen, når solen står op. For at robotten drejer tilbage til udgangspunktet, vil den starte motoren i modsat retning i forhold til før (mod uret). Programmet venter derefter i 16 gange 0,01 sekunder, det sikrer, at rotationen varer lige så lang tid baglæns, som robotten har roteret fremad, nemlig 16 steps. Robotten vil herefter vende tilbage til hoved-loopet, og tjekke forskellen mellem det input, som den får fra hver lyssensorer.

 

Her ses et flowdiagram, der viser robottens opførsel. Diagrammet er lavet ud fra programkoden.

*0,1 sek. i stedet for 0,01 sek.

Programkode

Her ses programkoden til robotten, skrevet i Arduino Language, som er et sæt af C/C++ funktioner:

const int LeftSensor = 2;    // connect sensor to analog input 0
const int RightSensor = 3;

int LeftInput, Leftpercent, RightInput, Rightpercent, diff, steps;

void setup() {
 steps = 0;
 Serial.begin(9600);

 //Setup Channel A
 pinMode(12, OUTPUT); //Initiates Motor Channel A pin
 pinMode(9, OUTPUT); //Initiates Brake Channel A pin

 //STOP MOTOR
 digitalWrite(12, HIGH); //Establishes backward direction of Channel A
 analogWrite(3, 0);   //Spins the motor on Channel A at half speed
}

void loop() {

 if (steps == 16) {
   digitalWrite(12, LOW); //Establishes backward direction of Channel A
   analogWrite(3, 100);   //Spins the motor on Channel A at half speed

   delay(100*steps);

   //STOP MOTOR
   analogWrite(3, 0);   //Spins the motor on Channel A at half speed

   steps = 0;
 }

 LeftInput = analogRead(LeftSensor);    // read the analog input
 Leftpercent = map(LeftInput, 0, 1023, 0, 100);
 RightInput = analogRead(RightSensor);    // read the analog input
 Rightpercent = map(RightInput, 0, 1023, 0, 100);

 diff = Rightpercent - Leftpercent;

 if ( diff > 2) {

   //START MOTOR
   steps++;
   digitalWrite(12, HIGH); //Establishes backward direction of Channel A
   analogWrite(3, 100);   //Spins the motor on Channel A at half speed

   delay(100);

   //STOP MOTOR
   analogWrite(3, 0);   //Spins the motor on Channel A at half speed
 }
}

 

Konklusion

Det kan konkluderes, at gruppen formåede at løse opgaven med at bygge en robot-solfanger, som kan følge den stærkeste lyskilde til stede, når enheden er aktiv. Robotten er bygget, så den følger solens bane fra øst til vest, og når den når tilstrækkelig langt mod vest (hvor solen forventeligt vil gå ned), så kører den platformen tilbage til udgangspositionen i øst.

Selvom robotten løser opgaven, er der dog nogle ting, som ville være fornuftige at forbedre på/ændre, såfremt man havde længere tid.
Det kan fx påtales, at antallet af steps motoren kører udelukkende er baseret på praktiske forsøg – her havde det været en idé at regne lidt mere på solens bane og hvor mange grader, at solen bevæger sig fra den står op til den går ned. Hertil vil der måske også være et behov for indregning af solens placering og bane i forhold til årstiden – men så var der måske også brug for flere sensorer og at pladen kan bevæge sig om x-aksen også.
Noget andet i koden er, at robottens bevægelse er baseret på tid – 0,1 sek – hvilket også er besluttet ved praktisk efterprøvning. Umiddelbart ville det nok være mere præcist at basere bevægelsen på hastighed/længde, frem for tiden. Med dette in mente, vil man også kunne lave beregninger, der kunne vise, om gruppens margin på 2% forskel mellem lyssensorerne er tilstrækkeligt sensitiv i forhold til den optimale udnyttelse af solens energi.
Rent opbygningsmæssigt ville det også have været en fordel, hvis pladen og væggen mellem sensorerne havde været større. Robotten er dog testet ude i rigtigt sollys og virker efter hensigten.

Video

Leave a Reply