PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : um einen Gegenstand herum/ Odometrie



RacerD
13.12.2006, 17:47
Entschuldigt meine allg. Unwissenheit zu diesem Thema, da ich noch recht neu bin.
Aber nun zu meiner Frage: Mir ist bewusst dass es zu diesem thema schon viele threats gibt, aber die nützen alle nichts (desswegen brauche ich eine privatanpassung von einem netten menschen) : ich habe hier einen prgrammcode, bei dem ich selbst nach mehrmaligem drüberschauen nicht den fehler finden konnte, denn wenn ich ihn ausführe, macht der roboter nicht das was er soll, er fährt nur geradeaus. Der Editor hat scheinbar keinen fehler gebracht.



#include "asuro.h"

int main(void) {
Init ();

int cm90=16.5;
int s1=10;
int s2=20;
int i, t;
for(i=0;i<10;i++)
{
PollSwitch();
}
t=PollSwitch();

while (1) {
if (t>=1) {
Encoder_Init();
while (encoder[LEFT]<=cm90*3)
{
MotorDir(FWD,FWD);
MotorSpeed(160,0);
}
cm90=0;
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
while (encoder[LEFT]<=s1*3)
{
MotorDir(FWD,FWD);
MotorSpeed(160,160);
}
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
cm90=0;
while (encoder[RIGHT]<=cm90*3)
{
MotorDir(FWD,FWD);
MotorSpeed(0,160);
}
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
cm90=0;
while (encoder[LEFT]<=s2*3)
{
MotorDir(FWD,FWD);
MotorSpeed(160,160);
}
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
cm90=0;
while (encoder[RIGHT]<=s1*3)
{
MotorDir(FWD,FWD);
MotorSpeed(0,160);
}
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
cm90=0;
while (encoder[LEFT]<=s1*3)
{
MotorDir(FWD,FWD);
MotorSpeed(160,0);
}
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
cm90=0;
} else {
MotorDir (FWD,FWD);
MotorSpeed(160,160);
}
}
return 0;
}
DiV RacerD

MartinFunk
13.12.2006, 18:51
Hallo RacerD,


for(i=0;i<10;i++)
{
PollSwitch();
}
t=PollSwitch();
dieser teil muss mit in die while(1){} da er nur 10 taktzüklen ausgeführt wird.

MfG Martinl

RacerD
13.12.2006, 19:29
geholfen hat es nicht... aber trotzdem vielen dank

EDH
13.12.2006, 19:49
das problem liegt an dem ganzen zeugs was bei der if abfrage ausgeführt wirdl.
probier mal obs geht, wenn du erst noch encoderset(0,0) aufurfst.

wenn nich könntest du doch auch einfach go unt turn hernehmen.

RacerD
13.12.2006, 20:22
encoderset(0,0) kennt er scheinbar nicht

was go und turn betrifft.... übt das mich ja nicht...aber gut.. ich werde es versuchen

EDH
13.12.2006, 20:28
EncoderSet(0,0)

kennt er vieleicht schon. ich bin halt zu fual dei umschalttaste zu benutzen ;)

Downad
13.12.2006, 20:29
ist es nicht so, dass am anfang



for(i=0;i<10;i++)
{
PollSwitch();
}
t=PollSwitch();


hier testest du ob schalter gedrückt (10 zyclen)!!

dann gehst du in dei while


while (1) {
if (t>=1) {
..schnipp...
} else {
MotorDir (FWD,FWD);
MotorSpeed(160,160);
}

und in der while testest du den taster.

nur wird in der while nie der taster aktualisiert und somit fährt asuro immer gerade aus ....
es sei denn, der taster würde gedrückt werden bevor!!!!!!! er losfähr.

hmm das hat martin schon geschrieben...


aber in der schleife...
teste mal



#include "asuro.h"

int main(void) {
Init ();

int cm90=16.5;
int s1=10;
int s2=20;
int i, t;


while (1) {
for(i=0;i<10;i++)
{
PollSwitch();
}
t=PollSwitch();
if (t>=1) { //Scahlter wurde gedrückte
Encoder_Init();
while (encoder[LEFT]<=cm90*3)
{
MotorDir(FWD,FWD);
MotorSpeed(160,0);
}
cm90=0; //warum setzt du den cm90 auf 0?
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);

} else {
MotorDir (FWD,FWD);
MotorSpeed(160,160);
}
}
return 0;
}

aber sag mal wass soll da genau passieren?
taste gedrückt und dann....
1. while in if abfrage -->drehe rechts


while (encoder[LEFT]<=cm90*3)
{
MotorDir(FWD,FWD);
MotorSpeed(160,0); //rechts drehen
}

dann geradeausfahren..... (2. while)

dann setzt du cm90 auf 0 damit ist die 3. while unsinnig


cm90=0;
while (encoder[RIGHT]<=cm90*3)
{
MotorDir(FWD,FWD);
MotorSpeed(0,160);
}

danach sieht es für mich so aus als ob die s2 und s1 viel kleiner als encoder -->while wird nicht gefahren


gruß
ralf

EDH
13.12.2006, 20:35
ist es nicht so, dass am anfang




for(i=0;i<10;i++)
{
PollSwitch();
}
t=PollSwitch();


hier testest du ob schalter gedrückt (10 zyclen)!!


da wird benötigt, weil bei einmaligem aufruf falsche werte drannstehen können, weil sich dieser kondensator da noch nciht entladen hat.

RacerD
13.12.2006, 20:51
also erstmal ein großes danke an euch beide: EDH und Downad

@Downad
ok das mit dem taster IN der schleife hab ich geändert
was nun das program machen soll? nunja es sollte etwa sowas machen:

sobald er an meinen Finger (representativ für einen Gegenstand) stößt, sollte er eine rechtsdrehung machen , ein stück vorwärts fahren, links drehn, vorwärts wieder links und mit der vorderseite zum finger zeigend, also genau 180° gedreht im gegensatz zur startposition. (hoffenltich versteht das jemand)

natürlich muss er nach dem anstoßen noch ein stück zurück fahren. Aber das sollte erstmal ein versuch sein, dass die Befehlsfolge eingehalten wird.



cm90=0; //warum setzt du den cm90 auf 0?
Das ist natürlcih unsinn, was ich da geschrieben hab. t sollte 0 gesetzt werden.




danach sieht es für mich so aus als ob die s2 und s1 viel kleiner als encoder -->while wird nicht gefahren
Das verstehe ich nicht, beim geradeausfahren (gleiche variablen, nur beim motor 160 links sowohl rechts) ist er genau meine angegebene strecke gefahren... vllt zählt mein encoder anders? :)

mfg RD

damaltor
14.12.2006, 15:34
naja... also bis auf kleine abweichungen sollten eigentlich alle encoder gleich zählen =)

poste mal den aktuellen code, so wie er im moment ist (nach allen korrekturen).

RacerD
14.12.2006, 15:44
#include "asuro.h"


int main(void) {
Init ();

int cm90=16.5;
int s1=10;
int s2=20;
int i, t;

#define vor {while (encoder[LEFT]<=s2*3){MotorDir(FWD,FWD);MotorSpeed(160,160);}};
#define zurück {while (encoder[LEFT]<=s1*3){MotorDir(RWD,RWD);MotorSpeed(160,160);}};
#define links {while (encoder[LEFT]<=cm90*3){MotorDir(FWD,FWD);MotorSpeed(0,160);}};
#define rechts {while (encoder[LEFT]<=cm90*3){MotorDir(FWD,FWD);MotorSpeed(160,0);}};

while (1)
{
for(i=0;i<10;i++)
{
PollSwitch();
}
t=PollSwitch();
Encoder_Init();
if (t>=1) {

zurück;
links;
vor;
rechts;
vor;
rechts;
vor;
} else {
MotorDir(FWD,FWD);
MotorSpeed (160,160);
}
}
return 0;
}
ich hab jetzt par sachen umgeschrieben, damit es kompakter aussieht.


Hm... und s1 und s2 sollte für die strecken zählen

werden die encoder werte beim nächsten encoder[LINKS] zurückgesetzt? wenn ja, dann hab ich meinen fehler gefunden

damaltor
14.12.2006, 15:49
hmm... du beziehst dich immer nur auf den linken encoder. dieser wird bei einer drehung anch links allerdings kaum bewegt. vielleicht sollte im define (rechts) deshalb mit encoder[right] gearbeitet werden.

encoder[left] bzw. encoder[right] sind variablen (genauer: bilden ein array). diese enthalten einen wert, den man abfragen kann, zurückgesetzt werden sie dadurch nciht. zurücksetzen kannst du sie nur durch EncoderSet(0,0);

RacerD
14.12.2006, 16:39
aha
danke
jetzt hab ich endlich meinen fehler gefunden... der einzige fehler ist wohl noch, das ich jetzt abends es nicht ausprobieren kann, weil die werte durch tischlampe und schatten usw. zu unterschiedlich sind

mfg RD

Downad
14.12.2006, 16:50
zurücksetzen kannst du sie nur durch EncoderSet(0,0);
hat dalmator geschrieben.

das ist glaube ich der schlüssel. setze mal vor den if encoder ein encoderset(0,0) damit der encoder neu von null an zählen kann.

alernativ wäre den encoderwert in eine variable zwischenspeichern und dann mir diesem wert + s1*3 oder was immer da sein sollte zu vergleichen

in der art etwa

int iLeftencoder= encoder[LEFT]; //Startwert merken

while (encoder[LEFT]<=iLeftencoder+(cm90*3))
{
MotorDir(FWD,FWD);
MotorSpeed(160,0);
}


gruß
downad