PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bei linienverfolgung umdreungen der räder zählen mit odometr



Touby_van
08.03.2008, 17:08
Hi wieder einmal

hab da mal einen code geschrieben wo mir der asuro die anzahl von schwarz weis feldern erkennt und dan den durchschnitt der beiden rädern am schluss ausgiebt nach dem ich stop sage. Das programm funktioniert ohne die odometrie einwandfrei doch nun läuft gar nichts mehr mit diesem code. ähm ist es überhaupt möglich die odometrie auszuwerten während dem linienverfolgen??
#include "asuro.h"

#define TRIGGERLEVEL 600
#define HYSTERESIS 10
#define HIGH 1
#define LOW 0

int main(void)
{
unsigned char data[] = "0123";
unsigned int i;
unsigned int linien_verfolgen ( int );
int Odometrie_zaehler( int *a , int *b );



Init ();

while (1)
{
for (i = 0; i < 100; i++)
Sleep (72);

SerRead (data, 3, 0);

for (i = 0; i < 100; i++)
Sleep (72);

if (data[0] == 'A' && data[1] == 'S' && data[2] == 'U')


linien_verfolgen ( 120 );


else if (data[0] == 'G' && data[1] == 'O' && data[2] == 'A')


linien_verfolgen ( 155 );


else if (data[0] == 'G' && data[1] == 'O' && data[2] == 'B')

linien_verfolgen ( 180 );


else if (data[0] == 'G' && data[1] == 'O' && data[2] == 'C')


linien_verfolgen ( 200 );


else
SerWrite ("falsch", 6);

}


return 0;
}

int linien_verfolgen ( int speed )
{
unsigned int data2[2];
unsigned char data3[] = "0123";
int count1 = 0;
int count2 = 0;
int count = 0;

Init();
FrontLED(ON);
MotorDir(FWD,FWD);

while(1) {

SerRead (data3, 3, 0);


if (data3[0] == 'S' && data3[1] == 'T' && data3[2] == 'O'){
count = count1 + count2;
count = count/2;
SerWrite (" count ", 7);
PrintInt(count);
count1 = 0;
count2 = 0;
break;
}
else
{
SerWrite ("falsch", 6);

LineData(data2);
if(data2[0]>data2[1])
{
MotorSpeed(speed,0);
BackLED(ON,OFF);
Odometrie_zaehler ( count1, count2);
}
else if (data2 [0] < data2 [1] )
{
MotorSpeed(0,speed);
BackLED(OFF,ON);
Odometrie_zaehler ( count1, count2);
}
else
{
MotorSpeed(speed,speed);
BackLED(ON,ON);
Odometrie_zaehler ( count1, count2 );
}
}
}
return 0;
}

int Odometrie_zaehler ( int *a , int *b )
{


unsigned int data [2];
signed int status [2] = {0, 0};

Init();

OdometrieData(data);

if ((status [ 0 ] == LOW) && (data [0] > TRIGGERLEVEL + HYSTERESIS)) {
status [0] = HIGH;
*a ++;
}

if ((status [ 0 ] == HIGH) && (data [0] < TRIGGERLEVEL + HYSTERESIS)) {
status [0] = LOW;
*a ++;
}
if ((status [ 1 ] == LOW) && (data [1] > TRIGGERLEVEL + HYSTERESIS)) {
status [1] = HIGH;
*b ++;
}

if ((status [ 1 ] == HIGH) && (data [1] < TRIGGERLEVEL + HYSTERESIS)) {
status [1] = LOW;
*b ++;
}

return 0 ;

}

damaltor
09.03.2008, 17:05
ja, möglich ist das. nur backleds und odometrie stören sich.
was genau macht der asuro mit dem code?

Touby_van
09.03.2008, 18:28
zuerst kann gewählt werden mit welcher geschwindigkeit der asuro fahren soll. egal in welchem gang er dann fährt soll er die drehzahl der räder ausgeben nach dem stop gesendet wurde. anschliessend kommt man dan wieder in das menu wo man sagt in welchem gang der asuro fahren soll

damaltor
09.03.2008, 20:27
ok. und was passiert wenn du den code flashst? was genau ist der fehler?

Sternthaler
12.03.2008, 23:48
Hallo Touby_van,

in deiner Funktion linien_verfolgen() benutzt du innerhalb der dortigen while()-Schleife den Befehl SerRead() im blokierenden Mode. (Der letzte Parameter ist eine 0) Das bedeutet, dass immer erst 3 Zeichen empfangen werden müssen, bevor die Schleife, und damit die aufzurufenden LineData()- / Odometrie_zaehler()-Funktion überhaupt einmal zum Arbeiten kommen.
BTW: Du solltes auch auf das Senden mit "SerWrite ("falsch", 6);" verzichten, da dies sehr viel Zeit (6*ca.4ms) in Anspruch nimmt in der du die Sensoren nicht bearbeitest. Da wirst du wahrscheinlich dann sehr viele schwarz/weiss-Wechsel an der Odometrie nicht mitbekommen.

Ich vermute, dass der Asuro sich keinen Millimeter von der Stelle bewegt.

Gruß Sternthaler

@damaltor
Ich muss es einfach noch mal erwähnen: Deine Fußzeilen (nicht nur die) sind immer wieder gut. ;-)