Gruppe:

Jonas Lund – Jolun18@student.sdu.dk
Patrick Nielsen – Panie18@student.sdu.dk
Mads Emil Falkenstrøm – Mafal17@student.sdu.dk


Indledning

Sun-inator 6000 er vores svar på portfolio opgave 1. Det er en to-go size soltracker der med sit simple design kan sættes op som en plug-and-play løsning. Ved brug af en æske og en 3D printer var det muligt at opstille et lukket miljø med et tårn til at styre “solpanelet”. Der blev fra start valgt at bruge en servomotor, samt to LED’er for at illustrere hvilken tilstand robotten er i.
Projektet i sin helhed er en simulering af et solcelleanlæg, dog uden solceller, der søger efter det bedste lysindfald for at optimere mængden af strøm der kan producere. Prototypen er blevet bygget med forskellige tilstande, heriblandt; søgning efter bedste lysindfald, bevægelse til højre eller venstre og stillestående tilstand.

Billeder

Figur 3 – Robotten under udvikling

Opbygningen

De primære tanker der danner grundlag for robotten er fordelen i at den er kompakt og nem at tage med. Den overordnede arkitektur er et tårn der kan dreje 180 grader for bedst muligt at følge solens gang fra øst til vest. Selve “solpanelet” der følger solen hælder 45 grader for at optimere lysindfaldet mest muligt i løbet af dagen. På panelet er der monteret 2 photoresistorerer i hvert hjørne med nok spredning til at det er muligt at beregne forskellen i lysindfaldet der styrer servo motorens gang. Valget er servomotor kom naturligt da det gav god mulighed for kontrol af robotten, og brug af DC motor ville medfører at et gearings system skulle sættes op for at kunne fremskaffe den samme kontrol.

Komponenter

Følgende komponenter blev brugt i forhold til opsætningen af systemet:

ComponentQuantity
Arduino Uno1x
Photoresistor2x
Servo Motor1x
100 Ω resistor2x
1k Ω resistor3x
Green LED1x
Yellow LED1x
Pushbutton1x
Figur 4 – Liste af brugte komponenter
Figur 5 – Tinkercad diagram af opbygningen
Figur 6 – Kredsløbdiagramtegning af opbygningen

Flowchart

Ud Fra flowdiagrammet kan man se at robotten har 4 forskellige tilstande, efter start af robotten vil den lede efter bedste lysindfald for begge LDR-sensorer, derefter vil robotten køre igennem, indtil robotten enten går imod højre eller venstre, alt efter hvilken LDR-sensor modtager mest lysindfald.
For at imødekomme muligheden for at repositionere robotten, er der tilføjet en knap som igen vil trigger metoden til at finde bedste lysindfald. Løbende vil robotten også tænde LED’er til at give indikatorer for om  den er tilfreds med positionen lyser den grønt, når den er i gang med at finde bedste position blinker den orgorangeange, eller når den drejer efter solen lyser den konstant orange.

Figur 7 – Flowchart af robottens opførsel

Test

Vi gennemførte en testkørsel af systemet over en tid på ca. 4 timer. Da himlen var overskyet hele dagen var lyset meget diffus og robotten havde aldrig opfattet at lysindfaldet var højere på en side end den anden udover tolerancen.
Der kan tydeligt ses en fejl i opfatningen efter ca. en tredjedel af tiden, hvor begge photorisistorer melder en signifikant mindre lysinfald. Robotten drejede sig 5 grader pga. denne fejl, men vendte straks tilbage til dens oprindelige position, hvor lysindfaldet var mere optimalt.

Figur 8 – Graf af lysindfald og servo positionen
Video 1 – The incredibly useless timelapse of the test

Kode

#include <Servo.h>

Servo servo;

//Define pins (photoRes2 pin2 is Analog, while the buttonPin 2 is digital)
const int servoPin = 9;
const int photoRes1 = 1;
const int photoRes2 = 2;
const int okLedPin = 11;
const int workingLedPin = 12;
const int buttonPin = 2; 

//Define constants
const int tolerance = 35; //Needs to be adjusted in production
const int stepSize = 5;
const int maxpos = 180;
const int minpos = 0;

//Initialize variables
int startPos = minpos;
int lightVal1;
int lightVal2;
int pos;

void setup() {
  Serial.begin(9600);   //Debug
  pinMode(okLedPin, OUTPUT);
  pinMode(workingLedPin, OUTPUT);
  pinMode(buttonPin, INPUT);
  servo.attach(servoPin);  
  servo.write(startPos);
  pos = startPos;
  findBestPosition();
}

void loop() {

  //Read the photoresistors
  lightVal1 = analogRead(photoRes1);
  lightVal2 = analogRead(photoRes2);
  int diff = lightVal1 - lightVal2;


  //Decide if it should move or not
  if (diff < -tolerance && pos < maxpos) {
    digitalWrite(workingLedPin, HIGH);
    digitalWrite(okLedPin, LOW);
    pos = pos+stepSize;
    servo.write(pos);
  } else if (diff > tolerance && pos > minpos) {
    digitalWrite(workingLedPin, HIGH);
    digitalWrite(okLedPin, LOW);
    pos = pos-stepSize;
    servo.write(pos);
  } else {
    digitalWrite(okLedPin, HIGH);
    digitalWrite(workingLedPin, LOW);
  }
  
  waitWhileButtonCheck(5);
}

//Waits for x seconds and checks for a button press
void waitWhileButtonCheck(int x) {
  int count = 0;
  while(count < x) {
    if(digitalRead(buttonPin) == HIGH) {
      findBestPosition();
      return;
    }
    count++;
    delay(100);
  }
}

//The motor goes from its min position to its max and checks for the position with the most light
void findBestPosition() {
  int ledCycle = 0;
  int bestPos = startPos;
  int bestLight = 0;

  digitalWrite(okLedPin, LOW);
  
  pos = startPos;
  servo.write(pos);
  delay(500);
  
  //Move around and compare the amount of light 
  while(pos < maxpos) {
    lightVal1 = analogRead(photoRes1);
    lightVal2 = analogRead(photoRes2);
    int totalLight = lightVal1 + lightVal2;
    
    if(totalLight > bestLight) {
      bestLight = totalLight;
      bestPos = pos;  
    }

    pos += stepSize;
    servo.write(pos);
    
    //LED blink
    delay(250);
    digitalWrite(workingLedPin, HIGH);
    delay(250);
    digitalWrite(workingLedPin, LOW);
  }
  
  pos = bestPos;
  servo.write(pos);
  delay(3000);
}

Konklusion

Ved brug af photoresistorerer og en servomotor har vi formået at bygge en robot der drejer sig efter solen for at få det mest optimale lysindfald. Ved påsættelse af 2 LED’er har vi samtidig formået at få robotten til at vise hvilken stadie den er i, og om alting virker. Samlet set vurderer vi at problemformuleringen er løst. Dertil er der tilføjet en knap der lader robotten søge efter den bedste position.

Robottens nuværende konstruktion er begrænset i det omfang at det ikke er en dual axis arm, og at der kun er mulighed for at dreje 180 grader. En mulig forbedring af systemet ville være at implementere en ekstra motor, der giver robotten mulighed for at justere vinklen til solen så det bedst mulige lysindfald altid findes. Det opløser samtidig problemet med at den kun kan dreje 180 grader, og robotten kan så få det bedste lysindfald året rundt.
Andre forbedringer ville være at justere hvor ofte robotten søger når det bliver for mørkt. Dette medfører at robotten ikke arbejder så længe at solen ikke er oppe.

Video 2 – The robot tested with a flashlight

Leave a Reply