Af Orhan Hadzihasanovic, Peter Obling og Rune Kristiansen

Produktbeskrivelse:

Gruppen har ifm. faget Hardware og Robotteknologi på 4. semester fået til opgave at lave en porteføljeopgave, hvor vi skal konstruere en solcellestyring, der drejer en solcelle efter solens lys med en motor for at optimere udnyttelsen af solens energi.

Produktkrav:

Der er ifm. porteføljeopgaven blevet fastsat nogle krav, som vores robot skal overholde:

  • Der skal benyttes én eller flere LDR-modstande til at detektere sollysets retning
  • Vi skal rette en flade ind, så den står vinkelret på solens stråler via et program til Arduino microcontrolleren samt én DC motor
  • Vi skal overveje, hvad der sker, når solen går op/ned.
  • Styring og gearing af motor, skal være således, at motoren følger solen bedst muligt.

Komponenter:

  • Lego
  • To LDR-sensorer
  • Potentiometer
  • 9v batteri
  • DC motor
  • Arduino uno
  • Arduino Motorshield
  • To 10k Ω resistorer
  • Breadboard
  • Ledninger

Systemets opbygning:

Systemet er bygget op af de førnævnte komponenter og jf. de krav, der er fremsat ifm. projektet.

Øverst oppe i systemet har vi to LDR-sensorer. Systemet roterer alt efter hvilken LDR-sensor, der opfanger den højeste lysintensitet. Endvidere er der en skillevæg mellem de to lyssensorer, så de ikke registrerer samme mængde lys. LDR-sensorerne er ligeledes vinklet i en (ca.) 45-graders position, så de opfanger mest muligt solenergi.
Nedenunder har vi tilføjet nogle gear, så vi bedre kan kontrollere rotationen sammen med potentiometeret.
Vores potentiometer er endvideret kædet sammen med vores gear, så vi ved, hvornår vores system har drejet 180 grader, hvorefter det vil blive resat.
Ved siden af, har vi vores DC motor, som styrer rotationen afhængig af solindfaldet. Vi har placeret vores DC motor i bunden, da vi ville lave en direkte tilslutning mellem motor og LDR-sensorer, men vi opdagede, at det ville være mere effektivt også at benytte et potentiometer til at styre rotationen. DC motorens placering er efterfølgende ikke blevet ændret, da der ikke var behov for dette.
Vores 9V-batteri er selvfølgelig med til at give strøm til systemet.
Sidst, men ikke mindst, gør vi brug af vores arduino board og motor shield, hvor vi har tilsluttet ledningsveje, resistorer m.m. mellem systemet og computeren.

Vi bruger motor shield i stedet for kun Arduino fordi, at motor shieldet nemt styre motorhastigheden og retningen af motoren, vha. dens indbyggede chip (også kaldet H-broen).  Det giver også nok strøm til at vi kan køre op til 2 DC-motorer med vores Arduino.

På denne figur ses der, at hvis LDR-værdierne er over 1000, så vil den robotten dreje. Her skal der nævnes, at vi fandt disse værdier under testning af robotten, mens vi sad indenfor i et belyst lokale, hvorfor det kan være andre værdier i andre omgivelser.

På figuren ”Diagramtegningen af hardware” kan man på breadboardet se vores 2 LDR sensorer , der er sat i hver deres spændingsdeler med en 10K Ohms modstand. Spændingen af de to spændingsdelere bliver aflæst på henholdsvis Analog pin 2 og 3.
Derudover viser diagramtegningen også vores resterende hardware komponenter, og hvordan de er kædet sammen samt et flow diagram over systemets opførsel.

Udfordringer med hardware:

Der har været en række problemer med at få tilføjet potentiometeret i vores opstilling. Den store udfordring var at få tilkoblet gearing til potentiometeret således at det fungerede optimalt med resten af vores setup. Jf. vores opstilling har vi bygget lego rundt om, således at potentiometeret bliver holdt fast, samtidig med at vi har lego pinde sat fast til potentiometeret og ovenfor et tandhjul.

Potentiometeret var svært at dreje, og der skulle meget motorkraft til, det kunne således ikke dreje 180 grader helt, men tilnærmelsesvis.

Kodning:

//først initialiserer vi vores 2 ldr sensorer og potentiometer til de nedenstående pins
int ldrPin1 = 2;
int ldrPin2 = 3;
int potentialPin = 1;
int ldr2;
int ldr1;
int potVal = 0;

//her initialiseres motoren, med en datahastighed på 9600 bits pr. sek.
void setup(void) 
{
  Serial.begin(9600);
  pinMode(12, OUTPUT);
  pinMode(9, OUTPUT);
}
 
//i denne loop, får vi skrevet nogle dataer fra ldr1, ldr2 samt potentiometret og får det printet i "konsollen" så vi kan holde øje med værdierne
void loop(void)
{
  ldr1 = analogRead(ldrPin1); //værdi = ldr1
  Serial.print("ldr 1 værdi= ");
  Serial.println(ldr1);
 
  ldr2= analogRead(ldrPin2); //værdi = ldr2
  Serial.print("ldr 2 værdi= ");
  Serial.println(ldr2);

  potVal = analogRead(potentialPin); //værdi = potentiometer
  Serial.println(polVal);
  delay(200);
 

//her har vi nogle if statements der sørger for at holde styr på bevægelserne af SunFlower. Vi har gjort således at man trækker de to ldr værdierne fra hinanden og hvis ldr1 får 255 mere i sollys, roteres SunFlower. Ligeledes hvis ldr2 får mere lys end ldr1 roteres der den anden vej.


  if (ldr1 - ldr2 > 255)  //Hvis ldr1 får mere lys end ldr2 og har en værdi over 255, roteres der mod højre
  {
    digitalWrite(9, LOW);
    digitalWrite(12, LOW);
    analogWrite(3, 255);
  }
 
  else if (ldr1 - ldr2 < -255)  //Hvis ldr2 får mere lys end ldr1 og har en værdi under -255, roteres mod venstre
  {
    digitalWrite(9, LOW);
    digitalWrite(12, HIGH);
    analogWrite(3, 255);
  }
 
//her roterer SunFlower hverken den ene eller den anden vej = stop, hvis forskellen på deres værdier er for lille
  else 
  {
    digitalWrite(9, HIGH);
    analogWrite(3, 0);
  }
 
// Når SunFlower har nået maksgrænsen af vores potentiometer på 38 eller mere, så "resettes" solcellen tilbage til værdien under 7, dvs solcellen roterer tilbage til udgangspunktet.
   if (potVal >= 38) 
  {
    while (potVal > 7) //så længe potentiometer vaærdien er over 7, bliver den ved med at "resette" SunFlower
    {
      potVal = analogRead(potentialPin);
      Serial.println(potVal);
      digitalWrite(9, LOW);
      digitalWrite(12, LOW);
      analogWrite(3, 255);
    }
  }
 
}

Udfordringer ved kodningen:

Nogle udfordringer ved koden var at finde ud af hvilke værdier lysstyrken skulle have i forhold til at dreje, samt hvad hastigheden på motoren skulle være. Der opstod også problemer i forhold til at få den til at dreje begge veje. Vi har lavet ldr værdiforskellen til at være 255 og -255 i det færdige build, men har testet med lavere værdiforskelle og højere.

Konklusion:

Vores robot, Sunflower, har gennemgået flere forandringer undervejs. Vores originale idé var at bygge en robot, der udseendemæssigt minder om en solsikke, og det lykkedes egentligt også. Problemet var dog, at vores første løsning, ikke var hensigtsmæssig, da vi bedre kunne effektivisere robotten ved at benytte et potentiometer til at styre rotationen. Sunflower måtte gennemgå yderligere iterationer, heriblandt at tilføje potentiometer og snekkegearing.

Sunflower kan følge lysintensiteten, ligesom en almindelig solcelle vil følge sollyset mest effektivt. Når der ikke registreres mere lys, nulstiller robotten sig selv, og drejer tilbage til startposition, så den står klar til, når solen stiger op i øst. Vi har dermed løst opgaveformuleringen.

Vores hardware lå ved siden af robotten. I et rigtigt scenarie, skal dette gerne være så beskyttes som muligt, så robotten kan blive ved med at fungere mest optimalt, hvorfor vi vil kunne optimere robotten på dette punkt. Ledningerne ville også skulle loddes fast og sikres yderligere, så der ikke opstår slitage eller lignende over tid. Endvidere skulle der har været yderligere dataindsamling og forundersøgelse for at optimere robotten bedst muligt ift. rigtigt sollys.

Video af robotten

Leave a Reply