Hi!

Also, den Asuro hab ich jetzt seit ca. 4 Tagen. MANMANMAN macht das Teil Böcke! \/

Ich hab jetzt Verschiedenes ausprobiert und bin ein wenig an der Linienverfolgung hängen geblieben. Was mir nicht gefallen hat: Bisherige Lösungen sind entweder linear abhänging (und neigen damit zum "Wackeln" auf geraden Strecken) oder "schalten" praktisch gesehen einfach nur die Geschwindigkeit einer Seite auf Null (wie das Beispielproggi im Lieferumfang). Was ich gesucht habe ist eine kontinuierliche Regelung, die bei leichten Abweichungen auch nur leicht reagiert, bei stärkeren entsprechend auch stärker (auch mit negativen Geschwindigkeiten!).

Nach einigem probieren, hier jetzt eine meiner Meinung nach sehr passable Lösung: Quadratisch abhängige Regelung. Sprich: Die Differenz des Liniensensors wird zunächst quadriert und anschließend als Korrektur für beide Motoren verwendet. Dies verträgt sich ganz gut mit den Motoren, deren Anlaufverhalten ist ja auch alles andere als linear. Das Ergebniss: Auf geraden Strecken wackelt der Asuro deutlich weniger, gleichzeitig werden aber sehr viel engere Kurven genommen!

Hier der Code:

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

#define maxspeed 130 /* gibt sowohl die maximal positive als auch die maximal negative
Geschwindigkeit an, guter Mittelwert etwa 140 */
#define medspeed 120 /* gibt die den Durchschnitt der Geschwindigkeit beider Seiten an, 
guter Mittelwert etwa maxspeed-20 */
#define quadteiler 30 /* Quotient des Liniensensors. Umso niedriger desto mehr neigt der
Asuro zum "Wackeln" auf geraden Strecken, aber er nimmt auch engere Kurven. Umgekehrt umso
höher dieser Wert, desto schneller fährt der Asuro die Strecke ab (ohne Wackeln), aber es 
werden zu enge Kurven "überfahren" Gute Werte zwischen etwa 10-100, guter Mittelwert 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);
	} 
}
Würde mich natürlich freuen, wenn hier mal ein paar Leute bei Interesse eine Art "Review" geben würden, da das ja mein erstes "richtiges" Proggi ist. Es kann sein das die ersten drei definierten Werte deutlich angepasst werden, da ich meinen Liniensensor etwas aufgemotzt hab (siehe Bilder hier: https://www.roboternetz.de/phpBB2/vi...5bbb8386cc6d7d)
Für "normale" Asuros empfehl ich aus dem Bauch bspw. einen quadteiler von ca. 10-30, bin mir aber nicht sicher.

Nojo, wie auch immer, hoffe euch gefällts. Gruß payce.