Borgar Bordoy – bobor16@student.sdu.dk

Martin Sørensen – maso717@student.sdu.dk

Thomas Vedel – thoch17@student.sdu.dk

Figur 1 – Model af Robotten

Robottens opbygning

Robottens opbygning er meget simpel, eftersom der ikke var mulighed for at benytte LEGO til at bygge med. I stedet er robotten designet som en 3D model i Tinkercad.

Robotten er opbygget med en plade ovenpå DC-motoren, hvorpå der er placeret to LDR-modstande, med en plade imellem dem for at undgå at de modtager det samme lys. Pladen med LDR-modstandene står på det største tandhjul vi benytter i gearingen. Idéen er at de to LDR-modstande registrere lyset fra to forskellige retninger, og robotten på den måde drejer i den retning, hvor lysindfaldet er højest. På den måde er robotten sikret at følge solens bane i alle de timer den står på himlen. 

Motoren er placeret inde i “kroppen” af robotten, der også bruger en plan flade som “bund”. Dette er for at gøre robotten mere stabil og skåne motoren for unødvendigt slitage.

Gearing

Ud fra motorens roterende del er der bygget et gearings netværk til at reducerer omdrejningerne der går til pladen med lys sensorerne. Der benyttes 3 tandhjul til gearingen. Det 1. hjul ud fra motoren har 16 tænder, 2. hjul har 8 tænder og det 3. hjul har 40 tænder. Dette vil sige at når DC-motoren kører en omgang drejer 2. tandhjul 2 omgang og 3. tandhjul 0.4 omgange, hvilket vil sige at gearings forholdet er 2.5:1

Derfor vil pladen med sensorerne dreje 180 grader på 10 sekunder, hvis DC-motoren har en konstant omdrejning på 12.5 rpm.

Styrring af DC-motoren

Vores DC-Motor kan dreje både med uret og mod uret, dette styres ved hjælp af en H-bro, som er vist på figur 2.

H-broen er opbygget ud fra de udleverede diagrammer. Dog har vi fjernet knapperne, da vi styrer hvilke MOSFETS som modtager strøm ved hjælp af Arduinoen.
Når East LDR-modstanden modtager den største mængde lys vil vi have motoren til at dreje med uret, dette gøre ved at sende strøm fra udgang 5 på Arduinoen. Omvendt sendes der strøm fra udgang 6, når West LDR-modstanden modtager den største mængde lys, og motoren kører så mod uret.

Figur 2 – MOSFET H-bro

Spændingsregulator

Figur 3 viser hvordan spændingsregulator kredsløbet som forsyner arduinoen med strøm, er opbygget.

Figur 3 – Spændingsregulator

Kredsløbet er en fixed-output regulator, hvilket benyttes til at sikre at man får en konstant output strøm uafhængigt af input spændingen, og max 24V og min 5V. Der benyttes to polariserede kondensatorer til at fjerne uønsket støj fra input og fra output.

9V batteriet går over til en switch, hvilket benyttes til at tænde og slukke for strømforsyningen. Derfra over til input kondensatoren med en kapacitans på 0.33μF, derfra videre til 5V regulatoren der reducerer spændingen til ned til 5V og omsætter den resterende spænding til energi. Herfra fortsætter kredsløbet til output kondensatoren med kapacitans på 0.10μF, og videre til Vin indgangen på arduinoen. Dette medfører i at arduinoen for en konstant spænding på 5V og dermed er uafhængig af at benytte usb indgangen som strømkilde.

Implementering af robottens opførsel

Robotten fungere således at den har to primære metoder: Accelerate of Decelerate.
Accelerate metoden kaldes for at styre om motoren skal køre fremad eller baglæns, dette gøres i en “blød bevægelse”, derefter kaldes decelerate metoden for at sætte farten ned på motoren, ligeledes i en blød bevægelse. Om motoren skal køre fremad eller baglæns, styres ved at tjekke hvilken af de to LDR-modstande der har den højeste værdi. Hvis East LDR-modstanden er højest, vil motoren køre fremad, og hvis West LDR-modstanden er højest vil motoren køre baglæns. Når de to LDR-modstande har den samme værdi, vil motoren stoppe med at køre, og pladen vil derfor stå stille, indtil værdien på den ene LDR-modstand ændres. På den måde styres DC-motorens retning for at dreje pladen så den hele tiden står i den retning hvor lysindfaldet er højest.

Selve farten som motoren har styres ved at beregne forskellen mellem værdien på East og West LDR-modstandende og dividere forskellen med 4, da vi på den måde opnår en passende fart til motoren. Denne implementering sikre også, at når solen er gået ned, så vil pladen drejes tilbage mod solen, når solen står op igen.

Robottens opførsel er illustreret på nedenstående flow-diagram.

Figur 4 – Flow diagram

Arduino code

int forwardPin = 6;	        //output for backwards direction 
int backwardPin = 5;		//output for forwards direction 

int west = 0;
int east = 0;
int speed = 0;

const int photocellPinE = A0;	       //input for LDR-resistors
const int photocellPinW = A1;


void setup()
{
  pinMode(forwardPin, OUTPUT);	         //defines output pins
  pinMode(backwardPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  //reads value from LDR-resistors.
  int west = analogRead(photocellPinW);   
  int east = analogRead(photocellPinE);
  

  if (east < west) {	//checks if west LDR is higher than east.
    speed = (west-east)/4;    //defines rotation speed.
/*max possible speed is 35, which translates to 50rpm at the motor.*/
    Serial.print("Backwards speed:");	
    Serial.println(speed);			
    accelerate(backwardPin, speed); 
//calls accelerate method on backwardPin. 	
    analogWrite(forwardPin, NULL);     //sets forwardPin to null.
	
  } else if (east > west) {	
//checks if east LDR is higher than west
    speed = (east-west)/4;		//defines rotation speed
    Serial.print("Forward speed:");
    Serial.println(speed);
    accelerate(forwardPin, speed);
//calls accelerate method on forwardPin
    analogWrite(backwardPin, NULL);  //sets backwardPin to null

    
  } else {	//Stops the motor if both LDR have the same value
    analogWrite(forwardPin, NULL);
    analogWrite(backwardPin, NULL);
 }
}

	/* accelerate is used to make a soft start
    followed by a deacceleration to make a soft ending*/

  void accelerate(int pin, int speed) {	
//Pin tells which Pin to accelerate and speed is the MAX-speed
	for (int i = 1; i <= speed; i = (i + 2) % 256) {         //the loop stops when reaching the speed variable
      delay(100); //rotation speed increases with a delay of 0.1s 
  	  analogWrite(pin, i);	 //send signal to the chosen pin.
   } 
    delay(1500);	
//when reaching MAX-speed it waits for 1.5s before deaccelerating
    deaccelerate(pin, speed);        //calls deaccelerate method.
    delay(500);	     /*sets 0.5 second delay before resetting the main loop.*/
}
  void deaccelerate(int pin, int speed) {
	for (int i = speed; i >= 0; i = (i - 2) % 256){	
// start at the speed variable and decreases until not moving.
      delay(100);  //decreases speed with delay of 0.1 second.
      analogWrite(pin, i)    //send signal the the chosen pin.
    }
  }

Konklusion  

Det har skabt lidt problemer at vi ikke havde mulighed for at lave robotten fysik og i stedet udelukket har lavet den i tinkercad. Det har derfor ikke været muligt at teste robotten fysisk, men via at regulere på LDR-modstandene i tinkercad på en måde der ville give mest mening i forhold til en sol rotation eller andet lys generelt, kan vi konkludere at robotten drejer på den korrekte måde. Ydermere har vi regnet os frem til en fart på motoren der giver mening i forhold til vores gearing, men dette har vi heller ikke kun teste optimalt.
Ved kun at benytte software har vi heller ikke kunne bygge en ordentlig “krop” til robotten ud af LEGO, hvilket for vores design til at se ret lavpraktisk ud.

Alt taget i betragtning er vi tilfredse med robotten, da den opfylder kravene til de komponenter den skal indehold, samt at den følger solens lys, hvilket var det primære mål. 

Mulige forbedringer

Solopgang

I forhold til at håndtere robottens bevægelse når solen er gået ned, kunne den forbedres således at den gik tilbage til start positionen når solen gik ned, frem for først at gå tilbage til positionen når den igen registrere solens lys, dette ville optimere det lys som blev opfanget da man på den måde ville mindske den tid hvor pladen ikke står i den optimale retning i forhold til solen. En mulighed for at implementere dette, kunne være at sætte en nedre grænse for hvor meget lys der bliver indfanget, og hvis man kom lavere end denne grænse ville robotten gå tilbage til start. Denne implementerings mulighed var også med i vores tanker, men blev ikke implementeret, da hvis der ville blive blokeret for solens lys (f.eks. en mørk sky), så ville robotten tro at solen var gået ned og gå tilbage til start, og ville så skulle finde tilbage til solen når engang blokeringen igen var væk. Dette ville endvidere medføre den risiko, at pladen ville have mere tid hvor den ikke havde den optimale retning mod solen, og kunne eventuelt holde motoren fra overhovedet at starte i tilfælde af længere tid hvor der ville være blokeret for solen.

Bevægelse

En mulighed for at optimere det lys som bliver indfanget ville være, at have en ekstra motor, således at man kunne dreje pladen vertikalt, for at optimere pladens vinkel i forhold til solen, hvilken ville betyde en endnu højere udnyttelse af solens lys.

Videos of the robot

Model af Robot
Præsentation in tinkercad

Leave a Reply