Gruppe: Diana Ismail, Jamila Abdulkarim, Sidsel Vanselow-Rasmussen

Mexineseren

Opgavebeskrivelse

I denne første porteføljeopgave, havde vi til opgave at konstruere en solcellestyring, der drejer en solcelle efter solens lys med en motor for at optimere udnyttelsen af solens energi.

Systemets opbygning

Systemet er opbygget således, at der er lavet et shield af legoklodser, der fungere som det bærende element af systemet. Shieldet er ikke lukket af på alle sider, da det skal være muligt at få adgang til
både motor, tandhjul og potentiometer, uden at skulle skille hele systemet ad. Motor og potentiometer er placeret lodret ned i Shieldet med to legopinde og forbundet via 2 tandhjul.

På enden af motorens legopind, er solcelleplatformen bygget på. Solcelleplatformen er opbygget af en række af legoklodser med 2 flade legoklodser centralt placeret, der fungere som skillevægge for de to lyssensorer og cockpit for Mexineseren, der er kaptajn på solcelleplatformen. De 2 lys-sensorer er sat fast med 2 legoklodser og placeret i hver deres ende af platformen, således deres ledninger ikke rør hinanden og der dermed sker en kortslutning. Lys-sensorerne er forbundet til hver deres 1k ohm modstand.

Motorshield

Vi benytter en Arduino Motor Shield som er baseret på L298, som er en dual-bridge motor driver. Den har flere h-broer indbygget. En h-bro er en konstruktion af 4 transistorer som muliggør at man kan drive en eller anden belastning både i positiv og i negativ retning. Det betyder at vi kan bruge motor shieldet til at køre med DC motorer og styrer hastigheden og retningen af motoren.

Diagramtegning

Udfordringer med hardware

Under opbygning af systemet, har der været udfordringer med placering af potentiometeret. Dette skyldes at den første ide, gik ud på at placere potentiometeret vandret på motorpinden, bundet med gummibånd. Der blev testet flere forskellige potentiometer og gummibåndstyper, men gruppen måtte til sidst konkludere at det ikke var muligt at forbinde motor og potentiometer på denne måde og der blev derfor grebet til en anden velkendt metode, nemlig tandhjul.

Opførsel og kode

Robottens Opførsel

Da robotten skal følge solen, skal den gøre to ting: Dreje sig med solen igennem dagens forløb, og dreje sig tilbage til sit startpunkt når solen er gået ned, for at være klar til næste morgen.
Dette er gjort igennem en række if- og while statements, der fortæller robotten, hvornår den skal dreje eller stoppe.

Flow-diagram

Koden

Til at start med tjekker Mexineseren hvilken værdi lyssensorerne og potentiometeret har og gemmer disse i variabler. Den skriver dernæst værdierne på serial monitoren, for at vi kan følge med i dem.

lysVar1 = analogRead(lys1);
lysVar2 = analogRead(lys2);
potVar = analogRead(pot);
Serial.println("A5: ");
Serial.println(lysVar1);
Serial.println(" ");
Serial.println("A4: ");
Serial.println(lysVar2);
Serial.println("Pot: ");
Serial.println(potVar);
Serial.println("---");
delay(1000);

Herefter tjekker den i et ”if” statement, om lyssensor 2 får mere lys end lyssensor 1. Hvis den gør det, sættes der en variabel til at holde lyssensor 2’s tidligere værdi. Derefter tjekker den i et ”while” statement, hvorvidt lyssensor 2’s værdi er større end dens tidligere, om den stadig får mere lys end lyssensor 1, og om potentiometeret har end mindre værdi end 1024, for at være sikker på at robotten skal dreje sig. Hvis ja, så drejer motoren mod højre, og den repeterer ”while” loopet, indtil et af de tre krav ikke længere opfyldes, hvorefter motoren bliver stoppet.

if ( lysVar1 < lysVar2 ) {
// Begynd at dreje mod siden lysVar2
//Tjek om den får mere lys end den gjorde før
tidligere1 = lysVar2;

while (lysVar2 >= tidligere1 && lysVar2 > lysVar1 && potVar < 1024) {
// tidligere1 skal være lig med lysVar1
digitalWrite(dir, HIGH);
digitalWrite(brake, LOW);
analogWrite(PWM, 150);
lysVar1 = analogRead(lys1);
lysVar2 = analogRead(lys2);
potVar = analogRead(pot);
Serial.println("A5: ");
Serial.println(lysVar1);
Serial.println(" ");
Serial.println("A4: ");
Serial.println(lysVar2);
Serial.println("Pot: ");
Serial.println(potVar);
Serial.println("---");
delay(500);
}

//stop motoren
digitalWrite(brake, HIGH); //engage brake
delay(500);
}

Får lyssensor 2 dog ikke mere lys end lyssensor 1 i ”if” statementet, så tjekker Mexineseren i stedet for et ”else if” statement, om både lyssensor 1 og 2 får mindre eller lig med lys til en værdi af 40. Hvis ja antager den, at det er nat og går i et ”while” loop, som først tjekker, om potentiometerets værdi er større end nul. Hvis det ikke er, så er Mexineseren på sit startpunkt og klar til næste dag. Hvis det er større end 0, så drejer den motoren mod venstre, indtil at potentiometeret er på 0 for at komme i start positionen, og stopper herefter motoren.

else if (lysVar1 <= 40 && lysVar2 <= 40 ){ 
// reset to default 

while (potVar > 0) {
//Drej motor tilbage til start
digitalWrite(dir, LOW);
digitalWrite(brake, LOW);
analogWrite(PWM, 150);
potVar = analogRead(pot);
Serial.println("Pot: ");
Serial.println(potVar);
delay(500);
Serial.println("stop motor ");
digitalWrite(brake, HIGH); //engage brake
delay(500);
}

//Stop motor
digitalWrite(brake, HIGH); //engage brake
delay(500);
}

Udfordringer i koden

Da Mexineseren har en forholdsvis simpel kode, var der ikke så mange udfordringer her. De fleste udfordringer var i selve hardware delen. Kodens udfordring bestod mest af alt i at finde den nemmeste og mest optimale måde at skrive den på, som til sidst faldt på et ”if/else if” statement og to ”while” statements, da den ikke havde brug for mere. Generelt set var koden derfor ikke et problem.

Konklusion

Robotten løser vores opgave fint ift. opgaveformuleringen, da den opfylder både kravet om at følge med solen og resette dens position om natten.

Mexineseren kan yderligere forbedres ved at tilte dens lyssensorplatform for at optimerer optagelsen af solens lysstråler. Derudover kan mexineserens bevægelse også forbedres, ved at gøre den mere smooth

Mexineseren in action

Leave a Reply