Gruppemedlemmer – David Mørk, Gustav Bork og Younes El-Hawari

Robottens opbygning
Robottens opgave er at den med en motor skal kunne dreje sig efter hvor solen er på himlen. Robotten er opbygget således at den kan dreje dens ”overkrop” efter en lyskilde, derudover kan den manuelt bevæge ”hovedet” op og ned. Robottens 2 motorer er placeret således at den kan dreje dens ”krop” lige over hjulene, og så den kan dreje det øverste sted på robotten op og ned, de er placeret således så robotten bliver stående hvor den er placeret manuelt og har mulighed for at dreje efter lyskilden. For at få robotten til at dreje efter en lyskilde er der blevet brugt 2 photoresistore, således at når der kommer lys fra den ene side drejer den til højre, og når der kommer lys fra den anden side, drejer den til venstre – dette er opnået ved at placere photoresistorne i toppen, men med en væg imellem dem for at skærme lyset så det kun rammer den ene, indtil at den er roteret til en vinkel, hvor begge photoresistore får lys.
For at undgå at robotten overstyrer og eventuelt vælter når lyset rammer den ene photoresistor, og dermed får robotten til at dreje den vej, er der blevet brugt en gearing, denne gearing er opbygget ved hjælp af 4 tandhjul med forskellige størrelser – det gør at robotten langsomt drejer mod lyskilden, og dermed undgår en overstyring

.

 

Robottens kredsløb og arduino programmering
Systemet er opbygget ved at have et kredsløb som er styret af en arduino som har en motor shield monteret, dette er monteret da selve arduinoen ikke kan levere nok strøm til at køre en motor. Kredsløbet består af i alt 4 resistorer. 2 photoresistorer samt 2 faste modstande. Det er opbygget på denne måde så vi kan etablere en spændingsdeling der gør at vi overhovedet kan læse input fra de 2 sensorer. De 2 photoresistorer giver værdier mellem 0 og 1023, når de opfanger lys, altså får vi 10 bit (2^10 = 1024) værdier. Der skulle ændres i værdierne, da de skulle sættes ned af for at der kunne ses forskel på om der er lidt naturligt lys og om der er lys direkte på den.

 

For at få robotten til at dreje alt efter hvilken photoresistor der får mest lys, er der i arduinokoden blevet lavet en threshold variabel, denne variabel bliver brugt til at få robotten til at dreje så korrekt efter lyskilden, dette bliver gjort ved den tager højde for forskellige statements og dreje alt efter hvilken statement der er sandt.

//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 = 40; // 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 StepSP = 0; //Iterations steps som skal anvendes for at få armen i start position (SP) 
int StepCount = 0; // Det totale antal steps som systemet bruger for at følge solen. (800~ Steps er cirka solnedgang)


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); // Læser værdien fra sensor1 (venstre)
Sensor2 = analogRead(sensorPin2); // Læser værdien fra sensor2 (højre)
Serial.print(Sensor1); 
Serial.print(", "); 
Serial.print(Sensor2); 
Serial.print(", "); 
Serial.println(StepCount);  // Disse print commands er til for at opstille hvad vi kan læse i monitoren. (Sensor1 Værdi, Sensor2 Værdi, StepCount)

if(Sensor1>threshold && Sensor2>threshold){ //Denne kommando instansieres hvis begge sensorer modtager lys der bringer dem over threshold
  digitalWrite(motorTurn, HIGH);
  analogWrite(motorSpeed, 0);
  delay(200);
  if(StepCount <0){ // Hvis begge sensorer modtager lys bliver stepcounten sat til 0)
    StepCount = 0; 
  }
  }
  
else if (Sensor1>threshold && Sensor2<threshold) { //Venstre Sensor modtager lys, denne kommando får armen til at bevæge sig mod venstre
  digitalWrite(motorTurn, LOW);
  analogWrite(motorSpeed, 100);
  StepCount--; 
  }
  
else if (Sensor1<threshold && Sensor2>threshold){ //Samme som den anden case, men bare i modsat retning
  digitalWrite(motorTurn, HIGH);
  analogWrite(motorSpeed, 100); 
  StepCount ++; 
  }
  
else{
  if(StepCount > 500){
  StepSP = 0;  //Variablen tiden sættes til 0
  StepCount = 0; 
    delay(1000); // 1 sekunds delay 
    while(StepSP <900){ // rotationssystemet rotere tilbage tiludgangspunktet - indtil tiden er lig 800
        digitalWrite(motorTurn, LOW);
        analogWrite(motorSpeed, 100); 
       // Serial.println("Drejer til udgangspunkt (Øst). StepSP: ");
        Serial.println(StepSP);
        StepSP++; //ligges 1 til StepSP
    }
  }} 
}

 

Der er 3 statements den kan tage højde for, 1. når denne ene photoresistor er over threshold og den anden er under, 2. når den modsatte photoresistor er over threshold og den anden er under, 3. når begge er over threshold. Dette får robotten til at dreje alt efter hvilket statement er er true. Dette threshold er sat til 40 i test videoen som er udført i et værksted med en lyskilde fra en lommelygte, men hvis den skal bruges andre steder, er er behov for at ændre dette threshold alt efter hvor meget lys den photoresistor som den ikke skal dreje mod får på sig.

Flow diagram

På nuværende tidspunkt checker robotten konstant efter ændringer i lyset – vi valgte ikke at inkludere et delay i vores kode da det kunne være at der var en refleksion eller lignende, som ville give robotten et forkert “resultat”, og derved kunne få den til at dreje forkert. Dette betyder også at den hele tiden kører på dens strømkilde, så en forbedring her ville være at sætte et delay på, sådan så  robotten  for eksempel kun checker x antal gange i timen for at spare strøm.

Konklusion
Som det ses på videoen, virker robotten når der bliver brugt en kunstig lyskilde i form af en lommelygte, derfor burde den også virke når der kommer naturligt lys fra solen, men med en ændring i threshold. For at optimere robotten, kunne den motor der lige nu manuelt bevæger robottens ”hoved” hvor de 2 photoresistorere der kører op og ned gøres automatisk, dette ville optimere udnyttelsen af solens energi da solen ikke altid står samme sted på himlen. En anden forbedring ville være at sætte et delay på, sådan så robotten kun checker efter ændring i lysets retning x antal gange i timen for at spare på batteri.

Leave a Reply