Benny Bearnaise Guide

skrevet af Thor Heie og Sonny Zastrow

Denne tutorial vil give dig viden omkring hvordan man bygger en LEGO robot. Robotten vil være i stand til at kunne følge en streg, samt at kunne dreje udenom en væg.
Banen den er blevet test på ses på figur.1 selve robotten kan ses på figur.2

Figur.1                                                                                  Figur.2

For at kunne bygge denne Robot er der 3 områder man skal arbejde med:

1. Opbygning af robotten med LEGO
2. Opbygning af hardware for at få input og gøre den i stand til at give et output
3. Software for at anvende input og have kontrol over output

Efter en gennemgang af disse områder, viser vi hvordan den kører. Derudover kommer vi også med overvejelser til hvad der kunne gøres bedre på den.

LEGO

Der er mange forskellige måder man kan bygge denne robot på. Som udgangspunkt vil vi opfordre til, at du bruger samme design, som os til at starte med. Når du har fået den til at virke vil stærkt anbefale modificere på den og laver dit eget design. På figur.3 ses vores design af LEGO robotten og på figur.4 ses den instruktions guide vi har anvendt.

 

Figur.3                                                                                         Figur.4

Da vi skulle bygge vores robot hentede vi inspiration fra en MINDSTORMS robot kaldt ” The Roverbot”. Vi fulgte instruktionen til side 17 fra bogen, der kan ses på figur.4. Herefter begyndte vi selv at sætte dele på for at gøre plads til Arduino’en der er vores mikro-kontroller, breadboardet hvor de elektroniske komponenter er tilkoblet, samt batterier og de forskellige sensorer.( opsætning se figur.5)   Vi endte ud med den udgave som kan ses på figur.3

Vi valgte “The Roverbot” fordi den igennem Lego Mindstorms er let tilgængelig og har en forholdsvis simpel opbygning, samtidig er den nemmere at bygge end alt der bruger bælter.
Stregsensorenes placerings er på fronten for at få retningen på robotten når den køre, sensorerne kunne måske have været placeret længere fra hinanden for at have et større bevæg område, dog syntes vi at det var en god ting at robotten bevægede sig så præcist ved kørsel på stregen. Det eneste udfordrende ved robotten er pladsen til breadboard, Arduino og batterierne, så derfor er der modificeret en del på oversiden af robotten for at gøre plads de forskellige dele og fordele vægten forsvarligt.

UltraSonic Sensoren, sidder på højre side af robotten fordi det er der væggen er hele tiden. Vi valgte denne sensor fordi det er relevant når der nu er en væg og for ikke at hardkode (skrive koden til det interval før den skal dreje omkring væggen), så robotten selv kan registrere væggen og have en delvis kunstig intelligens.

Hardware

Liste over komponenter der skal bruges:

Diverse LEGO-dele som delvist kan findes i byggevejledningen.

“The Roverbot” LEGO- byggevejledning se s.12 – s.16 (Se bort fra den gule boks til sidst i vejledningen): https://www.dropbox.com/s/pethndp532mqyrl/Lego%20Byggeinstruktioner.pdf?dl=0

1 x Arduino Uno: https://store.arduino.cc/arduino-uno-rev3
1 x MotorShield: https://store.arduino.cc/arduino-motor-shield-rev3
1 x Knap
1 x HC-SR04 Ultrasonic Range Finder: https://www.sparkfun.com/products/13959
2 x QRE1113 SparkFun Line Sensor Breakout: https://www.sparkfun.com/products/9453
1 x Breadboard: https://www.sparkfun.com/products/9567
8 x 1,5V batterier: https://www.sparkfun.com/products/9100
2 x batteriholdere med plads til 4 i hver: https://www.sparkfun.com/products/552
2 x Motorer Electric Technic Mini-Motor 9v + tandhjul, fra LEGO.

 

 

 

 

 

Figur.5

 

Alle disse dele skal forbindes som vist på figur.5

Software

Når robotten følger stregen får vi den til at bakke på den ene motor hvis den ene af line sensoren bevæger sig ind over noget sort. Dette gør vi fordi hvis den ikke bakker, laver den ikke et skarpt nok sving. Vi testede med at bare slukke motoren og sætte et større delay på, men det resulterede i den konstant ville bevæge sig væk fra stregen.

Når den kommer ned til området, hvor linjen slutter vil begge line sensorer få en værdi ind for sort. Når den har det vil den skifte mode. Da vi havde placeret sonaren på den ene side af robotten mente vi at det ville være nemmest at hardcode det første sving. Efter det sætter sonaren ind og væggen følges rundt til slut.

Her vises koden hvori der er beskrivelser til, hvad de enkelte dele gør.

// opsætning af port i Arduino
int lightSens1 = A2; 
int lightSens2 = A3;

// gemmer værdi fra lyssensor input
int valueLeft;
int valueRight;

// opsætning af Sonar
const int trigger = 5;
const int ekko = 7;

// værdier for lyssenor
int black = 700;
int white = 600;
// hastighed for motor forskellige tilstande  
int drive = 150;   // når den drejer 
int driveLR =255; // ligeud 
int noDrive =100;  // baglæns 

//motor1
int motorSpeedLeft = 3;
int driveLeft = 12;
int brakeLeft = 9;

//motor2
int motorSpeedRight = 11;
int driveRight = 13;
int brakeRight = 8;

// Sonar 
long duration; 
int distance;
int stands = 0;
int near = 20; 
int far= 25; 

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
pinMode(driveRight,OUTPUT);
pinMode(driveLeft,OUTPUT);
pinMode(motorSpeedLeft, OUTPUT);
pinMode(motorSpeedRight, OUTPUT);
pinMode(lightSens1, INPUT);
pinMode(lightSens2, INPUT);

pinMode(trigger, OUTPUT);
pinMode(ekko, INPUT);

}

void loop() {
  // put your main code here, to run repeatedly:
valueLeft =analogRead(lightSens1);
valueRight =analogRead(lightSens2);
Serial.println(stands);
if (stands == 0) // første del af banen med at følge streg
    { // ligeud
    if (valueRight < white && valueLeft < white){
      
      digitalWrite(brakeLeft, LOW);
      analogWrite(motorSpeedLeft, driveLR);
      digitalWrite(driveLeft,HIGH); 

      digitalWrite(brakeRight, LOW);
      analogWrite(motorSpeedRight, driveLR);
      digitalWrite(driveRight, HIGH);

      Serial.println("ligeud");
      } // når den højre sensor er mørk
    else if (valueRight > black && valueLeft < white){
      
      digitalWrite(brakeLeft, LOW);
      analogWrite(motorSpeedLeft, drive);
      digitalWrite(driveLeft, HIGH);

      digitalWrite(brakeRight, LOW);
      analogWrite(motorSpeedRight, noDrive);
      digitalWrite(driveRight, LOW);
      //delay(200);

      Serial.println("højre");
      
      } // når den venstre sensor er mørk
       else if (valueRight < white && valueLeft > black){
      
      digitalWrite(brakeLeft, LOW);
      analogWrite(motorSpeedLeft, noDrive);
      digitalWrite(driveLeft, LOW);

      digitalWrite(brakeRight, LOW);
      analogWrite(motorSpeedRight, drive);
      digitalWrite(driveRight, HIGH);
      //delay(200);
     Serial.println("venstre");
      }
       // anden del HardCode med første sving
      else if (valueRight > black && valueLeft > black){
        Serial.println("stop"); 
        stands = 1;

      digitalWrite(brakeLeft, LOW);
      analogWrite(motorSpeedLeft, 250 );
      digitalWrite(driveLeft,HIGH); 

      digitalWrite(brakeRight, LOW);
      analogWrite(motorSpeedRight, 0);
      digitalWrite(driveRight, HIGH);

      delay(2500);

      digitalWrite(brakeRight, LOW);
      analogWrite(motorSpeedRight, 20);
      digitalWrite(driveRight, HIGH);
      delay(1500);
        }

       
       
       Serial.print(valueLeft); 
      Serial.print(",");
      Serial.println(valueRight);
    }
    // Sonar følge væg
    else if (stands = 1){

      digitalWrite(trigger, LOW);
      delayMicroseconds(2);
      // Sets the trigPin on HIGH state for 10 micro seconds
      digitalWrite(trigger, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigger, LOW);
      // Reads the echoPin, returns the sound wave travel time in microseconds
      duration = pulseIn(ekko, HIGH);
      // Calculating the distance
      distance= duration*0.034/2;
      // Prints the distance on the Serial Monitor
      Serial.print("Distance: ");
      Serial.println(distance);
      
      if (distance>far){
          
      digitalWrite(brakeLeft, LOW);
      analogWrite(motorSpeedLeft, 55 );
      digitalWrite(driveLeft,HIGH); 

      digitalWrite(brakeRight, LOW);
      analogWrite(motorSpeedRight, drive);
      digitalWrite(driveRight, HIGH);
        }
        else if(distance < near ){

      digitalWrite(brakeLeft, LOW);
      analogWrite(motorSpeedLeft, drive);
      digitalWrite(driveLeft,HIGH); 

      digitalWrite(brakeRight, LOW);
      analogWrite(motorSpeedRight, noDrive);
      digitalWrite(driveRight, LOW);
          
          }

          else if (distance < far && distance > near){

          digitalWrite(brakeLeft, LOW);
          analogWrite(motorSpeedLeft, drive);
          digitalWrite(driveLeft,HIGH); 

          digitalWrite(brakeRight, LOW);
          analogWrite(motorSpeedRight, drive);
          digitalWrite(driveRight, HIGH);
            }
      }
      
  
}

 

Sammenspil mellem Mekanik, elektronik og software

Igennem de sensorer, som der sidder på robotten får den input. Disse input bliver anvendt, i den kode som Arduino’en har. Via denne kode anvender den inputene og der kommer et output, som i dette tilfælde er via motorene. Når motorene starter får det tandhjulene til at bevæge sig. Disse tandhjul er der sat hjul til, som får robotten til at køre. Sammenspillet mellem vores komponenter, opbygning af robotten og vores software resulterede i det som kan ses i nedenstående video.

Konklusion

Denne robot var med i en konkurrence om at se hvilken robot der kunne komme hurtigst igennem banen se Figur. 1.

Den vandt desværre ikke. Første pladsen kom igennem banen på 18 sekunder. Benny Bearnaise’s hurtigste tid var 38 sekunder. Dog kan der konkluderes at den kan følge en streg,  tag et sving og herefter følge en væg.

Perspektivering

For at vores robot skulle have klaret det bedre, mener vi at der skulle være justeringer i forhold til den del af koden der sættes igang efter der ikke er mere streg. Den skulle forbedres sådan at den drejede mere præcist og fx ikke kører over den røde streg og modtager straf point. Sonaren skulle der også arbejdes, en smule mere på. Den havde problemer med at få den rigtige afstand målt, hvilket resulterede i at den, lavede et alt for stort sving. Derudover vil tiden også kunne blive forbedret, hvis man ændrede på delayet i den første del, så den ikke hele tiden skal rette op, når den kører på linjen.

Leave a Reply