Navne på gruppemedlemmerne:
Tobias Ilsøe Jensen, Christopher Christensen, Mathias Rose og Mathias Autzen

Hvorfor er systemet/robotten opbygget som den er ift. at løse opgaven.

Opbygningen af robotten er der lagt en del tanke bag, for eksempel hvor hjulene skulle placeres i forhold til sensorerne og bilens aksel. Vi har valgt at undlade gearing i vores system, da det ikke var nødvendigt for at løse opgaven. Vi konstaterede at jo mindre modstand bilen havde for at køre, jo mindre strøm ville den bruge for at køre. Dette var en beslutning vi tog for at spare på batterierne.

Sensorerne på bilen var placeret helt ude i fronten til at starte med. Dette endte dog med at give problemer da det kom til at dreje præcist, så bilen ville være placeret over stregerne. Vi valgte derfor at flytte dem længere bagud, og dermed tættere på bilens aksel, for at det ville passe bedre med placeringen efter svingene. Dette virkede godt, og blev den endelige løsning.

Motorerne er bagerst på bilen, med et støttehjul foran for at give mere kontrol over bilens bevægelse. Hjulenes størrelse er også valgt for at bilen nemmere kunne køre ved en højere hastighed.

Hvordan er robottens hardware sammensat?  

Herunder er der en schematic af kredsløbet af Fragteren.
De blå ledninger fører til pins.
De røde ledninger fører til strøm.
De sorte ledninger fører til ground.

Igennem arbejdsprocessen har der været en del udfordringer. Få samlet bilen så IR sensoren var tæt nok på jorden til at de kunne afmåle præcise data uden at de rørte jorden.

Koden er implementeret så den køre sektioner af kode i en prædefineret rækkefølge alt efter hvilken rute bilen skal køre. Herunder er et eksempel på en rute hvor bilen skal køre ligeud, over et kryds, ligeud, dreje til højre i krydset, ligeud, lave en u-vending i krydset.  

Den overordnede opførelser / metoder for robotten

Robotten har 10 opførelser / metoder den kan skifte imellem, som kan ses på nedenstående flow-diagram.

  • Ved forward køre robotten fremad og retter ind, så længe sensorerne registrerer hvid.
  • Ved inversForward køre robotten fremad og retter ind, så længe sensorerne registrerer sort.
  • Ved forwardDelay køre robotten fremad, så længe sensorerne registrerer sort istedet for hvid.
  • Ved backwardDelay køre robotten bagud, så længe sensorerne registrerer hvid.

Vores transition conditions er blevet lavet så de er afhængige af sensor informationerne. Derved vil robotten kunne udføre den specifikke metode med samme resultat, uafhængig af fart og placering.  

Kode og beskrivelse

Vi fik ideen med at lave en finite statemachine, for på den måde kunne vi dele de forskellige funktionaliteter op i små puslespilsbrikker f.eks. “Right”, “forward” osv. På den måde kunne vi nemt selv skrive i hvilken rækkefølge funktionaliteterne skulle ske i forhold hvilken kasse der skulle hentes. Til at udføre opgave C har vi sat de forskellige funktioner sammen for at hente kassen og sætte kassen på plads og sat det ind i en funktion. Denne funktion som så skal udføres f.eks. “Opgave C” bliver så det eneste der bliver kaldt i vores Loop-funktion.

Vi fik hurtigt vores korrektion til at virke, når bilen kørte lidt skævt. Dette gjorde at den kunne rette sig ind, hvis den kørte en smule skævt. Vi havde dog nogle problemer med vores kode med hvad der skulle ske, når man skulle køre over et sort kryds og skift mellem vores while-statements. I starten prøvede vi at klare det hele med while-statements, men vi havde problemer når den skiftede mellem de forskellige while-statements i koden. Problemet var at når den gik fra forward, til korrektion og så til forward, så røg den ud af funktionen og kom videre til næste funktion, som kunne være “right”. Det vi brugte som løsning var at lave recursion, så kun hvis den var i et bestemt state, så kunne den komme ud af funktionen. Dette løste problemet med at skifte mellem de forskellige while-statements.
Billede af “right-funktionen”:

void right()
{
 digitalWrite(led1Pin,LOW);
  digitalWrite(led2Pin,HIGH);
  digitalWrite(led3Pin,LOW);
  digitalWrite(led4Pin,LOW);
  //Højre Hjul
  digitalWrite(12, LOW);
  digitalWrite(9, LOW);
  analogWrite(3, 0);

  //Venstre Hjul
  digitalWrite(13, HIGH);
  digitalWrite(8, LOW);
  analogWrite(11, Drej);

  sensReading1 = analogRead(pinSens1);
  Serial.println(sensReading1);
  sensReading2 = analogRead(pinSens2);
  Serial.println(sensReading2);

  if (sensReading2 < HvorMegetSort) {
    return;
  }
  else {
    right();
  }
}

I right-funktionen kan ses brugen af recursion, indtil sensReading2 er blevet hvid igen.

Vores andet problem med at passere et kryds løste vi ved at lave funktionen som hedder forwardDelay. Funktionen kører over et sort kryds indtil begge sensorer er hvide igen, det vil sige indtil den er kommet over den anden side af krydset. Herefter kunne forward blive kaldt igen, indtil der igen blev ramt et kryds.
Billede af hvordan “puslespilsbrikkerne” er sammensat i opgave c.

void opgaveC(){
  forward();
  forwardDelay();
  forward();
  forwardDelay();
  forward();
  forwardDelay();
  forward();
  //får fat i kassen
  Drej = 120; // øger drejehastighed da kassen giver større modstand
  right();
  forward();
  right();
  forward();
  left();
  forward();
  forwardDelay();
  forward();
  right();
  forward();
  forwardDelay();
  forward();
  left();
  forward();
  pause(10000);
  }


Når først koden var knækket til at løse en type funktion, så var der ikke langt til næste funktion, da de var opbygget efter samme principper.
Udover disse to problemer havde vi et problem med at få det vi i teorien tænkte burde virke ud i praksis. Dette var både forskelle i hvor meget strøm der skulle løbe igennem robotten og andre gange var det små basic fejl i koden. Men det kunne gøre det svært at afprøve, da når der opstod en fejl, så skulle man prøve at skelne mellem om det var en kodefejl eller en hardwarefejl. Det krævede andre små miniforsøg, f.eks. at ændre strømstyrken og ændre farten i koden mm. Dette gjorde at når der opstod fejl, så var det besværligt at få fundet fejlen, selvom det til sidst lykkedes.

Til sidst i projektet løb vi også ind i et ekstra problem. Netop at få vores “uturn” 180 graders sving til at virke. Vi var meget i tvivl om der var fordi bilen kørte for hurtigt rundt, og dermed ikke nåede at aflæse stregerne. På grund af dette brugte vi lang tid med at prøve forskellige batterier og hastigheder i koden. Vi kom dog frem til den konklusion at det faktisk var det modsatte som var problemet. I koden læser den først den ene sensor, og hvis den er hvid fortsætter den videre i koden, men hvis den er sort vil den springe over og kalde sig selv igen. Problemet er så bare at hvis den læser hvid og går videre i koden, læser den med det samme igen på selv samme sensor. Hvis den stadigvæk læser hvid, vil den kalde sig selv fra starten, og dermed fortsætte med at dreje rundt. Den eneste måde at komme ud af dette rekursive loop, er hvis den med det samme efter den har læst hvid én gang, får drejet sensoren ind over den sorte streg, så den læser sort lige efter den har læst hvid. Hvis bilen kører for langsomt når den aldrig at komme fra hvid til sort hurtigt nok til at kunne bryde loopet. Eftersom vi blev ved med at bruge vores tid på at få den til at køre langsommere, eftersom vi troede den ikke kunne nå at læse, spildte vi en masse tid med dette. Vi kom dog frem til den konklusion, at det ville tage for lang tid for os at fuldstændigt ændre dens opførsel, og valgte derfor at beholde den mere ustabile version.

Konklusion

Robotten løser opgaverne a,b,c,d og e. Dog er det ikke 100% af gangene det lykkedes. Den primære årsag hertil er uturn funktionen og batteriets levetid. Hvis det var en robot der skulle bruges i virkeligheden så skulle den levere en konstant ampere og volt og have en længere levetid, så den ville kunne nå at udføre opgaverne for en dag og så komme tilbage og blive opladet ved en ladestation. Udover det er der vores uturn, som i koden er lavet således at det kun virker nogle af gangene. Derfor undgås uturn så vidt muligt for at løse de forskellige opgaver.

Her skulle der laves en ny forbedret kode, der på en smartere måde skulle kunne løse opgaven, men grundet tidsmangel pga. flere projekter i vores forskellige fag måtte vi tage til takke med at det kun på nuværende tidspunkt kun virker nogle gange.

A+B løsning
C løsning
D løsning
E løsning

Leave a Reply