Gruppe: Sebastian Kier Andersen og Sofie Ingeman Behrens
Navn på robot: Sun Catcher

Tanker bag designet

Robotten er ganske simpel i sit design: Den har en vis gearing med 4 tandhjul af forskellig størrelse, for at solcellens omdrejningshastighed bedre kan styres, uden at motoren skal køre ved så lav kraft, at den sætter ud. Motoren selv er placeret delvist skjult i bunden af hensyn til konstruktionens tyngdepunkt. Der er desuden monteret to LDR på pladen, der skal repræsentere cellen, og der en vis afstand i mellem dem, for at kunne bedre bestemme sollysets vinkel på pladen. De sidder dog i samme højde.

Hardwaren dertil er ganske enkel, idet der kun er monteret de to LDR, som hver er forbundet til både 5V-strømkilden, Arduino samt stel via en modstand, således at de ikke svæver. Motoren er indirekte monteret via Arduinos tilhørende motor shield, hvor al den nødvendige elektronik er integreret.

Processen

Hardwarens omfang blev undersøgt ved først at finde et diagram for, hvordan en LDR skal tilsluttes.

Der blev desuden tegnet et blokdiagram for at skabe overblik over de komponenter, der skulle tilsluttes Arduino. Herefter begyndte arbejdet på softwaredelen, hvor et flowchart for programmets forløb blev skitseret.

Koden

Koden skulle styre robotten således, at den rettede sig efter lyset. Dette betød, at den skulle kunne sammenligne værdierne målt på de to LDR og herefter beslutte, om den skulle bevæge sig og i hvilken retning. Den skulle desuden afgøre, om solen overhovedet er stået op, dvs. om lysniveauet er højt nok til, at det giver mening, at den drejer og leder efter lyskilden (solen).

boolean sunIsUp = false, calibrated = false;
int threshhold = 250;
int light, lightDif, lightRight, lightLeft;

void setup() {
  //setup af motoren
  pinMode(12, OUTPUT);
  pinMode(9, OUTPUT);
}

void loop(){
  //læser værdierne på LDR og beregner forskellen og gennemsnittet
  getValues();

  //hvis solen er stået op
  if (light > threshhold) {
    sunIsUp = true;
    calibrated = false;
  }
  //hvis solen er gået ned
  else {
    sunIsUp = false;

    //stiller cellen klar til at kunne måle solens lys næste morgen
    if(!calibrated) {
      startTurnCCW();
      delay(1500);
      brake();

      calibrated = true;
    }
  }

  if(sunIsUp) {
    //hvis solen står skævt på cellen, skal den rettes til
    if(lightDif > 20) {
      startTurnCW();

      //cellen kører indtil forskellen på de to LDR er minimal
      while(lightDif > 20) {
        getValues();
      }
      brake();
    }
    else if(lightDif < -20) {
      startTurnCCW();

      //cellen kører indtil forskellen på de to LDR er minimal
      while(lightDif < -20) {
        getValues();
      };
      brake();
    }
  }
}

/*
 * Funktionen aflæser først de to LDR's værdier og beregner herefter forskellen mellem dem
 * og deres gennemsnit
 */
void getValues() {
  lightRight = analogRead(A0);
  lightLeft = analogRead(A5);
  lightDif = lightRight - lightLeft;
  light = (lightRight + lightLeft) / 2;
}

/*
 * Funktionerne "startTurnCCW" og "startTurnCW" sætter motoren i gang med at bevæge sig
 * henholdsvis med og mod uret
 */
void startTurnCCW() {
  digitalWrite(12, HIGH); //Establishes forward direction of Channel A
  digitalWrite(9, LOW);   //Disengage the Brake for Channel A
  analogWrite(3, 200);   //Spins the motor on Channel A at full speed
}

void startTurnCW() {
  digitalWrite(12, LOW); //Establishes backward direction of Channel A
  digitalWrite(9, LOW);   //Disengage the Brake for Channel A
  analogWrite(3, 200);   //Spins the motor on Channel A at half speed
}

/*
 * Funktionen stopper strømtilførslen og bremser motoren, så cellen igen står helt stille
 */
void brake() {
  digitalWrite(9, HIGH); //Engage the Brake for Channel A
  digitalWrite(3, LOW);
}

Der var visse udfordringer mht. at få motoren til at bremse. Dette skyldes, at vi tog udgangspunkt i en eksempelkode, der ikke formåede at bremse motoren overhovedet, og derfor blev vi nødt til ikke kun at bremse motoren, men også fuldstændigt lukke for strømmen til den.

Det skal også nævnes, at den nuværende værdi for threshhold er arbitrær i og med, at det ikke har været muligt at finde tid til at måle lysniveauet ved solnedgang.

Konklusion og reflektion

Robotten løser ganske fint opgaven i forhold til opgaveformuleringen, som kan læses ovenfor.

Der er dog stadig plads til forbedringer, og disse skulle først og fremmest ske på hardwaresiden med bedre, mere følsomme LDR og muligvis bedre motor/gearing, der kunne sikre en langsommere og mere præcis bevægelse rundt, uden at denne risikerer at gå i stå.

Programmeringsmæssigt kunne der sættes timere ind diverse steder, hvor lysniveauet bestemmer, om det er nat eller dag, så der tages bedre højde for, om der går en sky for solen eller at nogen skygger for solen. Desuden mangler der måling af den præcise grænseværdi, der skal diktere threshhold.

Leave a Reply