Opgavebeskrivelse

Opgaven går kort sagt ud på at bygge og programmere en robot der kan følge en sort linie og undvige en forhindring på 10x10cm placeret midt på linien for derefter at forsætte ud ad linien. Kravene til robottens er at den skal gøre brug af arduino med motor-shield og to uddelte lego motorer, valget af sensorer er frit.

Robotten skal yderligere kunne kommunikere til en computer eller smartphone vha. bluetooth.

 

Design af køretøj

Ideen bag mit design er at køretøjet skal være let, ikke for stort og det skal være let at udskifte hardware, flytte ledninger etc. Køretøjet Er bygget op omkring et solidt understel hvor motorerne sidder godt fast. Understellet er lidt bredt for at gøre plads til store plader ovenpå der kan bære breadboard, arduino og batterier. Det brede understel gør det muligt at dreje skarpt om køretøjets egen akse, men gør det også sværere at køre ligeud.

IMG_20130415_154243

 

Teknisk løsning

 

Motorer:

De to DC 9V motorer der benyttes, styres ved hjælp af de 3 følgende parametre:

  • PWM: Dette afgør hvor mange kræfter motoren skal bruge. Motoren drives af digitale signaler og kan derfor kun køre på fuld styrke eller ingen styrke. Med PWM-teknikken styres det hvor mange gange der tændes og slukkes for motoren i sekundet, så man på den måde kan simulere et analogt input til motoren.
  • Direction: skal hjulene køre forlæns eller baglæns
  • Brake: styrer om bremserne er slået til eller fra

Arduino motor-shieldet skal blot sættes oven på arduinoen og kræver ingen konfiguration udover den der ses i programmet senere. Jeg har valgt bare at tilslutte motorerne direkte på motor-shieldet i a og b.
Sensorer:

Jeg gør brug af en lego nxt lyssensor for at kunne følge den sorte linie. Det er nødvændigt med en pull-up ressistor for at kunne aflæse værdierne fra denne og af den årsag har jeg i mit program tilføjet en indbygget pull-up ressistor.

Til at fornemme forhindringen på banen bruger jeg en knap der, i det optimale scenarie, trykkes ind når robotten støder ind i forhindringen. Knappen er tilsluttet i analog indgang 5, der i programmet er sat til pinmode: input.

Bluetooth:

Til bluetooth bruger jeg det udleverede bluesmirf modul fra sparkfun. Modulet tilsluttes ved at forbinde rx og tx med arduinoens tx og rx. En god huskeregel er at t står for transmit og r står for receive. En transmitter skal derfor forbindes med en receiver og vice versa. Et almindeligt problem opstår når usb-stikket sættes i samtidigt med at bluetooth modulet er tilsluttet da de benytter samme serial forbindelse til arduinoen. Til at løse dette problem anvender jeg arduino-bibleoteket SoftwareSerial der kan angive arduinoens digitale pins som tx og rx.

Strømforsyning:

Der bruges 4×4 AA batterier sat i serieforbindelse hvilket burde kunne forsyne 9V motorerne med tilstrækkelig strøm til denne opgave.

 

IMG_20130415_154251

 

Kode og plan

 

Planen er at bruge den sorte linie som en slags usynlig mur man hele tiden kører ind i for at vide man følger den. Jeg starter derfor på venstre side af linien og kører mod højre ind i den. Når sensoreren fatter at jeg rammer linien styres der mod venstre indtil underlaget bliver lyst igen. Således vibrerer køretøjet sig fremad. Når robotten så rammer forhindringen aktiveres en algoritme der styrer uden om forhindringen hvorefter det gamle loop genoptages ved kontakt med den sorte linie.

Motorstyringen sker ved hjælp af 2 simple funktioner pr. motor, en til at bremse og en til at køre.

void driveMotorB(int speed, boolean forward) {

if(forward==true) {

digitalWrite(12,HIGH);

}

else{

digitalWrite(12,LOW);

}

I denne funktion angiver man farten og retningen på motoren vha. digitalWrite(pin,high/low) HIGH betyder i dette tilfælde fremad og low baglæns. På venstre motor havde jeg byttet om på + og – ledningerne så den kører i den omvendte retning.

Bremsefunktionen ser således ud:

void brakeMotorB(){

digitalWrite(8,HIGH);

}

Igen bruges digitalWrite, HIGH betyder bremserne er tilsluttede og LOW betyder de er koblet fra.

 

I mit loop anvender jeg så disse funktioner til at navigere ud fra lyssensorens input.

 

const int bump = A5;
const int inpin = A3;
int val = analogRead(inpin);
int bumpVal = analogRead(bump);
Serial.println(val);
Serial.println(bumpVal);
delay(5);

if (val > 270) {
//brakeMotorA();
//brakeMotorB();
driveMotorB(150,true);
driveMotorA(50,false);
delay(5);
}
else{
driveMotorB(50,false);
driveMotorA(150,true);
delay(5);
}
if( bumpVal <600 ) {
driveMotorB(120,true);
driveMotorA(120,true);
delay(1000);
}
}

Hvor val er lyssensorens variabel og bumpVal er den påmonterede knaps variabel.

 

Konklusion

Længden mellem de to hjul gør at køretøjet drejer meget skarpt. Problemet kan løses ved at tweake algoritmen for motorstyringen, men fungerer udemærket. Det går langsomt, men sikkert. Forhindringen blev aldrig klaret da jeg aldrig fandt frem til en algoritme der kunne manøvrere udenom. I bund og grund har robotten med sine motorer og sensorer potentialet til at klare opgaven til perfektion, men af tidsmæssige årsager blev det mål aldrig indfriet. Robotten gjorde sit bedste, men skaberen skuffede.

 

 

 

 

 

 

2 thoughts on ““Albot” arduino robot af Albert Kalnæs

Leave a Reply