Martin Bjerkov Hansen og Mads Bergholdt Sørensen

Figur 1

Til start var der udtænkt at systemet skulle være baseret på dc motor med tilkoblet gearing og h-bro for at kompensere for den manglende strøm arduino porten normalt levere. Dette blev desværre ikke muligt at udføre eftersom begge vores dc motorer stod af under øvelsen. Derfor blev der i stedet benyttet en servo motor, mens der er redegjort for begge opstillinger.

Systemet som vist på billedet ovenfor er den endelige system, som består af en 3d printet fod til servomotor. På den er der sat et stykke pap, som holder et lille breadboard på plads. Ved hjælp af to papirclips, bliver breakboarded holdt i en mere skrå vinkel. Herpå er der sat to LDR sensorer som er skilt med et stykke pap så det illustrerer en øst og en vest side. På et større bread board ved siden af er der sat 3 LED til, som henholdsvist lyser hvis programmet opfanger ændring i lys indfald, ændring i rotation på servomotor og den sidste lyser hvis systemet er i stilstand. 

Gearing

Gearingen var tænkt at skulle være som vist på figur 1, men grundet ødelagte dc motorer blev det kasseret til fordel for servostyringen. Gearingen skulle fungerer som hastighedsnedsættende, ved at havde 3 forskellige tandhjul hvor det første som var sat direkte på motoren skulle være mindst og det sidste tandhjul, hvis akse solcellen skulle tilkobles, værende det største. 

Figur 2

H-bro

Til styringen af dc motoren, er der som beskrevet tidligere, brug for en anden strøm end den som arduinoen kan levere på sin udgangsporte. Hertil kan en h-bro bruges, som gør det muligt at bevæge motoren i begge retninger. Der kan benyttes et IC som L293D eller der kan opbygges en selv, som ville bestå af fire transistorer, hver især knyttet til en arduino port. Eksemplet på figur 3 benytter sig af fire MOSFET n-kanal transistorer. Der kan yderligere forbindes fire dioder fra drain til source terminalerne for bedre at forhindre “back flow” fra motoren i det den skifter retning. 

Figur 3 – H-bro

For at aktivere motoren til at køre den ene retning, ville Port 1 og Port 2 aktiveres, og for den anden retning vil Port 3 og Port 4 aktiveres. Hvis man ønsker at bremse motoren, kan Port 4 og Port 2 aktiveres. 

Servo motor

Til den endelige opstilling, blev der som nævnt benyttet en servo motor i stedet. Den specifikke model brugt er i stand til at bevæge sig 180 grader frem og tilbage, hvoraf der ved hjælp af programmering kan vælges og aflæses vinkler placering præcist. Der kobles tre ledninger til arduinoen, en til 5V, en til GND og en til en PWM tilgængelig udgang. PWM signalet aflæses af motoren, som oversætter det til en vinkel ved brug af dens reguleringskredsløb. Ved brug af det indbygget library servo.h, sendes der forskellige PWM signaler til motoren, alt efter hvilken vinkel man bruger som input.

Sensore

Til at finde ud af hvor solcellen vil kunne generere mest strøm bruges to LDR sensorer, til at finde ud af om solcellen skal drejes til enten øst eller vest. LDR sensoren er som sådan bare en variabel modstand, som ændres ved påvirkning af lys . Modstanden ændre sig henholdsvis sådan at jo mere lys der er, jo mindre er modstanden, og jo mindre lys jo større modstand. 

Da der ikke er angivet et specifikt serienummer på LDR sensoren, er det valgt at bruge en simpel spændingsdeler opstilling, med en 10K resistor og LDR’en. Som udgangspunkt ønskes der gerne en stor variation i input spændingen ved lyspåvirkning, således det er nemmere at se udslag.

Figur 4

Til programmering skal der simpelt aflæses på en analog port, hvoraf der modtages en værdi mellem 0 til 1023 (0 – 5V). Værdierne fra de to LDR’er sammenlignes, og bruges til at bestemme hvornår servomotoren skal aktiveres. Det blev noteret ved afprøvning af de to sensorer, at den ene havde en delvis større standardværdi ved samme belysning. Den med en højere værdi, blev placeret i den side der skulle pege mod øst, så motoren ikke blev aktiveret konstant. 

Hardware

Til den endelige opstilling med servomoter, blev der brugt forskellige komponenter til systemet. Heriblandt modstande, LED dioder og LDR sensore. Modstandende brugt til LED’erne var 220 ohms og dem til LDR sensorene var 10k. Dette er vist på hardware diagrammet set nedenfor. 

Hardware diagram for DC-motor:

Hardware diagram for Servo-motor:

Flow diagram

For et hurtigt overblik over koden, er der blevet opstillet et flowdiagram. Arduinoen læser med et sekunds interval LDR værdierne, hvor den sammenligner de to med et if-statement. Hvis East er større end West, er det sandt og servomotoren rykker sig 2 grader. Følgende går den tilbage til at læse værdier igen. Et simpelt if statement sidst i koden, tjekker desuden om den maksimale rotation på 180 grader er nået, hvor den efter et delay går tilbage til udgangspunktet. Dette er opstillet til at simulere en solnedgang.

Figur 5

De tre bokse vil her gennemgås yderligere, med et tættere blik på selve programmeringen.

LDR aflæsningen er meget ligetil. De to LDR værdier knyttes til de to variabler, henholdsvis East og West, og udskrives på Serial monitoren. Desuden aflæses og udskrives vinklen af servomotoren, som kan gøres ved brug af header filen Servo.h og de inkluderet funktioner. I dette tidsrum er en gul status diode aktiveret, for at indikere stilstand.

Hvis if-statementet opfyldes, slukkes den gule diode, og der aktiveres en blå diode for at indikere motoren skal til at rykke sig. 

Der bliver benyttet read() funktionen til at aflæse hvilken vinkel motoren befinder sig i, som så adderes med to for en lille rotation. Under rotationen af motoren, aktiveres en rød diode også. 

Test med rigtig sol

Til testen med solen som lyskilde til systemet, blev forsøgsopstillingen placeret udenfor på en altan på en lidt overskyet dag. Dette gav lidt usikkerhed ift data, men som det fremgår af grafen var der en vinkel ændring på lidt over 20 grader i løbet af 2 timer. 

Figur 6
Figur 7

Billederne er taget med to timers interval, det første billede er derfor taget fra start, og billedet til sidst er taget to timer efter ved slut. 

Figur 8 – Billede af grafen, hvoraf Servomotorens vinkel placering ses op af y-aksen og antal minutter i forsøget ses langs x-aksen

Konklusion

Den endelige konstruktion opfylder umiddelbart de opstillet krav fra problemformuleringen. Den er i stand til rotere baseret på solens placering og rotere med små vinkler. Der er desuden opsat statusdioder, der indikere hvilket stadie programmet befinder sig i. Det er beklageligt at der ikke blev benyttet DC motorer og den 3D printet gearing der blev lavet, men servomotoren fungere fint til formålet. De implementeret delays kan simpelt øges og tilpasses, til at fungere i længere tidsperioder. 

Der er nogle punkter som kunne forbedres, hvis det nu f.eks skulle forestilles at implementeres et konkret sted. Først og fremmest, kunne der have været et større fokus på kalibreringen af LDR’erne. Den ene havde en større værdi end den anden ved samme belysning. Dette kunne tages højde for, ved at opsamle værdier fra dem begge ved ens belysning og vurdere den gennemsnitlige værdi den ene var højere end den anden. 

Der kunne være brugt mere tid på at opstille et mere stabilt stel, således ledninger ikke gik i vejen. Andet materiale end pap kunne være brugt, men fungerede fint til den simple opstilling. Der kunne være sat meget tid af til 3D design, men blev ikke vurderet til at være den bedste brug af tid. Stativet der blev brugt til servomotoren tog lang nok tid i sig selv, så fokuset forblev på programmeringen og en mock-up opstilling.

Endelige program

#include <Servo.h>
Servo myservo;
int LDR = A1;
int East = 0;
int West = 0;
int LDR2 = A2;

int LEDB = 3;
int LEDG = 2;
int LEDR = 4;

int readservo = 0;

void setup() {
  // put your setup code here, to run once:
myservo.attach(A0);

  pinMode(LEDG, OUTPUT);
  pinMode(LEDR, OUTPUT);
  pinMode(LEDB, OUTPUT);
  
Serial.begin(9600);
myservo.write(0);

}

void loop() {

  digitalWrite(LEDG, HIGH);
 East = analogRead(LDR2);
 West = analogRead(LDR);
  Serial.println("East is: ");
  Serial.println(East);
  Serial.println("West is: ");
  Serial.println(West);
  Serial.println("Servo Vinkel - "), Serial.println(readservo);
  delay(1000);

   if(East < West) {

    digitalWrite(LEDB, HIGH);
    digitalWrite(LEDG, LOW);

readservo = myservo.read();
myservo.write(readservo+2);
  digitalWrite(LEDR, HIGH);
  delay(500);
  
  digitalWrite(LEDR, LOW);
  delay(500);
  digitalWrite(LEDB, LOW);
  }
//Et if statement der siger hvis servo = 180, og East<West -> Reset til 0 grader, Readservo sættes til 0 igen
if(East < West && myservo.read() == 180){
  delay(1000); //Kunne være meget stort og tage højde for hvornår solen står helt ned'
  myservo.write(0);
  readservo = 0; 
}

}

Video af opstillingen

Leave a Reply