Af Louise Sjodsholm og Ricco Flyckt
_____________________________________________________________________________________

OBS: Gruppen havde glemt deres modstande uden mulighed for at hente dem inden fristen for genaflevering. Det var derfor ikke muligt at anvende andet end hvad gruppen havde liggende.
Der er derfor anvendt 200 Ohms modstande istedet for 220 Ohm modstande, som der blev anvendt ved første aflevering.

Hvordan ser systemet ud?

Systemet består af en kasse lavet i pap hvor to photoresistorer er placeret på ydersiden. Inden i kassen er et breadboard, samt Arduino Uno’en. I bunden af kassen er der hul til ledningen til Arduinoen således det er muligt at opsamle data løbende. Hvis dette ikke var nødvendigt, kunne den køre på batteri, og på denne måde kunne ledningen undgås. Der er under kassen placeret en vandret papflade, da dette gør det muligt at montere kassen ovenpå motoren, således den kan rotere frit uden forhindringer. Desuden er der bag papkassen placeret et breadboard med to statuslysdioder, der har til formål at fortælle hvilket stadie systemet er i. Når lysværdien er under grænsen for hvad der vurderes til at være nat, vil begge disse være slukket. Når der er mere lys på højre photoresistor lyser den blå, mens den gule lyser når der mere lys på venstre. Er forskellen på lys indenfor den angivne margin vil begge dioder lyse, hvilket betyder at motoren ikke bevæger kassen og dermed fastholder sin position.

Hvorfor er systemet/robotten opbygget som den er ift. at løse opgaven.

Hvilke tanker ligger bag ved opbygningen?

Photoresistorerne er placeret på fladen, for at indfange lyset. Placeringen i hjørnene skyldes breadboardets placering i kassen. Derudover skyldes det at det på denne måde vil være muligt at aflæse forskellige værdier fra de to photoresistorer, således det er muligt at beslutte i hvilken retning kassen skal bevæges, for at der er mest muligt sollys på fladen hele tiden.  Det vil være muligt at flytte den mod henholdsvis højre og venstre når det detekteres hvilken LDR der registrer den højeste værdi og flytte den i denne retning således den anden LDR vil måle en tilsvarende værdi. Dette vil betyde at solcellen nu har flyttet sig så meget at den er rettet optimalt mod lyset. Det blev besluttet at opbygge systemet med både breadboard og Arduinoen inden i kassen for at forhindre udfordringer med ledningerne, som opstod ved rotation. Desuden er solcellen på skrå, for at indfange så meget sollys som muligt.

Hvor er motoren placeret og hvorfor dér?

Motoren er placeret under papfladen, hvorpå breadboardet med dioder og kassen med Arduinoen er placeret. Denne placering er valgt da det giver fri bevægelighed for motoren, således den kan gå fra udgangspositionen og rotere 180 grader uden hindring. Motoren er placeret på denne flade, så det samtidigt er muligt at vinkle selve kassen som det ønskes, da denne ikke vil være afhængig af motoren, når motoren er under kassen og ikke er i direkte kontakt med denne. Desuden er motoren placeret ovenpå et glas, dette er den for at hæve den over bordet, således det er nemmere at fastgøre den, og samtidigt undgå problemer med at stikket til Arduinoen vil støde på ved rotation.

Hvilke sensorer er benyttet og hvor er de fysisk placeret på robotten

Der er anvendt to photoresistorer som er placeret i hver deres hjørne af solcellen. Formålet det dette er at detektere hvor der er mest sollys således solcellen kan rettes ind efter dette, og på den måde stå bedst muligt placeret ift. solens stråler. Det betyder samtidigt at afhængigt at målingerne fra sensoren vil motoren bevæges enten mod højre eller venstre indtil den optimale position er fundet.

Har det været problemfrit at opbygge robotten eller har den ændret form/sensor-placeringer flere gange?

Projektets forløb foregik ved den iterative tankegang. Blandt andet blev der løbende ændret i robottens fysiske udseende, da b.la. ledninger røg ud, når solcellen bevægede sig. Ved første aflevering blev der kun anvendt én photoresistor, samtidigt var kassen placeret direkte på motoren. Der var flere udfordringer ved dette. Eftersom der kun blev anvendt én photoresistor, skulle motoren bevæges meget, hvergang værdien for mængden af lys blev lavere end grænseværdien. Dette medførte at motoren roterede mere end hvad der var nødvendigt. Dette betød også at der ved indirekte sollys, som ville opstå hvis det var overskyet, ville være meget bevægelse af motoren. Her ville den, hvis skyen ikke kun var der ganske kortvarig blive ved med at rotere til den nåede slutpositionen hvorefter den returnerede til start, og begyndte rotation forfra til den igen fandt lys. Det vil sige, er der skyet længe ville den kunne risikere at rotere fra start til slut mange gange. Derudover gav det udfordringer at kassen var placeret direkte på motoren, da motoren til tider kunne have svært ved at rotere korrekt uden at hænge fast i kassen.

Desuden blev der løbende lavet forsøg, til at bestemme hvilke grænseværdier der var mest optimale for at fortælle mikrocontrolleren hvornår det var nat, og hvornår der var sollys. Ved genafleveringen er der tilføjet yderligere en photoresistor samt to lysdioder, hvilket har ændret designet af robotten. Den nye photoresistor er tilføjet i modsatte hjørne af den der var der tidligere, mens der er blevet tilføjet en papplade under kassen, hvor lysdioderne er placeret. Dette har gjort at motoren i stedet er placeret under kassen og breadboardet med lysdioderne. Dette har den fordel at motoren ikke længere risikere at hænge fast i kassen, og giver derfor en bedre og mere ren bevægelse, når motoren skal rotere.

Hvordan er robottens hardware sammensat?

Ovenstående ses en diagramtegning samt systemets kredsløbsdesign udfærdiget i Tinkercad. Systemet er opdelt over to breadboards, da der både er placeret et i kassen, der agerer solcellen, og et bag kassen, således det er muligt at se de to statuslysdioder. På breadboardet længst til højre, hvilket i den fysiske model er placeret inden i kassen er servo motoren sat til ground samt 5 V. Desuden er motoren sat til pin 9, hvorfra den kontrolleres. På breadboardet er ligeledes placeret to photoresistorer samt 200 Ohm modstande. Dette er ligeledes sat til GND og 5 V. Signalet fra de to photoresistorer læses ved de analoge pins A1 og A2. På breadboardet over Arduinoen er to LED lysdioder samt to 200 Ohm modstande placeret. Disse er forbundet til GND, og hver diode er forbundet til henholdsvis pin 2 og pin 4, dette gør det muligt at bestemme hvornår en eller begge lysdioder skal lyse. Alle modstande der er anvendt er 200 Ohm modstande da gruppen ved genaflevering udelukkende havde 200 Ohms modstande til rådighed. For at vurdere om en 200 Ohm modstand er tilstrækkelig at sætte foran lysdioderne udføres beregninger med Ohms lov. Da spændingen og modstanden er kendt udregnes strømmen.

Strømmen der løber gennem lysdioderne vil være 25 mA, dette kan de godt holde til samtidigt med at det er tydeligt at se hvornår de lyser og ikke lyser. Det vurderes derfor at være en fin løsning, når der ikke var andre modstande til rådighed. En resistor med en lidt højere modstand vil medføre lidt lavere strøm gennem lysdioden, hvilket vil være tættere på de optimale forhold som for de fleste er 20 mA[1].

For spændingsdelen med LDR modstandene er der kigget i datasheetet, hvor det er angivet at lys modstanden varierer mellem 18 og 50 k Ohm. Til at beregne den spænding som vil kunne måles efter photoresistoren, og som er den der aflæses, til at vurdere hvor meget lys der er, anvendes spændingsdelerformlen

Det vil sige, hvis der tages udgangspunkt i 50 k Ohm modstanden

Det vil sige at spændingen som der måles, kan variere op til næsten 5 V, dette giver stor variation da hvert step vil være 0,0049, og det dermed er muligt at adskille værdierne meget præcist da hvert enkelt step er meget småt. Step størrelsen udregnes som følgende, hvor det signal som der måles kan variere mellem 0 og 1023, og der divideres derfor med 1024.


[1] Forward Voltage and KVL | All About LEDs | Adafruit Learning System


Tag et billede af robotten og sæt pile og beskrivelser på de enkelte delkomponenter

Arduino Uno: Arduino uno’en er microcontrolleren der anvendes til at styre motoren på baggrund af det signal der kommer fra photoresistoren. Denne forsyner samtidigt systemet med spænding fra 5V pinen.

Servo motor: Er en micro servo SG90. Denne sørger for rotation på baggrund af signalet fra photoresistoren. Da det er en servo motor kan den maksimalt rotere 180°, hvor den udover at være sat til 5V og GND har kontrolledningen sat til pin 9, således motorens position kontrolleres via signalet fra denne, på baggrund af den indbyggede styring.

Photoresistor: Er sensoren der anvendes til at detektere lysintensiteten. Afhængigt af hvor meget lys der er på komponenten ændres modstanden, hvilket er denne egenskab der udnyttes til at bestemme ved hvilke værdier der er henholdsvis sollys, skygge og mørke.

Modstand: Der anvendes en 200 Ω modstand, da denne medførte store variationer i signalet fra photoresistoren ved de tre forskellige stadier.


Status LED: Der anvendes to Status LED pærer som har til formål at fortælle hvor i scriptet at vi befinder os. Henholdsvist en blå og en gul. Før status LED’en er der en 200 Ohm’s modstand, der sikrer at der ikke kommer en for stor strøm ind i status LED’en og ødelægger den.

Ledninger: Disse anvendes for at forbinde kredsløbet. Udover ledninger fra 5V og GND er der en ledning der forbinder kontrol på servo motoren med Arduino’en og en ledning der forbinder Arduinoen med photoresistoren, således værdien herfra kan anvendes.

Breadboard: Anvendes for at opbygge kredsløbet. Photoresistoren samt modstanden er sat i breadboardet sammen med ledningerne fra Arduinoen som sørger for spænding og forbindelse til ground. Ligeledes er der ledninger til de signaler som der anvendes fra photoresistoren.

OBS: Der er flere modstande, én ekstra photoresistorer og LED pærer som der ikke er pil til, da billedet ellers ville være uoverskueligt.

Har der været nogle problemer ift. at få hardwaren til at virke?

Der var under udviklingen af designet til første aflevering problemer med ledninger der faldt ud ved bevægelse. Derfor blev designet af prototypen ændret for at forhindre at nogle af ledningerne kom i kontakt med motoren. Ved genaflevering er der tilføjet en ekstra photoresistor, hvilket der var plads til på breadboardet indeni kassen, og som derfor ikke medførte yderligere problemer at tilføje. Der er samtidigt også blevet tilføjet to LED status lysdioder, samt ledninger fra Arduinoen indeni kassen hertil, som gav udfordringer i form af ledningernes længde, dette gjorde at designet ændrede sig. Der var problemer i forbindelse med opbygningen af hardwaren, da gruppen udelukkende havde 200 Ohm modstande til rådighed ved genafleveringen. Det havde været optimalt at kunne anvende andre modstande, men løsningen fungerede, som også ses af beregningerne.

Hvordan er robottens opførsel implementeret

Hvad er de overordnede opførsler / metoder for robotten

Robotten har fire primære opgaver. Disse er som følgende

  1. Læs LDR værdier
    1. Find differencen af LDR-værdierne. Både differencen, samt venstre og højre LDR-værdi gemmes i en integer datatype.
  2. Er LDR værdierne mindre end grænseværdierne for nat?
    1. Hvis den er, bevæger servo motoren solcellen til startpositionen.
  3. Er differencen som blev opsamlet i step 1 mindre eller lig med 60? Hvis den er dette, betyder det altså at der er cirka lige meget sol på begge LDR-modstande
    1. Vi holder derfor positionen for servo motoren.
  4. Vi ved nu at det ikke er nat, og der er mere sol på en af LDR-modstandene.
    1. Vi tester hvilken LDR-modstand der har mest sol på sig. Hvis venstre har mest på sig, bevæges der mod højre, indtil differencen er mindre end 60.
    1. Går nu tilbage til step 1.

Alt dette kan ses i flowdiagrammet nedenstående.

Flowdiagrammet ovenstående starter ved den blå boks.
Dette er starten af loopet, hvor vi læser de to LDR-værdier. Hernæst opsamler vi både venstre, højre og den absolutte difference af de to LDR-modstande.

I vores første if statement tjekker vi om det er nat, hvis det er nat, går vi tilbage til start position, og slukker begge statuslamper.

Efterfølgende ved vi det ikke er nat, og tester nu om solen står imellem de to LDR-modstande, med et margin på 60. Hvis de gør, står vi stille, men ellers tester vi om venstre LDR-modstand er større end højre LDR modstand. Hvis den er, betyder det at vi skal bevæge solcellen mod højre, for at komme ind for den absolutte difference på 60. Hertil tændes den gule status LED, så brugeren kan se at der nu bevæges mod venstre.
Hvis venstre ikke er større, betyder det at højre er større, og derfor opfanges dette i else sætningen, at vi skal bevæge os mod venstre.  Hertil tændes den blå status LED, så brugeren kan se at der nu bevæges mod højre.

Arduino kode

#include "Servo.h"

Servo minServo;

int sensorPin = A1;
int sensorPin2 = A2;
int servoPin = 9; //9'ende port
int blueLED = 2;
int yellowLED = 4;

int lysVaerdiV; // den analoge opsamlede lys værdi.
int lysVaerdiH;// den analoge opsamlede lys værdi.
int diff; //Differencen
const int NATVAERDI = 150; // grænse værdi for om det er nat.
const int STARTPOS = 180; // start position for motor
const int SLUTPOS = 0;
int pos = STARTPOS; // integer der tracker servo motorens position, sættes til start positionen

void setup() 
{
  pinMode(blueLED,OUTPUT);
  pinMode(yellowLED,OUTPUT);
  minServo.attach(servoPin); //attacher servo'en til 9'ende port
  Serial.begin(9600); // start seriel kommunikation
  minServo.write(STARTPOS); // sætter servo motor til start position - 180 grader
  digitalWrite(blueLED,LOW);
  digitalWrite(yellowLED,LOW);
}

void loop() 
{
  lysVaerdiV = analogRead(sensorPin); // opsamler lys værdi
  lysVaerdiH = analogRead(sensorPin2); // opsamler lys værdi
  diff = abs(lysVaerdiV - lysVaerdiH); //Tager den absolutte værdi af forskellen på venstre og højre
  
  if (lysVaerdiV <= NATVAERDI && lysVaerdiH <= NATVAERDI) // Er vores opsamlede værdi mindre end grænseværdien for nat? Kør tilbage til start position. 
  {
      pos = STARTPOS;//Sætter positionen til start positionen
      digitalWrite(blueLED,LOW); //Slukker for begge LED
      digitalWrite(yellowLED,LOW);
  }
   else if (diff <= 60) 
   {
      digitalWrite(blueLED,HIGH); //Tænder for begge LED
      digitalWrite(yellowLED,HIGH);
   }
   else
   {
    if (lysVaerdiV > lysVaerdiH)
      {
        pos--;
        digitalWrite(blueLED,LOW); 
        digitalWrite(yellowLED,HIGH); // Tænder for den gule LED, slukker for den blå.
      }
     else
      {
        pos++;
        digitalWrite(blueLED,HIGH);
        digitalWrite(yellowLED,LOW); // Tænder for den blå LED, slukker for den gule.
      }

   }

   if (pos > STARTPOS) //Position er større end 180, sæt den til 180
   {
    pos = STARTPOS;
   }
   else if (pos < SLUTPOS) // Position er mindre end 0, sæt den til 0. 
   {
    pos = SLUTPOS;
   }
   
   minServo.write(pos); //Får nu servo motoren til at bevæge sig, er det nat, bevæger den sig til start positionen, hvis venstre LDR er større, bevæger den sig mod højre, og omvendt mod venstre. 
  
/* Serial.print("V "); 
   Serial.println(lysVaerdiV);  
   Serial.print("H ");
   Serial.println(lysVaerdiH);
   Serial.print("P ");
   Serial.println(pos); */ //Til at lave grafer

   delay(1000); //Delay på ét sekund mellem hvert loop.
  
} 

I Arduino scriptet er der tre især vigtige funktioner for at solcellen agerer som forventeligt.  

  1. Først testes der om venstre og højre LDR er mindre end grænseværdien for om det er nat. Hvis begge sensorer er mindre eller lig med denne, betyder det at det er nat, og servo motoren flytter solcellen tilbage til startpositionen, hvor begge LED pærer bliver slukket.
  2. Efterfølgende testes der om differencen af de to LDR-modstande er mindre eller lig med 60, dette sikrer sig at der er lige meget sol på begge sider.  Grunden til at der først testes om det er nat i koden, er at hvis det er nat, ville begge LDR-modstande have en difference mindre end 60, hvilket ville få koden til at tro at der er lige meget sol på hver side, hvis der ikke blev testet for om det var nat først.
  3. Til sidst når vi til else sætningen. Det er altså her at vi nu er klar over det hverken er nat, eller differencen for de to LDR-modstande er større end 60. Et eksempel på dette kunne være at der var en værdi på 400 på højre, og en værdi på 50 for venstre. Dette betyder at vi skal dreje mod venstre, indtil at højre og venstre har en difference på mindre end 60.


Som nævnt vil vi altså i denne sætning teste om den venstre LDR-modstand er større end højre, hvis den er det bevæger vi solcellen mod højre.  Yderligere slukker vi for den blå LED og tænder for den gule LED.

Omvendt hvis den højre LDR-modstand er større end den venstre, skal vi altså bevæge os mod venstre. Efterfølgende tænder vi for den blå LED, og slukker for den gule LED.

Vis grafer for testkørsel med rigtig sol

Det var ikke muligt at udføre forsøg med rigtig sollys, i stedet blev der udført en test over 2 minutter, der simulerer hvordan robotten reagerer, ved lys, skygge og nat. Da forsøget udføres over kort tid er der indført et kort delay, som ville øges ved forsøg med rigtig sollys, ligesom delayet var større ved første aflevering, hvor forsøg med rigtigt sollys blev udført. Af grafen ses det at værdier målt fra den venstre LDR er angivet med blå, værdier fra den højre er angivet med orange, og servo motorens position er angivet med gul. Den sorte linje er grænsen for hvornår mængden af lys registreres som nat. Heraf ses det at ved de forhold forsøget er foretaget under er dette en høj værdi. Dette er dog ikke et problem da begge værdier fra LDR’erne skal være under før den kører tilbage til start. Det ses at mens begge værdier er under grænsen ændres positionen ikke, den fastholder udgangspositionen ved 180 grader. Så snart der påføres lys, men der ikke er en værdi med en difference på 60 mellem de to photoresistorers målinger roterer motoren, indtil værdien er indenfor en difference på 60. Af grafen ses de vertikale grønne linjer, som illustrer at positionen fastholdes, og dette skyldes målinger fra venstre LDR og højre LDR er indenfor differencen. For at illustrere at solcellen kan rotere tilbage mod udgangspunktet, hvis den eksempelvis har roteret fordi der kom en sky, og nu er for langt i den ene retning, påføres kraftigere lys på den højre LDR, herved ses det at motoren roterer tilbage. Her finder den ganske kort optimalt lys på begge, og ændre derved ikke position, dette er ikke markeret med grønne linjer, da det er meget kort. Derefter roteres igen, indtil der er tilsvarende lys på de to sensorer som betyder den står i den optimale position. Efterfølgende er det illustreret hvad der sker når det bliver nat. Selvom motoren på den korte tid forsøget er udført ikke har ændret positionen kraftigt, fjernes lyskilden alligevel, for at vise at den kører tilbage til start som er positionen angivet med 180 grader.

Ved et længere forsøg med rigtigt sollys vil positionen i længere tid fastholdes, mens det bør kunne ses den roterer både frem og tilbage, hvis der kommer skygge.

Herunder ses et forsøg over 10 minutter, men stadig med en kunstig lyskilde

Hvilke udfordringer har der været ift. til at få koden til at virke?

Under udviklingen af scriptet var der især problemer med at få servo motoren til at virke. Da projektgruppen ikke har tidligere erfaring med servo motoren. Mere specifikt var det bevægelsen af servo motoren, og hvordan dette skrives rent kode mæssigt. Desuden opstod der mindre problemer under udviklingen af koden, hvilket hurtigt blev løst, ved at anvende Serial.print(), og få et output på den serielle monitor, og dermed teste fejl i koden. Herunder var der b.la. grænseværdierne, for hvornår der er solskin, hvornår der ikke er solskin og hvornår det er nat, dette blev dog hurtigt løst, ved at lave forsøg. Til rigtig brug vil der skulle laves nye tests med rigtig sollys, og logge eventuelt en gang i minuttet. Herefter kan denne data analyseres for at forstå hvilke tal der beskriver sollys, og hvilke der beskriver nat. Grundet tidspres, var det kun muligt at lave kortvarige forsøg.
Yderligere blev der arbejdet med to LDR-modstande. Gruppen ville gerne have at solcellen først stoppede når der cirka var lige meget sollys på hver af de to LDR-modstande, så det betød at solen var cirka imellem de to LDR-modstande, og der derfor var sol på hele solcellen.
Gruppen brainstormede og lavede forsøg, og fandt ud af hvis den absolutte difference af de to LDR-modstande blev fundet, og der blev sat en margin på 60 (fundet ud fra forsøg), ville sensorene kunne detekte hvornår solen er imellem de to LDR-modstande.

Konklusion

Aktuatoren bevæger sig 180 grader efter sollyset der falder på LDR modstandene, og går tilbage til den oprindelige position, når det er nat. Dog er disse grænseværdier fundet ved hjælp af delvist simulerede forhold, og grænseværdierne vil derfor muligvis ikke være i overensstemmelse med grænseværdierne der ville fås ved at lave langvarige tests med sol lys (den absolutte difference mellem de to LDR-modstande), og nat. Der kan overvejes om opgaveformuleringen ville løses endnu bedre ved hjælp af en motor som er styret alt efter årstiderne. Herved kan solcellens vinkling ændres, da solen står højere på himlen om sommeren.

Desuden kan der konkluderes at ved hjælp af to LDR-modstande er der mindre tabt energi, i det at der løbende testes om den ene sides output er større end den anden, og retter sig hertil efter, for at få lige meget sol på hver LDR-modstand.  

Desuden anvendes der nu en absolut difference mellem de to LDR-modstande, i stedet for en grænseværdi for om der er sol. Dette sikrer at selv hvis det skulle blive overskyet, vil solcellen ikke bevæge sig efter solen. Det kunne eventuelt forbedre solcellen, hvis der sættes noget mellem de to photoresistorer, således det er nemmere at detekterer mængden af lys på hver af de to photoresistorer. Når solen ikke står helt lige, vil en plade eller lignende mellem, medfører en skygge, hvorved den en LDR vil måle en lavere værdi, sammenlignet med den værdi den vil måle når lyset blot er vinklet, men der ikke opstår en skygge. Dette vil altså kunne gøre at motoren hurtigere roterer solcellen, således den står i den optimale position.

Demo video

Der er ved genafleveringen optaget en ny video af robottens funktion, dette kan ses nedenstående.

Hvis link ikke virker : https://youtu.be/s9Y4Ry5BJVc

Leave a Reply