af Albert Kalnæs

 

Opgaven

Denne robot havde til opgave at transportere bolden fra gulvet til bordkanten og videre til robot 5’s “lad”. Det krævede derfor en platform til at modtage bolden i og til at hejse bolden op i og slutteligt en mekanisme der gav bolden videre til robot 5. Valg af sensorer og motorer stod frit.

 

Fysisk Design

IMG_20130521_120802 IMG_20130521_120808

Designet består af en kran fastgjort på bordkanten og bygget efter at opnå en rigid struktur der står fast. Legoen kan kun tilbyde en hvis styrke i konstruktionen så lidt tape må også anvendes især for at undgå at skulle bruge modvægte der fylder. Tapen er nødvendig da konstruktionens tyngdepunkt er ude over bordkanten hvor de to motorer hænger så noget skal holde konstruktionen fast på bordet så den ikke vipper udover. Kranen er bygget af to legomotorer og to spoler snoren til platformen rulles omkring.

Udover krankonstruktionen benyttes der en lille rampe til at modtage bolden og føre bolden videre til robot 5.

Sidst er der platformen bolden sidder i på vej op til bordet. En simpel lille platform med skrå kant i den ene side for at bolden lettere skulle kunne trille ud.

 

Hardware

Motorer: Jeg benytter to lego motorer. Gearet vha. det mindste lego-tandhjul som går over på et stort tandhjul. Til at styre hastigheden benytter jeg mig af pwm-styring.

LV-MaxSonar-EZ1: Bruges til at måle afstand, enten vha. pw eller analog indgangene i sensoren. I mit tilfælde bruger jeg pw da det angiveligt skulle være mere præcist iflg http://playground.arduino.cc/Main/MaxSonar. LV-MaxSonar-EZ1 egner sig specielt godt da den har en relativt tynd stråle den sender lyden ud i. Med en tynd stråle rammes kun de tiltænkte objekter fremfor alle de andre objekter der måtte være i nærheden. Målingerne kan variere en del og man bør lave en datafiltrering i sit program hvis man har brug for meget præcise målinger. Til mit formål fandt jeg det ikke nødvændigt at bruge mere datafiltrering end der allerede sker i forvejen inde i sonar-modulet ,eftersom flere tests viste sonaren virkede som den skulle.

Sonaren er let at tilslutte arduino da den kun kræver en ledning til strømforsyningpå 2.5V eller 5V, en ledning til ground og en ledning til analog eller pw for at kunne måle afstande.

PW står for pulse width og er hyppigt anvendt inden for afstandsmåling. Sonaren udsender lydbølger i en forholdsvis smal stråle og regner afstanden ud fra de tilbagevendende bølgers bølgelængde (pulse width).

Afstandsmåleren bruges til at opfatte hvornår platformen er ud for rampen og derfor skal begynde aflæsningen.

Link til LV-MaxSonar-EZ1 datasheet: http://www.maxbotix.com/documents/MB1040_Datasheet.pdf

 

Kode

Koden til at aflæse data fra sonar er fra http://playground.arduino.cc/Main/MaxSonar og skrevet af Bruce Allen. De eneste modificeringer jeg har foretaget er kun at udskrive cm. Jeg genbruger mine funktioner til motorstyring fra min pf2 http://op.tek.sdu.dk//?p=171.

Mit loop sætter motorerne igang med det samme. Egentlig var det tænkt at motorerne skulle sættes igang af en trigger der blev udløst når robot 3 havde afleveret bolden til platformen. Triggeren kunne enten være i form af en knap, flexsensor eller noget helt andet. Det ville ikke have gjort den store forskel i koden. Istedet starter motorerne bare så snart der er strøm. Motorerne kører på 150pwm hvilket giver en stabil og ikke for langsom opstigning.

Så snart platformen når inden for sonarens rækkevidde, under 100cm, stopper motoren der løfter i platformens forende, mens motoren der løfter bagenden forsætter og således tilter platformen og dropper bolden.

const int pwPin = 7; 
//Variable der holder data fra sonar
long pulse, inches, cm;

void setup() {

//Setup Channel A
pinMode(12, OUTPUT); //Initiates Motor Channel A pin
pinMode(9, OUTPUT); //Initiates Brake Channel A pin

//Setup Channel B
pinMode(13, OUTPUT); //Initiates Motor Channel A pin
pinMode(8, OUTPUT); //Initiates Brake Channel A pin
//This opens up a serial connection to shoot the results back to the PC console 
Serial.begin(9600); 
}

void loop() {
pinMode(pwPin, INPUT); 
//Used to read in the pulse that is being sent by the MaxSonar device.
//Pulse Width representation with a scale factor of 147 uS per Inch.
pulse = pulseIn(pwPin, HIGH);
//147uS per inch
inches = pulse/147;
//change inches to centimetres
cm = inches * 2.54; 
Serial.print(cm); 
Serial.print("cm"); 
Serial.println();

//Kør hvis der ikke er noget indenfor en meter
if(cm>100){
driveMotorA(150, true);
driveMotorB(150,true);
}
//hvis der er noget inden for en meter, tilt platformen
else{
brakeMotorB();
driveMotorA(150,true);
}
delay(100); 
}

//funktioner

void driveMotorA(int speed, boolean forward) {
if (forward==true) {
digitalWrite(12,HIGH);
} 
else {
digitalWrite(12,LOW);
}
digitalWrite(9,LOW);
analogWrite(3,speed);
}

void driveMotorB(int speed, boolean forward) {
if (forward==true) {
digitalWrite(13,LOW);
} 
else {
digitalWrite(13,HIGH);
}
digitalWrite(8,LOW);
analogWrite(11,speed);
}

void brakeMotorA(){
digitalWrite(9,HIGH);
}
void brakeMotorB(){
digitalWrite(8,HIGH);
}

 

Konklusion

Det er svært at bygge en konstruktion der er fast nok til formålet med den lego der var til rådighed. Hvis kranens forende begyndte at hænge lidt røg snoren der hejste platformen udover spolen og gav ujævn opstigning af platformen. Stabilisering af konstruktionen er derfor altafgørende. Sonaren virkede efter hensigt og opfattede platformen som den skulle. Tilt-bevægelsen virkede også og bolden røg da ned fra platformen, men landede aldrig på rampen. Der mangler noget til at få bolden de sidste centimeter fra platformen og ind til rampen.

Leave a Reply