Porteføljeopgave 1

Af Daniel Hansen Pedersen, Søren Holmbjerg Schibler og Tobias Holm Krab

Denne opgave beskriver opsætningen af en automatisk solcelletracker ved brug af en LEGO DC Motor, Arduino Uno, Motorshield, lysfølsomme modstande (LDR) og diverse kredsløbskomponenter. I teksten findes en beskrivelse af hardware inkl. diagramtegning og flowchart, en beskrivelse af opførsel inkl. programkoden og endeligt tanker omkring gearingen og evt. forbedringer.

Solar Tracker System (Klik for download video)

YouTube Video of the System (Eller se på YouTube)

Nedenfor ses billeder af opsætningen med pile, der indikerer de vigtigste komponenter:
Connections with the Motorshield Front view Motor & Gearing
Motoren er kernen af opbygningen og resten af robotten og systemet er bygget op omkring denne.
Systemet er bygget op omkring et kredsløb med to spændingsdelere:

Spændingsdeler

Valget bag to spændingsdelere bygger på, at spændingen Vout, der indlæses analogt på Arduino, er afhængig af modstanden over den lysfølsomme modstand (LDR). Det er derfor muligt at tilføre kredsløbet én given spænding og måle forskellen over de to LDR i hver sin spændingsdeler-opsætning via det analoge input, Vout, der fødes til Arduino.
Der anvendes NSL-19M51 LDR hvilket spænder over 20-100kΩ. Modstanden stiger omvendt proportionalt med lysintensiteten. Spændingsfaldet over LDR vil derfor ligge mellem 0,5-1,7V (jf. Vldr =  Vcc*(Rldr / 10k Ohm +  Rldr), hvor Vcc = 5V ). Da Arduino er på 10 bit er dens analoge range 0-1023 mellem spændingen 0 og 5 V. For at opnå et større range på vores analoge input, kunne modstanden og LDR byttes om i kredsløbet, da der dermed ville opnås en større spændingsforskel over LDRs range.

Her ses desuden en diagramtegning at robottens hardware:

HW

  1. Arduino Uno
  2. 10k Ohm modstand
  3. LDR-sensor
  4. Motor
  5. Breadboard

Hardwaremæssige udfordringer
Motorshieldet, som blev brugt til at starte med, havde før været brugt, og havde fået monteret noget ekstra hardware, dette var forbundet til nogle af pinsene hvilket gjorde at motorshielded ikke kunne komme ordenligt ned i Arduinoen. Dette betød at der opstod en løs forbindelse mellem de 2 boards, og kun virkede når man trykkede dem sammen, derfor blev der valgt at anvende et andet motorshield for at komme dette problem til livs.

En anden fejlkilde som også skulle minimeres var benene på de lysfølsomme modstande. Det viste sig at benene var for bløde og for tynde i deres diameter til at de ville passe ind i det valgte systems opbygning. Blødheden i benene på gjorde at gjorde at de havde en tilbøjelighed til meget let at bøje, når de blev sat ind i systemet. Løsningen blev at af-isolere noget hård ledning, for derefter at lodde det på benene på LDR’erne for at skabe nogle mere faste og tykke ben på dem.
Selve ledningerne til LDR krævede nemlig også at være ekstra lange for at give solcellen bevægelighed nok til at dreje rundt i og med at systemet er opbygget over et breadboard.

Implementering af robottens opførsel
Nedenfor ses et flowdiagram, der beskriver robottens opførsel:

FD

  1. LDR-sensorerne registrer lys
  2. De analoge inputs fra LDR-sensorerne fødes til Arduino
  3. Input sammenlignes i den nedenfor beskrevne kode
  4. Hvis lysforskellen overstiger tærkselværdien starter motoren
  5. Hvis der ikke er en lysforskel kører motoren ikke
  6. Sensoren er styret af en tidskonstant. Denne konstant gør at solcellen drejer tilbage mod øst ved dagens slutning.
  7. Motor kører tilbage til retning mod øst.

Opførslen er implementeret ved anvendelse af følgende kode:

#include <Time.h>
#include <TimeAlarms.h>

const int LDR1 = A4; //erklærer LDR1 forbundet til analog 4
const int LDR2 = A5; //erklærer LDR2 forbundet til analog 5
int MotorSpeed = 3; //motordriver forbundet til pin 3
int val1 = 0; int val2 = 0; //erklærer variable til værdier fra LDR
int drive = 12; //erklærer motor pins ift datablad
int brake = 9; //erklærer motor pins ift datablad
int sensorThreshold = 0; //erklærer tærskel for bevægelse
int starttime = 0; int endtime = 0; //erklæring af variable til tidsløkke

void setup() {
  pinMode(LDR1, INPUT); //erklærer LDR1 til at være input
  pinMode(LDR2, INPUT); //erklærer LDR1 til at være input
  pinMode(MotorSpeed, OUTPUT); //sætter motor til output
  setTime(10, 43, 50, 4, 1, 16); // sæt tid til midddag 1 April
  Alarm.alarmRepeat(24, 00, 0, TurntoEast); // 24:00 resettes solcellen
}

void TurntoEast() //Funktion til at dreje solcellen mod øst efter solnedgang
{
Serial.println("Turning to East");
starttime = millis();
endtime = starttime;
while ((endtime - starttime) <=5000) // kører funktionen i 5 sek
{
  digitalWrite(brake, LOW);
  digitalWrite(drive, LOW);
  analogWrite(MotorSpeed, 20);
endtime = millis();
}
}

void loop() {
  int val1 = analogRead(LDR1); //læser værdi fra LDR1
  int val2 = analogRead(LDR2); //læser værdi fra LDR2
  Alarm.delay(10); 
 
  if (sensorThreshold == 0) { // kalibrering af sensorer ift. lysforhold
    sensorThreshold = ((val1 + val2) / 2) - 350 ;  //tærskelværdi for bevægelse 
  }

  if (abs(val1 - val2) < sensorThreshold) { //hvis lille forskel, skal motoren stå stille
    digitalWrite(brake, HIGH);
    digitalWrite(drive, LOW);
  }
  if ((val2 - val1) > sensorThreshold) { //hvis val1 er størst, drej den ene vej
    digitalWrite(brake, LOW);
    digitalWrite(drive, HIGH);
    analogWrite(MotorSpeed, 40);
  } 
  if ((val1 - val2) > sensorThreshold) { //hvis val2 er størst, drej den anden vej
    digitalWrite(brake, LOW);
    digitalWrite(drive, LOW);
    analogWrite(MotorSpeed, 40);
  } 
}

Udfordringer i relation til koden
Motorshieldet har to former for output: drive og brake, hvilket gør at man skal kode sig til at få motoren til at køre den modsatte vej. I starten var ideen at man via brake kunne få motoren til at køre den modsatte vej, dette kunne ikke lade sig gøre derfor blev drive brugt til begge veje, hvis drive er sat til at være High og brake til at være low, kører motoren den ene vej, og hvis de begge er low køre motoren den modsatte vej, hvis man derimod gør brake high og drive low vil motoren stå stille. Indledningsvis var der derfor lidt test med at få motoren til at køre optimalt ift. koden, men også den hastighed, den blev stillet på ift. gearingen, der var (se næste afsnit).
En anden udfordring har været at finde den rette tærskelværdi for at få motoren til at køre med en regelmæssig hastighed og reagerer ved ønskede ændringer i lysforholdet. For at optimere dette kører en kalibrering i starten af loopet ud fra de to første inputværdi, at sensorerne registrerer. I kalibrering er dog en værdi, der vil skulle justeres afhængig af forholdene. Tærskelværdien er en bit-værdi, der tilsvarer en given spændingsforskel over de to spændingsdelerkredsløb.
Den sidste udfordringer har været at få solcellen til at dreje tilbage med stilling i øst. Der blev arbejdet i kontakter, vinkelbegrænsninger mm. men faldt valget på at anvende en timer og en alarm. Det krævede et par test at finde den rette værdi for den tid, at det tager motoren at gøre tilbage til udgangsstilling.
Motorens hastighed er sat til at være 40. Hastigheden sendes som PWM, der er en digital modulering af et analogt signal. Motorens range er 8 bit (256), hvilket vil sige, at den kører på en hastighd af ca. 15% af maksimum.

Gearing
Gearingen er sammensat sådan at fra motoren til selve solpanelet er der 5 tandhjul. Dette skyldes at motorens omdrejninger skal dæmpes, da solpanelet ellers vil bevæge sig for hurtigt. Når man beregner en gearing, er det vigtigt og vide, at der findes to former for gearing: simpel og kompleks gearing, hvoraf begge er blevet anvendt til til det i opgaven beskrevne system.
Opbygningen af gearingen er således at på motorens omdrejningsakse sidder der et 8-tands tandjul, som går ind i et 40 tands tandhjul, hvor der på samme arm sidder et 8 tands tandhjul, som går ind i et 40 tands tandhul, som så går ind i et 24 tands tandhjul. De 5 tandhjul kan se som en kompleks gearing + en simpel mellem de to sidste tandhjul. Derfor kan man beregne det samlede gearingsforhold ved at sige:

(tandhjul 1/tandhjul 2)(tandhjul 3/tandhjul 4)(tandhjul 5/tandhjul 6)=0,07

1

Derfor kan det ses at hvis motoren har en vinkelhastighed på 14 radianer per sekund vil outputs gearingen være 14*0,07 = 0,98 radianer per sekund. Dette kan yderligere sænkes ved at gøre forholdet mellem input og output større.
Som et eksempel på at vise hvordan forholdet mellem input og output er, beregnes den første gearing som blev brugt til solar control panelet, hvor der kun var 2 tandhjul:

Inputgearing/outputgearing = 24/56 = 0,4

Dette gav et output på 0,4 hvilket vil svarer til at hvis vinkelhastigheden er 14 radianer per sekund: 14*04=5,6 radianer per sekund. Her kan det tydeligt ses at fordi forholdet er blevet mindre, vil output-vinkelhastigheden også stige. Grunden til at denne gearing ikke blev valgt var at i outputtandhjulet havde en for stor friktion til at motoren kunne dreje denne rundt, samt at at outputshastighed vuderes til at være for stor. Der blev derfor kigget på hvordan denne friktion kunne mindskes og outputshastigheden nedsættes. Løsningen blev ovenstående løsning hvor der anvendes 5 tandjul, hvor motoren skal generere en meget lille kraft for at få solar control panel til at køre rundt i en passende fart, og derved give systemet meget bedre arbejdsbetingelser.

Forbedringer
Robotten kunne optimeres ved at lave en montering af LDR-sensorerne, så de ikke sidder skævt i hulerne. Ydermere kunne det være en idé at anvende 2 ekstra sensorer. Ved at bruge flere sensorer kunne det give en mere præcis måling af den lysmængde der er. En anden måde til at få en mere præcis måling kunne være at bruge en ekstra LEGO motor. Den motor vil bliver brugt til at justere vinklen af tårnet, så robotten selv kan finde en passende vinkel for lysindtaget.
Der kunne laves en udvidelse af robotten, ved at på montere en solcelle plade til at genere en strøm, som kunne drive en anden robot eller en vindmølle.

Konklusion
Det lykkedes vha. en LEGO DC Motor, LEGO-klodser, Arduino Uno + Motorshield, LDRs samt diverse kredsløbselementer at skrive et program og opbygge et system med en flade, der vinkelret følger sollyset.
Det tog 3 forsøg at få opbygget den rette gearing med henblik på at optimere hastigheden og bevægelsen af solcelledelen på robotten til at følge lyset bedst muligt.
Ved anvendelse af Timer-biblioteket i Arduino blev en alarm implementeret, der får solcellen til at dreje med orientering mod øst efter bestemt tid, sat til at være efter solnedgang. Systemet er også testet i sollys over et par timer, hvor det har vist at følge solens bevægelse, som det ses i videoen.

Leave a Reply