David Mørk og Mathias Winnard

Robottens Opbygning

Robotten er bygget op af LEGO, en DC Motor og fire resistorer, de fire resistorer består af to photoresistorer (også kaldet Light Dependent Resistor eller LDR) og to faste modstande. LDR fungerer ved princippet om “photo conductivity”. Materialet som er placeret på sensoren er i stand til at ændre sin ledende kraft, dens resistens, i forhold til hvor meget lys det modtager. Dette betyder at jo mere lys sensoren får jo mindre resistans har den, og denne ændring kan måles i den strøm der bliver sendt igennem sensoren og tilbage til arduinoen. Robottens opbygning kan inddeles i to dele; Første del er den nedre del som er dens fundament hvor motoren sidder. Den anden del er den øvre del; denne del er bygget så den kan dreje efter solens stråler, det er også her de to LDRs sidder, hvor de er adskilt af en væg mellem dem. Robotten virker ved at når der er lys på den ene LDR (f.eks. Den venstre på billedet på næste side) og mørke på den anden (Højre LDR på billedet), så drejer den til venstre. Når det direkte modsatte sker, drejer den til højre og når der er lys på begge så står den stille. Dette betyder at når solen står op, så retter robotten sig ind, så den er direkte mod solen og når solen så bevæger så hen over himlen følger robotten derefter. Der er også bygget en gearing på robottens motor; dette er gjort så robotten ikke laver en ”overstyring” når solen rammer en LDR ved at gøre farten mindre, hvilket dermed hjælper med nøjagtigheden af placering ift. Solen gennem dagen.

Robottens Hardware og Arduinokode

Som tidligere fortalt, følger robottens solens stråler ved hjælp af to photoresistorer/LDR. Dette bliver gjort ved at koble dem til en Arduino som kan ”fortælle” hvilken vej motoren skal ”dreje” ved hjælp af en sketch lavet i Arduino IDE (Integrated Development Environment). LDRerne giver en værdi mellem 0 og 1023 når de opfanger lys; altså kan der læse 10 bit (2^10 = 1024) værdier. I kredsløbet er der etableret en spændingsdeling ved at bruge to faste modstande, som er på 100k ohm, i forlængelse at LDRerne; dette er nødvendigt for at få tal-værdierne ned hvor de er mulige at aflæse. Da Arduinoen ikke selv kan levere nok strøm til at kører DC motoren, er der monteret et motor shield på Arduinoen, derudover kan et motor shield ved hjælp af den indbygget H-bridge styrer 2 motorer hvert for sig i hver deres retning, i dette projekt bliver der dog kun benyttet 1 motor.

For at få robotten til at dreje efter hvilken LDR der får mest lys, er der i arduino-koden (også kaldet for en sketch som tidligere nævnt) blevet lavet en threshold variabel. Threshold variabelen bliver brugt til at få robotten til at dreje sig korrekt efter en lyskilde. Dette bliver gjort ved den tager højde for forskellige statements og dreje alt efter hvilken statement der er sandt i sketchen.

Formålet med sketchen er at den skal læse LDRernes værdier og, ud fra disse værdier, styrer motoren i hvilken retning den skal kører og med hvilken fart. Dette bliver gjort ved at definere en variabel (threshold) som bliver brugt til at se efter hvilken LDR der er lys på.

Der bliver yderligere også defineret en variabel (dark), som bruges til at se efter om det helt nat (altså en høj værdi fra begge LDRer)  eller om det er overskyet. (altså en mellem værdi fra begge LDRer)

Der bliver deraf også defineret en boolean variabel (darkSP) som bruges til at få motoren til at kører tilbage over natten.

//variabler
const int sensorPin1 = 0; 
const int sensorPin2 = 1; // Højre Sensor på pind A1. Venstre Sensor indsat på A0.
int Sensor1 = 0; // Erklærer variablen Sensor1 som modtager værdien fra sensorPin1 (venstre) 
int Sensor2 = 0; // Erklærer variablen Sensor2 som modtager værdien fra sensorPin2 (højre)
int threshold = 50; // Den værdi som photoresistoren skal læse over før den skal registrere et udslag.
int motorTurn = 12; // Sætter digital pin 12 til at styre motordrejningen
int motorSpeed = 3; // Sætter analog pin 3 til at styre motorhastigheden
int dark = 300; 
bool darkSP = false;
 
void setup() {
// Output skal erklæres, da Arduinoen selv finder ud af hvad der er input.
Serial.begin(9600); // En kommando som skal indsættes så vi kan se hvad photoresistoren læser i monitoren.
pinMode(motorTurn, OUTPUT); // Erklærer at motorTurn er output
pinMode(motorSpeed, OUTPUT); // Erklærer at motorSpeed er output
}
 
void loop() {
Sensor1 = analogRead(sensorPin1); 
Sensor2 = analogRead(sensorPin2); 
Serial.print(Sensor1); 
Serial.print(", "); 
Serial.print(Sensor2);
Serial.println(", ");
Serial.println(darkSP);

if(Sensor1<threshold && Sensor2<threshold){
  digitalWrite(motorTurn, HIGH);
  analogWrite(motorSpeed, 0);
  delay(1000);
  darkSP = false;
  }
  
else if (Sensor1>threshold && Sensor2<threshold) { 
  digitalWrite(motorTurn, LOW);
  analogWrite(motorSpeed, 100);
  delay(1000);
  }
  
else if (Sensor1<threshold && Sensor2>threshold){ 
  digitalWrite(motorTurn, HIGH);
  analogWrite(motorSpeed, 100); 
  delay(1000);
  }

else if(dark > Sensor1 > threshold && dark > Sensor2 > threshold){ 
  digitalWrite(motorTurn, HIGH);
  analogWrite(motorSpeed, 0);
  delay(1000);
  }


else if(dark < Sensor1 && dark < Sensor2 && darkSP == false){
  darkSP = true;
  digitalWrite(motorTurn, HIGH);
  analogWrite(motorSpeed, 100);
  delay(4000);
}


else{
        digitalWrite(motorTurn, LOW);
        analogWrite(motorSpeed, 0); 
    }
  }
  

Der er i koden 5 statements, hvor Arduinoen reagerer forskelligt alt efter hvilket statement der er TRUE.

1.     statements (Sensor1<threshold && Sensor2<threshold) sætter motorSpeed til 0

  • dvs. Motoren ikke kører når der er lys på begge LDR.

2.     statement (Sensor1>threshold && Sensor2<threshold)

  • sætter motorSpeed til 100 og motorTurn til LOW, hvilket får den til at dreje til højre, når der er lys på Sensor1.

3.     statement (Sensor1<threshold && Sensor2>threshold)

  • sætter den til at kører modsat vej af nr. 2. statement.

4.     statement (dark > Sensor1 > threshold && dark > Sensor2 > threshold)

  • sætter motoren til ikke at kører når solen er dækket af skyer.

5.     statement (dark < Sensor1 && dark < Sensor2 && darkSP == false)

  • sætter motoren til at kører i 4 sek. hvorefter den stopper, dette gøres når det bliver nat.

Flow-diagram

Konklusion

Ifølge opgaveformuleringen opfylder Sol-Robot kravene ift. den givne opgave. Sol-Robot kan med sine to LDR-modstandere  detektere sollysets retning og via en Sketch lavet i Arduino IDE samt en DC motor rette en flade ind, så den står vinkelret med solens stråler. Selve fladen, som kun bliver styret af den ene DC motor, har derfor været nødt til at blive sat i en optimal position for at optimere solindfaldet (ca. 55 grader). Der er derudover i udviklingsprocessen blevet lavet en løsning til hvad der skal ske, når solen er gået ned/står op (Se Statement 5 under programmets opbygning og Arduino Hardware). For at sørge for en glidende bevægelse når robotten detekterer sollyset, er der her blevet benyttet et gear modul, som sørger for at der ikke sker  overstyring” når solen rammer en LDR. Ved hjælp af gear modulet sker der også en glidende bevægelse når robotten skal justere sin rotation og derved forøger den at følge solen bedst muligt.

En eventuelt forbedring til robotten kunne have været at motoren var placeret i toppen af robotten og monteret på en fod, i modsætning til nu, hvor motoren er del af foden. Herved kunne problemet med at den blev viklet ind i egne ledninger ved rotation tilnærmelsesvis undgås. Dette ville dog kræve en betydeligt tungere og mere stabil fod, eftersom motorens egen vægt ville blive tilføjet til robottens øvre, dynamiske halvdel. Der skulle derved også være plads til breadboardet samt selve Arduino UNOen og Motor-Shieldet mm. For at helt at undlade at have ledninger mm. Der har muligheden for at vikle sig ind i hinanden.

Som alternativ til at gøre brug af en DC motor til rotation, kunne man også have brugt en Stepper motor. Ved at gøre brug af en stepper-motor ville man nemmere kunne styre vinklingen samt rotationen af robotten, da man ved en stepper motor kan “huske” tidligere værdier f,eks, hvor mange rotationer der er lavet på akslen før den stoppede med at køre; hvoraf en DC motor kun kan være LOW/HIGH og derfor ikke kender noget til dens tidligere værdier. På denne måde kunne vi f.eks. droppe vores 5. statement fra (som sørger for at robotten nogenlunde er i lys indfaldsvinkel) til at robotten bør køre tilbage til nøjagtig tidligere position. Dette ville dog også have enkelte problemer som med en DC motor, nemlig solens position over et helt år der kan ændre sig.

Leave a Reply