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

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:
Component | Quantity |
Arduino Uno | 1x |
Photoresistor | 2x |
Servo Motor | 1x |
100 Ω resistor | 2x |
1k Ω resistor | 3x |
Green LED | 1x |
Yellow LED | 1x |
Pushbutton | 1x |


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.

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.

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.