Ersteinmal ... findet ihr es realistisch, das man ein Program schreiben kann, wobei man erstmal die Variablen für die Strecke und den Winkel auf jeden Asuro individuell Kallibrieren kann, sodass die Werte immer ziemlich genau sind und dass man dann nurnoch die Strecke und den Winkel eingeben muss?

Danke für die Tipps. Ich habe sie versucht einzubauen und will die Zahlen jezt nur zum testen sozusagen die Werte über IR senden. Ich weis, dass die Werte bei SerRead nur unsigned char sind und ich das auf int oder float eingeben können muss. hat vielleicht jemand eine idee wie ich das machen kann?

ich hab schoneinmal solchein Programtext versucht, allerdings funktioniert dies nicht aus besagten Gründen.

Hier einmal der Quelltext

Code:

#include "asuro.h"

int main (void)
{
	Init();
	int x, c, n, r, k = 0, o;
	int degree;
	int distance;
	int speed;
	int speedd;
	int sl, sr;
	unsigned char speedl;
	unsigned char speedr;
	char emfangene_daten [1];
	degree = 90;
	distance = 500;
	speed = 200;
	o = 25;
	do
	{
		for (x=0;x<50;x++)
		{

			r = x * 10;

			c = PollSwitch();
			sr = speed;
			sl = speed;
			
			switch (c)
			{
// Tasten um zum ermitteln der Werte bestimmte Werte einzugeben.
// Problem mit unsigned char und int ???

case 1: SerPrint ("X (49 = Ende) Erste Zahl: \n\r: ");
			SerRead (emfangene_daten, 1, 0);
			x = emfangene_daten [0] * 10;
			SerPrint ("X (49 = Ende) Zweite Zahl: \n\r: ");
			SerRead (emfangene_daten, 1, 0);
			x = x + emfangene_daten [0];
			break;

case 2: SerPrint ("R (Winkelkalibrierung) Erste Zahl: \n\r: ");
			SerRead (emfangene_daten, 1, 0);
			r = emfangene_daten [0] * 10;
			SerPrint ("R (Winkelkalibrierung) Zweite Zahl: \n\r: ");
			SerRead (emfangene_daten, 1, 0);
			r = r + emfangene_daten [0];
			break;
			
case 4: SerPrint ("O (Streckenkalibrierung (~25)) Erste Zahl: \n\r: ");
			SerRead (emfangene_daten, 1, 0);
			o = emfangene_daten [0] * 10;
	SerPrint ("O (Streckenkalibrierung (~25)) Zweite Zahl: \n\r: ");
			SerRead (emfangene_daten, 1, 0);
			o = o + emfangene_daten [0];
			break;
					
case 8: SerPrint ("Winkel Erste Zahl: \n\r: ");
			SerRead (emfangene_daten, 1, 0);
			degree = emfangene_daten [0] * 10;
			SerPrint ("Winkel Zweite Zahl: \n\r: ");
			SerRead (emfangene_daten, 1, 0);
			degree = degree + emfangene_daten [0];
			break;
					
case 16:SerPrint ("Strecke Erste Zahl: \n\r: ");
			SerRead (emfangene_daten, 1, 0);
			distance = emfangene_daten [0] * 10;
			SerPrint ("Strecke Zweite Zahl: \n\r: ");
			SerRead (emfangene_daten, 1, 0);
			distance = 10 * (distance + emfangene_daten [0]);
			break;
					
case 32:SerPrint ("Geschwindigkeit Erste Zahl: \n\r: ");
			SerRead (emfangene_daten, 1, 0);
			sr = emfangene_daten [0] * 100;
			SerPrint ("Geschwindigkeit Zweite Zahl: \n\r: ");
			SerRead (emfangene_daten, 1, 0);
			sl = emfangene_daten [0] * 10;
			SerPrint ("Geschwindigkeit Dritte Zahl: \n\r: ");
			SerRead (emfangene_daten, 1, 0);
			speed = emfangene_daten [0] + sl + sr;
			break;
			}
			sr = speed;
			sl = speed;

			r = x * 10;
		
			if (speed > 255)
			{
				speed = 255;
			}

			if (speed < 0)
			{
				speed = 0;
			}
		
			if (distance >= 0)
			{
				MotorDir (FWD,FWD);
				k = 1;
			}

			if (distance < 0)
			{
				MotorDir (RWD,RWD);
				k = 2;
			}
		
			if (degree < 0)
			{
				speedd = degree * r / distance;
				sl = speed + speedd;
				sr = speed - speedd;
			}
			if (degree > 0)
			{
				speedd = degree * r / distance;
				sl = speed - speedd;
				sr = speed + speedd;
			}

			if (speedl > 255)
			{
				speedd = sl - 255;
				sr = 255 - speedd;
				sl = 255;
			}
			if (speedr > 255)
			{
				speedd = sr - 255;
				sl = 255 - speedd;
				sr = 255;
			}

			SerPrint ("\n\rX: ");
			PrintInt (x);
			SerPrint ("\n\rWinkel: ");
			PrintInt (degree);
			SerPrint ("\n\rWeg: ");
			PrintInt (distance);
			SerPrint ("\n\rGeschwindigkeit: ");
			PrintInt (speed);
			SerPrint ("\n\rGeschwindigkeit Rechts: ");
			PrintInt (speedr);
			SerPrint ("\n\rGeschwindigkeit Links: ");
			PrintInt (speedl);
			SerPrint ("\n\rC: ");
			PrintInt (c);
			SerPrint ("\n\rO: ");
			PrintInt (o);
			SerPrint ("\n\rR (Winkelkalibrierung): ");
			PrintInt (r);
			SerPrint ("\n");

			if (c > 0) {Msleep (10000);}

			speedr = sr;
			speedl = sl;
	
			n = distance * o / speed;

			Msleep (200);
			MotorSpeed (speedl,speedr);
			for (c=0;c<n;c++) {Msleep (30);}
			MotorSpeed (0,0);
			Msleep (200);

			if (k == 1)
			{MotorDir (RWD,RWD);}
			if (k == 2)
			{MotorDir (FWD,FWD);}	

			MotorSpeed (speedl,speedr);
			for (c=0;c<n;c++) {Msleep (30);}
			MotorSpeed (0,0);
		}
	}
	while (1);
	return 1;
	BackLED (ON,ON);
}
Ich hab die Zeit, also für die Distanz, auch in eine Schleife gesetzt, da es jetzt nicht bei einer bestimmten Zahl abbricht und wieso würdest du fload statt int nehmen? Ich hab das Problem, dass mein einer Motor schneller als der andere läuft und deshalb müsste noch eine Odemerie-messung mit eingebaut werden, oder man kann es im Programm am anfang Kallibrieren. Hat jemand eine Idee?