Hur till spår din Robot med OpenCV (5 / 28 steg)
Steg 5: Dot Muncher: översikt
Så gjorde jag min robot, Dot mumsa, använda en Arduino Uno, Motor sköldoch en Bluetooth 4.0 modul. Chassit var tillverkad i HDPE, en skärbräda som jag stal från min fru. Motorer och däck var från eBay.
Nu, om någon robot arbete, som jag har sagt, så Google bort och välj en robot bygger du gillar.
Naturligtvis finns allt du hade varje vill veta på
Jag säger bara ".
Men koden, som är den del vi vill fokusera på. Verkligen, vår robot har endast en nerver och muskler, hjärnan faktiskt kommer i datorn, alla roboten gör är
- Beräknar den kompass informationen.
- Skickar den kompass informationen till PC.
- Läser de rörelse koderna från datorn.
- Översätter rörelse koden fick in en motor aktivering.
Det var allt. Ganska enkelt.
1 |
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
< span style = "color: rgb(136,136,136);" > //I've varit med Zombie_3_6_RC i bearbetningen för att interagera. < / span >
< span style = "color: rgb(136,136,136);" > / / referera I2C biblioteket < / span >
< span style = "color: rgb(85,119,153);" > #include < / span >< span style = "color: rgb(85,119,153);" >< Wire.h >< / span >
< span style = "color: rgb(136,136,136);" > / / referens HMC5883L kompass biblioteket < / span >
< span style = "color: rgb(85,119,153);" > #include < / span >< span style = "color: rgb(85,119,153);" >< HMC5883L.h >< / span >
< span style = "color: rgb(136,136,136);" > / / store vår kompass som en variabel. < / span >
HMC5883L kompass;
< span style = "color: rgb(136,136,136);" > / / spela in eventuella fel som kan uppstå i kompassen. < / span >
< span style = "color: rgb (51,51,153), font-weight: bold;" > int < / span > fel < span style = "color: rgb(51,51,51);" > = < / span >< span style = "color: rgb (0,0,221), font-weight: bold;" > 0 < / span >;
< span style = "color: rgb(136,136,136);" > //int pwm_a = 10; PWM kontroll för motor utgångar 1 och 2 är på digitala stift 10 < / span >
< span style = "color: rgb (51,51,153), font-weight: bold;" > int < / span > pwm_a < span style = "color: rgb(51,51,51);" > = < / span >< span style = "color: rgb (0,0,221), font-weight: bold;" > 3 < / span >; < span style = "color: rgb(136,136,136);" > //PWM kontroll för motor utgångar 1 och 2 är på digitala stift 3 < / span >
< span style = "color: rgb (51,51,153), font-weight: bold;" > int < / span > pwm_b < span style = "color: rgb(51,51,51);" > = < / span >< span style = "color: rgb (0,0,221), font-weight: bold;" > 11 < / span >; < span style = "color: rgb(136,136,136);" > //PWM kontroll för motor utgångar 3 och 4 är på digitala stift 11 < / span >
< span style = "color: rgb (51,51,153), font-weight: bold;" > int < / span > dir_a < span style = "color: rgb(51,51,51);" > = < / span >< span style = "color: rgb (0,0,221), font-weight: bold;" > 12 < / span >; < span style = "color: rgb(136,136,136);" > //dir kontroll för motor utgångar 1 och 2 är på digitala stift 12 < / span >
< span style = "color: rgb (51,51,153), font-weight: bold;" > int < / span > dir_b < span style = "color: rgb(51,51,51);" > = < / span >< span style = "color: rgb (0,0,221), font-weight: bold;" > 13 < / span >; < span style = "color: rgb(136,136,136);" > //dir kontroll för motor utgångar 3 och 4 är på digitala stift 13 < / span >
< span style = "color: rgb (51,51,153), font-weight: bold;" > int < / span > låg hastighet < span style = "color: rgb(51,51,51);" > = < / span >< span style = "color: rgb (0,0,221), font-weight: bold;" > 120 < / span >;
< span style = "color: rgb (51,51,153), font-weight: bold;" > int < / span > highspeed < span style = "color: rgb(51,51,51);" > = < / span >< span style = "color: rgb (0,0,221), font-weight: bold;" > 140 < / span >;
< span style = "color: rgb(136,136,136);" > //Distance bort < / span >
< span style = "color: rgb (51,51,153), font-weight: bold;" > int < / span > avstånd;
< span style = "color: rgb(136,136,136);" > //Sets varaktighet varje knapptryckning fångar motorer. < / span >
< span style = "color: rgb (51,51,153), font-weight: bold;" > int < / span > keyDuration < span style = "color: rgb(51,51,51);" > = < / span >< span style = "color: rgb (0,0,221), font-weight: bold;" > 10 < / span >;
< span style = "color: rgb (51,51,153), font-weight: bold;" > int < / span > iComp;
< span style = "color: rgb (51,51,153), font-weight: bold;" > ogiltig < / span >< span style = "color: rgb (0,102,187); font-weight: bold;" > Konfigurera < / span >)
{
Serial.BEGIN (< span style = "color: rgb (0,0,221), font-weight: bold;" > 9600 < / span >);
Wire.BEGIN(); < span style = "color: rgb(136,136,136);" > / / starta den I2C gränssnitt. < / span >
Serial.println (< span style = "bakgrundsfärg: rgb(255,240,240);" > "Att bygga nya HMC5883L" < / span >);
Kompass < span style = "color: rgb(51,51,51);" > = < / Span > HMC5883L(); < span style = "color: rgb(136,136,136);" > / / bygga en ny HMC5883 kompassen. < / span >
Serial.println (< span style = "bakgrundsfärg: rgb(255,240,240);" > "Ange skala till +/-1.3 Ga" < / span >);
fel < span style = "color: rgb(51,51,51);" > = < / span > Kompass. SetScale (< span style = "color: rgb (102,0,238), font-weight: bold;" > 1.3 < / span >); < span style = "color: rgb(136,136,136);" > / / Ange omfattningen av kompassen < / span >
fel < span style = "color: rgb(51,51,51);" > = < / span > Kompass. SetMeasurementMode(Measurement_Continuous); < span style = "color: rgb(136,136,136);" > / / inställd kontinuerlig mätning läge < / span >
pinMode (pwm_a, produktionen); < span style = "color: rgb(136,136,136);" > //Set kontroll stift som utgångar < / span >
pinMode (pwm_b, produktionen);
pinMode (dir_a, produktionen);
pinMode (dir_b, produktionen);
analogWrite (pwm_a, < span style = "color: rgb (0,0,221), font-weight: bold;" > 0 < / span >);
< span style = "color: rgb(136,136,136);" > //set båda motorer som körs vid (100/255 = 39) % duty cycle (långsamt) < / span >
analogWrite (pwm_b, < span style = "color: rgb (0,0,221), font-weight: bold;" > 0 < / span >);
pinMode (< span style = "color: rgb (0,0,221), font-weight: bold;" > 2 < / span >, OUTPUT); < span style = "color: rgb(136,136,136);" > //attach stift 2 till vcc < / span >
pinMode (< span style = "color: rgb (0,0,221), font-weight: bold;" > 5 < / span >, OUTPUT); < span style = "color: rgb(136,136,136);" > //attach stift 5 till GND < / span >
< span style = "color: rgb(136,136,136);" > / / initiera seriell kommunikation: < / span >
Serial.BEGIN (< span style = "color: rgb (0,0,221), font-weight: bold;" > 9600 < / span >);
}
< span style = "color: rgb (51,51,153), font-weight: bold;" > ogiltig < / span >< span style = "color: rgb (0,102,187); font-weight: bold;" > loopa < / span >)
{
< span style = "color: rgb(136,136,136);" > / / läsa raw värdena från kompassen (inte skalas). < / span >
MagnetometerRaw rå < span style = "color: rgb(51,51,51);" > = < / span > Kompass. ReadRawAxis();
< span style = "color: rgb(136,136,136);" > / / Hämta skalad värdena från kompassen (skalas till den konfigurerade skalan). < / span >
MagnetometerScaled skalas < span style = "color: rgb(51,51,51);" > = < / span > Kompass. ReadScaledAxis();
< span style = "color: rgb(136,136,136);" > / / värden används som så: < / span >
< span style = "color: rgb (51,51,153), font-weight: bold;" > Int < / span > MilliGauss_OnThe_XAxis < span style = "color: rgb(51,51,51);" > = < / span > skalas. XAxis; < span style = "color: rgb(136,136,136);" > / / (eller YAxis eller ZAxis) < / span >
< span style = "color: rgb(136,136,136);" > / / Beräkna rubrik när magnetometer är nivån, då korrigera för tecken på axeln. < / span >
< span style = "color: rgb (51,51,153), font-weight: bold;" > flyta < / span > rubrik < span style = "color: rgb(51,51,51);" > = < / span > ARCTAN2 (skalas. YAxis, skalas. XAxis);
< span style = "color: rgb(136,136,136);" > / / när du har din riktning, måste du sedan lägga till din "deklination vinkel", som är "Fel" av det magnetiskt sätter in i din plats. < / span >
< span style = "color: rgb(136,136,136);" > / / hitta din här: http://www.magnetic-declination.com/</span>
< span style = "color: rgb(136,136,136);" > / / min är: 2 37' W, som är 2.617 grader eller (som vi behöver) 0.0456752665 radianer, jag kommer att använda 0.0457 < / span >
< span style = "color: rgb(136,136,136);" > / / om du inte hittar din deklination, kommenterar ut dessa två linjer, din kompass kommer att vara något av. < / span >
< span style = "color: rgb (51,51,153), font-weight: bold;" > flyta < / span > declinationAngle < span style = "color: rgb(51,51,51);" > = < / span >< span style = "color: rgb (102,0,238), font-weight: bold;" > 0.0457 < / span >;
rubrik < span style = "color: rgb(51,51,51);" > += < / span > declinationAngle;
< span style = "color: rgb(136,136,136);" > / / korrigera för när tecken återförs. < / span >
< span style = "color: rgb (0,136,0), font-weight: bold;" > om < / span > (rubrik < span style = "color: rgb(51,51,51);" ><< / span >< span style = "color: rgb (0,0,221), font-weight: bold;" > 0 < / span >)
rubrik < span style = "color: rgb(51,51,51);" > += < / span >< span style = "color: rgb (0,0,221), font-weight: bold;" > 2 < / span >< span style = "color: rgb(51,51,51);" > * < / span > PI;
< span style = "color: rgb(136,136,136);" > / / check för Linda på grund av tillägg av deklination. < / span >
< span style = "color: rgb (0,136,0), font-weight: bold;" > om < / span > (rubrik < span style = "color: rgb(51,51,51);" >>< / span >< span style = "color: rgb (0,0,221), font-weight: bold;" > 2 < / span >< span style = "color: rgb(51,51,51);" > * < / span > PI)
rubrik < span style = "color: rgb(51,51,51);" >-= < / span >< span style = "color: rgb (0,0,221), font-weight: bold;" > 2 < / span >< span style = "color: rgb(51,51,51);" > * < / span > PI;
< span style = "color: rgb(136,136,136);" > / / konverterar radianer till grader för läsbarhet. < / span >
< span style = "color: rgb (51,51,153), font-weight: bold;" > flyta < / span > headingDegrees < span style = "color: rgb(51,51,51);" > = < / span > rubrik < span style = "color: rgb(51,51,51);" > * < / span >< span style = "color: rgb (0,0,221), font-weight: bold;" > 180 < / span >< span style = "color: rgb(51,51,51);" > / < / span > M_PI;
< span style = "color: rgb(136,136,136);" > / / normalt vi skulle fördröja tillämpningen av 66ms att låta öglan < / span >
< span style = "color: rgb(136,136,136);" > / / för att köra på 15Hz (standard bandbredd för HMC5883L). < / span >
< span style = "color: rgb(136,136,136);" > / / men eftersom vi har en lång följetong ut (104ms på 9600) vi kommer att låta < / span >
< span style = "color: rgb(136,136,136);" > / / det kör på dess naturliga hastighet. < / span >
< span style = "color: rgb(136,136,136);" > / / delay(66); < / span >
< span style = "color: rgb(136,136,136);" > //This undertrycker effektivitet hur mycket data som skickas till Python kod. < / span >
< span style = "color: rgb(136,136,136);" > / / i princip, det uppdateras varje sekund (10 mikrosekund fördröjning X 100 iComps) < / span >
< span style = "color: rgb (0,136,0), font-weight: bold;" > om < / span > (iComp < span style = "color: rgb(51,51,51);" >> = < / span >< span style = "color: rgb (0,0,221), font-weight: bold;" > 30 < / span >) {
< span style = "color: rgb (51,51,153), font-weight: bold;" > int < / span > adjHeading < span style = "color: rgb(51,51,51);" > = < / span >< span style = "color: rgb (0,0,221), font-weight: bold;" > 0 < / span >;
< span style = "color: rgb(136,136,136);" > //The "golvet" del gör flötet till ett heltal, rundar det upp < / span >
headingDegrees < span style = "color: rgb(51,51,51);" > = < / span > floor(headingDegrees);
< span style = "color: rgb (0,136,0), font-weight: bold;" > om < / span > (headingDegrees < span style = "color: rgb(51,51,51);" >> = < / span >< span style = "color: rgb (0,0,221), font-weight: bold;" > 280 < / span >) {
adjHeading < span style = "color: rgb(51,51,51);" > = < / span > karta (headingDegrees, < span style = "color: rgb (0,0,221), font-weight: bold;" > 280 < / span >, < span style = "color: rgb (0,0,221), font-weight: bold;" > 360 < / span >, < span style = "color: rgb (0,0,221), font-weight: bold;" > 0 < / span >, < span style = "color: rgb (0,0,221), font-weight: bold;" > 79 < / span >);
}
< span style = "color: rgb (0,136,0), font-weight: bold;" > annat < / span >< span style = "color: rgb (0,136,0), font-weight: bold;" > om < / span > (headingDegrees < span style = "color: rgb(51,51,51);" >< = < / span >< span style = "color: rgb (0,0,221), font-weight: bold;" > 279 < / span >) {
adjHeading < span style = "color: rgb(51,51,51);" > = < / span > karta (headingDegrees, < span style = "color: rgb (0,0,221), font-weight: bold;" > 0 < / span >, < span style = "color: rgb (0,0,221), font-weight: bold;" > 279 < / span >, < span style = "color: rgb (0,0,221), font-weight: bold;" > 80 < / span >, < span style = "color: rgb (0,0,221), font-weight: bold;" > 360 < / span >);
}
Serial.println(adjHeading);
iComp < span style = "color: rgb(51,51,51);" > = < / span >< span style = "color: rgb (0,0,221), font-weight: bold;" > 0 < / span >;
}
iComp < span style = "color: rgb(51,51,51);" > ++ < / span >;
fördröjning (< span style = "color: rgb (0,0,221); font-weight: bold;" > 10 < / span >); < span style = "color: rgb(136,136,136);" > //For seriell stabilitet. < / span >
< span style = "color: rgb (51,51,153), font-weight: bold;" > int < / span > val < span style = "color: rgb(51,51,51);" > = < / Span > Serial.read() < span style = "color: rgb(51,51,51);" >-< / span >< span style = "color: rgb(0,68,221);" > '0' < / span >;
< span style = "color: rgb (0,136,0), font-weight: bold;" > om < / span > (val < span style = "color: rgb(51,51,51);" > == < / span >< span style = "color: rgb (0,0,221), font-weight: bold;" > 1 < / span >)
{
Back();
}
< span style = "color: rgb (0,136,0), font-weight: bold;" > annat < / span >< span style = "color: rgb (0,136,0), font-weight: bold;" > om < / span > (val < span style = "color: rgb(51,51,51);" > == < / span >< span style = "color: rgb (0,0,221), font-weight: bold;" > 2 < / span >)
{
Right();
}
< span style = "color: rgb (0,136,0), font-weight: bold;" > annat < / span >< span style = "color: rgb (0,136,0), font-weight: bold;" > om < / span > (val < span style = "color: rgb(51,51,51);" > == < / span >< span style = "color: rgb (0,0,221), font-weight: bold;" > 3 < / span >)
{
Forward();
}
< span style = "color: rgb (0,136,0), font-weight: bold;" > annat < / span >< span style = "color: rgb (0,136,0), font-weight: bold;" > om < / span > (val < span style = "color: rgb(51,51,51);" > == < / span >< span style = "color: rgb (0,0,221), font-weight: bold;" > 4 < / span >)
{
Left();
}
< span style = "color: rgb (0,136,0), font-weight: bold;" > annat < / span >< span style = "color: rgb (0,136,0), font-weight: bold;" > om < / span > (val < span style = "color: rgb(51,51,51);" > == < / span >< span style = "color: rgb (0,0,221), font-weight: bold;" > 5 < / span >)
{
Stop();
}
}
< span style = "color: rgb (51,51,153), font-weight: bold;" > ogiltig < / span >< span style = "color: rgb (0,102,187); font-weight: bold;" > tillbaka < / span > () {
< span style = "color: rgb(136,136,136);" > //Straight tillbaka < / span >
analogWrite (pwm_a, highspeed);
analogWrite (pwm_b, highspeed);
digitalWrite (dir_a, hög); < span style = "color: rgb(136,136,136);" > //Reverse motor riktning, 1 hög, 2 låg < / span >
digitalWrite (dir_b, låg); < span style = "color: rgb(136,136,136);" > //Reverse motor riktning, 3 låg, 4 hög < / span >
Delay(keyDuration);
}
< span style = "color: rgb (51,51,153), font-weight: bold;" > ogiltig < / span >< span style = "color: rgb (0,102,187); font-weight: bold;" > vänster < / span > () {
< span style = "color: rgb(136,136,136);" > //Left < / span >
analogWrite (pwm_a, låg hastighet);
analogWrite (pwm_b, låg hastighet);
digitalWrite (dir_a, hög); < span style = "color: rgb(136,136,136);" > //Reverse motor riktning, 1 hög, 2 låg < / span >
digitalWrite (dir_b, hög); < span style = "color: rgb(136,136,136);" > //Reverse motor riktning, 3 låg, 4 hög < / span >
Delay(keyDuration);
}
< span style = "color: rgb (51,51,153), font-weight: bold;" > ogiltig < / span >< span style = "color: rgb (0,102,187); font-weight: bold;" > höger < / span > () {
< span style = "color: rgb(136,136,136);" > //Right < / span >
analogWrite (pwm_a, låg hastighet);
analogWrite (pwm_b, låg hastighet);
digitalWrite (dir_a, låg); < span style = "color: rgb(136,136,136);" > //Reverse motor riktning, 1 hög, 2 låg < / span >
digitalWrite (dir_b, låg); < span style = "color: rgb(136,136,136);" > //Reverse motor riktning, 3 låg, 4 hög < / span >
Delay(keyDuration);
}
< span style = "color: rgb (51,51,153), font-weight: bold;" > ogiltig < / span >< span style = "color: rgb (0,102,187); font-weight: bold;" > framåt < / span > () {
< span style = "color: rgb(136,136,136);" > //set båda motorer körs på 100% duty cycle (snabb) < / span >
analogWrite (pwm_a, highspeed);
analogWrite (pwm_b, highspeed);
< span style = "color: rgb(136,136,136);" > //Straight framåt < / span >
digitalWrite (dir_a, låg); < span style = "color: rgb(136,136,136);" > //Set motor riktning, 1 låg, 2 hög < / span >
digitalWrite (dir_b, hög); < span style = "color: rgb(136,136,136);" > //Set motor riktning, 3 hög, 4 låg < / span >
Delay(keyDuration);
}
< span style = "color: rgb (51,51,153), font-weight: bold;" > ogiltig < / span >< span style = "color: rgb (0,102,187); font-weight: bold;" > sluta < / span > () {
< span style = "color: rgb(136,136,136);" > //set båda motorer körs på 100% duty cycle (snabb) < / span >
analogWrite (pwm_a, < span style = "color: rgb (0,0,221), font-weight: bold;" > 0 < / span >);
analogWrite (pwm_b, < span style = "color: rgb (0,0,221), font-weight: bold;" > 0 < / span >);
< span style = "color: rgb(136,136,136);" > //Straight framåt < / span >
digitalWrite (dir_a, låg); < span style = "color: rgb(136,136,136);" > //Set motor riktning, 1 låg, 2 hög < / span >
digitalWrite (dir_b, hög); < span style = "color: rgb(136,136,136);" > //Set motor riktning, 3 hög, 4 låg < / span >
Delay(keyDuration);
}