Navn på Robotten; ”Hugo”

13148256_10153953695445795_1092869925_o_edited

Video af testkørsel:

Dagen før konkurrencedagen 2/5

Bedste Konkurrencetid (af de 3 forsøg)

Desværre kunne robotten ikke gennemføre banen på konkurrencedagen. Vi har dog en optagelse fra en anden dag, da vi testede robotten i at følge stregen.
Den sidste halvdel af banen med objektet der skulle ungås, må i have til gode 🙂

Opbygning af hardware.

shsj

Arduino Motorshieldet er sat sammen med Arduino UNO boardet. Batterierne (6 stk AA batterier) er indført i Motorshieldets power (sort i GRD, rød i Vin) De to motorer sidder i de to medhørende porte for motorer (A og B). Sensorerne har begge en GRD, UCC og en i OUT. De to GRD fra hver af sensorerne er loddet sammen til en ledning, der går i Motorshieldets GRD. De to OUT er loddet sammen til en ledning, der er indført i Motorshieldets strømligning på 5V. Højre sensors UCC sidder i Motorshieldets analoge port A0 på , hvor den venstre sidder i A1.

Opbygning af robot i Lego.

I denne del har vi lært en hel del fra den første portefølje opgave vi lavede, da vi rent byggemæssigt ikke havde nok fokus på at stabilisere selve legodelen, og i denne omgang har vi haft megen fokus på at den skulle være stabil, og samtidigt bevægelig – men også konstrueret på en sådan måde at den kunne holde til at bære alle hardware elementerne. Vi startede med at bygge forenden og sætte vores to motorere til på de to forreste hjul. Vi byggede en gearing i Lego, for at kunne kontrollere hastigheden og omdejningerne på begge akslerne. Dernæst byggede vi ”ladet” på bilen, således at den kunne indeholde vores motorshield, samt arduino uno. Og batteri-pakken. Da det er en bil, og ikke en solfanger som sidste gang, skulle vi nemlig være opmærksomme på at den også skulle kunne bære en ekstern batterikasse, og derfor skulle bagenden ligeledes være enormt stabil for at bære vægten af dette. Vores største udfordring rent Lego-mæssigt lå i at få konstrueret et baghjul således at den kunne dreje. Dette løste vi ved at sætte en ”rulleplade” på med en glat top på, således at den havde fri friktion i bagdelen. Nedenunder ses billeder der illustrerer robotten.

gjdtkgscUnavngivetvdsdehsyfbd 

Efter at have prøvekort robotten med opbygingen I ser forneden, skete det op til flere gange, at den “kørte af sporet”. Så vi blev enige om at batterierne vejede så meget på “halen”, at de skulle placeres tættere på forhjulene, for at gøre det nemere for robotten at dreje, og derved havde en større chance for at “blive på sporet”.

13147942_10153953695520795_783765027_o  13170101_10153953695505795_1785845845_o

Den sidste opbygning ses på billederne herover. Her gav vi robotten mere stabilitet, ved at sætte alt vægt nær hjulene. Den sorte kasse der giver højde, indeholder både arduino-boardet, motershieldet og batterierne. Denne løsning gav en tydelig forskel i svigene. Man kunne se, at robotten ikke længere “slæbte” på en bagende. Vi tilføjede også en mere stabil løsning til selve sensorerne. Disse blev fastnet med legoklodser med hul i og et par skruer. Nu undgår vi at de rykker på sig, når robotten kører, så vi er ekstra sikre på de værdier der bliver aflæst.
Opbygning af program samt kodeeksempler.

I sofwaren har vi angivet en int for hver af portene A0 og A1, som sensorerne er tilkoblet. Disse aflæser og udskriver den værdi vi får af sensorerne. Så har vi angivet motorernes værdier for at bakke/køre fremad og for at sætte en hastighed, i forhold til de to ind- og udgange for motorer, der sidder på vores motershield.
Når robotten har kørt setup(), hvor vi initierer de pinMode’s vi skal bruge og starter serien 9600 ms, begynder robotten at følge stregen på boardet, ved hjælp af koden fra loop(). I loopet er der oprettet et map(value, fromLow, fromHigh, toLow, toHigh), som angiver henholdsvis “rate1” og “rate2” for hver af sensorernes værdier. Heraf bliver der taget differencen af de to værdier, og alt efter om værdien kommer til at ligge mest til den ene eller anden side af denne, vil robotten dreje til enten højre eller venstre. Hvis værdien kommer ud over differencen, vil robotten bare fortsætte ligeud.

      int rate1 = map(SensorPin0Value, 0, 1023, 0, 100); 
      int rate2 = map(SensorPin1Value, 0, 1023, 0, 100);
      Serial.println(rate1);
      Serial.println(rate2);
      
      int dif = rate1 - rate2;
      if(dif < -20){               // Højre
        digitalWrite(DIR_A, HIGH); 
        analogWrite(PWM_A, 3); 
        digitalWrite(DIR_B, LOW); 
        analogWrite(PWM_B, 150);
        Serial.println(dif);
      }
      else if(dif > 20 ){          // Venstre
        digitalWrite(DIR_A, HIGH); 
        analogWrite(PWM_A, 150);
        digitalWrite(DIR_B, LOW); 
        analogWrite(PWM_B, 3);
      }
      else{                        // Lige ud
        digitalWrite(DIR_A, HIGH); 
        analogWrite(PWM_A, 150);
        digitalWrite(DIR_B, LOW); 
        analogWrite(PWM_B, 150);
      }

Idet robotten drejer den ene, har vi sat den modsatte motor til at køre baglens, for at få en bedre og hurtigere rotation.

Vi har brugt en if-funktion, til at indikere hvad der sker, når værdien fra sensorerne måles under 800 (altså når underfladen måles som sort). I dette tilfælde vil robotten stoppe.

// stopstep      
bool stopStep(){
 digitalWrite(DIR_A, HIGH); // Venstre
 analogWrite(3, 0);
 digitalWrite(13, LOW); // Højre
 analogWrite(11, 0);
}


void loop(){ 
  if(SensorPin0Value > 800 && SensorPin1Value > 800) {
    
    // Kør stopStep imens ^^
    while (stopStep()){
      break;    
    }
  }
}

Selve det at få robotten til at følge stregen på bedste vis rundt i svingene, har været en udfordring. Det er blevet testet flere gange med mange forskellige værdier. I første omgang var det for at sørge for, at robotten ikke ville “falde af” i de skarpe sving. Derefter galt det om at kunne sætte farten lidt op, for at vinde kapløbet!

Vi har som sagt valgt at hardcode delen, hvor robotten skal navigere sig rundt om legovæggen. Her kunne vi senere tilkoble en en anden sensor, der kan se når man nærmer sig væggen, og kode robottens opførsel derudfra.
For at hardcode robotten til at styre sig uden om denne væg, har vi brugt boolean- og while-funktioner.
Vi har kaldt vores booleans firstStep, secondStep… ect., som slavisk gennemgår hvad robotten skal foretage sig ved hvert punkt.
While-funktionerne er brugt til at smide et delay på robotten, så koden i det tilsvarende step får robotten til at køre ligeud/dreje rundt om væggen inde for en vis tid, inden den fortsætter. Da der kun er en hvid flade i denne del, ligger vores while funktioner inde under vores tidligere nævnte if-funktion, som indikerer hvad der sker, når værdien for sensorerne er under 800.

Hvordan er samspillet mellem mekanik, elektronik og software?

Mekanik;

Mekanik-delen fungerer på den måde at vi har anvendt to motorer der ved hjælp af programmeringen kunne styre de to forreste hjul og derved bestemme hastighed, og retning af bilen. Samspillet mellem software og mekanikken var ret essentiel, da dette skulle fungere 100% optimalt. Desuden var det ret vigtigt at robotten blev bygget på en måde så den var stabil, men heller ikke for stor, da den stadig skulle kunne have en vis hastighed. Den skulle endvidere som førnævnt, være ret stabil da den skulle kunne bære en del komponenter i sig.

Elektronik;

Elektronik-delen bestod af vores arduino uno, samt motorshield. Desuden var der to motorer og 2 linje sensorer monteret på underdelen af bilen.

Samspillet mellem dette var ligeledes som de andre dele ret essentiel, da vores bane den skulle køre på var indrettet efter bl.a. vores linjesensorer og derfor var placeringen samt monteringen af disse ret afgørende. Programmeringsdelen i forbindelse med elektronikken var også ret afgørende, og det samspil der skulle være mellem disse var også en stor udfordring, da vi skulle løse en opgave ved først at benytte vores linjesensorer til at detektere de sorte streger på banen og til sidst ”hardcode” den sidste halvdel af banen.

Software;

Software delen og samspillet med denne mellem de to andre dele var nok den vigtigste del af opgaven, da det ret meget var den del der var bærende for at de andre dele kunne fungere. Det var ligeledes den største udfordring i denne opgave, da vi som førnævnt valgte at anvende linje sensorerne til den første halvdel af banen, og dernæst ”hardcode” den sidste halvdel, så derfor var det at programmere på denne måde både udfordrende og krævende for at løse opgaven.

Samlet set er alle 3 dele enormt essentielle da man ikke kan lave en robot på denne måde til at løse en opgave som den vi fik givet uden at tage højde for alle delene – og samspillet mellem alle delene er altså ret vigtigt, da det f.eks. er ligegyldigt med programmeringen hvis motoren ikke virker, eller omvendt.

Konklusion – hvor godt løser robotten opgaven?

Efter som robotten ikke gennemførte banen i konkurrencen, må man sige, at den ikke løser opgaven godt nok. Vi havde dog succes dagen før, hvor robotten gav en fin tid på banen. Så set derudfra, har robotten løst opgaven.
Set bort fra de fejl vi fandt på konkurrencedagen, har selve legoopbygningen givet et godt udslag, efter vores skiftende konstruktioner af robottens fysiske skelet.
Softwaren har fungeret godt og givet robotten mulighed for at færdes på egen hånd på banen. Der er dog nogle ting, som kan ændres ved videre arbejde, der vil kunne give et bedre udfald generelt.

Perspektivering.

Robotten løste ikke opgaven godt nok, da den endelig skulle testes. Hertil har vi mistanke om, at lyset har ændret sig fra dag til dag, og kan have påvirket sensorernes målinger.
En anden ting, der kan have spillet ind er, at vi brændte en sensor af, og måtte sætte en ny på, som muligvis har givet et andet udslag, end den forrige, og derved ikke passet sammen med de tal vi har angivet i koden.

For at gøre robottens navigation rundt om væggen mere præcis, er det helt klart en bedre løsning at bruge endnu en sensor, som f.eks. en Sonar, der ved hjælp af ultralyd kan sanse en væg. At harcode robotten rundt, tager helt sikkert også en del kode, som i virkeligheden kunne fylde mindre. Derudover kan man risikere at robotten simpelthen kører ind i væggen, hvis den er kommet en anelse skævt fra start. Man skal altså være meget præcis med opstarten, hvad det angår.

Leave a Reply