Wall-E 2.0

Af Jonas Jensen, Didde Jacobsen og Lukas Teichert

Konkurrence tid: 180 sekunder/ikke gennemført

TEST TID: cirka 30 sekunder

Guide til opbygning af Wall-E 2.0, den kørende Lego Arduino Robot.

Hardware der skal bruges til opbygningen:

1x Arduino Board (UNO)

1x Motor Shield (Passende til board)

2x Lego Motorer

2x Line Sensor

1x Hc -sr04 (Sonar Sensor)

6x AA Batterier + holder

1x Breadboard (Mini/Small)

1x Lego Bil

Design

I dette afsnit vil der blive gennemgået  de forskellige design steps, som gruppen har taget gennem konstruktions udviklingen.

Første design udkast minder meget om det endelige, men her havde bilen 2 tætsiddende hjul som næse-hjul bagpå, hvilket gruppen oplevede gav bilen en del besvær med at flytte bagenden.

Andet udkast af design, flyttede gruppen placeringen af næse hjulet, så den var foran motorerne (i modsætning til bagerst på bilen). Ved denne konstruktion oplevede gruppen, at styringen af bilen blev forværret. Dog fandt gruppen ud af; at ved denne konstruktion læste sensorerne bedre, da de var blevet placeret foran på bilen.

Sidste udkast blev en blanding af de 2 foregående designs, med næse-hjul bagpå og sensor foran – dog ændrede gruppen næse-hjulet til kun at have ét hjul, dette gav bilen mere mobilitet.

 

Link til byggevejledning i Lego Digital designer:

https://drive.google.com/file/d/1Icv57CWF-m-Y-uTTryiUHIpMDAmFgpJz/view?usp=sharing

Hardware

Batteri

Gruppen har valgt at bruge 6 stk AA batterier(7.2V – 9V) til at forsyne arduinoen og shieldet med, dette er fordi gruppen oplevede at 4 stk (4.8V – 6V), ikke gav systemet tilstrækkeligt strøm. Batterierne er forbundet til shieldet i den ene side, ved GND og Vcc. se billedet som ligger under motorer afsnittet.

 

Motorer

Motorerne som kører bilen, er 2 stk DC lego motorer, disse er sat til shieldets A og B indgange, som befinder sig i den ene ende af shieldet. Dette giver gruppen mulighed for at kunne kontrollere hvilken retning motorerne skulle dreje, ved hjælp af kode. Højre motor er sat til indgang A og Venstre motor er sat til indgang B. Billedet under viser hvordan motorerne og batterierne er sat til shieldet.

Billede 1

 

Line Sensor

Gruppen har valgt at bruge 2 stk Linje Sensorer, for at kunne løse opgaven som er blevet stillet. Ved at bruge 2, og monterer disse fast foran på bilen med et lille mellemrum, så de sidder på hver sin side af stregen som bilen skal følge, kan bilen se ud fra hvilken sensor der bliver sort, hvilken vej den skal dreje, derved blive ved med at følge stregen, og ikke køre af sporet.

For at kunne nemmere holde styr på komponenterne og ledninger, har gruppen valgt at bruge et mini breadboard, og da både begge sensorerne og sonar sensoren skulle bruge både Vcc og GND, var det nemmere med et breadboard som kunne forsyne de 3 komponenter med strøm i stedet for at have flere ledninger ned i den samme udgang på shieldet.

De 2 linje sensorer har hver 3 udgange (Vcc, GND og OUT), som alle er forbundet med shieldet.

Shieldet har en udgang som kan forsyne komponenterne med 5V som befinder sig i bunden af shieldet(tæt ved batteriernes tilslutning), herfra er der trukket strøm til breadboardet(Rød ledning), som videre forsyner de 2 linje sensorer med strøm.

Ved siden af 5V udgangen har shieldet en GND udgang, herfra er der trukket en ledning til breadboardet(Sort), som gør det muligt at kunne grounde de 2 sensorer.

Til hver af de 2 sensorer bruges der 1 digital port, henholdsvis port 2 og 4. Dette gøres fordi gruppen ønsker, at have muligheden for at kunne holde styr på hvilken af de 2 porte der får hvilke signaler.

Valget af digitale porte frem for de analoge, faldt på digitale fordi linje sensoren er konstrueret sådan, at hvis den måler en sort farve modtager den digitale porte et 1 tal, og hvis den ser alt andet modtager den et 0 tal. Gruppen ville kun kunne se forskel på om sensorerne ser sort eller alle andre farver(true or false).

Højre sensor er sat til port 2 gennem breadboardet(Gul ledning) venstre sensor er sat til port 4(Orange ledning).

 

Sonar Sensor

Den sidste komponent som gruppen har valgt at bruge er en sonar sensor, valget faldt på denne komponent, da gruppen skulle bruge en sensor der ville gøre det muligt at finde og holde en bestemt afstand til et fremmed objekt, i dette tilfælde en væg, som bilen skulle følge i en sikker afstand, finde vej rundt om og videre ind over målstregen.

Denne sensor har 4 udgange, (Vcc, Trigger, Ekko og GND)

Sensoren har gruppen valgt at sætte direkte ned i breadboardet, dette er begrundet i at sensoren skulle bruge en fast position på bilen, som ikke særlig nemt kunne ændre sig. Dette var også den nemmeste måde at tilslutte sensoren til shieldet, da breadboardet allerede havde Vcc og GND tilsluttet. Derfra bliver der trukket strøm videre til sonar sensoren(Rød ledning) og bliver groundet igennem den sorte ledning.

De 2 sidste udgange er til, at kunne transmittere og modtage værdierne i sensoren, ved at sende et signal til transmit igennem port 7(blå ledning), sendes der en lydbølge ud, efter et kort stykke tid vil receiver delen af sensoren, modtage lydbølgens ekko derefter sendes der et signal til port 6(grøn ledning), hvor bilen ved at lave en beregning, Kan finde ud af afstanden, mellem den og det nærmeste objekt.

Billede 2

 

Software.

I dette afsnit vil der blive gennemgået den software der ligger bagved konstruktionen. Herunder ses er flowchart der forklarer den software der er brugt i grove træk:

Billede 3

 

Øverst oppe i koden, includeres Newping.h som er et bibliotek som skal bruges for at kunne modtage signaler fra sonar sensoren.

Derefter defineres alle de pins som skal bruges, samt der oprettes en boolean variabel (wall) som skal bruges til at fortælle bilen hvornår den skal overgå til at køre på input fra sonar sensoren.

Derefter oprettes der 2 int variabler der skal kunne holde på signalerne fra sensorerne (LS1 og RS1).

 

Derefter oprettes der en funktion, der har til formål at beregne afstanden til det nærmeste objekt, ud fra dataen som arduinoen modtager fra sonar sensoren.

Dette gøres ved at finde den tid det tager sensoren at afsende en lydbølge og modtage et ekko igen.

Lyden bevæger sig med 343.6 m/s, i almindelig atmosfærisk luft ved 20°,

men da der kun skal bruges den halve afstand kan denne tid divideres med 2.

ved at lave en lille beregning kan der findes ud af hvor lang tid det vil tage lyden at bevæge sig 1 cm.

v = s/t = 1/0,00291 = 343.6.

v = hastighed,

s = afstand i meter

t = tiden i sekunder

Dette viser at lyden er 0,00291 sekunder om at bevæge sig 1m, derefter kan dette omregnes til cm pr s, hvilket giver at lyd bevæger sig 1 cm på 29.1 μs

 

Dette kan videre bruges til at finde afstanden ud fra dataen som arduinoen modtager.

Først sættes afstanden til tids dataen som hentes fra ekko porten, derefter bruges de værdier som skal bruges til at omregne til cm.

afstand = (afstand/2)/29.1

Således finder bilen afstanden til det nærmeste objekt.

/*
 * Øverst oppe i koden, includeres Newping.h som er et bibliotek som skal bruges for at 
 * kunne modtage signaler fra sonar sensoren.
 * Derefter defineres alle de pins som skal bruges, samt der oprettes en boolean variabel (wall) 
 * som skal bruges til at fortælle bilen hvornår den skal overgå til at køre på input fra sonar 
 * sensoren.
 */
#include <NewPing.h>
                               
  int motorTurnA = 12;         // Digital pin 12 til styring af motordrejningen1
  int motorSpeedA = 3;         // Analog pin 3 til styring af motorhastigheden1
  int motorTurnB = 13;         // Digital pin 13 til styring af motordrejningen2
  int motorSpeedB = 11;        // Analog pin 11 til styring afmotorhastigheden2
  int Ekko = 7;                // Digital pin 7 til ekko
  int trigger = 6;             // Digital pin 6 til trigger
  int LS = 2;
  int RS = 4;

  bool wall = false;           // boolean variabel til at finde hvornår bilen skal køre efter væggen
  int speedFrem = 65;          // Hastigheden, når hjulet kører frem 
  int speedDrej = 85;          // Hastigheden, når hjulet skal dreje 
  int afstand = 0;             // Variabel til at holde finde og holde afstanden
  int LS1;                     // Variabel til at holde data fra venstre sensor
  int RS1;                     // Variabel til at holde data fra Højre sensor

/*
 * Derefter oprettes der en funktion, der har til formål at beregne afstanden til det nærmeste objekt, 
 * ud fra dataen som arduinoen modtager fra sonar sensoren.
 * Dette gøres ved at finde den tid det tager sensoren at afsende en lydbølge og modtage et ekko igen.
 * 
 */
void FindAfstand(){                                         
 
  //Lyd udsendes (trigger) og lyden optages (ekko) 
  digitalWrite(trigger, LOW);                       // Lyd outputtet stoppes
  delay(2);
  digitalWrite(trigger, HIGH);                      // Lyd outputtet startes 
  delay(10);                                        // Lyd outputtet er tændt i 10 milisekunder 
  digitalWrite(trigger, LOW);                       // Lyd outputtte stoppes
  
  //Afstanden bestemmes 
  afstand = pulseIn(Ekko, HIGH);                    //pulseIn funktionen henter inputtet fra Ekko porten 
  afstand = (afstand/2)/29.1;                       //Inputtet (aftsand) omregnes til centimeter
}

void setup() {
 /*
  * pinmode sættes for de forskellige pins,
  */
  // Opsætning af porte for sensorerne
  pinMode(Ekko,INPUT);
  pinMode(trigger, OUTPUT); 
  pinMode(LS, INPUT);
  pinMode(RS, INPUT);

 // Opsætning af porte for motorer 
  pinMode(motorTurnA, OUTPUT);                              
  pinMode(motorSpeedA, OUTPUT);                             
  pinMode(motorTurnB, OUTPUT);                              
  pinMode(motorSpeedB, OUTPUT);   

  Serial.begin(9600);
}

void loop() {
/*
 * LS1 og RS1 varblerne sættes til værdierne fra venstre og højre sensorer
 */
LS1 = digitalRead(LS);
RS1 = digitalRead(RS);
/*
 * Når sensorerne ser den sorte streg bliver værdien sat til true, hvorefter den så vil aktiverer en af de
 * følgende if statements.
 *  feks. Højre sensor ser den sorte streg vil bilen dreje til højre ved at ændre i PWM til begge motorerne.
 * Derefter vil der være et lille delay hvilket giver bilen tid nok til at bevæge sig før næste tjek igen 
 * vil komme
 */
  if(!RS1 && LS1) // TURN right
  {
    
    Serial.println("right");               
    digitalWrite(motorTurnA, LOW);           
    analogWrite(motorSpeedA, speedDrej);     
    digitalWrite(motorTurnB, HIGH);         
    analogWrite(motorSpeedB, 85);
    delay(50);
  }
  if(RS1 && !LS1) //TURN left
  {
    Serial.println("left");
    digitalWrite(motorTurnA, HIGH);   
    analogWrite(motorSpeedA, 85);
    digitalWrite(motorTurnB, LOW); 
    analogWrite(motorSpeedB, speedDrej);
    delay(50);
  }
  if(!LS1 && !RS1) // FORWARD
  {
    Serial.println("FORWARD");
    digitalWrite(motorTurnA, HIGH);
    analogWrite(motorSpeedA, speedFrem);
    digitalWrite(motorTurnB, HIGH); 
    analogWrite(motorSpeedB, speedFrem);
  }

/*DEL 2 Kører efter muren
 * Når bilen når til enden af den sorte linje, vil bilen se sort på begge sensorer.
 * Hvilket vil sætte begge værdier til true, og aktiverer denne if statement.
 * Hvorefter bilen vil stoppe helt op, og efter en kort pause vil fortsætte frem i 0,9 sekunder
 * Derefter vil bilen dreje mod venstre i 0,85 sekunder og wall variablen bliver sat til true.
 */
  
  if(LS1 && RS1)// begge sensorer ser sort
  {
  delay(50);
    if(LS1 && RS1){
    
      digitalWrite(motorTurnA, HIGH); //stop
      analogWrite(motorSpeedA, 0);
      digitalWrite(motorTurnB, HIGH);
      analogWrite(motorSpeedB, 0);
      delay(200);
      digitalWrite(motorTurnA, HIGH); //Kører frem
      analogWrite(motorSpeedA, speedFrem);
      digitalWrite(motorTurnB, HIGH);
      analogWrite(motorSpeedB, speedFrem);
      delay(900);
      digitalWrite(motorTurnA, HIGH);     //drej
      analogWrite(motorSpeedA, speedDrej);
      digitalWrite(motorTurnB, LOW);
      analogWrite(motorSpeedB, speedFrem);
      delay(850);
      wall = true;
    }
  }  
/*
 * Når wall variablen bliver sat til true, vil koden gå ind i dette while statement, og forblive inde i det indtil arduinoen genstartes.
 * Her bruges FindAfstand() funktionen til at finde afstanden til væggen.
 * Ud fra denne værdi vil bilen foretage sig en af følgende ting.
 */
    while(wall == true){
      FindAfstand();

      if(afstand > 14 && afstand < 20){                                     // Afstanden til muren er større end 14 og mindre end 20, så robotten drejer til højre (ind mod muren) 
        speedFrem = 65;
        digitalWrite(motorTurnA, LOW);
        analogWrite(motorSpeedA, 5);
        digitalWrite(motorTurnB, HIGH);
        analogWrite(motorSpeedB, speedFrem);
      }
      
      else if(afstand < 10){                                 // Afstanden til muren er mindre end 10, så robotten drejer til venstre (væk fra muren)  
        speedFrem= 65;
        digitalWrite(motorTurnA, HIGH); 
        analogWrite(motorSpeedA, speedFrem);
        digitalWrite(motorTurnB, LOW); 
        analogWrite(motorSpeedB, 5);
      }
      
      else if (afstand > 20){                                // Afstanden er størrer end 20 cm, (forbi væggen)  
        digitalWrite(motorTurnA, LOW); 
        analogWrite(motorSpeedA, 10);
        digitalWrite(motorTurnB, HIGH);
        analogWrite(motorSpeedB, 135);
      }
      else{                                                  // Ellers: aftsanden er mellem 10 og 14 centimeter, robotten kører lige ud 
         
        speedFrem = 50;
        digitalWrite(motorTurnA, HIGH);
        analogWrite(motorSpeedA, speedFrem);
        digitalWrite(motorTurnB, HIGH);
        analogWrite(motorSpeedB, 65);  
      }
      speedFrem = 50;
    }
    
  }

 

Konklusion

Denne porteføljeopgave blev ikke helt som den skulle have været da konstruktionen(Bilen) ikke kunne gennemfører banen. Her er det den sidste del af banen der stod i vejen for succes. Når bilen skulle begynde at bruge sonar sensor  opstod der problemer med bilen. For at gruppen kunne løse den opgave der blev stillet skulle der eventuelt have lavet en del flere test, måske opbygning af designet til bilen da det eventuelt har skabt problemer for bilen.

 

Perspektivering

Konstruktion har nogle fejl omkring software og fysisk design der kunne have perfektioneret. Her kunne gruppen have anvendt gearing til konstruktion for, at skabe en større kontrol over bilen samt, at konstruktionen ville have kunnet kører ved en hurtigere og lavere hastighed. En anden ting der kunne have blevet brugt til konstruktionen er at have anvendt en form for tryk plade i stedet, for at at læse sort på begge sensorer til anden del (Muren) af banen.

Leave a Reply