Gruppemedlemmer: Simone Emma Pedersen, Nicolai Staal, Gustav Frank Larsen

solar hunter
Giga Solar Hunter MK3

Hvordan er robotten bygget op

Robottens konstruktion understøtter dens primære funktionalitet: at vippe en platform fra højre til venstre. Den er konstrueret af Lego Technic-elementer, og konstruktionen suppleres af regulære Lego System-klodser. Vippe-funktionen opnås via et stort tandhjul, som den rektangulære ”solcelle”/plade er fastgjort til, således at en rotation til højre vipper pladen i denne retning. Det store tandhjul drejes af et mindre tandhjul, der er forbundet via en aksel til et større tandhjul, som så igen drejes af en snekke. Samtlige tandhjul er placeret lodret på en såkaldt ”Technic-beam” (et Technic-element med en masse huller), som er fastgjort i en ret vinkel til modellens fod. Tandhjulenes størrelse og anordning i forhold til hinanden er nøje overlagt – et lille tandhjul drejer eksempelvis et større et, hvilket gør, at det større drejer meget langsommere, eftersom det skal dreje flere takker, før det har nået en hel omgang. Dette sikrer, at platformen ikke bevæger sig for hurtigt og upræcist i forhold til solen, som den jo prøver at ”fange”.

Selve ”solcellen” er konstrueret af to 2×4 og to 1×8-System-plader, samt en 2×8-plade med huller mellem nopperne, og er i sig selv – uafhængigt af det forbundne tandhjul – immobil. De to lyssensitive modstande er placeret i henholdsvis den østlige og vestlige ende af pladen. Loddede kabler, der er ført ned gennem hullerne i pladen, forbinder mostandende til breadboardet, hvilket selvfølgelig komplicerer en potentiel 360-graders rotation af pladen. For at sikre, at de to modstande aldrig rammes af lige store mængder lys, MEDMINDRE lyset rammer hele pladen i en ret vinkel, er der placeret en skillevæg af almindelige 1x4klodser i midten af pladen mellem de to modstande. Den forhindrer, at begge modstande kan modtage (næsten) den samme lysstyrke, selvom pladen vender skævt til den ene eller anden side.

 

Hvordan er robottens Hardware sammensat

Til at løse opgaven er der til hardwaren anvendt en Arduino, et Arduino Motor Shield Rev3, en Lego-motor, to LDR-sensorer og to 1k Ohm resistorer.

Det anvendte Motor Shield gør det muligt, at køre motoren i to retninger fra dets A og B-udgange.

LDR-sensoren fungerer således, at den skifter resistens afhængigt af hvor meget lys, der bliver tilført. Meget lys
betyder lav resistens og omvendt. Ud fra den viden har gruppen bygget et kredsløb, hvor der fra Arduino-boardets 5v-output er to serieforbindelser af en LDR-sensor og en 1k Ohm resistor, der ender i jord (”GND”). Imellem de to resistorer måles spændingen via. analoge input i Arduino-boardets A0 og A1 indgange.

               

 

Hvordan er robottens opførsel implementeret

Robottens er programmeret til at sammenligne lyssensorernes input og bruge inputtet til at afgøre om motoren skal bevæge sig frem eller tilbage. Er differencen mellem de to lyssensorer for stor, vil motoren bevæge sig mod lyssensoren med størst værdi. Motoren stoppes hver gang lyssensorernes værdi ligger inde for det ønskede interval og sikrer på den måde, at robotten bevæger sig i forhold til solens position.

For at tage højde for at solen står op i øst og robotten derfor skal tilbage til sit udgangspunkt, er robotten programmeret til at bevæge sig tilbage til udgangspunktet når begge lyssensorernes input er lave. Efter solnedgang ville de to lyssensitive modstande modtage lige meget lys – eller snarere lige lidt. Vi har derfor etableret en nedre numerisk grænse, og i det øjeblik begge sensorers inputværdi falder under denne grænse, bliver en boolean-variabel ved navn ”night” sat til true. Dette muliggør, at et længere afsnit kode bliver kørt, da det blandt andet er afhængigt af denne variabels værdi. Denne kode drejer blot solcellen mod venstre i et bestemt antal sekunder, der angives i et delay, hvorefter motoren atter stoppes. Det fornødne antal sekunder for denne rotation mod øst blev ved hjælp af tests af motorens fart vurderet til at være 18 sekunder.

int sensorPin0 = 0;
int sensorPin1 = 1;
bool night = false;
int night1 = 1;

void setup() {
  
    Serial.begin(9600); //Enable Serial print
    //Setup Channel A
    pinMode(12, OUTPUT); //Initiates Motor Channel A pin
    pinMode(9, OUTPUT); //Initiates Brake Channel A pin
  
}

void loop(){
  
  int rate0 = analogRead(sensorPin0); // read the analog input (ldr)
  int rate1 = analogRead(sensorPin1);
  int difference = rate0 - rate1;
  int sensVal = constrain(difference, 10,500); 


  if (rate0 <= 300 && rate1 <= 300) { 
      night = true;
  } else {
      night = false;
      night1 = 1;
    }
  
  if (night == true  && night1 == 1){  
    
      digitalWrite(12, LOW); //Establishes backward direction of Channel A
      digitalWrite(9, LOW);   //Disengage the Brake for Channel A
      analogWrite(3, 255);   //Spins the motor on Channel A at full speed
      delay(18000);
      digitalWrite(12, LOW); //Establishes backward direction of Channel A
      digitalWrite(9, LOW);   //Disengage the Brake for Channel A
      analogWrite(3, 0);   //Spins the motor on Channel A at no speed
      night = false;
      night1 = 2;
     
    }

  if (difference==sensVal && night == false) {
    
     digitalWrite(12, LOW); //Establishes backward direction of Channel A
     digitalWrite(9, LOW);   //Disengage the Brake for Channel A
     analogWrite(3,0); //Spins the motor on Channel A at no speed
     delay(1000);
    }

  else if (rate0 < rate1 && night == false) {
      //forward @ full speed
      digitalWrite(12, HIGH); //Establishes forward direction of Channel A
      digitalWrite(9, LOW);   //Disengage the Brake for Channel A
      analogWrite(3, 255);   //Spins the motor on Channel A at full speed
      delay(1000);
  
  } else if (rate0 > rate1 && night == false) {
      //backward @ full speed
      digitalWrite(12, LOW); //Establishes backward direction of Channel A
      digitalWrite(9, LOW);   //Disengage the Brake for Channel A
      analogWrite(3, 255);   //Spins the motor on Channel A at full speed
      delay(1000);
  
    } 
 
  
}

Det primære problem var så at forhindre denne kode i at blive kørt igen og igen – tjekket af night-variablen, som udløser rotationen, foregår nemlig i loop-funktionen. Som udgangspunkt ville rotationen således ikke kun udløses 1 gang ved solnedgang, men derimod igen og igen, indtil en af de to modstande igen modtog værdier over 300. Solcellen ville altså ikke rotere 1×18 sekunder mod venstre og så stoppe, men fortsætte med at snurre rundt hele natten. For at modvirke dette blev der indført endnu en variabel – ”night1” – som indeholder det hele tal 1. Rotationskoden blev så ydermere gjort afhængig af denne variabel: før kodens eksekvering bliver night1-variablen tjekket for, hvorvidt den NØJAGTIGT indeholder tallet 1. Det vil den som udgangspunkt altid gøre, så rotationskoden bliver udført som ønsket, så snart de to sensorinput falder under 300 – men i den sidste linje af denne kode bliver variablens værdi forhøjet. På den måde undgås det, at koden kan udføres endnu en gang, eftersom night1-variablen ikke længere indeholder tallet 1.

Det andet kode-afsnit, der tjekker de to sensorers input og sætter night-variablen til true, hvis deres værdier ligger under 300, indeholder samtidig en metode, der sætter night-variablen til false, så snart de to sensorer opfanger sollyset og får værdier over 300. Den forbliver således false, så længe solen skinner (det vil sige hele dagen), og den store rotation mod øst kan ikke udføres, før dagen er omme og solen går ned – medmindre det bliver meget overskyet. Men det er en helt anden historie…

 

Konklusion

Robotten har ingen problemer med at finde solen og dreje ”solcellen”, så den rammes af mest muligt lys – takket være skillevæggen mellem de to modstande er den nødt til at stå lige på solens lys. Den kan i enkelte tilfælde dog ende med at vippe få millimeter fra side til side, hvis den er i tvivl om den optimale udretning. Bevægelsen foregår fra øst til vest – i et tilpasset tempo, for at øge præcisionen og spare på motorkraft. Robotten nåede ikke at blive testet i reelt sollys, men fungerede upåklageligt med kunstige lyskilder og mørklægningsmetoder såsom en indkøbspose, der blev placeret over robotten.

Leave a Reply