Portefølje 2

Robot navn: D.U.I (Driving Under Influence)

Gruppe: Mette Tanggaard Ohlsen & Natascha Denise Grønlie

Bedste konkurrence tid: 

Test tid : 57 sekunder

Bedste konkurrence tid: 48 sekunder

Video af Testkørsel

Sequence 01

Opbygning af hardware

Vi har brugt to IR-sensorer der registrerer forskellen på sort og hvid, og udskriver det som en analog værdi. Disse bruges til at registrere den sorte linje. Vi har brugt en sonar sensor der udsender lyd og måler hvor langt tid der går før lyden kommer tilbage. Den bruges til at måle afstanden over til væggen.

Den venstre motor er forbundet til Motor Shieldet gennem channel A, og den højre gennem channel B. IR-sensorerne er forbundet således at Vcc på IR-sensorerne går til 5V i Arduino Motor Shieldet gennem breadboardet. Output for den venstre IR-sensor er forbundet til analog 2, og den højre til analog 3. Ground på IR-sensorerne er forbundet til Ground på Motor Shieldet gennem breadboardet. Sonar sensoren har fire pinde, hvor Vcc er forbundet til 5V på Motor Shieldet gennem breadboardet. Trigger er forbundet til digitale pin 5 på Motor Shieldet og Echo til digital pin 6. Ground på Sonar-sensoren er forbundet til Ground på Motor Shieldet gennem breadboardet. Batterierne er forbundet til Motor Shieldet, med plus forbundet til Vin og minus til en kontakt som fører videre til Ground. Vi har placeret kontakten for at vi kan slukke for Arduinoen uden at fjerne batterierne. Batterierne er serie-forbundet for at opnå en spænding på ca. 9.6V. Hvis de var parallelforbundet ville spændingen ligge på ca. 4.8V.

 

 

Opbygning af robot i Lego

Vores robot er opbygget med to store hjul foran, forbundet til motorerne med en gearing på 1:5. Den har et tredje støttehjul bagpå, der kan dreje 360 grader. Der er seks tapper bygget under den foran til at sætte IR-sensorerne på. De er placeret under robotten, tæt på jorden for at kunne måle mere præcist. De sidder med et mellemrum, lidt større end linjen er bred, for at kunne registrer hvad retning linjen drejer i forhold til robotten. Der er to pinde bygget ud på højre side, til at holde sonaren. Vi har placeret Sonar sensoren på højre side af robotten da det er den side væggen vil være på når robotten når frem til anden del af ruten. Derudover har vi valgt at sætte Sonar sensoren på skrå for at den kan ”se fremad” og finde væggen igen når den har rundet enden.
I midten af robotten placeres to batteriholdere som hver har fire batterier med en spænding på 1.2V. Øverst på robotten placeres breadboardet, og ved siden af placeres Arduino Uno med monteret Arduino Motor Shield.

 

Se byggevejledning

Download (ZIP, 5.08MB)

 

Opbygning af program

//declare pins
const int leftSensor = 2;
const int rightSensor = 3;
const int trigPin = 5;
const int echoPin = 6;
int moveSpeed = 100;
//boolean to tell which part of the course it's on
boolean lineFollow = true;
boolean wallFollow = false;
//motor a is right
//motor b is left
void setup() {
 //set pin modes
 Serial.begin(9600);
 pinMode(9, OUTPUT); //A brake
 pinMode(12, OUTPUT); //A direction
 pinMode(8, OUTPUT); //B brake
 pinMode(13, OUTPUT); //B direction
 pinMode(trigPin, OUTPUT);
 pinMode(echoPin, INPUT);
}

void loop() {
//read from IR sensors
 int leftInput = analogRead(leftSensor);
 int rightInput = analogRead(rightSensor);
//is following the black line
if(lineFollow == true){
 //call followLine() function with sensor reading
 followLine(leftInput, rightInput);
 //otherwise it should call the followWall() function
} else if(wallFollow == true){
 followWall();
}
 //wait for 100 miliseconds
 delay(100);

}

//function to follow the line, called from loop()
void followLine(int leftInput, int rightInput){
//if right inpur AND left input are above 900, both are black, means it should have reached the end line
 if(leftInput > 900 && rightInput > 900){
 //call the function to stop moving, stopMoving()
 stopMoving();
 //set the lineFollow to false
 lineFollow = false;
 //set moveSpeed to 50
 moveSpeed = 50;
 //call the function findWall(), to find the wall
 findWall();
//if right input OR left input is over 900
 } else if(rightInput > 900 || leftInput > 900){
 //if right input is higher than left input, right sensor is on the black line
 if(rightInput > leftInput){
 //turn right
 turnRight();
 } else{
 //else it must be the left one, and it should turn left
 turnLeft(); 
 }
 } else{
 //otherwise, move forward
 moveForward();
 }
}

//function to follow wall, called from loop()
void followWall(){
 //---- Code taken from http://www.instructables.com/id/Simple-Arduino-and-HC-SR04-Example/ 
 //declaree variables of type long
 long duration, distance;
 //set trigPin output to LOW
 digitalWrite(trigPin, LOW);
 //wait
 delay(2);
 //set trigPin output to HIGH
 digitalWrite(trigPin, HIGH);
 //wait
 delay(10);
 //set trigPin output to LOW
 digitalWrite(trigPin, LOW);
 //read pulse from echoPin
 duration = pulseIn(echoPin, HIGH);
 //calculate distance
 distance = (duration/2)/29.1;
 //---- end of code taken

 //write distance to serial. monitor (for testing)
 Serial.println(distance);
 //if distance is less or equal to 12
 if(distance <= 12){
 //turn left,away from wall
 turnLeft();
 //turn left for 200 miliseconds
 delay(200);
 //start moving forward
 moveForward(); 
 //if distance is over 13 AND less than 20
 } else if (distance > 13 && distance < 20){
 //turn right for 150 miliseconds
 turnRight(); 
 delay(150);
 //move forward
 moveForward();
 delay(500);
 //if distance is more than 20
 } else if (distance > 20){
 //turn right for 350 miliseconds
 turnRight();
 delay(350);
 //then move forward for 340 miliseconds
 moveForward();
 delay(340);
 }
 //otherwaise move forward
 else{
 moveForward(); 
 }
 
 
 
}
//function to find wall, called from followLine()
void findWall(){
 //move forward for 1250 miliseconds
 moveForward();
 delay(1250);
 //stop moving
 stopMoving();
 //turn left for 750 miliseconds
 turnLeft();
 delay(750);
 //stop moving 
 stopMoving();
 //set wallFollow to true, to begin next part of course
 wallFollow = true;
}
//function to move backwards
void moveReverse(){
 //print direction (for test)
 Serial.println("Reverse");
 digitalWrite(12, HIGH); //diretion on motor A
 digitalWrite(9, LOW); //break off motor A
 digitalWrite(13, HIGH); //diretion on motor B
 digitalWrite(8, LOW); //break off motor B
 analogWrite(3, moveSpeed); //speed of motor A
 analogWrite(11, moveSpeed); //speed of motor B
}

void moveForward(){
 //print direction (for test)
 Serial.println("Forward");
 digitalWrite(12, LOW); //diretion on motor A
 digitalWrite(9, LOW); //break off motor A
 digitalWrite(13, LOW); //diretion on motor B
 digitalWrite(8, LOW); //break off motor B
 analogWrite(3, moveSpeed); //speed of motor A
 analogWrite(11, moveSpeed); //speed of motor B
}
void turnRight(){
 Serial.println("Right");
 digitalWrite(12, HIGH); //diretion on motor A
 digitalWrite(9, LOW); //break off motor A
 digitalWrite(13, LOW); //diretion on motor B
 digitalWrite(8, LOW); //break off motor B
 analogWrite(3, moveSpeed); //speed of motor A
 analogWrite(11, moveSpeed); //speed of motor B
}
void turnLeft(){
 //print direction (for test)
 Serial.println("Left");
 digitalWrite(12, LOW); //diretion on motor A
 digitalWrite(9, LOW); //break off motor A
 digitalWrite(13, HIGH); //diretion on motor B
 digitalWrite(8, LOW); //break off motor B
 analogWrite(3, moveSpeed); //speed of motor A
 analogWrite(11, moveSpeed); //speed of motor B
}
void stopMoving(){
 //print direction (for test)
 Serial.println("STOP");
 digitalWrite(12, LOW); //diretion on motor A
 digitalWrite(9, HIGH); //break off motor A
 digitalWrite(13, HIGH); //diretion on motor B
 digitalWrite(8, HIGH); //break off motor B
 analogWrite(3, 0); //speed of motor A
 analogWrite(11, 0); //speed of motor B
 }

 

Vores program er opbygget så, vi har to booleans der indikerer hvilken del af banen den befinder sig på. En if statement tjekker booleansne og vælger en funktion ud fra om den skal følge den sorte linje, eller den skal følge væggen. Når den følger linjen, tjekker den værdierne for højre og venstre IR-sensor, og hvis én af dem indikerer sort, drejer den mod den sensor. Hvis de begge indikerer sort, har den nået stopstregen og den skifter til at følge væggen og sænker hastigheden til 50. Når den følger væggen kigger den på afstanden. Hvis afstanden er under eller lig med 12 er den for tæt på væggen og den drejer til venstre væk fra den. Hvis afstanden er mellem 13 og 20 er den for langt fra væggen og den drejer til højre ind mod den. Hvis afstanden er over 20, skal den runde enden af væggen og den drejer meget til højre.

 

Nedenstående flowdiagram viser den overordnede logik i vores program.

 Samspil mellem mekanik, elektronik og software

Samspillet mellem vores mekanik, elektronik og software, er således at batterierne giver strøm til arduinoen, gennem Motor Shieldet, som gør at den kan køre softwaren, og så den kan bruge sensorene og få motorene til at køre. Strømniveauet på batterierne har også betydning for hvor hurtigt robotten kører.

Arduinoen er vigtig da det er den der kører softwaren der i sidste ende bestemmer hvordan robotten bevæger sig rundt på banen.

Motorerne er vigtige fordi de gør det muligt for robotten at bevæge sig rundt på banen.

Sensorenes placering på robotten har stor betydning for hvordan robotten kører på banen. Hvis man f.eks. flytter sonaren, vil den give en anden måling i forhold til væggen, og softwaren vil derfor reagere på en anden måde.  Eller hvis IR-sensorerne sad længere over jorden ville deres målinger blive mere upræcise, og vi ville derfor ikke kunne styre lige så præcist efter stregen.

Softwaren er vigtig da det er den der lytter til sensor input, og bestemmer hvordan robotten skal kører. Ændringer i softwaren giver også ændringer i hvordan robotten navigerer banen.

Derfor er alle dele af robotten vigtige for at den kan navigere banen korrekt.

 

Konklusion

Vi kan ud fra opgaveformuleringen konkluderer at robotten løser opgaven, da vores robot kan følge de sorte linjer og kan gennem Sonar-sensoren ”se” hvor væggen er og derved kører rundt om den. Det forekommer dog at den ikke når rundt om væggen, afhængig af hvordan den forlader den sorte streg, og om sonaren opfanger enden af væggen.

 

Perspektivering

Hvis vi skulle arbejde videre med vores bil kunne vi sætte sonaren mere stabilt på, og justere softwaren til styring rundt om væggen. Derudover kunne vi bygge et mere stabilt skelet til bilen.

Vi kunne justere vores software, så motorstyringen bliver mere præcis. Ledninger kunne sættes mere systematisk/praktisk, så der ikke opstår løse forbindelse, eller de blokerer hjulene. Og vi kunne sætte IR-sensorerne mere stabilt, så de ikke giver sig når bilen flyttes. Vi kunne udskifte Motor Shieldet med et andet, så der ikke er løseforbindelser ved skruerne.

 

Leave a Reply