Udviklet af David Mørk, Gustav Bork og Younes El-Hawari

Anvendt hardware

  • 2 LEGO DC Motorer
  • Arduino Uno
  • Arduino Motorshield
  • 2 QRE1113 sensorer
  • Ledninger
  • Lego
  • 1 knap
  • 1 HC-SR04
  • 1 9V Strømkilde

 

I første udkast var robottens opbygning  baseret på en Braitenberg Vehicle 2b, hvor agenten er symmetrisk opbygget, men dette er ikke længere tilfældet, da der er blevet monteret en arm på højre side af agenten. Den har 2 ens sensorer i fronten (QRE1113), som måler efter en sort linje. For at agenten skal køre, får motorene input fra de 2 sensorer i fronten, med strøm fra et 9V batteri. Når agenten drejer, har vi sat det ene hjul til at køre den modsatte vej, sådan så den får en hurtig drejning. Hvis den skal dreje til venstre, vil højre hjul køre baglæns og vice versa.

Agentens opbygning i LEGO

Agenten er opbygget sådan så den har 2 styrende hjul samt en støttepind og en glider monteret. Idéen har hele tiden været, at hver motor skulle styre drejningen på hver sin side af agenten. Første udvikling havde 3 forskellige mounts til batteri, arduino og breadboard,  i et form for tårn-layout, hvilket gjorde den høj og ustabil, og derudover var vægt også et problem. Løsningen på vægt problemet var, at lave en længere model. Derved kunne vi udjævne vægten, sådan så der ikke var for meget på et sted. I fronten af agenten er der en styrepind, som guider den, når der drejes. De to QRE1113 sensorer er monteret i fronten af agenten, ca. 0,5 cm over jorden. Ultralydssensoren sidder også på fronten, da agenten bruger den til at finde ud af, hvornår muren er foran den. Når den registrerer muren foran den, vil den dreje til venstre indtil der ikke er et objekt 10 cm foran den, hvor den i så fald kører til højre igen, indtil agenten rammer muren og kontakten bliver aktiveret, hvor den så vil køre til venstre igen, indtil knappen ikke bliver trykket. Knappen er blevet monteret på en ”arm”, som skal bruge meget lidt tryk for at blive rykket, så armen aktiverer knappen ligeså snart, at den rammer muren. Der er opsat en 16:1 gearing på motorene.

    

Kredsløbstegning og beskrivelse

Kredsløbet består af to QRE1113 sensorer, som er en reflektiv sensor, der virker ved at detektere mængden af infarødt lys, som reflekteres tilbage på den. Den består af en LED, der udsender IR (i serie med en 100Ω modstand for at begrænse strømmen) og en IR-sensitiv fototransistor.

Sensorne er tilkoblet Arduino Uno (og motor shield) via Vcc, ground samt et analogt input.

Der er tilkoblet en 9V strømkilde til arduino motor shieldet, og deri er motorende sat i deres korrekte inputs. De to QRE1113 sensorer er tilkoblet i analog inputs 4 og 5, samt ground og 5V. Ultralydssensoren har 4 pins, Vcc og ground er sat i henholdsvis 5V og ground, dens trigger pin er sat i digital pin 10, og dens echo pin er sat i analog pin 3.

Knappen er på de diagonale ben sat i Vcc (forbundet med en 10k Ω pullup resistor.) og GND, og en af dens outputs er sat i digital pin 2.

Software

const int sensorPin1 = A4;
const int sensorPin2 = A5;
const int button = 2;
int Sensor1 = 0;
int Sensor2 = 0;
int threshold = 700;
int motorTurnA = 12;
int motorSpeedA = 3;
int motorTurnB = 13;
int motorSpeedB = 11;
int speedForward = 65;
int speedTurn = 120;
int buttonState;
int trigPin = 10;
int echoPin = A3;
long duration, cm, inches;
int e = 0;
int d = 0;
void setup() {

  Serial.begin(9600);

  //Opsætning af porte for afstandmåler
  pinMode(sensorPin1, INPUT);
  pinMode(sensorPin2, INPUT);
  pinMode(trigPin, OUTPUT);                         //Den digitale pin SAfstandTrigger sættes til output (lyd output)
  pinMode(echoPin, INPUT);

  //Den digitale pin SAstandEkko sættes til input (lyd input)

  //Opsætning af porte for motorer
  pinMode(motorTurnA, OUTPUT);                              // Erklærer at motorTurn er output
  pinMode(motorSpeedA, OUTPUT);                             // Erklærer at motorSpeed er output
  pinMode(motorTurnB, OUTPUT);                              // Erklærer at motorTurn er output
  pinMode(motorSpeedB, OUTPUT);                             // Erklærer at motorSpeed er output

  //opsætning af porte for buttons
  pinMode(button, INPUT_PULLUP);
}

void loop() {
  
   // The sensor is triggered by a HIGH pulse of 10 or more microseconds.
  // Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  // Read the signal from the sensor: a HIGH pulse whose
  // duration is the time (in microseconds) from the sending
  // of the ping to the reception of its echo off of an object.
  pinMode(echoPin, INPUT);
  duration = pulseIn(echoPin, HIGH);
 
  // convert the time into a distance
  cm = (duration/2) / 29.1;
  inches = (duration/2) / 74; 


  //Aflæser input for lyssensor
  Sensor1 = analogRead(sensorPin1);
  Sensor2 = analogRead(sensorPin2);

  //Printer lyssensor input
//  Serial.print(Sensor2); // venstre
//  Serial.print(", ");
//  Serial.print(Sensor1); // højre
//  Serial.print(", ");

  if (Sensor1<threshold && Sensor2>threshold) {             // Sensor1 ser hvid og Sensor2 (venstre) ser sort - drej til venstre 
    digitalWrite(motorTurnA, HIGH);   
    analogWrite(motorSpeedA, speedForward);
    digitalWrite(motorTurnB, LOW); 
    analogWrite(motorSpeedB, speedTurn);
    }
  else if (Sensor1>threshold && Sensor2<threshold) {        // Sensor2 ser hvid og Sensor1 (højre) ser sort - drej til højre
    digitalWrite(motorTurnA, LOW);
    analogWrite(motorSpeedA, speedTurn);
    digitalWrite(motorTurnB, HIGH);
    analogWrite(motorSpeedB, speedForward);
    }


  else{
    digitalWrite(motorTurnA, HIGH);
    analogWrite(motorSpeedA, speedForward);
    digitalWrite(motorTurnB, HIGH); 
    analogWrite(motorSpeedB, speedForward);
    }

   
  //Serial.print(",");
  Serial.println(cm);
  Serial.print(" CM: ");
  //Serial.println(e); 
  //Serial.print(buttonState);
  
  if (cm<4) {
    e++;
  Serial.print(d);
//  Serial.print(" D: ");
//  Serial.print(" E: ");
  Serial.print(e);
    while (e>3 && d<200) 
    {
    digitalWrite(motorTurnA, HIGH);   
    analogWrite(motorSpeedA, speedForward);
    digitalWrite(motorTurnB, LOW); 
    analogWrite(motorSpeedB, speedTurn);
    d++;
    Serial.println(d);
    }
    while (d>30)
    {
    buttonState = digitalRead(button);
      if (buttonState == HIGH){
    Serial.println("HIGH");
    Serial.println(buttonState);
    digitalWrite(motorTurnA, HIGH);   
    analogWrite(motorSpeedA, 50);
    digitalWrite(motorTurnB, HIGH); 
    analogWrite(motorSpeedB, 65);
      }  else {
    Serial.println("LOW");
    Serial.println(buttonState);
    digitalWrite(motorTurnA, LOW);   
    analogWrite(motorSpeedA, 70);
    digitalWrite(motorTurnB, HIGH); 
    analogWrite(motorSpeedB, 75);
      }
      }
    }
 
   }

Flowdiagram

Perspektivering og retrospektiv

Der har været problemer med opbygning af agenten, specifikt med lokationen af sensorer (primært ultralydssensoren). Idéen var først at bruge den til at komme rundt om muren, men fandt hurtigt ud af, at der var bedre alternativer i form af en knap/aktuator. Derudover har der været problemer med opbygnignen af agenten (den har været for skrøbelig eller for tung), så dette er også faktorer der skal overvejes.

Der har været en stor kamp med at få den rigtige længde på armen, da den samtidig nemt skal kunne trykke knappen ned, og samtidig ikke være for stor, da det bare vil gøre det svært for den at komme rundt om væggen, dog hvis den er for kort, skal der for højt et tryk til at få knappen til at aktivere, og derved vælter den bare væggen når den støder ind i den.

Video

Konklusion

Det har været interessant at få robotten til at virke, da den skal optimeres mange gange på de forskellige stadier af banen, på grund af de mange sensorer der sidder på den. I den endelige version lykkedes det at få robotten til at følge linjen gennem hele banen, derudover når den når til væggen, vil den køre langs den ved et signal der gives gennem en knap.

Der kræves meget optimering af robottens layout for at få den til at køre ordentligt, samt at finde optimal gearing osv. for at kunne komme igennem banen på maksimal hastighed, og derudover også være passende sådan så den kan reagere på sensorernes inputs og nå at korrigere dens retning.

Leave a Reply