PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Strecke abmessen



m1ch15inner
26.11.2006, 21:02
Also:

mein Asuro fährt schon mal ner linie nach.

jetzt möcht ich mal wissen wie des mit der Odometrie funktioniert

dh.: codes posten......

ich möchte dass mein Asuro 1m der linie nach fährt und dann anhält.

bekommt man das hin oder is dass viel zu schwierig.

PS: ich habe mich noch nicht mit [highlight=red:4c464ec6be]odometrie[/highlight:4c464ec6be] befasst. ich blicks also auf keinem auge
#-o

EDH
26.11.2006, 21:16
copy/paste bringt nichts.
also lern lieber erst mit der odometrie umzugehen.

(1) ob helll/dunkel messen, und in einer bariable status speichern
//while schleife die ungefähr so auschaugt while(strecke < sollstrecke):
(2) linienssnore auslesen, und entsprechend handeln
(3) odometrie mit encode[left] auslesen.
(4) je nachdem ob jetzt andere farbe als in status strekcke inkrementiern oder unverändert lassen
(5) status neu setzen


ist etwas unverständlich oder?
möglicherweise verstehst du das besser, wenn du dir die go funktion mal genauer anschasut.
im prinzip brauchst du ja die go funktion, nbur dass er halt der linie nachfahren soll.

mfg EDH

m1ch15inner
26.11.2006, 21:20
was is die go funktion?

damaltor
27.11.2006, 11:31
also codes posten geht gar nicht, das ist richtig... bevor du dich mit go befasst, sieh dir erstmal die anleitungn von edh an. und wenn du dazu fragen hast dann sag bescheid =)

m1ch15inner
27.11.2006, 14:37
ihr sollt mir nicht den fertigen code geben sondern die anweisung die ich reinschreiben soll......äm so wie

encode[left]
was macht des?

damaltor
27.11.2006, 14:43
in der variable encoder[left] sind die seit dem aufruf von encoder_init() gezählten schwarz-weiss-übergänge von dem linken rad gespeichert.

m1ch15inner
27.11.2006, 14:46
muss ich des einfach als variable einsetzten....(davor Encoder_Init(); is kla)?

EDH
27.11.2006, 14:51
wenn du Encoder_Init() aufrufst, wird die odometrie via interrupt auslelesen.
d.h. encoder[left] ist eine ganz normale variable

m1ch15inner
27.11.2006, 15:00
äm was is da falsch?

#include "asuro.h"

int main(void)
{
Init();
Encoder_Init();
while(encoder[left]<1000)
{
MotorDir(FWD,FWD);
MotorSpeed(130,125);
}
return 0;
}

m1ch15inner
27.11.2006, 15:03
sry- habs schon
left -> LEFT

damaltor
27.11.2006, 15:27
Das funktioniert aber nicht oder?

m1ch15inner
27.11.2006, 15:30
war ja nicht fertig! der fährt ja nur....=)

#include "asuro.h"

int main(void)
{
Init();
Encoder_Init();
while(encoder[LEFT]<100)
{
MotorDir(FWD,FWD);
MotorSpeed(130,125);
}
MotorSpeed(0,0);
return 0;
}

so misst er schon mal ;)

damaltor
27.11.2006, 15:42
na das sieht doch schon ganz gut aus... jetzt musst du nur noch mal schaun, wie viele ticks eine bestimmte strecke lang ist...

m1ch15inner
27.11.2006, 16:02
gibts irgend ne aufforderung bei der er wieder zu einem bestimmten punkt zurückspringt?

m1ch15inner
27.11.2006, 16:09
du hast des vorher falsch vormuliert
encoder[LEFT] zählt wie oft es einen farbwechsel gibts
heißt schwarz-> weis UND weis -> schwarz

oder?

EDH
27.11.2006, 16:19
also im programm code springen geht mit goto
allerdings ist das nicht gerade guter stil.

EDH
27.11.2006, 16:23
zitat aus der doku zur lib 2.61


Odometriesensor Werte bei Interrupt Betrieb. encoder[0] links, encoder[1] = rechts. (Wertebereich 0..1023)
Definiert in Zeile 170 der Datei asuro.h.

njet.
encoder[left] zählt nbicht die einzelnen farbwechsel.

m1ch15inner
27.11.2006, 16:38
warum fährt er dann bei 30 nur 6 cm? und nicht 12?

EDH
27.11.2006, 16:46
hä? wie, wo was??
wo fährt er bei 30 nur 6cm?

m1ch15inner
27.11.2006, 17:17
oben hab ich doch den code gepostet
wenn ich ihn bis 30 zählen lass
dann sollte er sich ja 3 mal ganz umdrehen

10 zu 50
=> eine Umdrehung = 1/5 Radumfang
=> ein Tick = 1/6 Umdrehung = 1/30 Radumfang

Radumfang: 123mm
=> ein Tick = 123mm / 30 = 4,1 mm

dh.: 30 x 4mm = 12cm

er fährt aber nur 6 cm!
:-s

EDH
27.11.2006, 17:23
die rechnung mag ja stimmen, aber in der variable enciode[left] werden nun mal nicht die anzahl der ticks, sondern der acktuelle werte der odometrie gespeichert.
mit drehzahl etc hat das überhauptnix zu tun

entwede hab ich da jetzt einen knoten im hirn, oder du...

m1ch15inner
27.11.2006, 17:54
dann dürfte der code aber überhaupt nicht gehn!?

EDH
27.11.2006, 18:17
ich hab den code grad mal selber probiert.
komisch...
könnte es sein, das die dokumentation nicht so ganz stimmt?

damaltor
27.11.2006, 19:30
ööhm... und was is dann das "neue" an der neuen lib? dass die werte per interrupt ermittelt werden oder was? hoffentlich schaut al einer hier rein der sich damit auskennt... -.-

m1ch15inner
27.11.2006, 21:09
@EDH

aus der go-funktion geht doch aber auch hervor dass die encoder[LEFT] sozusagen die übergänge zählt.....

damaltor
27.11.2006, 21:16
eben darum dacht ich das ja auch...

EDH
27.11.2006, 21:28
Odometriesensor Werte bei Interrupt Betrieb. encoder[0] links, encoder[1] = rechts. (Wertebereich 0..1023)
Definiert in Zeile 170 der Datei asuro.h.

ich dagegen hab mich auf die doku verlassen. und die besagt eindeutig, dass die werte der odometrie drinne gespeichert sind. tja ähh.

damaltor
27.11.2006, 21:45
void Go(int distance, int speed)
{
int enc_count = 0;
int tot_count = 0;
int diff = 0;
int l_speed = speed, r_speed = speed;
enc_count=abs(distance);

// enc_count=distance*10000;
// enc_count/=12823;

Encoder_Set(0,0); // reset encoder

MotorSpeed(l_speed,r_speed);
if(distance<0) MotorDir(RWD,RWD);
else MotorDir(FWD,FWD);

while(tot_count<enc_count) {
tot_count += encoder[LEFT];
diff = encoder[LEFT] - encoder[RIGHT];
if (diff > 0) { //Left faster than right
if ((l_speed > speed) || (r_speed > 244)) l_speed -= 10;
else r_speed += 10;
}
if (diff < 0) { //Right faster than left
if ((r_speed > speed) || (l_speed > 244)) r_speed -= 10;
else l_speed += 10;
}
Encoder_Set(0,0); // reset encoder
MotorSpeed(l_speed,r_speed);
Msleep(1);
}
MotorDir(BREAK,BREAK);
Msleep(200);
}

so hier ist die go funktion... sie nimmt offensichtlich die werte an als die gezählten tiks.

ich glaub ich werd mal nen programm schreiben was die werte einfach ausgibt... bis gleich.

damaltor
27.11.2006, 22:03
hmmm... also folgendes programm


#include "asuro.h"

int main(void)
{
Init();
Encoder_Init;
MotorSpeed(150,150);
Encoder_Set(0,0);
while(1){
PrintInt(encoder[LEFT]);
SerWrite(" ",3);
PrintInt(encoder[RIGHT]);
SerWrite("\n\r",2);
}

return 0;

}


gibt folgendes aus:


0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0



würde das einer von euch mal kurz flashen und sagen was bei ihm rauskommt? danke

m1ch15inner
27.11.2006, 22:08
naja...bei mir auch!
aber das passt ja auch nicht zur teorie von EDH!?

damaltor
27.11.2006, 22:12
aber auch nicht zu meiner....

EDH! mach du mal...

m.a.r.v.i.n
27.11.2006, 22:31
Hi,

@damaltor Dein Programm gibt eine Warnung aus.
Zeile 6 Code has no effect

Encoder_Init();

so wäre es richtig. Dann zählen die Encoderwerte brav hoch.
Die Doku der Asuro Lib ist also falsch. Es werden die Ticks gezählt.

Gruß m.a.r.v.i.n

damaltor
27.11.2006, 22:40
Alles klar... danke dir =)

m1ch15inner
28.11.2006, 11:10
HA!

und ich hab noch ne frage! leider hock ich grad in der schule und kann den code nicht posten. aber er sieht so änlich aus wie die go funktion.
also.....wenn ich meinen roboter auf den boden stelle und anschalte fährt er einen bogen nach rechts!? wenn ich ihn aber erst leerlaufen lass (die räder hochheb) und dann absetz dann fährt er perfekt gerade aus!? kP warum. kann mir da jemand was dazu sagen oder is des zufall?

m1ch15inner
28.11.2006, 14:51
wenn ichs licht an mach:


1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1


!?!?!?!?!?

m1ch15inner
28.11.2006, 14:56
0 1
6 10
15 19
26 30
36 44
50 58
62 70
77 81
90 93
100 106
116 121
130 135
144 151
160 167
176 183
190 199
206 213
220 230
234 246
250 262
267 279
282 295
296 312
310 329
320 345
335 362
350 379
366 395
380 413
398 429
414 447
430 463
447 480
464 495
480 511
496 529
514 545
530 562
545 579
560 596
574 613
591 630
608 647
624 664
640 681
656 698
673 715
690 732
706 749
724 765
738 782
755 799
772 817
788 833
805 850
822 867
838 884
856 901
872 918
890 935
906 952
923 969
940 987
956 1003
974 1021
992 1039
1009 1057
1027 1075
1046 1094
1064 1112
1082 1130
1100 1148
1118 1167
1136 1185
1154 1204
1172 1222
1190 1240
1208 1259
1227 1277
1245 1296
1263 1314
1281 1333
1300 1351
1318 1369
1336 1387
1354 1406
1372 1424
1390 1443
1409 1461
1427 1479
1445 1497
1463 1516
1482 1535
1500 1553
1518 1571
1536 1590
1554 1608
1572 1626
1591 1645
1609 1663
1627 1682
1644 1700
1661 1719
1679 1737
1697 1756
1715 1774
1733 1792
1752 1811
1770 1829
1788 1848
1807 1866
1825 1885
1843 1903
1861 1922
1877 1940
1893 1958
1901 1976
1913 1994
1929 2012
1943 2030
1961 2048
1979 2067
1997 2085
2016 2103
2034 2121
2053
kommt wenn ich die BackLEDs aus mach! ^^ weis aber nicht warum!?

m1ch15inner
28.11.2006, 15:02
#include "asuro.h"



int main(void)
{
Init();
int il=130 ;
int ir=130 ;
Encoder_Init();
MotorDir(FWD,FWD);
MotorSpeed(il,ir);
while(1)
{
while(encoder[LEFT]<encoder[RIGHT])
{
BackLED(OFF,ON);
il=il+10;
ir=ir-10;
MotorSpeed(il,ir);
}
while(encoder[LEFT]>encoder[RIGHT])
{
BackLED(ON,OFF);
ir=ir+10;
il=ir-10;
MotorSpeed(il,ir);
}
}
return 0;
}

was is daran falsch?

m.a.r.v.i.n
28.11.2006, 16:22
Hi,

BackLEDS und die Odometrie Foto Transistoren teilen sich die selben Port Pins. Es geht nur eines von beiden gleichzeitig. Wenn du die Odometrie verwenden willst, kannst du die Back LEDs nicht benutzen.

Gruß m.a.r.v.i.n

m1ch15inner
28.11.2006, 16:24
^^ des is natürlich gut zu wissen! danke
jetzt gehts sau gut!

damaltor
28.11.2006, 16:58
stimmt, daran hab ich nicht gedacht...

gehts auch wenn er auf dem boden losfährt?

m1ch15inner
28.11.2006, 17:02
dann fährt er schief

Oo

aber kP warum

und wenn ich ihn eine bestimmte strecke fahren lasse mit while(encoder[LEFT]<Strecke) dann hält er immer unterschiedlich spät an manchmal sogar garnicht!?

damaltor
28.11.2006, 17:07
mmh... naja vielleicht liegt das daran dass wenn er auf dem boden fährt die lichtverhältnisse sich ändern, und wenn er aufgebockt ist nicht... keine ahnung...

odysee_2002
30.11.2006, 22:07
Hallo,

die Werte vom Radencoder sind stark davon abhängig, wie weit das Zahnrad vor den Radsensoren sitzt. Die Interrupt Service Routine erkennt nur eine Flanke, wenn der Wert mindestens unter 140 fällt und über 160 steigt.
Diese Werte sind aber stark einer Exemplarsteuung von Asuro zu Asuro unterworfen, sodaß nicht jeder Asuro die Flanken sauber erkennt.
Darum fährt ein Asuro vielleicht nicht die gewünschte Strecke.
Abhilfe kann man hier mit einer Min/Max Wert Bildung der Encoder Signale schaffen, dann kann man die Schwelle jedesmal neu bestimmen.

Gruß