Gruppemedlemmer – Jakob Most, Nicklas Simonsen, Sebastian Flensted og Troels Deibjerg.

CaterPillar

Formål

I denne opgave skal der konstrueres en solcellestyring, der drejer en solcelle efter solens lys med en motor for at optimere udnyttelsen af solens energi.

Systemets Opbygning

CaterPillar Demo Video

For lave en god solcellestyring er der forskellige ting der skal tages højde for. De følgende ting har vi valgt at fokusere på.

  • Holde styr på solens placering i forhold til solcellen for at kunne rotere solcellen optimalt, det gør vi med to photoresistorer.
  • Kende rotationen af vores platform for at kunne resette dens position når det bliver nat, det gør vi ved hjælp af et potentiometer.
  • Sørge for at motoren ikke kører når det ikke kan betale sig ift. Hvor meget strøm solcellen producerer.

Desuden vil vi også sørge for at bygge vores system med henblik på at mindske slitage på ledninger. Dette hensyn tages for at skabe en holdbar løsning hvor ledninger skånes for unødig slitage for at have mindst mulig vedligeholdelse.

For at mindske slitage på ledninger er vores system opbygget som en samlet platform (motor, solcelle og sensorer) som hviler på en akse. Platformen drejes af motoren gennem en snekkegearing mellem platform og fundament. Ved at have systemet som en samlet platform der drejer på et fundament, kan vi altså sørge for at de eneste ledninger som ikke roterer sammen med platformen, er dem som skal lede strømmen fra solcellen væk.

Gearing og Motor

For at kunne bruge vores motor, som drejer for hurtigt uden gearing, har vi valgt at bruge en snekkegearing (snekke og snekkehjul). Snekken drejer platformen rundt på fundamentet ved at snekken drejer mod et fastlåst snekkehjul som sidder fast på fundamentet. Vores snekkehjul giver en udveksling på 40:1 som sørger for at vi kan dreje platformen i en mere passende fart og derved ikke river konstruktionen fra hinanden. Udover at skabe en gearing sørger snekkegearet også for at platformen ikke ville kunne blive drejet uintentionelt af en eventuel vind som kunne tage fat i solcellepanelet.

Motorplaceringen skulle overholde kravet om minimal slitage. Derfor skulle den svæve og støttes af platformen. Derfor designede vi et system hvor hovedkonstruktionen skulle glider over platformen. Motoren blev placeret i en yderlig position støttet af et hjul, grundet placeringen af snekkegearet. Det ville være bedre med et hjul mellem platform og hovedkonstruktion da de to materialer direkte mod hinanden har høj friktion samt slider på hinanden.

Sensorer

De sensorer som at brugt til at få solcellen til at virke er et potentiometer og 2 Photo resistorer. Potentiometeret bliver brugt til at bestemme den placering som solcellen står i. Potentiometeret har også en start og en slut position så solcellen ved hvornår den skal stoppe med at følge solen, og hvor den skal dreje hen når det bliver aften/nat. Potentiometer er placeret på den akse som platformen drejer på, heraf kan vi nemt få en placerings værdi som kan bruges til bestemme solcellens position.

Photoresistorerne bliver brugt til at fortælle hvor solen er. Begge disse komponenter får en værdi ind fra solen, og når den højre (set fra konstruktionen) resistors værdi stiger til en værdi af 20 over den venstre, så vil solcellen rykke sig frem til en position så den venstre resistor har en værdi på 20 større end den højre (så solcellen igen kigger lidt foran solen). Tolerancetallene er gisnede da vi ikke har data til rådighed om optimal solcelle positionering. Photo resistorerne er placeret langt nok væk fra hinanden og peger lidt væk fra hinanden til at de værdier vi får fra dem er store nok til at styrer. De er også blevet placeret inde i en lille tube som hjælper til at give en større forskel på den værdi de får.

Hardware

Diagramtegning

Hardware Diagram

Opstilling

Opstilling

Arduino motor shield

Vi bruger Arduino motor shield da dette sparer os for at have en H-bro.

Med en H-bro kan vi nemlig vende ”retning” på strømmen og lade vores DC-motor rotere både med og mod uret. Dette gøres ved at f.eks lukke S1 og S4 eller S2 og S3.
Med et motor shield (shield er bare en general betegnelse for add-on moduler) som praktisk talt er en stor h-bro, og har predefinerede pins kan vi direkte gennem pins gå ind og styre adfærd. Desuden kan vi tilkoble en højere spænding f.eks et 9V batteri, men helt op til 12V.
Vi bruger en ekstern strømkilde da vores DC motor er en 9V motor og derfor kører bedst med 9V batteri tilkoblet. Med kun 5V tilsluttet kunne motoren knap dreje vores opstilling,

I vores projekt kan det argumenteres om der er brug for at maskineriet skulle køre ”tilbage”, da det egentlig nok er kortere at fortsætte samme rotation, når solen er gået ned, hen til udgangspunktet hvor solen vil stå op. Men der skal også tages højde for kabler/ledninger vinter og sommertid. Derfor kører vi vores motor baglæns hen til startpunktet når solen er gået ned. Hvis der ikke var mulighed for at kabler kunne komme i klemme, kunne man om sommeren, styre robotten til at tage den korte rotation videre fra solnedgang/slutpunkt til solopgang/startpunkt.

Problemer ift at få hardware til at virke

Et problem som opstod i løbet af opbygningen af solcellen, var potentiometeret. Da potentiometeret når det bliver drejet rundt, burde give en lineær værdi skulle det være nemt at bestemme rotationen af platformen. Men den værdi som potentiometeret gav, var kun lineær op til 90 og derefter steg den eksponentielt op til sin max værdi. Dette var heldigvis et let løseligt problem da solcellen vi byggede kun havde brug for værdierne mellem 0 og 75 for at kunne dreje platformen 180 grader og derefter køre tilbage når det blev tilbage. Tallet 75 blev målt ved manuelt at dreje potentiometeret 180 grader.

Et andet problem var i det hele taget at få potentiometeret sat fast på vores akse da det ikke er kompatibelt med lego. Desuden var der også lidt problemer med at få indputtet finde ud af at bruge indputtet herfra.

Systemets funktionalitet

Opførsel

Flow Diagram

Platformen starter med at analysere inputtet fra de to photoresistore. Hvis photoresistoren som er vendt mod højre for platformen modtager mere lys end den sat til venstre, vil platformen drejes med uret indtil de to photoresistores input udlignes. Platformen bevæger sig kun hvis forskellen mellem de to photoresistores input er betydeligt forskellige, for at motoren ikke konstant er i bevægelse. Når platformen drejes, læses potentiometeret som er fikseret til maskinen. Hvis potentiometerets input er større end maxværdien der er givet i koden, vil platformen ikke drejes længere til højre. Dette er for at forhindre platformen i at dreje efter solen er gået ned. Hvis photoresistorernes samlede input er lavere end en given værdi betragtes det som at være nat. Der ventes en kort periode og photoresistornes input læses igen for at sikre sig at de stadig modtager en lav værdig, dette sikre sig at platformen ikke vender tilbage til start position ved et tilfælde. Da vil platformen drejes tilbage mod uret, indtil det fikserede potentiometer afgiver en værdi som er lavere end den givne minimumsværdi. Den vil nu være i ”start position” og klar til at modtage sol fra solopgangen.

Kode highlights

if(lightSensorRightValue - 20 > lightSensorLeftValue && potentiometerValue > minPotentiometerValue){
    while(lightSensorRightValue + 20 > lightSensorLeftValue && potentiometerValue > minPotentiometerValue)

Her ses en af vores vigtigste funktioner i koden. Dette If statement sørger for at platformen først drejer når vores værdi på højre photoresistor er 20 større end værdien fra venstre photoresistor. Samtidig bruges potentiometer værdien til at sørge for at platformen ikke drejer til mere end de 180 grader.

Når dette if statement er true går vi ind i et while loop som starter motoren. Dette while loop kører indtil at værdien på venstre photoresistor er 20 højere end den højre. Dette sørger for at platformen drejer lidt forbi solen, venter til solen er forbi, og derfter gentager det sig.

if(lightSensorLeftValue + lightSensorRightValue < 20){
    delay(2000);
    if(lightSensorLeftValue + lightSensorRightValue < 20){
      while(potentiometerValue < maxPotentiometerValue) {

Denne del af koden drejer solcellen tilbage i sin start position hvis det bliver mørkt. Men der er også taget højde for en overskyet dag eller andre faktorer som kunne genere sensoren i løbet af dagen. Dette hjælper “Delay(2000);” funktionen på, som venter i 2 sekunder og tjekker så igen for at se om der stadig er mørkt.

Kode

int lightSensorLeftPin = A5;
int lightSensorLeftValue = 0;

int lightSensorRightPin = A4;
int lightSensorRightValue = 0;

int potentiometer = A0;

int motorSpeed = 50;

int potentiometerValue;
int minPotentiometerValue = 15;
int maxPotentiometerValue = 70;

void setup() {
  
  Serial.begin(9600);
  //Setup Channel A
  pinMode(potentiometer, INPUT);
  pinMode(12, OUTPUT); //Initiates Motor Channel A pin
  pinMode(9, OUTPUT); //Initiates Brake Channel A pin
  
}

void loop(){

  lightSensorLeftValue = analogRead(lightSensorLeftPin);
  lightSensorRightValue = analogRead(lightSensorRightPin);

  Serial.print("Left Sensor: ");
  Serial.print(lightSensorLeftValue);

  Serial.print("           Right Sensor: ");
  Serial.print(lightSensorRightValue);

  potentiometerValue = analogRead(potentiometer);

  Serial.print("           Potentiometer: ");
  Serial.println(potentiometerValue);

  if(lightSensorRightValue - 20 > lightSensorLeftValue && potentiometerValue > minPotentiometerValue){
    while(lightSensorRightValue + 20 > lightSensorLeftValue && potentiometerValue > minPotentiometerValue){

      lightSensorLeftValue = analogRead(lightSensorLeftPin);
      lightSensorRightValue = analogRead(lightSensorRightPin);

      Serial.print("Left Sensor: ");
      Serial.print(lightSensorLeftValue);

      Serial.print("           Right Sensor: ");
      Serial.print(lightSensorRightValue);

      potentiometerValue = analogRead(potentiometer);

      Serial.print("           Potentiometer: ");
      Serial.println(potentiometerValue);
      
      digitalWrite(12, LOW); //Establishes backward direction of Channel A
      digitalWrite(9, LOW);   //Disengage the Brake for Channel A
      analogWrite(3, motorSpeed);   //Spins the motor on Channel A at half speed
      delay(500);
    }
  }
  else{
    digitalWrite(9, HIGH); //Eengage the Brake for Channel A
    delay(1000);
  }

  if(lightSensorLeftValue + lightSensorRightValue < 20){
    delay(2000);
    if(lightSensorLeftValue + lightSensorRightValue < 20){
      while(potentiometerValue < maxPotentiometerValue) {

        lightSensorLeftValue = analogRead(lightSensorLeftPin);
        lightSensorRightValue = analogRead(lightSensorRightPin);

        Serial.print("Left Sensor: ");
        Serial.print(lightSensorLeftValue);

        Serial.print("           Right Sensor: ");
        Serial.print(lightSensorRightValue);

        potentiometerValue = analogRead(potentiometer);

        Serial.print("           Potentiometer: ");
        Serial.println(potentiometerValue);
        
        digitalWrite(12, HIGH); //Establishes forward direction of Channel A
        digitalWrite(9, LOW);   //Disengage the Brake for Channel A
        analogWrite(3, motorSpeed);   //Spins the motor on Channel A at half speed
        delay(1000);
      }
    }
  }
  
}

Kode-problemer

Nogle af de udfordringer der har været ved at få koden til at virke, har primært været at finde ud af hvordan koden skulle udvikles og sættes sammen. Det har også været ”trial and error” for at få værdierne fra de sensorer vi har arbejdet med til at give den passende værdi vi skulle bruge til solcellens rigtige opførsel.

Konklusion

Catarpiller har været igennem forskellige iterationsprocessor. Den første version tog ikke højde for slitage på ledninger og holdbarhed (figur 1), men var en simpel konstruktion der drejede en solcelle. Konceptet blev her skiftet til at der skulle være et minimum af elementer der roterer. Selve princippet er det samme, men her vi fæstner rotationsaksen til jorden og drejer hele maskinereriet. Selve konstruktionen af det nye koncept skabte en del små problemer da evnerne vedrørende Lego Technic var begrænsede.  Motorens placering blev forceret ud i en yderlig position grundet snekkegearet, men senere overvejede vi om konstruktionen skulle ændres igen for at bruge motoren ind under selve hovedkonstruktionen ved at tilføje to ekstra tandhjul (figur 2) og derved fjerne støttehjulet samt de ekstra omkostninger der på at vedligeholde dette. Dette blev dog overvejet så sent i processen at vi gik med støttehjulskonceptet.

Generelt er der en del faldgruber angående optimering. Der er tweaking ang. hvornår der er optimalt at dreje solcellen. For at justerer dette skulle vi bruge en mængde data over solcellens ydeevne samt energiforbrug ved rotation af systemet samt slid af komponenter over en 30-årig periode. Derfor er vores threshold-værdier ang. rotation fiktive og blot nogle vi mener kan repræsentere funktionen af vores system udmærket.

Dog uden real-life data styrer vores kode konstruktionen på en logisk, kost- og miljøvenlig måde der tager højde for spontan mørklæggelse af sensor og solens position.

Figur 1 Figur 2

Leave a Reply