Af Laura, Pernille & Sandra

Systemet

Systemet er bygget op af legoklodser, hvor bunden er bygget op med en motor. Motoren er placeret i bunden for at gøre konstruktionen så stabil som mulig. Fra bunden er der forbindelse fra tandhjul til resten af konstruktionen. Disse tandhjul styrer både et potentiometer, som har til formål at afgøre, hvor langt motoren har kørt, og ”solcellen” som er lavet af to lyssensorer – denne er placeret på toppen. Gruppen har bygget en vinklet flade, samt skaber en afgrænsning midt på denne, for at adskille de to lyssensorer.

Robotten har undervejs været ændret flere gange for at få konstruktionen til at være så stabil som mulig. Der er på den baggrund blevet bygget en ”væg” af LEGO, samt bygget et udhæng til potentiometeret. Potentiometeret er blevet bygget ind i en klods, for at løse et problem med at potentiometeret rykker sig, når motoren bevæger sig, i stedet for at dreje og ændre værdi.

Robottens hardware er hovedsageligt sat sammen på et breadboard, og med faste ledninger. Det optimale ville være at tage hensyn til at ledningerne bliver slidt ved brug, da de bliver bevæget sammen med solcellen. Det har undervejs også givet problemer i form af at ledningerne kan blive revet ud af Arduinoen, samt at ledningerne kan dreje lyssensorerne, så de peger i en forkert retning. Det er forsøgt løst ved at lave ledningerne længere, samt putte hver ben fra lyssensorerne ind i sit eget hul på legoklodsen.

Hardware

  • 2 * 1K Ohms modstande
  • Arduino UNO
  • Batteri, 9V
  • Breadboard
  • DC-motor
  • 2 * LDR
  • Ledninger
  • Lego
  • Motorshield
  • Potentiometer

På det første billedet nedenfor ses et diagram over hardwarens sammensætning. Her ses hvordan Arduinoen med motorshield, er koblet sammen med både lyssensorer, potentiometer, motor og et batteri. Her ses at potentiometeret er sat i motorshieldets pin A2, og lyssensorer er sat i henholdsvis pin A0 og pin A1. Motorshieldet er valgt på baggrund af at kunne få robotten til at køre begge veje, så systemet kan resettes, når den når til maksimum værdien på potentiometeret, som sker når solen er gået ned.

Opførsel

På flow-diagrammet ses opførslen af robotten.

Kode

if(followSun == true) {
    if (rightSensorValue > leftSensorValue && rightSensorValue != leftSensorValue){
      digitalWrite(dirPin, LOW);
      digitalWrite(brakePin, LOW);
      analogWrite(3,40); 
      Serial.println("Going right!");

         
    }
  if(rightSensorValue < 30 && leftSensorValue < 30 && reset==false){
      digitalWrite(dirPin, LOW);
      digitalWrite(brakePin, HIGH);
      analogWrite(3,0);
      Serial.println("STOP");
      
      }

if (potValue >= 1000 || potValue <=50) {
      digitalWrite(dirPin, LOW);
      digitalWrite(brakePin, HIGH);
      analogWrite(3,0);
      
      followSun = false;
      reset = true;
    }
  }

Solfangerens bevægelse bliver aktiveret når followSun booleanen er sand – allerførste gang koden køres igennem, er denne automatisk sand. Når denne er sand igangsættes bevægelsen, der styrer motorens bevægelse. Hvis den højre lyssensors værdi er højere end den venstres, vil motoren igangsættes og solfangeren vil dreje i retning mod solen.
Hvis de to lyssensorers værdi er ens, skal motorens rotation stoppe og solfangeren skal blive stående i positionen, indtil lyssensorens værdi igen bliver forskellige.

I den brugte kode, er der skrevet at hvis de to værdier begge er under 30, vil robotten standses – dette er gjort på baggrund af de to værdier dermed ikke behøver at være præcis det samme, da lyset i rummet forstyrrer dette.
Når potentiometerets værdi er over 1000 eller under 50, standses motoren, og booleanen followSun sættes til false, og booleanen reset til sand. Dette er gjort for at solfangeren bliver reset, når dagen er slut og derved er klar til næste dag.

 if(reset == true) 
  {
    while (potValue >= 100)
    {
        //drive motor left, turn back solar cell
        digitalWrite(dirPin, HIGH);
        digitalWrite(brakePin, LOW);
        analogWrite(3,40);
        
        potValue = analogRead(potPin);
        Serial.print("POTVALUE: ");
        Serial.println(potValue);
         
    }
    followSun = true; 
    reset = false; 
 
  }

Hvis reset er sand går den ind i if-statementet, der skal genstarte solfangeren. Imens potentiometerets værdi er større end 100 kører solfangeren tilbage til startpositionen, før reset igen sættes til falsk og followSun sættes til sand.

Udfordringer

Et af de store problemer har været, at få Arduinoen ind i reset loopet og komme ud igen efter at robotten var resat. Dette var et problem, da gruppen startede med at forsøge at få robotten til at resette i et if-statment i stedet for et while loop. Dette gjorde at robotten ikke nåede at genstarte til en ny dag, inden den fangede solen og kørte videre. Gruppen prøvede at løse dette med et delay, men dette forhindrede robotten i at komme ud af restart loopet og der startede derfor ikke en ny dag.

Konklusion & perspektivering

Robotten lever op til opgaveformuleringen om at konstruere en solcellestyring, der drejer en solcelle efter solens lys med en motor for at optimere udnyttelsen af solens energi, hvor der bliver benyttet en DC motor til at rette fladen ind så den peger mod solens stråler.

Robotten har dog plads til forbedring. Opbygning af den kunne gøres mere stabil. Der kunne samtidig været taget større hensyn til slidtage af ledninger, og løse problemet med at ledningerne kan rives ud af breadboard og Arduinoen.

I forhold til solens op og nedgange kunne der også være lavet en mere optimal løsning til at tjekke dette, da det nuværende system hele tiden tjekker hvor solen er, upåvirket om det er dag eller nat, samt restarter når robotten har drejet cirka 180 grader, som gruppen forventer svarer til et døgn.

Video af systemet

På videoen ses en visning af robotten Little Miss Sunshine.

Leave a Reply