PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Odometriewerte ausgeben? + Linienverfolgung-"Feinabstim



MST1
27.10.2010, 17:10
Hallo zusammen,
am Sonntag bin ich endlich dazu gekommen meinen Asuro zusammenzubauen(mit hilfe meines Vaters).
Ich hab jetzt ein wenig expermentiert und hab 2 kleinere Probleme.

1. Problem:
Ich möchte gerne die Odometriedaten über Hyperterminal ausgeben lassen, jedoch hab ich keine Ahnung wie es geht, da ich ja kein int als char ausgeben kann bzw net richtig.

2. Problem:
Die Lininenverfolgung funktioniert zwar generell, jedoch werden manchal hell-dunkel-Unterschiede gemessen wo keine sind, gibt es da eine Art "Feinabstimmung"?

Im vorraus schonmal Danke für eure Hilfe.

mfg
Mario

shedepe
27.10.2010, 20:52
Hallo,

Das Erste kannst du mit der Bibliotheksfunktion itoa() machen (einfach kurz danach googeln wie die korrekte Syntax der Funktion ist)

Beim zweiten kann ich dir leider nicht helfen da ich keinen Asuro besitze

MST1
27.10.2010, 20:55
danke schonmal fürs erste ich teste es morgen mal aus.

Valen
29.10.2010, 14:08
Wie machst du den Linien-steuerung nun?

MST1
29.10.2010, 15:36
/*anderer Code*/
{
FrontLED(ON);
unsigned int line[2];
LineData(line);
if (line[0] == line[1])
{
MotorDir(FWD,FWD);
MotorSpeed(200,200);
StatusLED(GREEN);
BackLED(ON,ON);
}
else if(line[0] < line[1])
{
MotorDir(FWD,FWD);
MotorSpeed(150,200);
StatusLED(GREEN);
BackLED(OFF,ON);
}
else
{
MotorDir(FWD,FWD);
MotorSpeed(200,150);
StatusLED(GREEN);
BackLED(ON,OFF);
}
/*weiteren Code*/


Das is der Teil der für die Lininenverfolgung zuständig ist. Der restliche (nicht gezeigte) Code hat keinen Einfluss auf diesen Codeausschnitt.

Valen
29.10.2010, 16:28
Ob den Restliche Code kein Einfluss hat wurde ich nicht Ausschließen. Aber ok. Es gibt schon ein erklärbare Ursache in deinem Code.

Den Messwert-kurve der beiden Linien Sensoren ist nicht gleich wegen Bautoleranzen (Fototransistor selbst, und den Wiederstande mit dem es ein Spannungsteiler macht, Orientierung usw.). Sie können unterschiedliche Messwerten zurück geben, eben wen sie über eine Gleich-massige Untergrund stehen. Die Werten sind fast nicht das selbe ohne Justierung. Das kann eben abhängig sein von ob es über einem Schwarze oder Weiße Untergrund steht weil sie nicht ganz gleich empfindlich sind. Eine erste 'Feinabstimmung' könnte sein erst die Differenz zwischen den beiden Werten zu errechnen (line[0]-line[1]; uber gleich-massige Untergrund beim Stillstand), und das später bei den Linien-fahrt nach jeder Messung von den momentane Differenz ab zu ziehen. Dan hat jeder messung entlang den Linie den Gleichen referenz wert. Den Motoren können aber auch den Messwerten ein wenig stören. Deshalb ist vielleicht auch ein kleine Hysteresis erforderlich zwischen Links und Rechts ablenken. (line[0]-line[1]-referenzdifferenz > oder < als zbs. 5) Dan wird es nicht so nervös steuern wen er schon uber ein linie steht.

Wie oft wechseln bei dir den Backleds?

Es gibt auch Beispielen hier im Forum wo 2 Messungen gemacht werden, einer mit eingeschaltete und einer mit abgeschaltete LED. Damit wird den Einfluss von Umgebungslicht beheben.

MST1
29.10.2010, 17:39
#include <stdio.h>
#include "asuro.h"

int main(void)
{
Init();
while(1)
{
int data[2];
OdometrieData(data);
int a = data[0];
int b = data[1];
char buffer1[10];
char buffer2[10];
int n = sprintf(buffer1,"%d",a);
int o = sprintf(buffer2,"%d",b);
SerWrite("\nWert links: \n",16);
int x;
for(x=0;x<10;x++)
{
SerWrite(buffer1,n);
}
SerWrite("\nWert rechts: \n",17);
int y;
for(y=0;y<10;y++)
{
SerWrite(buffer2,o);
}
int taster = PollSwitch();
while(taster == 0)
{
FrontLED(ON);
unsigned int line[2];
LineData(line);
if (line[0] == line[1])
{
MotorDir(FWD,FWD);
MotorSpeed(200,200);
StatusLED(GREEN);
BackLED(ON,ON);
}
else if(line[0] < line[1])
{
MotorDir(FWD,FWD);
MotorSpeed(150,200);
StatusLED(GREEN);
BackLED(OFF,ON);
}
else
{
MotorDir(FWD,FWD);
MotorSpeed(200,150);
StatusLED(GREEN);
BackLED(ON,OFF);
}
int j;
for(j=0;j<20;j++)
{
Sleep(255);
}
taster = PollSwitch();
}
if(taster >= 8)
{
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(200,200);
int i;
for(i=0;i<100;i++)
{
Sleep(255);
}
MotorDir(BREAK,RWD);
MotorSpeed(0,200);
int j;
for(j=0;j<170;j++)
{
Sleep(255);
}
}
else
{
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(200,200);
int i;
for(i=0;i<100;i++)
{
Sleep(255);
}
MotorDir(BREAK,FWD);
MotorSpeed(0,200);
int j;
for(j=0;j<170;j++)
{
Sleep(255);
}
}
}
return 0;
}

Das ist der komplette Code, welcher auch funktioniert hat.
Ich werde deine Idee später einbauen.

Valen
30.10.2010, 15:56
Den restliche Code in deinem Programm hat tatsächlich kein Einfluss auf deinem Programm. Genauer gesagt aber nur wenn den Motoren den Tastenmessung nicht stören. Das tun sie aber oft wenn sie drehen. Weil bei ein Falsch bemerkte Taster Eindruck die While-schleife verlassen wird, und er dann ein kurzes Drehung machen soll. Aber das macht er nicht, oder?

MST1
31.10.2010, 19:57
doch er dreht, es passt alles.
Zu deiner Lösung, ich versteh sie nicht wirklich, liegt wahrscheinlich daran das ich Anfänger bin und von Regelprozesse und so Sachen keine Ahung habe. Hast du einen Link wo man sich darin ein bisschen einlesen kann, weil Wikipedia-Erkärungen sind sehr schwer zu verstehen zum Teil.