Opgave

De fem robotter fra portefølje opgave 2 skal samarbejde om at gennemføre en større bane med forskellige forhindringer og fragte et objekt fra A til B. De har hver fået en opgave at udføre og robotterne er derfor afhængige af hinanden. Denne robot (nr. 1) har til opgave at sætte løbet i gang. Den skal finde en lyskilde, som er placeret ved robot 2. Den finder lyskilden ved hjælp af to lys-sensorer og sætter robot 2 i gang.

Fysisk design

Robotten er den samme som fra tidligere blogindlæg, men der er dog foretaget et par småjusteringer, så den er tilpasset til den nye opgave, som den skal udføre

20130514_121109

Robotten benytter sig nu ikke af LEGO-farvesensoren mere, men i stedet af to lyssensorer, der er monteret forrest på robotten og peger skævt ud til hver side (se billede). Flexsensoren benyttes stadig. Den bruges her til at detektere robot 2. Robotten har foran på flex-sensoren monteret en plastic plade, som bliver holdt på plads at 2 LEGO klodser.

Hardware

Denne gang var der ikke de store problemer i at få sat hardwaren op, da både flexsensor og lyssensorer var blevet brugt i tidligere opgaver. Her ses en diagramtegning:

diagram_light seeker

Der lå dog et mindre problem i det stød, robotten skulle give robot 2 for at sætte denne i gang. For at stødet ikke skal være for hårdt og for at robotten kan registrere, når den rammer robot 2 (så den kan stoppe), har den monteret en flexsensor, som stikker forud. Robot 2 bliver sat i gang, når en hjemmelavet knap bliver aktiveret. Derfor skal robot 1 ramme meget præcist, for sætte robot 2 i gang, da flexsensoren ikke er ret bred/stor. Derfor blev der til slut monteret en plasticplade på flexsensoren, så den har en større overflade at ramme robot 2 med. Både flexsensoren og de to LDR’er er forbundet til pull-up modstande,disse modstande er sat ind for at få det analoge signal i et område hvor arduinoen kan læse værdien.

Software

Robotten navigerer mod lyset vha. de to lys-sensorer. Værdien for hver sensor aflæses og den absolutte værdi af forskellen mellem disse beregnes. Er denne værdi mindre end 75 tolkes det som om robotten vender (næsten) direkte mod lyskilden og den kører derfor lige ud.

int LDRReadingRight = analogRead(LDR_Right);
int LDRReadingLeft = analogRead(LDR_Left);

SensorForskel = abs(LDRReadingRight - LDRReadingLeft); //finder den absolutte værdi af forskellen på de to sensorer

if(SensorForskel <= 75 && RunBool==true){ // hvis forskellem mellem sensorene er mindre eller lig med 75 og RunBool er sand kørerer robotten lige ud
        digitalWrite(dirA, LOW);
        digitalWrite(dirB, LOW);
        analogWrite (speedA, 150);
        analogWrite (speedB, 150);
  delay(50); 
  }

Er værdien højere end de 75 kører robotten på det hjul, hvor den laveste værdi er mål (mindst lys) og dermed retter den sig op i forhold til lyskilden.

else if(LDRReadingRight < LDRReadingLeft && RunBool==true){ //ellers drejer den i den retning, hvor lyset er størst
        digitalWrite(dirA, LOW);
        digitalWrite(dirB, HIGH);
        analogWrite (speedA, 150);
        analogWrite (speedB, 0);
 delay(50); 
}

Dette billede illustrerer adfærden:

illustration_med_pile

For at robotten kører ligeud eller drejer skal RunBool være ’true’. Denne boolean bruges til at tjekke om robotten har fundet robot 2. Den sættes nemlig til ’false’, når den aflæser en værdi fra flex-sensoren er under eller lig med 400.

if (Serial.available() > 0) {            
    incomingByte = Serial.read();
    RunBool =true;              // aktiverer robotten
    Serial.println("action");
}
if(FlexValue<= 400){
    RunBool = false;
}

Dette udløser også at robotten stopper.

else if(RunBool==false){ // hvis RunBool er falsk stopper robotten. RunBool er falsk hvis flexsensoren er blevet aktiveret
    digitalWrite(dirA, HIGH);
    digitalWrite(dirB, HIGH);
    analogWrite (speedA, 0);
    analogWrite (speedB, 0);

    Serial.println("Go robot2... GO!!!");
}

Testkørsel af det samlede system

Robotten havde efter den nye plade var blevet sat på lidt problemer med at komme i gang. Dette skyldes at pladen var monteret på flexsensoren, som dermed blev bøjet og robotten ”troede” derfor at den havde mødt robot 2 og stoppede derfor (inden den overhovedet var begyndt at køre). Dette kunne nemt være fixet ved at sætte værdien for hvornår robotten skulle stoppe op. Udover startproblemer kørte robotten rigtigt godt og fik sat robot 2 i gang uden problemer.

Video af testkørsel kan ses her.

Perspektivering 

Systemet som helhed

Det er selvfølgelig problematisk at de 5 robotter er så afhængige af hinanden. Kører en robot ikke som den skal, bryder hele systemet ned. Fx. venter robot 2 på at få et skub fra robot 1. Får den ikke dette skub bliver robot 2, som det fungerer nu, aldrig sat i gang, hvilket så igen medfører at de efterfølgende robotter ikke kan udføre deres opgave. Dette kunne undgås ved at robotterne kunne kommunikere sammen, bedre registrere hinanden og reportere fejl, og så eventuelt overtage hinandens opgaver, hvis der skulle ske fejl. .

Denne robot

Robotten er specielt designet til at kunne løse denne specifikke opgave, men da den ikke kører efter en fast bane og bare kører mod en lyskilde (og stopper når den møder en forhindring) vil den også kunne bruges i andre sammenhænge.

Der hvor robotten halter mest er, når den skal opdage robot 2 og sætte denne i gang – primært kommunikationen med robot to, da flexsensoren fint registrerer robot 2, den er bare ikke præcis nok (uden plastic plade) til at den kan bruges til at aktivere en knap på den. En løsning på dette kunne eventuelt være at robotterne kommunikerede sammen via bluetooth.

Konklusion

Robotten løser opgaven ifølge opgavebeskrivelen: den er i stand til at finde en lyskilde og køre mod denne ved hjælp af 2 lyssensorer og sætte robot 2 i gang.

Referencer

1.) http://www.instructables.com/id/First-Arduino-Robot-Light-Seeker/step6/Finally-Motor-Control/

2.)Portefølje 2: http://op.tek.sdu.dk//?p=104

3.) Videoer af robotterne på youtube:

 

One thought on “Portefølje 3 – robot 1

Leave a Reply