Porteføljeopgave 1 – Sun Searcher

Robotsystem: Sun Searcher

Gruppe: Mette Tanggaard Ohlsen & Natascha Denise Grønlie

4. Semester Lærings- og Oplevelsesteknologi

Systemets opbygning

 

 

Som set på billedet til højre har vi yderst til venstre placeret Arduino med monteret Arduino Motor-Shield. I midten sidder Breadboardet med ledninger forbundet til hhv. to LDR-modstande og Arduinoen. Til højre har vi placeret motoren under vores opstilling for at holde den tæt på ’fundamentet’, og gøre at den sidder mere stabilt. Den er vendt således at vi får en lodret rotationsakse, da vi skal rotere solcellen horisontalt. Over Lego motoren har vi selve gearingen, som er på 1:5. Det første tandhjul (det lille grå) har 8 tænder og det største tandhjul (det store grå) har 40 tænder, de er forbundet med et sort tandhjul med 24 tænder. Oven på det grå tandhjul har vi en skrå plade hvor ’solcellen’ er sat fast. Øverst på pladen har vi placeret to LDR modstande afskærmet med en plade mellem dem. Afskærmningen gør sammen med LDR-modstandende at vi kan finde ud af hvilken retning lyset kommer fra, og således rotere solcellen mod solen.

Hardware

Diagramtegning

Billeder af system med delkomponenter

 

Problemområder

Under opbygningen af vores robot havde vi problemer med at ledningerne var for ’stive’ hvilket resulterede i at den del af robotten som skulle rotere mod lysets retning havde svært ved at rotere. Vi har ikke skiftet ledningerne, men det lykkedes at give den en større vinkel at rotere indenfor, ved at lade ledningerne hænge frit.

Derudover oplevede vi at vores ene LDR-modstand var mere følsom, hvilket vi forsøgte at løse ved at sætte et threshold på (80) inde i koden. Et andet problem vi løb ind i var gearingen. Vi fandt ud af at gearingen var for lav (1:1.667) og vi satte derfor gearingen op til 1:5.

 

Systemets opførsel

Robottens opførsel er bygget op af if-, else-statements, der først tjekker om der er lys på sensorerne. Hvis der er lys, tjekker den hvilken sensor der registrerer mest lys og motoren drejer derefter opstilling i den retning. Den stopper når der er ca. lige meget lys på begge sensorer. Vi har måtte opsætte et threshold på 80, da vores sensorer ikke er lige følsomme.

Kode

const int sensorPin = 1; // analog 0, venstre sencor
const int sensorPinR = 0; //analog 1, højre sencor
const int thressHold = 80; //forskel i sensor følsomhed
const int lightLimit = 230; //minimum lysmængde den skal reagere på
void setup()
{
 Serial.begin(9600);
 pinMode(9, OUTPUT);
 pinMode(12, OUTPUT);
}
void loop()
{
 int rate = 100; //sæt rate til 100 (millisekunder)
 int rateLeft = analogRead(sensorPin); // læs input fra venstre sensor
 int rateRight = analogRead(sensorPinR); // læs input fra højre sensor
 delay(rate); // vent

 //check om der er lys på minimum én af sensorne
 if(rateLeft > lightLimit || rateRight > lightLimit){
  //kald funktion til at dreje opstillingen
  turnDirection(rateLeft, rateRight); //kald funktionen til at dreje
 } else{
   Serial.println("no light");
   digitalWrite(9, HIGH); //slå bremsen til
   analogWrite(3, 0); //sæt hastighed til 0

 }

 
}

void turnDirection(int leftSens, int rightSens){
    int diffLR = leftSens - rightSens; //find forskellen mellem sensor output
    int diffLRAbs = abs(diffLR); //find den absolutte værdi af forskellen
  
    //hvis forskellen er mindre end threshold, stop motoren
    if(abs(diffLRAbs < thressHold)){
      Serial.println("do none");
      digitalWrite(9, HIGH); //slå bremsen til
      analogWrite(3, 0); //sæt hastighed til 0
    } else if(leftSens > rightSens){
      //drej  mod den sensor der har mest lys(venstre)
      Serial.println("turn Left");
      digitalWrite(12, LOW); //Sæt retning
      digitalWrite(9, LOW); //Slå bremsen fra
      analogWrite(3, 255); //sæt hastighed
    } else {
      //drej mod højre
      Serial.println("turn Right");
      digitalWrite(12, HIGH); //sæt retning
      digitalWrite(9, LOW); //slå bremsen fra
      analogWrite(3, 255); //sæt hastighed
    }

  }

Vi havde problemer med at den ene sensor var mere følsom, og vores robot blev derfor ved med at dreje over mod den, men vi løste det ved at indsætte et threshold på forholdet mellem sensorerne.

Derudover var der i første omgang forvirring med hvilken vej motoren drejede, men det blev nemt løst ved at bytte om på HIGH og LOW for retningsoutputtet, i de forskellige statements.

Konklusion

Vores robot løser opgaven, da den ved brug af LDR-modstande bestemmer i hvilken retning lyset kommer fra, og vha. en motor, dreje solcellen mod lyset (inden for 180 grader). Logikken kigger også på hvor meget lys der er til stede, så den ikke reagerer hvis der er for mørkt.

Vores robot kunne forbedres ved at gøre brug af blødere ledninger, sat op på en anden måde, så robotten har mere frihed til at dreje over en større vinkel. Den kunne også gøres mere præcis ved en større gearing. Sensorerne kunne sættes bedre fast, så de ikke giver sig når robotten drejer.

I logikken kunne der gøres brug af tid, til at se om solen er oppe, så den ikke om natten drejer mod kunstige lyskilder der måtte passere.

Der kunne også gøres brug af en start position, så den om morgenen selv, drejer sig mod øst inden solen står op.

Derudover kunne der tilføjes yderligere to sensorer og en motor, der drejer den om en vandret akse, så den også kan tage hensyn til hvor højt solen står på himlen.

 

 

 

Leave a Reply