Archiv verlassen und diese Seite im Standarddesign anzeigen : um einen Gegenstand herum/ Odometrie
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, 19: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
geholfen hat es nicht... aber trotzdem vielen dank
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.
encoderset(0,0) kennt er scheinbar nicht
was go und turn betrifft.... übt das mich ja nicht...aber gut.. ich werde es versuchen
EncoderSet(0,0)
kennt er vieleicht schon. ich bin halt zu fual dei umschalttaste zu benutzen ;)
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
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.
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, 16: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).
#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, 16: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);
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
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.