-         

Ergebnis 1 bis 9 von 9

Thema: Odometriewerte ausgeben? + Linienverfolgung-"Feinabstim

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    25.10.2010
    Alter
    22
    Beiträge
    21

    Odometriewerte ausgeben? + Linienverfolgung-"Feinabstim

    Anzeige

    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

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.266
    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

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    25.10.2010
    Alter
    22
    Beiträge
    21
    danke schonmal fürs erste ich teste es morgen mal aus.

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.167
    Wie machst du den Linien-steuerung nun?

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    25.10.2010
    Alter
    22
    Beiträge
    21
    Code:
    /*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.

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.167
    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.

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    25.10.2010
    Alter
    22
    Beiträge
    21
    Code:
    #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.

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.167
    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?

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    25.10.2010
    Alter
    22
    Beiträge
    21
    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.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •