Robotten Ejgild

13096269_10208772864419616_962433138152641636_n
Frederikke og Else

Indledning

Vi har konstrueret en autonom kørende arduino lego robot. Robotten består af et arduino-board, der styrer to lego motorer samt batterier der gør robotten selvkørende. Robotten følger en bane på en mørk streg, hvortil den har to lyssensorere der gør den i stand til at følge den.

 

Video (ikke det bedste forsøg)

 

Bedste konkurrencetid

Ud af de 3 forsøg blev vores bedste tid 29,84 sekunder.

 

Opbygning af hardware

kigsfs

For at robotten kan køre, er der lego motorer der styrer hjulene, der er batterier tilsluttet, så den er selvkørende og den har lyssensorer til at følge stregen på banen.

 

Koden

const int lineSensor1 = 3; //Sensor 1 i hul A3
const int lineSensor2 = 2; //Sensor 2 i hul A2

const int hvid = 450;
const int sort = 600;

void setup() {

  //Skriver ud, for at tjekke vores sensorer:
  Serial.begin(9600);

  //Sensorerne:
  pinMode(lineSensor1, OUTPUT); // Kontakt til sensor 1
  pinMode(lineSensor2, OUTPUT); // Kontakt til sensor 2

  //Motor setup Channel A
  pinMode(12, OUTPUT); //Kontakt til Motor A
  pinMode(9, OUTPUT); //Kontakt til Bremse A

  //Motor setup Channel B
  pinMode(13, OUTPUT); //Kontakt til  Motor B
  pinMode(8, OUTPUT); //Kontakt til Bremse B
}

void loop(){
  //Vi får sensorsignalet analog, for digital ville bare være 1 eller 0, altså ikke nuanceret nok
  //Sensor 1:
  int rate1 = analogRead(lineSensor1);
  
  //Sensor 2:
  int rate2 = analogRead(lineSensor2);

  /*
  //Skriver det ud til test:
  Serial.println("Sensor 1 - Hoejre: ");
  Serial.println(rate1);

  Serial.println("Sensor 2 - Venstre: ");
  Serial.println(rate2);
  */

  //Kør hvis sensor 1 OG sensor 2 ser hvidt:
  if(rate2 < hvid && rate1 < hvid){
      //Fremad VENSTRE
      digitalWrite(12, LOW); //Motor A, fremad
      analogWrite(3, 255);   //Hastigheden (255 = fuld kraft)

      //Fremad HØJRE
      digitalWrite(13, HIGH); //Motor B, fremad
      analogWrite(11, 255);   //Hastigheden (255 = fuld kraft)
    } 

    //Ellers hvis højre sensor ser sort:
    else if(rate1 < sort){
      //Fremad HØJRE
      digitalWrite(13, HIGH); //Motor B, fremad
      analogWrite(11, 255);   //Hastigheden (255 = fuld kraft)

      //Stop VENSTRE
      analogWrite(3, 0);      //Hastigheden (0 = stop)
    }
    
    //Ellers hvis venstre sensor ser sort:
    else if(rate2 < sort){
      //Fremad VENSTRE
      digitalWrite(12, LOW); //Motor A, fremad
      analogWrite(3, 255);   //Hastigheden (255 = fuld kraft)

      //Stop HØJRE
      analogWrite(11, 0);   //Hastigheden (0 = stop)
    }

    //Ellers stop begge, vent 1 sekund og kør:
    else {
      //Stop begge:
      analogWrite(3, 0);   //Hastigheden (0 = stop)
      analogWrite(11, 0);   //Hastigheden (0 = stop)

      //Vent i 1 sekund:
      delay(1000);


 // Ved muren:
 //Kør fremad i 0,6 sekund:
      //Fremad VENSTRE
      digitalWrite(12, LOW);  //Motor A, fremad
      //digitalWrite(9, HIGH);   //Disengage the Brake for Channel A
      analogWrite(3, 255);   //Hastigheden (255 = fuld kraft)

      //Fremad HØJRE
      digitalWrite(13, HIGH); //Motor B, fremad
      //digitalWrite(8, LOW);   //Disengage the Brake for Channel B
      analogWrite(11, 255);   //Hastigheden (255 = fuld kraft)

      delay(600);


 //Drej til venstre i 1,4 sekund:
      //Fremad HØJRE
      digitalWrite(13, HIGH); //Motor B, fremad
      //digitalWrite(8, LOW);   //Disengage the Brake for Channel B
      analogWrite(11, 255);  //Hastigheden (255 = fuld kraft)

      //Stop VENSTRE
      analogWrite(3, 0);  //Hastigheden (0 = stop)

      delay(1400);


 //Kør fremad i 2,9 sekunder:
      //Fremad VENSTRE
      digitalWrite(12, LOW); //Motor A, fremad
      //digitalWrite(9, HIGH);   //Disengage the Brake for Channel A
      analogWrite(3, 255);   //Hastigheden (255 = fuld kraft)

      //Fremad HØJRE
      digitalWrite(13, HIGH); //Motor B, fremad
      //digitalWrite(8, LOW);   //Disengage the Brake for Channel B
      analogWrite(11, 255);   //Hastigheden (255 = fuld kraft)

      delay(2900);


 //Drej til højre i 1,0 sekund:
      //Fremad VENSTRE
      digitalWrite(12, LOW); //Motor A, fremad
      //digitalWrite(9, HIGH);   //Disengage the Brake for Channel A
      analogWrite(3, 255);   //Hastigheden (255 = fuld kraft)

      //Stop HØJRE
      analogWrite(11, 0);   //Hastigheden (0 = stop)

      delay(1000);


 //Kør fremad i 1 sekund:
      //Fremad VENSTRE
      digitalWrite(12, LOW); //Motor A, fremad
      //digitalWrite(9, HIGH);   //Disengage the Brake for Channel A
      analogWrite(3, 255);   //Hastigheden (255 = fuld kraft)

      //Fremad HØJRE
      digitalWrite(13, HIGH); //Motor B, fremad
      //digitalWrite(8, LOW);   //Disengage the Brake for Channel B
      analogWrite(11, 255);   //Hastigheden (255 = fuld kraft)

      delay(1000);


 //Drej til højre i 0,9 sekund:
      //Fremad VENSTRE
      digitalWrite(12, LOW); //Motor A, fremad
      //digitalWrite(9, HIGH);   //Disengage the Brake for Channel A
      analogWrite(3, 255);   //Hastigheden (255 = fuld kraft)

      //Stop HØJRE
      analogWrite(11, 0);   //Hastigheden (0 = stop)

      delay(900);


 //Kør fremad i 10 sekunder:
      //Fremad VENSTRE
      digitalWrite(12, LOW); //Motor A, fremad
      //digitalWrite(9, HIGH);   //Disengage the Brake for Channel A
      analogWrite(3, 255);   //Hastigheden (255 = fuld kraft)

      //Fremad HØJRE
      digitalWrite(13, HIGH); //Motor B, fremad
      //digitalWrite(8, LOW);   //Disengage the Brake for Channel B
      analogWrite(11, 255);   //Hastigheden (255 = fuld kraft)

      delay(10000);
      
    }
}

Koden gør så arduinoen fortæller motorerne hvordan de skal opføre sig, udfra de inputs den får fra lyssensorerne.

Når robotten ser helt sort, så ved den at den er færdig med at følge den sorte streg, og så begynder den det hardcodede program der er lagt ind, så den følger væggen rundt og kommer over målstregen.

 

Samspillet & Lego’en

Motorerne er placeret nederst på robotten, sådan så det var nemmest at konstruere gearingen og sætte dem sammen der hvor vi gerne ville placere hjulene på robotten.

Vi flyttede sensorerne frem, sådan så de ikke fik elektroniske forstyrrelser fra motorerne.

Billede af robtten fra siden.

13133365_10208772865139634_1257647900483956182_n

 

Robotten er bygget sådan så den opnår den bedste stabilitet, vi har brugt legeklodser i siden med huller i, sådan så ledningerne kunne føres igennem der.

Der er sørget for at arduinoen og batterierne sidder fast i legokonstruktionen, så de ikke påvirkes under kørslen ved at blive rystet for meget.

Forrest på robotten er placeret “en forrude” sådan så arduinoen nemt kan programmeres og så der er mulighed for at trykke på reset knappen – til når den skal starte sin kode forfra.

 

Konklusion

Vores robot løser den givne opgave, men til testningen (de 3 forsøg), var banen blevet bøjet således at robotten fejlede. Inden de 3 forsøg har robotten løst opgaven op til flere gange uden fejl.

Den løser opgaven omkring 70 % af gangene, men har små fejl der gør at den ikke gør det 100 % af gangene, hvilket vi selvfølgelig havde håbet den ville gøre.

Konklusionen er derfor at robotten sagtens kan løse opgaven, men den viser ikke den stabilitet i gennemførelsen, som vi ønskede den skulle. Hvis den skulle bruges til et arbejde der afhang af at den virkede 100 % at gangene, ville den ikke fungere til det på givne tidspunkt.

 

Valg undervejs (problemer)

Vi oplevede at vores robot ikke ville dreje til venstre, hvilket gjorde det problematisk for os at tilpasse koden. Derfor valgte vi at hardcode robotten i den sidste del af banen, da vi var bange for eventuelle risici ved at tilføje flere måleenheder.

Vi fandt ud af at det var motorerne der ikke virkede optimalt, så dem fik vi først byttet ud meget sent i forløbet, hvilket gjorde at vi måtte ændre mange ting i koden.

 

Perspektivering
For at gøre den bedre, kan man tilføje en afstandscensor, dette ville gøre den nemmere at programmere til andre baner og det ville præcisere dens rute gennem banen.

Man kunne lave flere tests af gearingen, sensorerne, motorerne osv. for at finde ud af om man benytter det bedst muligt for robottens kørsel.

Leave a Reply