Lavet af: Thea Kingo og Sara Larsen

Opbygningen af UTSC-robotten

Formål
Systemet er lavet så der er en konstant vinkling af solcellerne mod himlen,  hvilket optimerer solindfaldet. Herpå er der monteret LDR-sensor der registrerer lysindfaldet og får motoren til at roterer i forhold lysindfaldet.
Materialer
UTSC-robotten er lavet af 2 LDR-modstande til at detektere sollysets retning. Disse er sat i forbindelse med 2 Modstande i et kredsløb styret af et Arduino program i en Arduino microcontroller med et Arduino Motor Shield. Opbygningen er lavet i LEGO og styret
med en LEGO DC motor.
Sammensætning
Motoren er placeret ved siden af rotationssystemet. Det er den for at få en lille kompakt opbygning. Der er benyttet 2 LDR-sensorer, der er placeret på den skrå flade øverst mod himlen. Disse er separeret med en skillevæg, så de ikke registrerer lys fra modsatte side.
Gearingen af motoren kan omdanne omdrejningshastighed til kraft. Det er en fordel, da opsætningen skaber en del modstand i rotationen, mens solens bevægelse på himlen er meget langsom. Gearingen går fra et tandhjul på 8 tænder til et tandhjul på 56 tænder, hvorved vi øger styrken 7 gange og nedsætter hastigheden 7 gange. Under opbygningen af robotten blev gearingen ændret fra 1:2,33 til 1:7, hvorved vi oplevede at motoren kørte mere jævnt og sad mindre fast.
Problemer under opbygningen kan begrænses til udfordringer med at bygge i LEGO især ift. montering og fiksering af tandhjul. En anden overvejelse var at placere breadboardet på det roterende system, for at mindske antallet af ledninger. Fordelen ved det er en større bevægelsesfrihed, men det kan skabe unødig belastning på rotationssystemet. Dog kan ledninger fra den roterende del til den faste del skabe en modstand, der ikke kan hindres!

Koden

Robotten får et input fra sensorerne, der sammenlignes med en forudbestemt grænseværdi der
bestemmer om der er lys eller skygge. Grænseværdien er fundet ved forudgående test i naturligt miljø. Rotationssystemet aktiveres på baggrund af sensorernes input.
For hvert step i en positiv rotation tælles variablen count op. Når den når over 500 og der ikke er lys, så drejes rotationssystemet tilbage til startpositionen, mod øst. Hvis rotationsdelen drejer i negativ retning, tælles count tilsvarende ned.
Hvis rotationssystemet ikke rammer startpositionen, korrigeres for dette vha. positiv og negativ omdrejning, bestemt af lyssensorerne. I tilfældet hvor rotationssystemet har overdrejet, dvs. den står for nordligt, så korrigeres dette og count sættes til nul.
//variabler
const int sensorPin1 = 0; // Venstre LDR-sensor1 på pind A1 (virker pt. ikke)
const int sensorPin2 = 1; // Højre LDR-sensor2 på pind A1
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 = 300; //Grænsen for lys og mørke 
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 rotationsdelen skal bruge for at komme til startposition (SP, øst) 
int StepCount = 0; //antalt steps som rotations systemer bruger for at følge solen (count = 800 når rotationssystemet har roteret 180 grader) 


void setup() {
// Output erklæres, input regner den selv ud
Serial.begin(9600); // Bare fordi det skal vi for at skrive til 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 LDR-sensor1 (venstre)
Sensor2 = analogRead(sensorPin2); // Læser værdien fra LDR-sensor2 (højre)
Serial.print(Sensor1); 
Serial.print(", "); 
Serial.print(Sensor2); 
Serial.print(", "); 
Serial.println(StepCount); 

if(Sensor1>threshold && Sensor2>threshold){ //hvis begge ser lys
  digitalWrite(motorTurn, HIGH);
  analogWrite(motorSpeed, 0);
  delay(200);
  if(StepCount <0){ // I det tilfælde at sensorene ikke peger direkte mod solen ved solopgang, tillades at den rotere der til. Count nulstilles dog så snart begge solceller ser lys. 
    StepCount = 0; 
  }
  }
  
else if (Sensor1>threshold && Sensor2<threshold) { //ventre sensor ser lys 
  digitalWrite(motorTurn, LOW);
  analogWrite(motorSpeed, 100);
  StepCount--; 
  }
  
else if (Sensor1<threshold && Sensor2>threshold){ //højdre sensor ser lys 
  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
    }
  }} 
}
Arduino IDE har haft problemer med at oprette kontakt til Arduino boardet, hvilket muligvis skyldes Motorshieldet. Port og board er derfor blevet undersøgt for mulige fejl mellem uploadingerne. Vi har haft gavn af at printe værdier i monitoren under udviklingen, for at se hvor fejl kunne opstå.
Der vil altid være udfordringer med fastlægning af grænseværdier. Det er en definitionssag, hvor meget lys sensoren skal registrere for at definere det som lys. Ligesom man kan stille spørgsmålet “hvad er skygge?”. De skal indstilles til miljøet, vejret og omgivelserne. Fx. vil en regnfuld dag registreres som nat og en solrig sommerdag kan solen stå for højt, hvorved den faste vinkling skal justeres manuelt.
Herudover har vi variablerne “StepCount” og “StepSP” og en konstant for motorhastighed. “StepCount” tæller hvor mange step motoren tager i positiv retning, og trækker steps fra i negativ retning. Når “StepCount” er over 500, og begge lyssensorer ikke registrerer lys, aktiveres “StepSP”.
“StepSP” tæller hvor mange steps rotationssystemet tager før den når startpositionen. Startpositionen er forud defineret til at være 900 steps, da det passer med en halv omgang. Logisk set burde “StepSP” og “StepCount” tælle det samme antal steps i en halv omgang. Forskellen på 400 steps er fordi opbygningen af koden ved “StepSP” kræver flere steps.
Værdierne 900 og 500 kan justeres, ligesom koden kan ændres så counterne tæller mere ens. Det kan også løses ved en mekanisk tæller, et potentiometer eller en knap der definerer STOP.

Konklusion

Koden virker men grænseværdier skal justeres til miljø, vejr og omgivelser. Det har ikke været muligt at teste robotten udenfor over et par timer.

Alternativer i opbygningen er primært aktuelt for at rotationssystemet kan finde tilbage til startpositionen om natten.

 

Leave a Reply