PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro drehen lassen



diesy2
18.11.2005, 22:15
Hallo,

ich habe ein recht komischen Vorfall.

Ich möchte den Asuro einmal um 90° links und einmal um 90° rechts drehen lassen.

Meine Funktion für links geht da ganz gut nur rechts will der nicht so recht. Da dreht er ein wenig mehr als 300°

Dazu muß ich sagen, dass ich dies über die Odometrie mache. Dafür habe ich die Schwarz/weiß flächen umgebaut. nun habe ich halb schwarz und halb silber. Somit habe ich das "Rauschen" wegbekommen und der kleine fährt eine super linie.

Hier mal mein code



#include "asuro.h"

unsigned int data[2];

int OdoDifferenz;
int wegzaehler=0;
unsigned int lineData[2];

char zeichen[4];
int start=0,wechsel=0;
int schwarz=0,silber=0;
int odo=0;
int exit=0;

void einmalrechts(void)
{
schwarz=0;
silber=0;
start=0;
wechsel=0;
OdometrieData(data);

if (data[0]<110)
{
start=0;
wechsel=0;
}
else
{
start=1;
wechsel=1;
}



if(start==0)
{
while(schwarz<8 && silber <7)
{
MotorDir(FWD,FREE);
MotorSpeed(110,0);
OdometrieData(data);
if(data[0]<110 && wechsel!=0)
{
silber++;
wechsel=0;
}
else if (data[0]>110 && wechsel!=1)
{
schwarz++;
wechsel=1;
}
SerWrite("Silber: ",8);
itoa(silber,zeichen,10);
SerWrite(zeichen,sizeof(zeichen));
SerWrite("Schwarz: ",9);
itoa(schwarz,zeichen,10);
SerWrite(zeichen,sizeof(zeichen));

}
}
else
{
while(schwarz<8 && silber <7)
{
MotorDir(FWD,FREE);
MotorSpeed(110,0);
OdometrieData(data);
if(data[0]<110 && wechsel!=0)
{
silber++;
wechsel=0;
}
else if (data[0]>110 && wechsel!=1)
{
schwarz++;
wechsel=1;
}

SerWrite("Silber: ",8);
itoa(silber,zeichen,10);
SerWrite(zeichen,sizeof(zeichen));
SerWrite("Schwarz: ",9);
itoa(schwarz,zeichen,10);
SerWrite(zeichen,sizeof(zeichen));

}
}

MotorSpeed(0,0);
MotorDir(FWD,FWD);
BackLED(ON,ON);
}

void undjetzt_links(void)
{
schwarz=0;
silber=0;
start=0;
wechsel=0;
OdometrieData(data);

if (data[1]<110)
{start=0;
wechsel=0;}
else {start=1;
wechsel=1;}



if(start==0)
{
while(schwarz<8 && silber <7)
{

MotorDir(FREE,FWD);
MotorSpeed(0,110);
OdometrieData(data);

if(data[1]<110 && wechsel!=0)
{
silber++;
wechsel=0;
}
else if (data[1]>600 && wechsel!=1)
{
schwarz++;
wechsel=1;
}


}
}
else
{
while(schwarz<8 && silber <7)
{
MotorDir(FREE,FWD);
MotorSpeed(0,110);
OdometrieData(data);

if(data[1]<110 && wechsel!=0)
{
silber++;
wechsel=0;
}
else if (data[1]>600 && wechsel!=1)
{
schwarz++;
wechsel=1;
}
}
}

MotorSpeed(0,0);
MotorDir(FWD,FWD);
}

int main(void)
{

Init();
einmalrechts();
undjetzt_links();

return 0;
}



Evtl. kann man das noch besser lösen!!?

Rakke
19.11.2005, 12:31
Hei diesy2,

ein paar Sachen fallen mir auf:

* beim Rechtsdreh fragst du auf <110 und >110 ab, beim Linksdreh auf <110 und >600 ab. Eine Hysterese tut sicherlich not, aber diese schein mir sehr groß zu sein. Lass dir doch die Werte der rechten Odo-Sensorik auch mal ausgeben, wie du es beim Rechtsdreh schon machst.
* Beim Rechtsdreh hast du Ausgaben über die serielle Schnittstelle drin. Die brauchen ewig, beim Linksdreh fehlen die. Es gibt also auf jeden Fall ein unterschiedliches Timing in den Funktionen.
* Ich bin kein C-Profi, meine aber, dass du bei logischen Verknüpfungen innerhalb von if/while/...-Abfragen Klammern setzen musst; auf jeden Fall solltest du, z. B. also while((schwarz<8 ) && (silber <7)). Keine Ahnung, was der Compiler da sonst draus macht.
* Es gibt hier im Forum einige geniale Erweiterungen für den Asuro. Dabei werden die Odometrie-Sensoren interruptgesteuert ausgewertet, dadurch gehen praktisch keine Ticks verloren. Im Programm kann man dann ganz einfach zwei globale Variablen verwenden, die die rechtenund linken Ticks beinhalten. Die Erweiterung kommt in Form einer neuen Asuro.c und Asuro.h und gibt außerdem noch eine Funktion namens PrintInt(int) mit - ganz praktisch. Hier findest du den letzten Entwicklungsstand der Dateien: https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=11256



Viel Erfolg,

Rakke

diesy2
19.11.2005, 13:18
Danke für deine Antwort.

Deine Anmerkungen aus Punkt 1 und 2 habe ich verbessert. Leider geht es immernoch nicht.

edit:
Jetzt geht es. Nur hört er nicht auf wenn er einmal durch ist. Woran kann das liegen?

Danny
22.11.2005, 10:27
Hi,

schreib vor das return 0; noch ein while(1); damit der in ner Endlosschleife bleibt. Bei einfach nur return 0; soll der Mikrocontroller wohl probleme haben.



while(1);
return 0;

diesy2
22.11.2005, 12:18
Danke für den Tipp.

Ich habe aber einfach die Asuro.c .h getauscht und dann gings komischerweise.

Rakke
22.11.2005, 19:14
Hei,

gegen welche asuro.h hast du denn welche getauscht?

diesy2
22.11.2005, 19:21
Na ich habe deinen Link genommen und bin dann auf die Seite von Andun oder so.