Stap 11: Maakt het interessant
ft lengtes van visserij lijn en bind elk op door het gat in het midden van de
katrollen. Tie van de andere uiteinden van de lijn aan een voorjaar-klem en klem op een
marker. Monteer het Witboek op uw canvas bord met tape of klemmen.
Laten we zeggen de stappenmotoren tekenen in willekeurige richtingen standaard en vervolgens
om zich te gedragen als ze deden vóór wanneer iemand een fotocel bedekt. Dit zal
Maak een tekening zoals die SADbot in de Eyebeam venster galerij gemaakt. Geniet van! Spelen met de fotocellen, zodat u kunt met SADbot communiceren en interessante tekeningen maken.
/*
SADbot v.03
SADbot zal het trekken van een willekeurige afstand in willekeurige richting tot een
fotocel wordt geblokkeerd. Wanneer SADbot een fotocel is geblokkeerd detecteert, het
naar toe zal trekken. Stappenmotoren zijn gedreven door van Sparkfun
EasyDriver v4.3
CC-GNU GPL door Ben Leduc-molens en Dustyn Roberts
Gemaakt: 2010.06
*/
#include //import stepper bibliotheek
#define stappen 200 / / 360/1.8 (stap hoek) = 200 stappen/revolutie
nieuwe stepper objecten uit stepper-bibliotheek (één per motor) declareren
Stepper right_motor (stappen 6, 7); 6 = DIR, 7 = STAP
Stepper left_motor (stappen, 11, 12); 11 = DIR, 12 = STAP
int afstand; Hoe ver de motoren moeten gaan
int laagste; laagste fotocel waarde op te slaan
int i; voor de looping
variabelen voor 4 fotocellen
int photo_up;
int photo_down;
int photo_left;
int photo_right;
Canvasgrootte instellen 1000 stappen is ongeveer.4 inch
#define CANVASWIDTH 32000
#define CANVASHEIGHT 20000
totale afstand voor grenzen controleren
SADbot begint bij center (canvaswidth/2 en canvasheight/2)
zweven totalWidth = CANVASWIDTH /2;
zweven totalHeight = CANVASHEIGHT /2;
int randomDirection;
int randomDistance;
VOID Setup {}
Serial.begin(9600); seriële afdruk te beginnen zodat we kunnen dingen zien
instellenin motor snelheid (RPM)
right_motor.setSpeed(200);
left_motor.setSpeed(200);
willekeurige zaad gebruiken om beter willekeurige getallen
* ingesteld op een analoge pin die u niet gebruikt
randomSeed(analogRead(4));
} / / einde van setup
void loop {}
lezen en afdrukken van alle sensor-waardes van analoge pins 0-3
photo_up = analogRead(0);
Serial.Print("up");
Serial.println(photo_up);
photo_down = analogRead(1);
Serial.Print("down");
Serial.println(photo_down);
photo_left = analogRead(2);
Serial.Print("left");
Serial.println(photo_left);
photo_right = analogRead(3);
Serial.Print("right");
Serial.println(photo_right);
delay(1000); Geef me tijd om ze te lezen in de monitor
Controleer vóór de tekening, onze totalHeight en totalWidth
Serial.Print("totalHeight:");
Serial.println(totalHeight);
Serial.Print("totaWidth:");
Serial.println(totalWidth);
delay(1000); Geef me tijd om ze te lezen in de monitor
fotocel waarden opslaan in een array
int photoValues [] = {photo_up, photo_down, photo_left, photo_right};
laagste = 9999; Dit hoger ingesteld dan mogelijk fotocel waarden
lus te vinden van de laagste waarde van de fotocel
voor (ik = 0; ik < 4; i ++) //4 = aantal sensoren
{
Serial.println(photoValues[i]); Print photoValue matrix
werkelijke fotocel waarde aan "laagste" variabele toewijzen als het lager
dan wat "laagste" is ingesteld op (begint bij 9999)
Als (laagste > = photoValues [i]) {}
laagste = photoValues [i];
}
uitprinten om te bevestigen dat de laagste waarde wordt geselecteerd
Serial.Print("lowest:");
Serial.println(lowest);
delay(1000); Wacht één seconde voordat het zodat kunnen wij het lezen van de waarden in een lus
} //end voor
afstand = laagste; instellen van de reisafstand = laagste waarde
als laagste waarde geeft aan een overdekt fotocel, trekken naar laagste
deze drempel afhankelijk van verlichting wijzigen
Als (laagste < 550)
{
vinden van de sensor die overeenkomt met de laagste, gaan die richting,
maar alleen als SADbot binnen de grenzen van het canvas
Als ((laagste == photoValues[0]) & & ((totalHeight + distance) <
CANVASHEIGHT))
{
omhoog (afstand);
totalHeight += afstand; Increment totalHeight variabele
}
anders als ((laagste == photoValues[1]) & & ((totalHeight-distance) > 0))
{
neer (afstand);
totalHeight-= afstand; decrement totalHeight variabele
}
anders als ((laagste == photoValues[2]) & & ((totalWidth-distance) > 0))
{
links (afstand);
totalWidth-= afstand; decrement totalWidth variabele
}
anders als ((laagste == photoValues[3]) & & ((totalWidth + distance) <
CANVASWIDTH))
{
recht (afstand);
totalWidth += afstand; Increment totalWidth variabele
}
} //end als
anders, niemand is die betrekking hebben op alle sensoren, draw volgens willekeurige
anders
{
willekeurig getal 1 t/m 9 toewijzen aan richting kiezen
randomDirection = willekeurige (1, 9);
Serial.Print ("willekeurige richting:");
Serial.println(randomDirection);
Kies willekeurig getal 1 t/m 200 toewijzen aan afstand
randomDistance = willekeurige (1, 200);
Serial.Print ("willekeurige afstand:");
Serial.println(randomDistance);
aanwijzingen voor een randomDirection-waarde die wordt gegenereerd
schakelaar (randomDirection)
{
geval 1: //go omhoog
Als ((totalHeight + randomDistance) < CANVASHEIGHT)
{
up(randomDistance);
totalHeight += randomDistance;
}
breken;
geval 2: //go naar beneden
Als ((totalHeight-randomDistance) > 0)
{
Down(randomDistance);
totalHeight-= randomDistance;
}
breken;
Case 3: //go links
Als ((totalWidth-randomDistance) > 0)
{
Left(randomDistance);
totalWidth-= randomDistance;
}
breken;
geval 4: //go recht
Als ((totalWidth + randomDistance) < CANVASWIDTH)
{
Right(randomDistance);
totalWidth += randomDistance;
}
breken;
geval 5: //go rechtop
Als (((totalWidth + randomDistance) < CANVASWIDTH) & & ((totalHeight
+ randomDistance) < CANVASHEIGHT))
{
upRight(randomDistance);
totalWidth += randomDistance;
totalHeight += randomDistance;
}
breken;
kast 6: //go upLeft
Als (((totalWidth-randomDistance) > 0) & & ((totalHeight +
randomDistance) < CANVASHEIGHT))
{
upLeft(randomDistance);
totalWidth-= randomDistance;
totalHeight += randomDistance;
}
breken;
geval 7: //go regelrechte
Als (((totalWidth + randomDistance) < CANVASWIDTH) & & ((totalHeight-randomDistance) > 0))
{
downRight(randomDistance);
totalWidth += randomDistance;
totalHeight-= randomDistance;
}
breken;
geval 8: //go downLeft
Als (((totalWidth-randomDistance) > 0) & & ((totalHeight-randomDistance) > 0))
{
downLeft(randomDistance);
totalWidth-= randomDistance;
totalHeight-= randomDistance;
}
breken;
standaard: //just in geval
Left(0);
} //end schakelaar
} //end anders
} //end loop
/*
Hier zijn de directionele functies. Lus van grootte = afstand.
Positieve Stapnummers zijn met de klok mee, tegen de klok in negatieve
*/
ongeldig omhoog (int afstand)
{
voor (ik = 0; ik < afstand; i ++) {}
right_motor.Step(1);
left_motor.Step(-1);
}
}
VOID neer (int afstand)
{
voor (ik = 0; ik < afstand; i ++) {}
right_motor.Step(-1);
left_motor.Step(1);
}
}
VOID links (int afstand)
{
voor (ik = 0; ik < afstand; i ++) {}
right_motor.Step(-1);
left_motor.Step(-1);
}
}
void (int afstand) recht
{
voor (ik = 0; ik < afstand; i ++) {}
right_motor.Step(1);
left_motor.Step(1);
}
}
VOID rechtop (int afstand)
{
voor (ik = 0; ik < afstand; i ++) {}
right_motor.Step(2);
left_motor.Step(-.2);
}
}
VOID upLeft(int distance)
{
voor (ik = 0; ik < afstand; i ++) {}
right_motor.Step(.2);
left_motor.Step(-2);
}
}
VOID regelrechte (int afstand)
{
voor (ik = 0; ik < afstand; i ++) {}
right_motor.Step(-.2);
left_motor.Step(2);
}
}
VOID downLeft(int distance)
{
voor (ik = 0; ik < afstand; i ++) {}
right_motor.Step(-2);
left_motor.Step(.2);
}
}