Af: Huy Minh Luu Tran og Mads anenoy Lindholm

Billens navn: Chrome and Shiny

Udviklingsprocessen og samspillet mellem hardware og kode.

Problemformuleringen for denne opgave var, at bygge en bil ud af lego som kunne følge en linje ved hjælp nogle linjesensor. Derudover skulle bilen kunne gennemfør resten af forhindringsbanen under 3 minutter. nedstående billede er en repræsentation af banen.

Skærmbillede 2016-05-10 kl. 19.43.45

 

Udviklingsprocessen

Det har fra begyndelsen af arbejdet med portefølje opgaven været et mål, at bygge en robot med fire hjul i stedet for tre. Den primære motivation for denne beslutning var at udfordrer os selv. Kravene for designet af bilen var, at den nogenlunde skulle ligne en bil, og at det skulle ligne at den var taget direkte ud fra en Mad Max filmene.

Skærmbillede 2016-05-02 kl. 15.25.59

Det overstående bilede er af ”Chrome and Shiny”. De to DC Lego motor blev brugt som baghjulene og i tidligere versioner af bilen sad der en dreje mekanisme foran.

13113347_10209165333031683_1657050796_o

Denne mekanisme var simpel i sin opbygning, hvilket betyd at bilen havde havde svært ved at dreje ordentligt. Mere præcist havde bilen problemer med at rette sig op efter et sving. Dreje mekanismen manglede noget som gjorde, at den automatisk ville rette sig op igen efter et sving. Dette kunne havde blevet løst med en ekstra motor. Ydremere var konstruktionen ikke særlig stabil, hvilket blev rettet i den endelig version af bilen.  Det var dog ikke kun negative ting der kom ud af at arbejde på den første model. Det at bilen faktisk lignede et kørertøj og at der blev brugt 4 hjul gjorde, at vægtfordeling af de forskellige komponenter var godt fordelt. Arduino Shield er placeret i centrum for at gøre det lettere med hensyn til montering af linjesensor. De otte batterier er placeret bagved Arduino Shield for at fordele vægten. Som det fremgår på billedet, så er de to linje sensor placeret først i bilen. De er skruet fast med skruer tæt på jorden. Selve afstanden mellem de to sensor er den mest optimale efter adskillige test. Anvendelsen af linje sensorerne er inspireret af Braitenbergs biler, hvor koblingen af sensor og motor gør det muligt for bilen at agerer rundt om lys, eller i dette tilfælde en sort linje. Braitenbergs teori gik ud på, at hvis man koblede motor og sensor én til én, så ville bilen afvige når sensorerne opfangede en linje.

Skærmbillede 2016-05-02 kl. 15.25.47

Overstående billede er af den endelig model af bilen. Det blev stadig fastholdt, at bilen skulle have 4 hjul. Løsning til dreje mekanismen var, at prøve at bruge en masse gearing på siderne af bilen. Denne løsning gjorde, at når bilen ville dreje til højre, så vil den modsatte side af bilen bremse for at kompenser for det. Det var en løsning der virkede på den bekostning, at drejninger ikke var særlig bløde, hvilket fremgår i videoen af bilen. De mange gearingshjul gav mulighed for at eksperimenter med hastigheden af bilen. Chrome and Shiny gearing endte med at være:

(40/24)*(40/40)*(40/40)*(40*/40) =  1:1,667

Det vil sige at bilens drejningsmoment er øget 1,667 gange. Ydremere roterer de efterfølgende gear 0,6 gange pr revolution af kører gearet. Dette er alt sammen med til at give bilen den hurtige hastighed, hvilket resultaterne af fra selve kørerdagen illustrerer tydeligt.

De to nedstående billeder er skitser af hardwaren og et diagram oversigt over komponenterne.

Skærmbillede 2016-05-02 kl. 15.28.55

 

Skærmbillede 2016-05-02 kl. 15.29.22

 

Slut resultater fra demonstration dag

Til selve demonstrationsdagen præsteret Chrome and Shiny forventeligt. I tidligere testkørsler blev der noteret en tid på 11 sek. Til den endelig test fik hver gruppe tre forsøg til at komme igennem forhindringsbanen på korttest tid. Her er tiderne over de tre forsøg for Chrome and Shiny:

1 – 11,53 sek

2 – 3 min

3 – 3 min

Som det kan ses blev det ikke en  konsistent præsentation. Den første runde endte med en god tid. De to efterfølgende forsøg blev ikke brugt til at forbedre tiden, men til at filme til præsentationsvideoen af bilen. Det gik ikke helt som planlagt. Nogle af fejlene havde noget at gøre med batterierne, og at der blev sat en “blood bag” / legofigur foran bilen, som havde det med at forstyrrer linjesensorne. Alt i alt var det en rigtig fin præsentation.

 

Kode highlight

Bil består af 2 DC motorer som bliver styret gennem vores Arduino motor shield. Motor shieldet tager brug af adskillige pins til for at kunne styre de 2 DC motorer. Man kan bruge op til 3 pins for at styre bilen, dette indebære kontrol over hastighed, retning og bremser, vi tager selv kun brug af hastighed og retning. Pinsene er fordelt således, Motor X (Hastighed, Bremse, Retning) dvs. Motor A (3, 9, 12) og Motor B (11, 8, 13). Vi har valgt at opdele vores bil i forskellige funktioner for at få et bedre overblik på hvad bilen skal fortage sig. Det vil sige, når vi gerne vil have bilen til at køre fremad skal man skrive:

digitalWrite(12, HIGH); digitalWrite(13, HIGH); analogWrite(3, fullspeed);analogWrite(11, fullspeed);

Dog siden vi har lavet denne sætning om til en funktion kan vi nøjes med at skrive: forward();

Til sammen har vi opsat 4 funktioner for bilens basiske bevægelse. spinLeft(), spinRight(), stopCar(), forward().
Nu hvor vi har funktioner til at styre bilen skal vi også have nogle grundlag for hvornår de skal bruges. De gør vi med if statement. Vi mangler dog stadig en metode for at kunne se linjen, dette gøre med vores IR sensorer som er sat i digital pin 2 og 4. Vi har valgt at bruge digitale signaler da det vidste sig at være mere konsistent i vores tilfælde. Herefter danner vi nogle statements ardunionen til at tjekke om den har rørt ved linjen på højre eller venstre side og rette op ved hjælp af vores bevægelses funktioner.

Til sidst har vi hard-coded en række bevægelses funktioner den skal udføre med et delay imellem hver funktion. Denne række funktioner har vi lagt i en anden funktion kaldt freeMode(). Vi valgte og at sørge for at den ikke skiftede Mode tilfældigt ved at sætte en variable counter(cycle) til at tælle til 1200 føre den måtte skifte mode. Når cycle rammer 1200 sættes stopCarN til 1 og den vil skifte til freeMode().

Her ses den kode der er blevet brugt til Chrome and Shiny

const int fullspeed = 255;
const int sensorPin0 = 2; // Venstre
const int sensorPin1 = 4; // Højre
int stopCarN = 0;
int cycle = 0;

void setup() {
  // put your setup code here, to run once:
  pinMode(sensorPin0, INPUT);
  pinMode(sensorPin1, INPUT);
  pinMode(12, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(11, OUTPUT);
  Serial.begin(9600);
}
void loop() {
  delay(5);
  boolean  rightS = digitalRead(sensorPin0);
  boolean leftS = digitalRead(sensorPin1);
  Serial.println(cycle);
  if (!stopCarN) {
    if (!rightS && !leftS ) {
      forward();
    }
    else if (rightS && !leftS) {
      spinRight();
    }
    else if (!rightS && leftS  ) {
      spinLeft();
    }
    else if (rightS && leftS) {
      stopCar();
      if (cycle > 1250) {
        stopCarN = true;
      }
    }
    if (stopCarN) {
      freeMode();
    }
    cycle++;
  }
}
void forward() {
  digitalWrite(12, HIGH);
  digitalWrite(13, HIGH);
  analogWrite(3, fullspeed);
  analogWrite(11, fullspeed);
}
void stopCar() {
  analogWrite(3, 0);
  analogWrite(11, 0);
}

void spinRight() {
  digitalWrite(12, HIGH);
  digitalWrite(13, LOW);
  analogWrite(3, fullspeed);
  analogWrite(11, fullspeed);
}
void spinLeft() {
  digitalWrite(12, LOW);
  digitalWrite(13, HIGH);
  analogWrite(3, fullspeed);
  analogWrite(11, fullspeed);
}
void freeMode() { // Skal kaliberes efter mængden af strøm
  forward();
  delay(385);
  spinLeft();
  delay(475);
  forward();
  delay(1250);
  spinRight();
  delay(475);
  forward();
  delay(575);
  spinRight();
  delay(465);
  forward();
  delay(1250);
  stopCar();
  delay(500000);
}

 

 

Perspektivering

I selve koden er det blevet forsøgt at anvende Pfeiffers teori om at tænke i adfærd i stedet for faser. Dog kunne koden optimeres mere i forlængelse af dette ved at have en tydeligere differentiering af de forskellige ”modes”. Der blev heller ikke anvendt en ekstra sensor til anden del af forhindringsbanen. Da der blev brugt hardcodet til noget af banen, har batterierne haft en væsentlig rolle i forhold til kalibrering af hardcode.  Bilens hastighed blev  prioriteret højere i bekostning af, at bilen blev mindre autonom i anden halvdel af forhindringsbanen. Der blev heller ikke brugt analog værdier til linje sensorerne, som ville havde givet et bredder spektrum at arbejde med. Dog var det ikke nødvendigt i løsning af denne opgave, da digital fungerede.

Konklusion

Ved hjælp af Lego klodser, DC motor, Arduino Shield og linje sensor har det været muligt at bygge en Lego bil, som kunne gennemføre forhindringsbanen på under 3 minutter. Teori fra Braintenberg og Pfeiffer har været reference materiale i løsningen af opgaven. Ved hjælp af gearing lykkes det at bygge en bil med 4 hjul som fungerede. Dette gav en overraskende fordel i første del af forhindringsbanen. Der blev ikke brugt en ekstra sensor til anden halvdel, men hardcode løste dette problem ganske fint.

Video

 

Leave a Reply