Navn på robotsystemet

JoLuDi Solcelle

  • Navne på gruppemedlemmerne

Jonas Jensen, Lukas Teichert og Didde Jacobsen.

  • Hvordan ser systemet ud? – husk billede

Billede 1

På billedet ses konstruktionen af vores løsning på solcelle tracker. Her ses der gearing til motor samt “solfanger” platformen, hvor der monteret 2 LDR modstande der er separeret med plade (De to LDR modstande er separeret fordi der gerne skulle være en hvis forskel mellem målingerne). Motor er forbundet til arduino Rev3 motorshield, og LDR er forbundet til analoge porte på arduino shieldet gennem breadboard.

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

Gruppen anvendte en DC motor, hvor der ingen gearing er. Dette giver problemer med styring af hastigheden af selve motoren. Derfor brugte gruppen et gearing system til, at gøre motoren lettere at kontrollere. Derudover valgte gruppen at anvende netop disse størrelser, og antal gear til at sænke farten på motoren, da solen bevæger sig meget langsomt.

o Hvilke tanker ligger bag ved opbygningen

Selve konstruktion er gennemgået flere iterative processer, hvor gruppen har afprøvet flere forskellige konstruktioner. Her udvalgte gruppen en simpel konstruktion til, at løse opgaven. Grunden til den viste konstruktion er at gearingen, var problematisk, at få til at passe. Samt vidste gruppen at den optimale vinkel på solcellerne skulle være omkring 45 grader i Danmark.

o Er der nogen gearing?

Gruppen anvender et 16 tands tandhjul på motoren og flytter det over på et 64 tands tandhjul, ovenpå dette tandhjul sidder et 8 tands tandhjul der flytter energien videre til det sidste 64 tands tandhjul. Hvilket giver konstruktionen en gearingsratio på 132. Dette betyder at når motoren kører en omgang kører konstruktion 132 gange rundt.

 

o Hvor er motoren placeret og hvorfor dér?

Placeret ved siden af selve konstruktionen, hvor dens kraft bliver transporteret af gearingen. Fordi at det var nemmere at implementere gearingen ud fra den afstand motoren er placeret fra konstruktionen (Platformen, se billede 1).

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

2 stk LDR modstande er brugt til produktet. Her er de placeret på en platform, med en “væg” til at separer dem. (Se billede 1)

o Har det været problemfrit at opbygge robotten eller har den ændret

form/sensor-placeringer flere gange?

Flere forskellige konstruktioner blev anvendt dog var første konstruktion den endelige. Sensorenes placering har ikke rigtig ændret sig.

  • Hvordan er robottens hardware sammensat?

o Lav en diagramtegning (brug evt. fritzing.org/download)

Billede 2

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

delkomponenter

Billede 3

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

Motorshieldet var der problemer med, at få til at virke. Vi prøvede at lave en separat H- Bridge, for at kunne vende polariteten i motoren for at kunne kører begge veje. Dog lykkedes det at anvende Rev3 Shieldet, hvilket gjorde processen nemmere.

  • Hvordan er robottens opførsel implementeret

o Hvad er de overordnede opførsler / metoder for robotten

Billede 3 viser opsætningens koden, hvor vi først har implementeret et tids bibliotek for at kunne have styr på hvornår at solcellen skulle “nulstille” sig selv. Derefter opretter vi hvilke porte der skal benyttes.

Til sidst på billede 3 sættes tiden (Hour, Minute, Second, day, Month, year efter 1970), dette valgte vi at gøre her da der var et problemer med at få Arduino til at hente aktuel nuværende tid fra PC.

Billede 4 viser selve koden der får robotten til at bevæge sig og følge solens position. For at kunne “kigge” efter solens position, valgte vi at bruge et loop, med et interval på 5 minutter, da solen ikke bevæger sig særlig hurtigt behøves der ikke at blive tjekket konstant, og for at undgå små ændringer i lysets styrke. Når LRD Modstandene måler at der er en forskel på de 2, vil et if statement blive aktiveret, hvor der igen efter 1 minut vil blive lavet et tjek, for at se om ændringen stadig er relevant, eller om dette bare var en sky eller skygge der tilfældigvis har påvirket dem nok til at LRD modstanderne har målt en forskel mellem dem. Hvis der ved dette tjek ikke måles nogen forskel, vil robottens position forblive uændret, og vil gå tilbage til sine 5 minutters tjek. Hvis der til gengæld stadig måles en forskel mellem modstanderne, vil en af de 2 while loops gå i gang, afhængig af om værdien er over eller under 1.

while Loopene fortæller hvilken retning motoren skal dreje, for at kunne bevæge robotten frem og tilbage,  derefter sættes PWM_B(Hastighed) på motoren med en startværdi på 32. Derefter accelerere motoren hver gang at loopet køre, med en stigning på 16 indtil sensor værdierne er lige med 1. For at tjekke sensor værdierne, vil der i hvert gennemløb af while loopet blive indsamlet data fra de to LDR modstande og ud fra dette laves ny udregning (variablen: value).

Når at værdierne er lige med 1, breaker vi ud af while loopet, hvorefter motorens PWM_B(Hastighed) sættes til 0, hvilket får motoren til at stoppe.

o Lav et flow-diagram, der beskriver robottens opførsel.

Billede 4

o Inkludér kode + beskrivelse – Til at formattere og highlighte jeres kode på

blog’en kan i bruge Crayon Syntax Highlighter. Dette gøres ved at anvende

ikonet: i menubjælken under ”Add new post” i wordpress. Bare benyt

standardindstillingerne i ”Add Crayon Code”-popup’en. Sketching-sproget

formateres fint med JAVA-indstillingerne!

#include <Time.h> 
#include <TimeLib.h>
// Tids-bibliotek inkluderes
///////////////////////////////////////////////////////////////////////////
const int 
PWM_B   = 11,
DIR_B   = 13,
BRAKE_B = 8,
SNS_B   = A0;

int Sensor1 = A4;
int Sensor2 = A3;
int SensorValue1 = 0;
int SensorValue2 = 0;
time_t t = now();
//Oprettelse af variabler og Pins til arduino og tiden sættes
///////////////////////////////////////////////////////////////////////////
void setup() {
  setTime(15,30,0,4,4,48);
  // Configure the A output
  pinMode(BRAKE_B, OUTPUT);  // Brake pin on channel A
  pinMode(DIR_B, OUTPUT);    // Direction pin on channel A

  // Open Serial communication
  Serial.begin(9600); 
}
//Tiden sættes manuelt samt deklarering af Pins til OUTPUT og opsætning af Serial Monitor
///////////////////////////////////////////////////////////////////////////
void loop() {
// Set the outputs to run the motor forward
  Serial.println(second());
  delay(300000); // 5 minuter
  SensorValue1 = analogRead(Sensor1);
  SensorValue2 = analogRead(Sensor2);
  float value;
  
  int hastighed = 32;
  value = SensorValue1 / SensorValue2;
  Serial.println(SensorValue1);
  Serial.println(SensorValue2);
  Serial.println(value);
//Opsætning af læst data og delay på sensor læsning samt udregning af differencen mellem de to sensorer. 
//Start hastighed for motor sættes til 32.
///////////////////////////////////////////////////////////////////////////
  if(hour() == 0 && minute() == 0 && second() == 0){
    analogWrite(PWM_B, hastighed);
    hastighed += 16;
    delay(10000);
    analogWrite(PWM_B, 0);
    hastighed = 32;
  }
//Reset funktion med manuel tidssætning. For at løse solnedgangs problemet, drejer motor 180 grader tilbage. 
///////////////////////////////////////////////////////////////////////////
  if (value !=1){
      delay(60000); // 1 minut
      SensorValue1 = analogRead(Sensor1);
      SensorValue2 = analogRead(Sensor2);
      value = SensorValue1 / SensorValue2;
//Hvis der er en difference på de to sensorere tjekkes der igen efter 1 minut.
///////////////////////////////////////////////////////////////////////////      
      while(value > 1){
        Serial.println("Go Forward");
        digitalWrite(BRAKE_B, LOW);  // setting brake LOW disable motor brake
        digitalWrite(DIR_B, HIGH);   // setting direction to HIGH the motor will spin forward
        
        analogWrite(PWM_B, hastighed);     // Set the speed of the motor, 255 is the maximum value
        hastighed += 16;
        SensorValue1 = analogRead(Sensor1);
        SensorValue2 = analogRead(Sensor2);
        value = SensorValue1 / SensorValue2;
      }
      while(value < 1){
        Serial.println("Backward");
        digitalWrite(BRAKE_B, LOW);  // setting againg the brake LOW to disable motor brake
        digitalWrite(DIR_B, LOW);    // now change the direction to backward setting LOW the DIR_A pin

        analogWrite(PWM_B, hastighed);     // Set the speed of the motor
        hastighed += 16;
        SensorValue1 = analogRead(Sensor1);
        SensorValue2 = analogRead(Sensor2);
        value = SensorValue1 / SensorValue2;
        }
    }
//Her tjekkes der med while statements om sensor værdien mellem de to sensorer er større eller mindre end 1.
//Hvilket afgøre højre eller venstre rotation på motor. Her køres while loopet indtil værdierne igen er lige med 1.
//Hastigheden er styret af en kontrolleret acceleration ved at incremente hastigheds variablen. 
///////////////////////////////////////////////////////////////////////////    
    hastighed = 32;
    digitalWrite(BRAKE_B, HIGH);
    analogWrite(PWM_B, 0);
//Når while loopet ikke kører sættes motorens hastighed til 0.
///////////////////////////////////////////////////////////////////////////
}

 

 

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

Tids biblioteket er meget akavede opsat, da selve tiden sættes manuelt og ikke rigtig kan opdateres til nuværende, da programmet genstartes ofte.

Tiden sættes efter timer på dagen. Check intervallet er 5 minutter. Hvis minutter angives kan der ske problemer med tidstjek.

Da vi kun havde en DC motor blev 180 grader, regnet efter sekunder ud fra et stopur, derfor er det ikke så præcist, som det kunne være, hvis man vidste hvad motorens position var, men positionen var ikke så vigtig da selve anordningen ville tilpasse sig når solen kommer frem i øst. (Dog blev der overvejet at lave en beregning på tandhjulene på fysiske gearing, for at få en mere præcis position).

  • Konklusion

o Løser robotten opgaven ift. opgaveformuleringen?

Robotten løser opgaven som den skal. Der er dog noget usikkerhed i forhold til præcision.  Selve de komponenter der er blevet stillet til rådighed er ikke de bedste muligheder til løsningen. Dog har gruppen formået at forstå vigtigheden af gearing når der er med en DC motor at gøre.

o På hvilke punkter kan den forbedres – og evt. hvordan?

Præcision ville være vores robots største svaghed, samt ledninger rives ud af breadboard, hvis robotten drejer mere end ca. 3/4 rundt. Dette kunne gruppen have løst med en kontakt der ville blive aktiveret, som ville fortælle arduinoen at nu har konstruktionen nået sit mål, hvilket betyder den nu skal slukke motoren.

  • Video

o Inkludér demo-video. Det er fint at benytte en anden lyskilde end solen for at

speede processen op 😉

Leave a Reply