PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : unterschiedliches motorenverhalten



inka
20.02.2007, 16:14
ich verstehe es nicht:

zwei programme, hier färt der asuro geradeaus:

#include "asuro.h" // bitte die neue Datei benutzen
// asuro.h und asuro.c vom 31.03.05

#define aus MotorDir(BREAK,BREAK)
#define go {MotorSpeed(150,150);MotorDir(FWD,FWD);}
#define backturn { MotorSpeed(150,250);MotorDir(RWD,RWD);Msleep(1000) ;}

/************************************************** ***********************************

ASURO discovers your apartment

program made by stochri july, 2005

************************************************** ***********************************/

int speed()
{
int rightspeed,leftspeed;
int leftold,rightold;

Encoder_Set(0,0); // reset encoder


leftold=encoder[LEFT];
rightold=encoder[RIGHT];
Msleep(300);
leftspeed=encoder[LEFT]-leftold;
rightspeed=encoder[RIGHT]-rightold;

//SerWrite(" speed Left,Right ",19);
//PrintInt(leftspeed);
//PrintInt(rightspeed);
return leftspeed+rightspeed;
}

int main(void)
{
int n,v,nullspeed;

Init();
Encoder_Init();
StatusLED(OFF);
SerWrite("\n\rASURO OK\n\r",8);

go;
Msleep(500);

nullspeed=speed()-10;

while(1)
{
v=speed();
SerWrite("\n\r speed ",9);
PrintInt(v);

if(v<nullspeed)
{
backturn;
go;
Msleep(500);
}

}
return 0;
}


das zweite (jetzt das richige), hier zieht er beim vorwärtsfahren nach rechts:

/************************************************** ************************
*
* File Name: kollisiontest.c
* Project : ASURO
*
* Description: Kollisionstest mit Hilfe der Tastensensoren
*
* Ver. Date Author Comments
* ------- ---------- ----------------- -----------------------------
* 1.0 10.09.2005 Peter initial build
* 1.1 08.01.2006 Peter 2x PollSwitch + Vergleich,
anstelle 8x PollSwitch
*
* benoetigt die modifizierte Asuro Bibliothek 'asuro.c'
* von waste, stochri und andun. Zu finden bei www.roboternetz.de
*/
/************************************************** *************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* any later version. *
************************************************** *************************/

#include "asuro.h"

/* Um eventuelle Unterschiede zwischen linken und rechtem Motor auszugleichen
* definieren wir 2 Werte für fullspedd links und rechts
*/
#define FULL_L 125 /* Fullspeed linker Motot */
#define FULL_R 125 /* Fullspeed rechter Motor */

/* Motor vorwärts */
void MotorFwd(void)
{
MotorDir(FWD,FWD);
MotorSpeed(FULL_L,FULL_R);
}

/* Motor rückwärts */
void MotorRwd(void)
{
MotorDir(RWD,RWD);
MotorSpeed(FULL_L,FULL_R);
}

/* Motor rückwärts Links */
void MotorRwdL(void)
{
MotorDir(RWD,RWD);
MotorSpeed(FULL_L,0);
}

/* Motor rückwärts Rechts */
void MotorRwdR(void)
{
MotorDir(RWD,RWD);
MotorSpeed(0, FULL_R);
}

/* Motor stop */
void MotorStop(void)
{
MotorSpeed(0,0);
}

int main(void)
{
unsigned char t1, t2;

SerWrite("\n\r kollision_wiki_2007_02_19 ",29); // wer bin ich
Init();
while(1)
{
t1 = PollSwitch();
t2 = PollSwitch();
if(t1 == 0 && t2 == 0) /* keine Taste */
{
MotorFwd(); /* vorwärts fahren */
FrontLED(ON);
BackLED(OFF,OFF);
}
else if (t1 && t2 && t1 == t2)
{
MotorStop();
if(t1 & 0x07) /* Tasten links gedrückt? */
{
MotorRwdL(); /* Rückwärtskurve links fahren */
FrontLED(OFF);
BackLED(ON,OFF);
}
if (t1 & 0x38) /* Tasten rechts gedrückt? */
{
MotorRwdR(); /* Rückwärtskurve rechts fahren */
FrontLED(OFF);
BackLED(OFF,ON);
}
Msleep(1000); /* 1 Sekunde fahren */
}
}
return 0;
}


woran kann das liegen?

zumgwadrad
20.02.2007, 16:21
Hi,
tschuldigung ist das nicht 2mal ein und das selbe Prog?
Hab das jetzt 3mal gelesen und finde keinen Unterschied! Also sollte dein Asuro auch beidesmal das gleiche machen!
Wenn du des erste wieder draufspielst dann fährt er wohl wieder geradeaus?

inka
20.02.2007, 16:36
hast recht, die typische kopierfalle :-(

habs geändert...

edit: ja, nachdem wiederholten flashen des ersten progs fährt er wieder geradeaus. Ich meine es ist ja nicht so, dass er eine scharfe rechtskurve fährt, man merks aber schon...

zumgwadrad
20.02.2007, 16:44
Hi,
aha jetzt. Also wenn ich das richtig sehe dann ist der wesentliche Unterschied das des zweite Prog ohne den Encoder für den weg läuft, und das führt zu dem Bogen, da zwei baugleiche Motoren nie exakt gleich laufen! Also der eine macht halt bei 5V von mir aus 50 u/min und der andere macht bei gleicher Spannung 51 u/min und so entsteht dann dein Bogen;
musst halt den Encoder noch reinschmeißen dann müsste es gehen!
Viel Erfolg

inka
24.02.2007, 14:21
hi allerseits,
so weit klar. Ich habe jetzt stochris "kleines geheimnis" um das einlesen und auswerten der taster ergänzt (wird nocht nicht ausgewertet) und probeweise um ein paar defines ergänzt:


#include "asuro.h" // bitte die neue Datei benutzen
// asuro.h und asuro.c vom 31.03.05

#define aus MotorDir(BREAK,BREAK)
#define go {MotorSpeed(150,150);MotorDir(FWD,FWD);}
#define back { MotorSpeed(150,150);MotorDir(RWD,RWD);Msleep(1000) ;}
#define backturn { MotorSpeed(150,250);MotorDir(RWD,RWD);Msleep(1000) ;}
#define backleft { MotorSpeed(150,250);MotorDir(RWD,RWD);Msleep(1000) ;}
#define backright { MotorSpeed(250,150);MotorDir(RWD,RWD);Msleep(1000) ;}
#define stop { MotorSpeed(0,0);}

/************************************************** ***********************************

ASURO discovers your apartment

program made by stochri july, 2005

************************************************** ***********************************/

int speed()
{
int rightspeed,leftspeed;
int leftold,rightold;

Encoder_Set(0,0); // reset encoder


leftold=encoder[LEFT];
rightold=encoder[RIGHT];
Msleep(300);
leftspeed=encoder[LEFT]-leftold;
rightspeed=encoder[RIGHT]-rightold;

//SerWrite(" speed Left,Right ",19);
//PrintInt(leftspeed);
//PrintInt(rightspeed);
return leftspeed+rightspeed;
}

int main(void)
{
int v,nullspeed, sw, sw0, sw1, sw2;

Init();
Encoder_Init();
StatusLED(OFF);
SerWrite("\n\rASURO OK\n\r",8);

go;
Msleep(500);

nullspeed=speed()-10;

while(1)
{
sw0=PollSwitch(); // Schalter einlesen und für eine Runde speichern
sw1=PollSwitch();
sw2=PollSwitch();
if ((sw0==sw1) && (sw0==sw2)) sw=sw0; else sw=0;

v=speed();
SerWrite("\n\r speed ",9);
PrintInt(v);

if(v<nullspeed)
{
backturn;
go;
Msleep(500);
}

}
return 0;
}

wenn ich das programm starte, macht der asuro einen leichten rechtsbogen, beim "stochri pur" aber nicht. Wieso???