PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem duch Kombination: Linienverfolgung & Batteriezus



ThugBone
19.12.2005, 07:08
Guten Morgen allerseits !


Hab folgendes Problem:

Ich möchte meinen Asuro in Dauerbetrieb nehmen. Später soll er bei einem geringen Batteriestand die Ladestation aufsuchen. Momentan bin ich noch in der Anfangsphase und habe bisher folgenden Code:



#include "asuro.h"
#include <stdlib.h>

#define maxspeed 130
#define medspeed 120
#define quadteiler 30

int speedLeft,speedRight, sR, sL, i;
unsigned int lineData[2];

void Line (void)
{
speedRight = medspeed - ((i*abs(i))/quadteiler);
speedLeft = medspeed + ((i*abs(i))/quadteiler);
if (speedRight > maxspeed) speedRight = maxspeed;
if (speedLeft > maxspeed) speedLeft = maxspeed;
if (speedRight < -maxspeed) speedRight = -maxspeed;
if (speedLeft < -maxspeed) speedLeft = -maxspeed;
if (speedRight < 0) {MotorDir (FWD,RWD); sR=-speedRight;sL=speedLeft;}
else if (speedLeft < 0) {MotorDir (RWD,FWD); sL=-speedLeft;sR=speedRight;}
else {MotorDir(FWD,FWD);sL=speedLeft;sR=speedRight;}
}

int main(void)
{
Init();

FrontLED(ON);
for (i = 0; i < 0xFF; i++) LineData(lineData);
speedLeft = speedRight = 120;
for(;;) {

LineData(lineData);
i = lineData[0] - lineData[1];
if (i > 0) {
StatusLED(GREEN);
Line();
}
else if (i < 0) {
StatusLED(RED);
Line();
}
else {
StatusLED(OFF);
speedLeft = speedRight = medspeed;
MotorDir(FWD,FWD);
sL=speedLeft;sR=speedRight;
}
MotorSpeed(sL,sR);
SerWrite("Akkuladung: ",12);
PrintInt(Batterie());
SerWrite("\n\r",3);


}
}


Bei diesem Code, ist allerdings die Linienverfolgung miserabel. Könnte mir jemand einen Tipp geben, wie man es optimieren könnte ?


Und noch eine Frage:
Kann man die Akkus auch aufladen, wenn der Asuro eingeschaltet ist ?


===========================
Vielen Dank!

ThugBone
05.01.2006, 10:25
Hab ein erneutes Problem. Das folgende Programm funktioniert nach meiner Zufriedenheit:


#include "asuro.h"
#include <stdlib.h>

#define maxspeed 130
#define medspeed 120
#define quadteiler 30

int speedLeft,speedRight, sR, sL, i;
unsigned int lineData[2];
unsigned int zaehler = 0;
int bat;

void Line (void)
{
speedRight = medspeed - ((i*abs(i))/quadteiler);
speedLeft = medspeed + ((i*abs(i))/quadteiler);
if (speedRight > maxspeed) speedRight = maxspeed;
if (speedLeft > maxspeed) speedLeft = maxspeed;
if (speedRight < -maxspeed) speedRight = -maxspeed;
if (speedLeft < -maxspeed) speedLeft = -maxspeed;
if (speedRight < 0) {MotorDir (FWD,RWD); sR=-speedRight;sL=speedLeft;}
else if (speedLeft < 0) {MotorDir (RWD,FWD); sL=-speedLeft;sR=speedRight;}
else {MotorDir(FWD,FWD);sL=speedLeft;sR=speedRight;}
}

int main(void)
{
Init();
FrontLED(ON);
for (i = 0; i < 0xFF; i++) LineData(lineData);
speedLeft = speedRight = 200;
for(;;) {
zaehler++;
if (zaehler == 2500) {
bat = Batterie();
zaehler = 0;
PrintInt(bat);
if(bat > 550){
StatusLED(GREEN);
}
else{
StatusLED(RED);
}
}
LineData(lineData);
i = lineData[0] - lineData[1];
if (i > 0) {
Line();
}
else if (i < 0) {
Line();
}
else {
speedLeft = speedRight = medspeed;
MotorDir(FWD,FWD);
sL=speedLeft;sR=speedRight;
}
MotorSpeed(sL,sR);
}
}






Nun brauch i das Programm ohne Linienverfolgung - hab mir folgendes gedacht:




#include "asuro.h"
#include <stdlib.h>


unsigned int zaehler = 0;
int bat;



int main(void)
{
Init();

for(;;) {
zaehler++;
if (zaehler == 2500) {
bat = Batterie();
zaehler = 0;
PrintInt(bat);
if(bat > 550){
StatusLED(GREEN);
}
else{
StatusLED(RED);
}
}

}
}


Jedoch werden jetzt ganz andere Werte, als vorher ausgeben. Beim obersten Programm Werte um 580 beim unteren Programm Werte von 830 ?

Kann jemand helfen ?

oder weiß jemand welche Werte bei der Batterie-Funktion ausgegeben werden müssten ?

Danke