gruppemedlemmer: Ajithan Christian, Jeppe Olesen og Mathias Katz Sørensen.

Intro

I Danmark står solen op i øst og går ned i nordvest. Når solen står op i øst om morgenen, går sollyset næsten parallelt med jordens overflade, og igennem dagen står sollyset mere og mere vinkelret til jordoverfladen, indtil solen igen går ned i nordvest. DC-motoren er placeret, således at “solcellen” roterer omkring x-aksen. På denne måde kan solcellen orientere sig vinkelret i forhold til solen, igennem sollysets dagscyklus.

Systemet er bygget på denne måde for at kunne opfange mest sollys. Med den nuværende opstilling kan systemet bevæge sig over 180◦ og sikre at mest muligt af platformen vender direkte mod solen, dog kun i én akse. (det vides ikke om dette er mere effektivt end det som er afbilledet i PF1-pdf´en, men det kunne tænkes at være bedre omkring ækvator, hvor solen bevæger sig mere lige over himlen.)

Anvendte komponenter  

  • 2 * 10K Ω modstande
  • 4 * 1K Ω modstande
  • 3 * 220 Ω modstande
  • 1 * Arduino Uno 
  • 1 * 238-9642 3V DC motor 
  • 2 * LDR-modstand 
  • 4 * IRLZ34N transistor
  • 4 * IN4007 dioder
  • 3 * LED dioder

Diagramtegning

Teori

På DC-motorens rotationsakse er der placeret en plade, som skal agere som “solcellen”. I enderne væk fra rotationsaksen, er der placeret en LDR modstand. I mellem de to LDR modstande er der placeret en skillevæg, der skal skygge for solen, der kommer parallelt med solcellen. Skillevæggen gør, at den ene LDR-mostand vil give et større output end den anden, hvis solcellen står parallelt med sollyset. Forskel imellem outputtet fra de to LDR-mostande, registreres af mikrocontrolleren (Arduinoen), som efterfølgende vil få motoren til at rotere solcellen indtil modstandenes output når ligevægt. Rotationsretningen af solcellen afhænger af hvilken LDR-modstand, der giver det største output. Afhængigt af hvilken modstand der giver det største output vil få motoren til enten at køre den ene vej eller den anden vej, afhænger af de if-statements, der er erklæret i koden.

Motoren sættes igang, når der løber strøm igennem H-broen. Hvilken retning som strømmen løber igennem DC-motoren styres af koden, hvor der er lavet tre forskellige funktioner. Funktionerne styrer hvilke MOSFET’s, der er åbne og lukket, som er bestemt af hvilket MOSFET, der modtager strøm på deres Gate-pin. Føres der dog ikke nogen strøm til nogle af MOSFET’ene, kan der ikke løbe strøm igennem dem, og motoren vil ikke køre rundt.


Systemet kan befinde sig i tre forskellige faser; bevægende fremad, bevægende bagud, eller stillestående. Afhængigt at hvilken af de tre faser, som systemet befinder sig i, vil 1 af de 3 lysdioder lyse. Hvis den grønne lysdiode lyser, så kører motoren fremad, og de andre dioder vil være slukket. Lyser den gule lysdiode, vil motoren køre bagud, og de andre dioder vil være slukket. Hvis motoren ikke bevæger sig, vil den røde lysdiode være tændt, og de andre vil være slukket.

Hvordan er gearingen og hvorfor?

Gearingen er valgt for at mindske rotationen fra DC-motoren, så platformen kører langsommere. Dette er gjort via 5 gear med 12 tænder og 5 med 48 tænder. Nedenfor er et billede for at vise opstillingen af gearene. For at finde ud af hvor meget gearingen sænker eller øger hastigheden, skal gear ratioen findes. Dette gøres her, ved at tage tænderne fra det ”drivende gear” over tænderne fra det ”drevne gear”, da radius af gearene i dette tilfælde er afstemt.

Dette giver derfor følgende:

Hvilket vil sige, at for hver gang det første gears tænder roteres 1024, rykkes tænderne på det sidste gear 1 gang. Da platformen placeres ved det sidste gear er hastigheden, som den kan flyttes altså nedsat med dette.

Hvordan er h-broen opbygget inkl begrundelser og beregninger? Hvordan er robottens hardware sammensat?

Superior solarising er opbygget af to LDR modstande, en DC motor og en H-bro, som er styret via en Arduino. 

LDR modstande er lavet af halvledende materiale, der giver den en høj modstand. Når lys fald over modstanden vil dets modstand ændres, hvormed modstandsværdien kan anvendes til yderligere behandling. LDR’erne opsættes simpelt i en spændingsdeler, hvor LDR værdien kan læses til Arduinoen. Til spændingsdeler er anvendt en modstand på 100k ohm for begge, hvormed analogværdierne for de to sensorer vil være tæt på hinanden. Dette er ønsket for bedre at kunne styre Superior solarising. 

Spændingsdeleren er givet ved følgende. 

Hvor R2 er sensoren og R1 = 100k ohm 

Kredsløbet er opsat på følgende vis. 

Signalet fra LDR’erne kan læses af en Arduino, hvor der via software kan tændes en DC motor. En DC motor kræver dog mere strøm, end en Arduino kan forsyne fra dets outputpins, derfor skal motoren sættes op med en transistor. Den anvendte DC motor trækker 1.05 A, hvor Arduinoen maks kan give 40mA. 

Transistor: 

Transistoren er en elektrisk komponent, typisk anvendes den som switch eller som forstærker. I denne portfolie anvendes den som forstærker. Transistoren tager en lille input strøm, hvor denne strøm forstærkes og giver en større output strøm. Typisk vil en IC-driver anvendes til at forsyne den nødvendige strøm, udover denne kan en H-bro konfigurering med transistor anvendes. Da Superior solarising skal følge solen horisontalt, skal den kunne bevæge sig både til øst og vest. H-broen muliggøre motorstyringen i begge retninger. 

Superior solarisings H-bro er opstillet vha. MOSFET transistor, da disse er spændingskontrolleret. Ved spændingskontrollerede transistor er drain strømmen kontrolleret af spændingen over gate terminalen. Til h-broen anvendes MOSFET af N-kanal med “enchancement mode”, hvor konduktiviteten kan kontrolleres, dermed kan strømmen til motoren kontrolleres. Hvis spændingen  på gate terminalen er lav, vil MOSFET’ten ikke lede en strøm og omvendt, er spændingen på gaten høj, vil MOSFET’ten lede.

En spænding over gate terminalen, vil inducere en kanal, som tillader en spænding over Rds modstanden, dermed løber en Id strøm. Rds modstanden sidder fra sources to drain, og er lav ved aktivering (Rds(on)) og høj ved deaktivering, hvormed strømmen kan varieres.  

Gate spændingen, som skaber kanalen, skal være større end en bestemt tærskelværdi, som er markeret med Vgsth, i databladet. 
Værdien vil være mindre end 5V for logic gate, hvilket gør dem optimale i kombination med en mikrokontroller. 
H-boren opsættes med 4 MOSFET, som er spændingskontrolleret. Disse kan styres via Arduinoen, som kan sætte terminalen til høj eller lav via de digitale indgange. Broen skal yderligere have en modstand på gaten, som kan regulere skiftetiden. Denne er dog ikke afgørende for dette forsøg.


 

H-broens kredsløb har yderligere 4 flyback dioder. Disse sikrer afladning af eventuel gemt energi i motor vindingerne, da en DC motor er induktiv. Den induktive energi vil generere en flyback spænding, når strømmen afbrydes. Dioden sørger for sikker afledning til forsyningen, så denne ikke vil skade transistorene. På figuren kan opstillingen ses. 

Til H-broen bruges 

Med databladets beskrivelse, kan drain strømme regnes ved følgende. 

Hvor VGS er gate-source spændingen og VGSth er tærskelværdien. K kan defineres som følgende.

For IRLZ34N kan følgende drain strøm regnes. Ved Vgs = 4 er Id = 14A og Vgsth = 1,5 V 

Med den udregnede k værdi kan Id strømme findes ved en forsyning på 5 volt. 

Ud fra beregningerne og diagrammet, kan det ses, at MOSFET’ene kan forsyne motoren med 1.05 A uden problem. 

Analogværdien fra LDR sensorerne kan nu bruges til at styre motorens retning. 

Har det været problemfrit at opbygge robotten eller har den ændret form/sensor-placeringer flere gange?

Der er under opbygning ikke blevet ændret på placeringen af sensorerne, dog blev der sat tape mellem sensorerne for at få en større forskel på input fra sensorerne, når der blev lyst på dem. Der blev under opbygningen forsøgt at ændre på placering og type af ledninger. Dette blev gjort fordi at de mere stive ledninger blev revet ud af breadboardet, når platformen roterede. Dog endte vi med at gå tilbage til de originale ledninger, da de andre ikke virkede. Problemet blev i stedet løst ved at tape ledningerne fast på platformens stander.

Har der været nogle problemer ift. at få hardwaren til at virke?

Der opstod enkelte problemer i forhold til motoren og gearingen. Hvis gearingen var for hård, kunne motoren ikke trække. På et tidspunkt kørte motoren ikke som ønsket. Forskellige input fra sensorerne menes at kunne have været årsagen

Hvilke udfordringer har der været ift. til at få koden til at virke?

Det var besværligt at vurdere de hvad tærskelværdien som skulle overskrides for at motoren kørte skulle være. For høj og motoren kørte ikke og for lav så kørte den for hurtigt. Derudover skulle styrken på DC-motoren også reguleres efter gearingen, som blev ændret undervejs.

Flow chart over systems opførsel

Kode
I koden er de to modstande navngivet henholdsvis, som eLDR og wLDR og udskriver et analogt output. Der er opsat følgende if-statements, der udføres hvis kravene opfyldes. Hvis eLDR  er større end wLDR og forskellen mellem dem er større end 80, sættes motoren til at køre fremad.
Hvis wLDR ligeledes er større end eLDR og forskellen mellem dem er større end 80, sættes motoren til at køre baglæns. Er der ingen af kravene, der opfyldes, standses motoren.

Lysdioderne styres af de 3 funktioner i koden; Forward(), Backward(), og Break(), Her vil de tilsvarende lysdioder enten lyse eller være slukket, afhængigt af den funktion der køres af programmet. Forward()=grøn diode lyser, Backward()=gul diode lyser og Break() = rød diode kører.

const int eastLDR = A0;
const int westLDR = A1; 
const int BreakLight = 10;
const int BackwardLight = 9;
const int ForwardLight = 11;
int eLDR = 0; // Den ene LDR
int wLDR = 0; // Den anden LDR

const int forward1 = 5;
const int forward2 = 4;
const int backward1 = 3;
const int backward2 = 2;

int dif = 0; //difference mellem de to LDR

void setup() 
{
 
 pinMode (forward1, OUTPUT);
 pinMode (forward2, OUTPUT);
 pinMode (backward1, OUTPUT);
 pinMode (backward2, OUTPUT);
 pinMode (ForwardLight, OUTPUT);
 pinMode (BackwardLight, OUTPUT);
 pinMode (BreakLight, OUTPUT);
 pinMode (ForwardLight, LOW);
 pinMode (BackwardLight, LOW);
 pinMode (BreakLight, LOW);

Serial.begin(9600);
}

void loop() 
{
eLDR = analogRead(eastLDR);
wLDR = analogRead(westLDR); 

float eLDRV = eLDR*(5.0/1024.0); 
float wLDRV = wLDR*(5.0/1024.0);
 

dif = eLDR - wLDR //finder forskellen mellem de 2 LDR værdier

if(eLDR > wLDR && abs(dif) > 150){  
  forward();  //kør denne funktion hvis overstående krav opfyldes
  }
else if (eLDR < wLDR && abs(dif) > 150) {
  backward();   //kør denne funktion hvis overstående krav opfyldes
}
else {
  breaks();   //kør denne funktion hvis ingen af kravene opfyldes
}

Serial.print("east ");
Serial.println(eLDR);
Serial.print("west ");
Serial.println(wLDR);
  Serial.print("sensorValue: ");  //udskriver værdierne i serial monitor
  Serial.println(eLDRV);
  Serial.print(' ');
  Serial.print("sensorValue1: ");    
  Serial.println(wLDRV);
  Serial.print('\n');
  Serial.println(dif);
  Serial.print('\n');
  delay (1000); 
}


void forward() //sætter motor til at køre fremad
{
   digitalWrite(forward1, HIGH); //sætter hastigheden til 100 via PWM signal
   digitalWrite (forward2, HIGH);
   digitalWrite (backward1, LOW);
   digitalWrite (backward2, LOW);
   digitalWrite (ForwardLight, HIGH); //tænder lysdioden
   digitalWrite(BreakLight, LOW);   //slukker lysdioden
   digitalWrite(BackwardLight, LOW);    //slukker lysdioden
  
}

void backward() //sætter motor til at køre baglæns
{
  digitalWrite(backward1, HIGH);   //sætter hastigheden til 100 via PWM signal
   digitalWrite (backward2, HIGH);  
   digitalWrite (forward1, LOW);
   digitalWrite (forward2, LOW);
   digitalWrite(BackwardLight, HIGH);//tænder lysdioden
   digitalWrite(BreakLight, LOW);//slukker lysdioden
   digitalWrite(ForwardLight, LOW);//slukker lysdioden
  
}

void breaks() //stopper motoren
{
  digitalWrite(forward1, LOW);   //sætter hastigheden til 0 via PWM signal
   digitalWrite (backward2, LOW);  
   digitalWrite (forward1, LOW);
   digitalWrite (forward2, LOW); 
   digitalWrite(BreakLight, HIGH); //tænder lysdioden
   digitalWrite(BackwardLight, LOW); //slukker lysdioden
   digitalWrite(ForwardLight, LOW); //slukker lysdioden
 }

Serial monitor

Testkørsel

Det var desværre meget overskyet, da vi kørte vores test. så data er fra lyset fra en mobiltelefon over en kortere periode.

Grafen viser inputs fra begge LDR modstande. Disse afgør om motoren kører og i hvilken retning, dette bestemmes når differencen krydser en af tærskelværdierne, som ses i grafen nedenfor. de første 450 samples bevæger Superior Solarising mod “vest” efter ca. 500 samples bevæger den sig mod “øst”.

Video

Leave a Reply