Opgaven 

Opgaven går ud på at konstruere et Arduino board, der kan styre to LEGO motorere via et Motor-shield samt en LEGO robot, dette kan sidde på. Robotten skal kunne følge en sort streg på et hvidt underlag og undervejs undgå en forhindring på 10×10 cm og finde tilbage på stregen igen. Den skal kunne gennemføre banen på under 1 minut.

Desuden skal robotten kunne kommunikere trådløst via bluetooth med computer eller smartphone, og der skal laves et interface på PC eller computer, der kan starte og stoppe robotten.

bane

 

Fysisk design

Motorer og gearing 

Robotten har to store hjul, som er placeret ca. på midten af robotten. De er placeret her, da det er her det meste at vægten ligger (batterierne og motorerne, som er ret tunge). For at robotten ikke vælter bagud har den her en lille ”dut”. Jeg havde til start valgt at sætte et hjul der, men når robotten drejede, fulgte det ikke med og faldt ofte af.

Motorerne er placeret cirka midt på robotten og har gearing – fra lille tandhjul til stort. Til start havde jeg ikke lavet gearing, og robotten havde derfor svært ved at komme i gang og var langsom til at skifte retning og da banen jo iflg. opgaveformuleringen skal gennemføres på under 1 minut, var det vigtigt at robotten blev hurtigere til at starte op.

20130414_133208

 

Sensorer

Robotten benytter sig af to sensorer – en LEGO lyssensor og en flexsensor.

Lyssensoren bruges til, at få robotten til at følge den sorte linje. Den var først placeret et godt stykke inden under robotten, hvilket viste sig at være en dårlig idé, da robotten skyggede for sensoren, og den så gav værdier for sortfarve, selvom den burde registrere hvid. Den er derfor flyttet længere frem og sidder helt forrest.

Flexsensoren er også placeret forrest på robotten. Den bruges til at registrere forhindringen. Når robotten kommer for tæt på en forhindring bøjer sensoren og sensorværdien ændres derfor og robotten kan så reagere på dette.

Sensorværdierne/intervallerne har ændret sig en del efter lysforholdene, og det har derfor været nødvendigt at rette i koden løbende. Dette kunne evt. forbedres ved at bygge sensoren inde i en kasse, så den ikke blev påvirket af lys ude fra, og bruge sensorens indbyggede lys eller lave en funktion, der til start selv tjekkede værdierne for henholdsvis hvid og sort og så handlede efter disse.

Hardware

Diagramtegning

Diagram

 

billede med beskrivelser

Problemer

Der lå et stort arbejde i at få LEGO lyssensoren til at virke. Mange at de beskrivelser og toturials, vi fandt på nettet, var ikke korrekte og der var mange småfejl i diagramtegningerne. Derfor gik der lang tid med at prøve sig frem, og da sensoren endelig var sat rigtig til, gav den ikke sensorværdier, der kunne bruges til noget. Dette blev heldigvis nemt fixet ved at sætte pinMode for sensoren til ’INPUT’ og  ’HIGH’.

pinMode(reader, INPUT);

digitalWrite(reader,HIGH);

Desuden var det ikke til at få min computer til at kommunikere med bluetooth til robotten. Jeg valgte derfor at bruge min mobiltelefon i stedet. Jeg fik sat et program om, der hvis en variabel blev ændret fra ’s’ til ’k’, fik sat robotten i gang og hvis omvendt stoppede den. Denne værdi modtog den fra mobilen af – så jeg kunne tænde og slukke robotten fra mobilen via bluetooth, men pludselig fungerede dette ikke længere og jeg har ikke kunnet finde ud af hvorfor.

Software

At følge en sort streg

Til start forsøgte jeg at få robotten til at køre PÅ den sorte linje. Hvis sensoren fangede linjen kørte robotten lige ud (i hvert fald i teorien). Når robotten så kom udenfor linjen kørte den en søgefunktion, hvor den skiftevis kørte til højre og til venstre og øgede tiden, således at den hele tiden søgte bredere indtil den igen var tilbage på den sorte linje. Dette fungerede ikke særlig godt. Motorene kørte ikke ens og robotten brugte lang tid på at søge og finde stegen igen, når det kom udenfor. Jeg ændrede derfor taktik.

Robotten følger nu den sorte streg ved at forsøge at holde sig på grænsen mellem det sorte og hvide.

Hvis robotten starter på venstre side af den sorte streg kører den venstre motor til sensorværdien fra LEGO farvesensoren er over 250 (+/- afhængig af lysforholdene), hvilket svarer til sort farve. Derefter kører den højre motor til sensorværdien er under 250, som svarer til hvid.

Billedet her illustrerer det:

robot

 

I koden ser det således ud:

    if(reading<250){ 
        digitalWrite(dirA, LOW);
        digitalWrite(dirB, HIGH);
        analogWrite (speedA, 150);
        analogWrite (speedB, 0);
     }
    if(reading>250){
        digitalWrite(dirA, HIGH);
        digitalWrite(dirB, LOW);
        analogWrite (speedA, 0);
        analogWrite (speedB, 150);
    }

Her på video

 

Undgå forhindring

Flexsensoren bruges, som sagt, til at opdage forhindringer. Når sensoren bøjes bliver sensorværdien under 400. Når dette sker stopper robotten med sin almindelige adfærd (følge den sorte streg), og kører en bane udenom forhindringen, indtil den igen finder den sorte streg. Dette er hard coded, hvilket ikke er optimalt og fungerer rigtig skidt. Robotten kører ikke ens hver gang, da der er en masse faktorer, der spiller ind bl.a. forhindringens placering og vinkel, hvor i programmet robotten er (om venstre eller højre motor kører), standen af motorerne og strømmen på batterierne. Hvis man i stedet havde anvendt en step-motor havde det taget en del af usikkerhederne væk, da man så kunne arbejde med vinkler og mere præcise distancer. Man kunne også have lavet en adfærd, hvor robotten løbende tjekkede, om den var forbi forhindringen.

Koden, der får robotten til at køre uden om forhindringen, ser sådan ud:

      digitalWrite(dirA, HIGH); 
        digitalWrite(dirB, LOW);
        analogWrite (speedA, 0);
        analogWrite (speedB, 0);
        delay(500);
        Serial.println("stop");

        digitalWrite(dirA, HIGH); 
        digitalWrite(dirB, LOW);
        analogWrite (speedA, 20);
        analogWrite (speedB, 50);
        delay(1000);
        Serial.println("drej h");

        digitalWrite(dirA, HIGH); 
        digitalWrite(dirB, LOW);
        analogWrite (speedA, 0);
        analogWrite (speedB, 0);
        delay(500);
        Serial.println("stop");

        digitalWrite(dirA, LOW); 
        digitalWrite(dirB, LOW);
        analogWrite (speedA, 70);
        analogWrite (speedB, 50);
        delay(1000);
        Serial.println("ligeud");

        digitalWrite(dirA, HIGH); 
        digitalWrite(dirB, LOW);
        analogWrite (speedA, 0);
        analogWrite (speedB, 0);
        delay(500);
        Serial.println("stop");

        digitalWrite(dirA, LOW); 
        digitalWrite(dirB, HIGH);
        analogWrite (speedA, 20);
        analogWrite (speedB, 50);
        delay(1000);

        digitalWrite(dirA, HIGH); 
        digitalWrite(dirB, LOW);
        analogWrite (speedA, 0);
        analogWrite (speedB, 0);
        delay(500);
        Serial.println("stop");

        digitalWrite(dirA, LOW); 
        digitalWrite(dirB, LOW);
        analogWrite (speedA, 70);
        analogWrite (speedB, 50);
        delay(1000);
        Serial.println("ligeud");

        digitalWrite(dirA, HIGH); 
        digitalWrite(dirB, LOW);
        analogWrite (speedA, 0);
        analogWrite (speedB, 0);
        delay(500);
        Serial.println("stop");

        digitalWrite(dirA, LOW); 
        digitalWrite(dirB, HIGH);
        analogWrite (speedA, 20);
        analogWrite (speedB, 50);

Her på video

 

Konklusion

Robotten løser næsten opgaveformuleringen. Det har været en rigtig stor opgave, når man aldrig har arbejdet med noget lignende før, men jeg har lært en masse. Robotten vil stadig ikke modtage data, således at den kan startes og stoppes fra mobilen, og turen rundt og forhindringen fungerer langt fra hver gang, men den følger stregen rigtig godt og kan uden forhindring køre banen på under 15 sekunder. Den registrer også forhindringen godt – det er bare komme udenom den, den ikke er så god til.

 

Leave a Reply