Gruppemedlemmer

Jens Kristian Vitus Bering – jberi18@student.sdu.dk

Karl Amadeus Finsson Hansen – karlh18@student.sdu.dk

Pradeep Thayaparan – prtha18@student.sdu.dk

Systemets opbygning

Der var fokus på at starte med et fundament for vores servomotor, så denne kunne stå stabilt og sikkert. Derefter måtte gruppen lave en vinkel, som breadboard kunne ligge på, så gruppen fik sollyset vinkelret ind. Under breadboard er vores servomotor, der kan dreje til den ene og anden side. Vores breadboard fungerer som vores solcelle flade, og på den er der placeret 2 LDR en i hver side. LDR er vores solsensor som indfanger lyset, og er skilt ad ved hjælp af 2 stykker pap, således at lysets indfald fra den ene side ikke forstyrre den anden side. Derudover er der 2 led lys, en i hver side, deres funktion er at lyse op når servomotoren drejer deres retning. Servomotoren håndterer selv gearing, men hvis den ikke været det kunne gruppen evt. have brugt lego til at lave en gearing.

Gruppen har programmeret Arduinoen således, at hvis de indlæste værdier fra LDR-sensorerne på den ene side er større en tolerancen får den gruppens servomotor til at dreje sig i den retning. Der er anvendt en tolerance for at undgå, at robotten bevæger sig for meget omkring samme værdi. Når det er mørkt begynder servomotoren at bevæge sig til startpositionen, så den er klar til næste dag.

Anvendte komponenter 

Følgende komponenter blev anvendt i forbindelse med opsætningen af systemet 

  • 2 x 220 Ω – Som fungere til at regulere modstanden
  • 2 x 1000 Ω – Som fungere til at regulere modstanden
  • 1 x Arduino Uno – Kontrollere systemet
  • 14 x Man-Man ledninger 
  • 1 x Servomotor – En motor der kan bevæge sig 180 grader
  • 2 x LDR-modstand – Lyssensor
  • 2 x LED – Lys

Figure 1 – Opbygning af Wall-E ved hjælp af TinkerCAD

Figur 1 viser gruppens opstilling af komponenterne. Jord og strøm er forbundet til strømskinnerne af breadboard således, at det kan anvendes af de andre komponenter. 

Servomotoren er forbundet til strømskinnerne og Arduinos #D9 som input. Arduinoen får servomotoren til at dreje ved hjælp af PWM signaler. Arduino anvender #D11 og #D12 at tænde LED. LDR-modstande er forbundet til analog pin#A0 og pin#A1, hvor Arduinoen læser deres værdier.  I opsætningen er der også anvendt 4 resistorer med modstande på henholdsvis 2 x 220 Ω og 2 x 1k Ω.  Der er blevet anvendt en modstand på 1k Ω til LDR-modstandene og 220 Ω til LED pærerne for at undgå at de ikke bliver brændt af.   

Ændring af form/sensor-placeringer

Gruppen har foretaget løbende ændringer i robottens struktur for at forbedre lysindfaldet, såsom at sætte LDR-modstande helt til højre og venstre side. Derudover er der også blevet  brugt pap til at skelne dem yderligere.

Problemer ift. hardwaren 

Gruppen havde ikke nogen forforståelse af hardware og elektronik før opgaven og derfor var der en stejl læringskurve i starten. I starten måtte gruppen sætte sig ind i, hvordan elektroniske komponenter skal sættes sammen og hvordan de interagerer. Det eneste der er værd at nævne er opsætningen af systemet ikke skete problemfrit, da servomotoren havde svært ved at bære vægten af breadboard hvilket resulterede i at hovedet på servomotoren faldt af et par gange. Derudover gjorde det lidt vanskeligt at benytte materialer fra hjemmet frem for legoklodser som SDU ville have udleveret hvis ikke det havde været for pandemien. Dette ville have gjort opsætningen af hardwaren noget lettere.   

Figur 2 – Diagramtegning af Wall-E

Diagramtegning

Figur 2 viser diagram tegningen af systemet, som er lavet ved hjælp af Fritzing. Tegningen viser kommunikationen mellem Arduino, Servomotor, LDR, LED-lysene og modstanderne. 

 

Figur 3 – Billede af Wall-E med og uden pap

Figure 3 viser opsætningen af systemet samt de komponenter der er blevet anvendt. Ydermere ses det hvordan papstykkerne er blevet brugt. Gruppen har benyttet lim og tape for at kunne holde pap stykkerne, servomotoren og breadboard stabil.

Robottens Opførsel

Figur 4 – Flowdiagram af Wall-E

Ud fra flowdiagrammet kan det ses, at LDR værdierne har en afgørende faktor om hvorvidt servomotoren skal dreje til højre eller venstre alt efter lysets indfald. Værdierne på LDR-sensorerne vil blive aflæst og dernæst vil Arduino give instruktioner til servomotoren om, hvad den skal gøre.

  1. Hvis det er mere lys på venstre side dvs. værdierne på venstre LDR er højere end den på højre vil den bevæge sig til venstre.
  2. Hvis det er mere lys på højre side dvs. værdierne på højre LDR er højere end den på venstre vil den bevæge sig til højre.
  3. Hvis solen er gået ned, vil det sige at værdierne på LDR er meget lave og dermed vender den tilbage til startpositionen, så den er klar til den næste dag, når solen stiger op igen.

Der er anvendt en tolerance for at forhindre servomotoren i at bevæge sig når der er en små differens mellem de to indlæste LDR-værdier og dermed gør den mere stabil. 

Kode 

For at arduinoen kan have en bestemt opførsel skal der også skrives noget kode. Gruppen startede med at erklære de forskellige pins som fik den tilsvarende værdi som var forbundet til på Arduinoen. De værdier som benyttes af digital signal er primært LED lysene, som kun kan have to værdier, nemlig HIGH and LOW, mens LDR-modstandene kan have flere forskellige værdier og derfor har et Analogt signal. Eftersom, at værdierne hurtigt kan ændre sig og dermed have svingninger er der blevet implementeret et deadband på 40. 

I koden er der to forskellige funktioner: Setup() og Loop(). Setup() er funktionen, som bliver kaldt når et sketch startes. I funktionen findes forskellige PinMode() kald, som er blevet brugt til at konfigurere de forskellige pins til at fungere, som enten et output eller input. myServo, som er en instans af Servo bliver også konfigureret til  D9. For at kunne aflæse tallene og dermed plotte dataene til en graf benyttes der Serial. I funktionen sættes Serial til at kunne aflæse værdierne med en baud rate på 9600 bit pr sekund. 

Loop() funktionen indeholder den logik, som sørger for at aflæse værdierne på LDR modstandene og vurderer om den enten skal dreje til højre eller venstre ved hjælp af nested if statements. Den yderste if statement vurderer om sensor værdien på den første LDR er større end sensor værdien på den anden LDR minus tolerancen. Hvis dette er tilfældes så drejes servomotoren, mens LED pæren som servoen drejer hen mod bliver tændt. 

Sidst i loop() funktionen bliver Serial kaldt for at printe værdierne. Der er blev sat et delay på 1 minut, så resultaterne er mere overskuelige.

#include <Servo.h>

int sensorPin = A0;

int sensorPin2 = A1; 
int led1 = 12;
int led2 = 11;
int servoPin = 9;
int sensorValue = 0;

int sensorValue1 = 0; 
int sensorValue2 = 0; 

int servoGrad = 180;
int tolerance = 40;
int minuteCounter = 0;

int totalSensorValue = 0;

Servo myservo;

void setup()
{

    pinMode(sensorPin, INPUT);
    pinMode(sensorPin2, INPUT);

    myservo.attach(servoPin);
    myservo.write(servoGrad);
    Serial.begin(9600);
}

void loop()
{
  
    sensorValue1 = analogRead(sensorPin); // 200
    sensorValue2 = analogRead(sensorPin2); // 200 
    totalSensorValue = sensorValue1 + sensorValue2;

    
    
    if (sensorValue1 < sensorValue2-tolerance)
    {
        if (servoGrad <= 180 && servoGrad > 0)
            servoGrad--;
            digitalWrite(led2, HIGH);
            digitalWrite(led1, LOW);
    }
    else if (sensorValue1 >= sensorValue2+tolerance )
    {
        if (servoGrad >= 0 && servoGrad<180)
            servoGrad++;
            digitalWrite(led1, HIGH);
            digitalWrite(led2, LOW);
    }

    else if(sensorValue1 < 20 && sensorValue2 < 20){
      if(servoGrad < 180){
       servoGrad++; 
      }
       digitalWrite(led1, LOW);
       digitalWrite(led2, LOW);
    }
    minuteCounter++;

    
    myservo.write(servoGrad);
    
    Serial.print("Minute: ");
    Serial.print(minuteCounter);
    Serial.print("; TotalValue: ");
    Serial.print(totalSensorValue);
    Serial.print("; SensorValue1: ");
    Serial.print(sensorValue1);
    Serial.print("; SensorValue2: ");
    Serial.print(sensorValue2);
    Serial.print("; Servograd: ");
    Serial.print(servoGrad);
    
    Serial.println();
    delay(60000); // changes each minute
}

Testkørsel med rigtig sol

Solcellen blev testet den 17. marts 2021 mellem 12:00 og 21:30. Om morgenen var det ikke muligt at placere robotten ud på grund af vind og tåge, men klokken 12 kom solen, og gruppen greb chancen. Umiddelbart gik testperioden meget godt uden nogen mærkbare vanskeligheder.

Figur 4. Diagram over testperioden af solcellen Wall-E

Tiden på grafen er beskrevet i minutter hvoraf 0 minut er kl 12 og den sidste minut er 21:30. Intervallet i loopen i Arduinoen var 1 minut dvs. at sensorerne blev kun læst engang om minuttet. Testperioden tog 560 minutter, hvilket vil sige, at experimentet endte omkring kl 21:30.

Blå Linje

TotalValue er den samlede værdi fra begge LDR-sensorer og er den blåfarvede linje. Grunden til at gruppen valgte at anvende den samlede værdi over to separate værdier pga på grafen var, at den samlede værdi påviste bedre det samlede lysindfald i løbet af dagen så gruppen kan se, hvornår det begynder at blive mørkt. Man kan se, at allerede fra starten er lysindfaldet højt og dette skyldes, at gruppen startede kl 12 da solen allerede var steget op. Det er også muligt at se svingninger i tidsintervallet 100 min – 130 min, som gruppen mener skyldes flere skyer der var omkring dette tidspunkt. Solen begyndte så småt at gå ned efter 300 minutter ie 5 timer (kl 17 ), men der var stadig lyst indtil omkring 19.

Rød Linje

Den røde linje viser graden servomotoren er på, hvoraf 180 er startpositionen og 0 er slutpositionen. Gruppen kan umiddelbart se en nedadgående lineær linje fra start til omkring 100 minutter ind i testperioden. Grunden til dette er, at robotten prøver at indhente solen fordi experimentet startede kl 12, men grundet intervallet vil servomotoren kun nå at dreje 60 grader om timen. Omkring 100 min inde i experimentet begynder servomotoren at stabilisere omkring positionen 90 grader og derefter følger solen stabilt. Servomotoren når sit laveste punkt på 200 minutter, og derefter begynder det langsomt at gå den anden vej igen, fordi solen har nået sit højeste punkt.. Kl 21:30 er den nået tilbage til start positionen igen og klar til næste dag.

Diskussion

Udfordringer ift. koden

Arduino Strings

Der var nogle problemer med at anvende arduino strings, fordi de ikke kunne append de indlæste værdier. Måden gruppen tacklede dette problem var at lave en “fix” ved for at kunne nå at lave experimentet på dagen. Et fix var at anvende “Serial.print()” som som en slags append i stedet for append direkte på Arduino stringen.

CSV

Set i bakspejlet burde gruppen have formateret Serial Output som en CSV, men dette havde gruppen ikke tænkt på før gruppen gik i gang med experimentet. Dette medførte i at gruppen måtte konvertere dataen fra experimentet til CSV format bagefter.

Tolerance

Gruppen frygtede med for lav tolerance ville servo motoren dreje sig for meget. At finde den rigtige tolerance var besværligt, da gruppen ville have et stabilt system og derfor anvendte tolerance for at undgå svingninger. Gruppen eksperimenterede med nogle få tolerancer før den endelig tolerance blev valgt for experimentet. 

Opbygning af robotten

Da der skulle foretages et experiment udendørs medførte det så breadboardet samt computeren skulle også stå udenfor. Dette kunne være risikabelt da experimentet ville tage flere timer og at det ikke kan garanteres at det ikke vil regne. Gruppen overvejede at decouple breadboard fra overfladen af solcellen ved at forlænge ledningerne ved at sammensætte flere Female-to-Male ledninger og måske sætte alt andet end solcellen under ly. Gruppen valgte dog at gå med breadboardet. Denne opsætning havde dog den ulempe at servomotoren bar al vægten af breadboard hvilket resulterede i at servomotoren kunne falde af.

Statusindikator 

Gruppen anvendte lys til at illustrere, når robotten bevægede sig. En anden mulig løsning er at bruge lyspærer til at illustrere, hvilken position servomotoren befinder sig. Det kunne eventuelt være opsat ved hjælp af 7 lysdioder, hvor den midterste altid lyser. Hvis værdien er under 76 grader vil lysdioderne fra midten til venstre side begynde at lyse. Når værdien når helt ned til 0 grader vil hele venstre side lyse. Samme er gældende for højre side, hvor man maksimalt kan nå op til 180 grader. Hvis dette er tilfældet, så vil alle lysdioder fra midten til højre side lyse.

Konklusion

Der er lavet et simpelt solpanel, der følger solen rundt, som styres af en Arduino ved hjælp af LDR-modstande. Systemet lever op til kravene i beskrivelsen, men har stadig rum for forbedring såsom at forbedre koden således, at den formaterer output som en CSV fil. Gruppen valgte at bruge breadboardet som solcelle overfladen og dette havde også nogle konsekvenser såsom, at det var tungt for servomotoren at have al den vægt på således at hovedet på servomotoren kunne falde af. En forbedring af systemet ville muligvis at  decouple breadboardet af solarpanelet.

Video

Det ses på videoen den flytter sig i lysets retning og når det er mørkt drejer mod venstre for at komme tilbage til et udgangspunkt – i den her video er intervallet kun 500 millisekunder og derfor meget hurtigere end det gruppen brugte til solen.

Leave a Reply