Nils Vestergaard Lauritzen Niklas Rosendahl Arnesen

Opbygning:

Kravet for denne opgave var at “Konstruere en solcelle styring, der drejer en solcelle efter solens lys med en motor for at optimere udnyttelse af solens energi”.

Vi gik til denne opgave med udgangspunkt i et simpel design som kan opfylde opgavens krav. Vi gik med at konstruerer robottens “skelet” ud af pap og tape, da det var de materialer vi havde til rådighed. På billede 1 og 2 er illustreret vores skitsering af robotten. Da vores robot kun roterer i en akse gav det mest mening for os at fladen med photoresisterne var vinklet 45 grader. Vi vil mene at dette ville være den mest optimale vinkel til solen, i forhold til at få de bedste målinger. 

Robotten består som vist på tegning af en større bund, der fungerer som en balancerende fod. Inde i foden kunne vi nemt placere Arduinoen og breadboardet, og der fra trække ledninger op igennem foden til photoresisterne og LED’erne. Oven og midt på denne fod er servo motoren placeret, hvor selve solcellen balancerer oven på motorens greb. Ideen bag dette, var at motoren roterer hele solcellen mod lyset. Da der ikke er nogen form for gearing i servomotoren var det ikke nødvendig at forholde sig til gearingen.

Set fra Siden Set fra fronten

Vi har valgt at placere photoresisterne helt ude i siderne på fladen. Det gav god mening i forhold til at de ville være nemmere at måle difference mellem de 2 photoresistorer. Som krav i opgaven skulle vi implementerer status lysdioder. Vi valgte at bruge en grøn og rød LED pærer til at indikerer hvilken status vores robots software er i når den køre. Vi valgt at placere dem på toppen af foden hvor de er tydelige at se.

Robottens grundlæggende udseende har ikke været ændret undervejs i processen. Vi valgte dog at placerer et stykke pap i midten på fladen hvor photoresisterne er placeret. Det ville medfører at robotten ville have nemmere ved at vende sig mere direkte mod solens stråler.

Robottens Hardware:

Kræsløbs diagram

Liste over anvende komponenter:

  • 1 stk: Uno R3 controller Board
  • 4 stk: 330 ohm resistorer
  • 2 stk: photoresistor
  • 1 stk: Grøn LED
  • 1 stk: Rød LED
  • 1 stk: Servo Motor
  • 1 stk: Breadbord
På billedet nedenfor ses robotten forfra, hvor de blå ringe fremviser placeringen af begge photo-resistorer, mens de røde ringe fremviser placeringen af begge LED pærer.
Det næste billede viser også placeringen af begge LED pærer, men også placeringen af motoren imellem solcellens øverste og nederst del.

Vi har ikke haft stører problemer hardware, udover små fejl med forkert placerede ledninger og komponenter.

Opførsel:

Robottens to photo resistorer måler hele tiden lysstyrken. Når robotten er sat op, tjekker den først om lysstyrken på begge photo resistorer er for lav, det vil sige at de måler om det er nat. Hvis det er nat, så roterer motoren hen til sin start position. Dette er derfor vigtigt at motoren står peget mod øst, før den er startet. I denne tilstand slukker robotten for begge dioder, for at vise det er nat. Hvis lysstyrken ikke er for lav, så sammenligner robotten begge photoresistorernes data og finder differencen imellem hver deres målte styrker. Hvis difference ikke er for stor, går koden tilbage fra start, men hvis den er for stor, så skal den roterer motoren hen mod lyset. Dioden der matcher den givne retning lyser op, mens den anden slukkes for at vise, dens tilstand. Ellers lyser begge differencen dioder op, hvis den ikke roterer.
Den bestemmer derfor retningen ud fra, hvor lysstyrken er lavest, og den roterer efterfølgende motoren indtil at differencen er en acceptabel størrelse igen.

Flow diagram over robottens opførsel
#include <Arduino.h>
#include <Servo.h>

Servo tracker; // create servo object to control a servo

// varibler for de forskellige indputs of outputs
int sensorOne = A0; //rød
int sensorTwo = A1; //grøn
int sensorDifference = 0;
int sensorOneLight = 6; //rød
int sensorTwoLight = 5; //grøn

//startpostion for servo
int sensorPosition;
int startPosition = 159;


void setup() {

  Serial.begin(9600);

  pinMode(sensorOneLight, OUTPUT);
  pinMode(sensorTwoLight, OUTPUT);
  tracker.attach(11);
  tracker.write(startPosition);
}

void loop() {
  // Mål og gem data fra begge photoresistorer
  int valueOne = analogRead(sensorOne);
  int valueTwo = analogRead(sensorTwo);

  // Mål differencen på deres lysstyrken
  sensorDifference = valueOne - valueTwo;

  // Kald "dataCollect" funktionen og print dataen i konsollen.
  dataCollect(valueOne, valueTwo);

  /* Tjek om lysstyrken er for lav hos begge photoresistorer
   *  Hvis lysstyrken er for lav, er det nat.
   */
  if (valueOne < 10 && valueTwo < 10) {
    // Roter dernæst motoren hen mod startpositionen (mod øst)
    sensorPosition = startPosition;
    tracker.write(sensorPosition);

    // Sluk for begge dioder, så det vises at det er nat
    digitalWrite(sensorOneLight, LOW);
    digitalWrite(sensorTwoLight, LOW);

  }
  else {
    /* Hvis det ikke er nat, så mål differencen.
     * Hvis differencen er for stor?
     */
    if (sensorDifference > 50)
    {
      /* Tænd den ene diode, så robotten viser hvilken retning den drejer.
       * Dernæst roterer motor indtil differencen er tilpas
       */
      digitalWrite(sensorOneLight, HIGH);
      digitalWrite(sensorTwoLight, LOW);
      if (sensorPosition < 160) {
        sensorPosition++;
        tracker.write(sensorPosition);
        delay(100);
      }

    }
    else if (sensorDifference < -50)
    {
      digitalWrite(sensorOneLight, LOW);
      digitalWrite(sensorTwoLight, HIGH);
      if (sensorPosition > 20) {
        sensorPosition--;
        tracker.write(sensorPosition);
        delay(100);

      }
    }

    else {
      /* Hvis differencen er tilpas, så tænd for begge dioder, 
       *  så det vises at robotten er i en neutral tilstand
       */
      digitalWrite(sensorOneLight, HIGH);
      digitalWrite(sensorTwoLight, HIGH);

    }
  }
  delay(300);
}


void dataCollect (int valueOne, int valueTwo) {
  Serial.print("Difference: ");
  Serial.print(sensorDifference);
  Serial.print (" - SensorOne: ");
  Serial.print(valueOne);
  Serial.print(" - SensorTwo: ");
  Serial.print(valueTwo);
  Serial.print(" - MotorPos: ");
  Serial.println(sensorPosition);
};

Test af Robot

Grundet det dårlige vejr med mangel af sol, blev vi nødt til at være lidt kreative med vores test. Derfor tog vi solcellen ind i et mørkelagt rum, hvor vi tog en lampe og førte den langsomt rundt i en bue over solcellen, for at simulere solen. Dette blev gjort over ca. 3 minutter, og resultatet kan ses på grafen nedenfor. Grafen viser hvor meget lys hver photoresistor modtager samt differencen imellem dem, og den viser også motorens position, der går fra 20 til 160 grader. Det kan tydeligt ses, at når den absolutte værdi af differencen, når over en værdi af 50, så begynder motoren at roterer.

graf over test

Det har været en udfordring at opsamle den givne data. Vi brugte et delay i vores update funktion, for at undgå at motoren drejede alt for hurtigt, og ikke rev alle ledninger ud af breadboardet, og for at den ikke opsamlede alt for meget unødvendigt data.
Vi prøvede at gøre “delay” større, så den ikke opsamlede data for hver frame, men så roterede motoren for langsomt. Fx hvis delay var 1 minut, så roterede motoren en lille smule hvert minut. Vi endte derfor med at gøre vores delay til 300 millisekunder som en nem middelvej. Ulempen ved de 300 millisekunder er dog at man ender med rigtig meget data meget hurtig. Det medførte også til at da vi testede robotten ude i solen i ca. 3 timer, endte vi med så meget data at da det skulle overøres forsvandt meget af data, og kunne ikke bruges.

Konklusion

Kort sagt fungere solcellen som den skal. Robotten måler lysstyrken gennem de to photo-resistorer, og ud fra differencen roteres robottens overflade igennem en servomotor hen mod det stærkeste lys. Når lysstyrken er lav ved begge photo-resistorer, bedømmer robotten det er nat og roterer tilbage til sin start position. Robottens status vises også igennem to LED pærer.

Robotten er fremstillet i pap, hvilket er meget ustabilt og ikke ideelt, hvis den skal placeres udenfor i længere tid. Udover dette er den også afhængig af en computer, hvor muligheden for at tilkoble et batteri til Arduinoen ville være en forbedring.

Vi kunne nok også have genovejet strukturen på vores kode og lavede nogen ændringer, så robotten eventuelt kunne køre mere optimalt, og at data mængden ikke blev lige så står når den kører. Det kunne have gavnet da vi testede fordi, vi kunne have undgået at miste meget af vores data. Ud fra dette kunne vi have sammenlignet servo motorens vinkel med solens reélle elevationsvinkel, som have været det mest optimale.

Leave a Reply