- Labornetzteil AliExpress         
Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 37

Thema: ASURO Dunkel-Hell-Kantenverfolgung

  1. #21
    Benutzer Stammmitglied
    Registriert seit
    10.05.2007
    Alter
    39
    Beiträge
    31
    Anzeige

    Powerstation Test
    Hallo,

    jetzt möchte ich meinem alten Programm gerne zur Umgebungslichtkompensation was hinzufügen.
    Da ich ja auf einer Schwarz-Weiß-Kante fahre, ist meine Idee folgende:
    Ich stehe auf der Kante, links schwarz rechts weiß.
    Ich messe nun also auf beiden Transistoren jeweils mit LED on und off.
    Dann bilde ich die Differenz aus den Messwerten des linken bzw. rechten Transistors. Da links auf schwarz steht, müsste sich ja hierfür eine andere Differenz ergeben als für den rechten Transistor.

    Code:
     Init();
     FrontLED(Off);
     LineData(data); //links->schwarz, rechts->weiß
     a=data[0];
     b=data[1];
     FrontLED(On);
     c=data[0];
     d=data[1];
     schwarz=c-a;
     weiß=d-b;
    Das habe ich also soweit.
    Das würde ich gerne in eine Funktion umgeblicht packen, damit ich im mainprogram nur noch umgeblicht aufrufen muss.
    Jetzt ist aber mein Problem, dass ich an die Differenzwerte für Weiß und Schwarz nicht rankomme. Wie bekomme ich denn den Digitalwert?
    Desweiteren hab ich mit der funktion so meine Probleme.

    int umgeblicht (LineData(Data));
    {
    int a,b,c,d,schwarz,weiß;
    FrontLED(Off);
    LineData(data); //links->schwarz, rechts->weiß
    a=data[0];
    b=data[1];
    FrontLED(On);
    c=data[0];
    d=data[1];
    schwarz=c-a;
    weiß=d-b;
    }
    so würde ich meine Funktion basteln und dann im main einbauen.
    Ist das so in etwa richtig? Bin ich auf dem richtigen Kurs?

    Ich weiß, das sieht alles ziemlich unkoordiniert aus

    Wenn ich dann mal den Differenzwert habe, dann kann ich das in dem obigen(von damaltor) verbesserten Programm als Bedingung in den if Anweisungen einbauen.
    Andererseits habe ich mir auch überlegt, dass ich die Differenz zwischen Links und Rechts bilde, das müsste ja, wenn man auf Kurs ist, immer einen festen Wert ergeben.
    Beides hört sich für mich plausibel an...aber am Programmieren haperts halt wieder.

    Ich hoffe ihr könnt mir mal wieder helfen!!

    Liebe Grüße

  2. #22
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    an sich ganz fein, aber damit misst du nicht das umgebungslicht, sondern nur den unterschied zwischen frontled on und off. wozu?

    teste erstmal das programm ob das überhaupt funktioniert, bevor du es verfeinerst...
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  3. #23
    Benutzer Stammmitglied
    Registriert seit
    10.05.2007
    Alter
    39
    Beiträge
    31
    Morgen!
    Also mein Gedanke war, wenn ich zB mit dem linken Sensor auf einer schwarzen Fläche stehe, dann müsste die Differenz der beiden linken Sensorwerte(LED ON OFF) einen ~gleichbleibenden Wert ergeben. Völlig aus dem Hut gezogen sage ich jetzt einfach für eine schwarze Fläche ergibt sich eine Differenz von 100, und für eine weiße etwa 200. Somit hätte ich ja eine Bedingung dafür, ob sich ASURO auf Kurs befindet, oder ob er neben der Spur liegt.
    Was ich mir aber da eingehandelt hab, kam mir erst später in den Sinn: Ich muss immer erst 2mal messen, einmal mit einmal ohne LED, muss die Werte zwischenspeichern, und die müsste ich dann mit Referenzwerten vergleichen, also mit diesen 100 und 200 (welche ich natürlich nicht habe).
    Ist es möglich, dass mir ASURO diese Werte schickt (per IR nach dem Programmablauf)? Und dann müsste ich vor jeder while Schleife, von denen ich momentan ja Stück habe, diese Messung machen, und das wird dann ja relativ lange für eine so kleine Funktion!
    Ich hoffe, meine Idee mit dem Differenzwert einer LED ist klar, ob die so funktioniert weiß ich nicht.

    Leider kann ich das auch noch nicht testen, da mein ASURO noch nicht da ist. Und selbst dann muss ich den erst mal zum laufen bringen

  4. #24
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    die idee sollte gehen. die werte kannst du bei jedem mal wo das programm gestertet wird, neu einlesen und in einer variable speichern. wenn sie sich dauerhaft sehr ähneln, dann könnte man sie auch im eeprom des prozessors speichern. eine kurzzeitige messung mit quasiblinkender led ist kein problem. nur den sinn des ganzen verstehe ich nicht. wozu wissen wo der unterschied ist?
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  5. #25
    Benutzer Stammmitglied
    Registriert seit
    10.05.2007
    Alter
    39
    Beiträge
    31
    Na ich möchte gerne den Unterschied zwischen schwarzer und weißer Fläche wissen, unabhängig davon, wie die Lichtverhältnisse sind. Wenn ich von den Schwellenwerten 450 und 550 ausgehe, dann sind die ja immer noch vom Umgebungslicht abhängig. Mit dieser Differenzbildung möchte ich gerne einen zu einer best. Farbfläche korrespondierenden Wert erhalten.
    Wenn der ASURO dann über das Feld fährt, und stets diese Messung macht und mit dem Differenzwert vergleicht, weiß er, ob am linken Sensor was anderes anliegt als am rechten. Und das halt auch, wenn unterschiedliche Lichtverhältnisse vorliegen. (Ich denke das mit 450 und 550 sollte hier OHNE Probleme auch funktionieren, nur ist das mit dem Umgebungslicht halt Teil der Aufgabe!!!).
    Ich würde das ja mal gern versuchen, aber ich kann ja nicht.

    Wie würdest du das, was ich da vorhabe denn in eine Funktion packen?
    Ich habs ja oben schon mal versucht...ich will die definieren und dann nur im Programm aufrufen müssen.

    Oder eben so: Wie könnte man denn die Umgebungslichtkompensation noch/sonst machen?

  6. #26
    Benutzer Stammmitglied
    Registriert seit
    10.05.2007
    Alter
    39
    Beiträge
    31
    Also so hab ich mir das vorgestellt. Bitte nicht auf die Feinheiten achen

    Code:
    #include "asuro.h"
     
    int RefLinks(LineData);  //Funktion für Differenzwert Links
    FrontLED(ON);
    LineData(Data);
    a=data[0];
    FrontLED(OFF);
    LineData(Data);
    c=data[0];
    LRef=a-c;
    return LREF;
    
    int RefRechts(LineData);	//Funktion für Differenzwert Rechts
    FrontLED(ON);
    LineData(Data);
    b=data[1];
    FrontLED(OFF);
    LineData(Data);
    d=data[1];
    RRef=b-d;
    return RRef;
    
    int main(void)
    {
    
    unsigned int data[2]; //data[0]->links, data[1]->rechts
    unsigned char speed=150;
    unsigned char taste;
    
    Init();
    
    FrontLED(ON);
    LineData(Data);
    a=data[0];
    b=data[1];
    FrontLED(OFF);
    LineData(Data);
    c=data[0];
    d=data[1];
    LRef=a-c;	//Aktueller Referenzwert Links
    RRef=b-d;	//Aktueller Referenzwert Rechts
    
    if ((data[0]<450)&&(data[1]>550)) { // links schwarz rechts weiß
    while (1){
    LREF = RefLinks(LineData);		//Aufrufen der Funktion
    RRef = RefRechts(LineData);		//Aufrufen der Funktion
    if (LRefakt > LRef );{			//zu weit rechts->links weniger speed
    speed=speed-10;
    }
    if (RRefakt < RRef );{			//zu weit links->links mehr speed
    speed=speed+10;
    }
    MotorSpeed(speed,150);
    taste=PollSwitch();
    if (taste>0){
    MotorSpeed(0,0);
    StatusLED(RED);
    }
    .... für linksweissrechtsschwarz genauso
    Bitte kommentieren was ihr dazu sagt, wäre das so in der Art möglich?
    Könnt ihr mir eine andere Möglichkeit nennen? Oder mir etwas zeigen?

    EDIT: Wie ich meine "Umgebungslichtkompensation" in die erste Abfrage, also bei der Entscheidung wo nun schwarz und weiß sind, einbaue, habe ich noch keinen Schimmer. Eigentlich ist das ja sinnlos, weil ich nicht zuordnen kann, was für ein Wert für schwarz und was für ein wert für weiß steht!
    Ich dreh mich im Kreis

  7. #27
    Benutzer Stammmitglied
    Registriert seit
    10.05.2007
    Alter
    39
    Beiträge
    31
    Jetzt habe ich nochmal was....

    Code:
    #include "asuro.h"
    
    int main(void){
    	unsigned int data[2];
    	unsigned char speed=150;
    	unsigned char taste;
    	unsigned char A=0,B=0;
    
    	Init();
    	LineData(data);
    	A=data[0];
    	B=data[1];
    	FrontLED(ON);
    	MotorDir(FWD,FWD);
    
    	while ((data[0]>550) && (data[1]<450)){ //LwRs
    		BackLED(OFF,OFF);
    		MotorSpeed(150,150);
    		LineData(data);
    		taste=PollSwitch();
    		if (taste>0){
    			MotorSpeed(0,0);
    			StatusLED(RED);
    			}
    		}
    	while ((data[0]<550) && (data[1]>550)){ //LsRw
    		BackLED(ON,ON);
    		MotorSpeed(150,150);
    		LineData(data);
    		taste=PollSwitch();
    		if (taste>0){
    			MotorSpeed(0,0);
    			StatusLED(RED);
    			}
    		}
    	while ((data[0]>600) && (data[1]>600) && (A>B)){ //weiter rechts
    		BackLED(ON,OFF);
    		speed=speed-10;
    		MotorSpeed(150,speed);
    		LineData(data);
    		taste=PollSwitch();
    		if (taste>0){
    			MotorSpeed(0,0);
    			StatusLED(RED);
    			}
    		}
    	while ((data[0]<400) && (data[1]<400) && (A>B)){ //weiter links
    		BackLED(OFF,ON);
    		speed=speed+10;
    		MotorSpeed(150,speed);
    		LineData(data);
    		taste=PollSwitch();
    		if (taste>0){
    			MotorSpeed(0,0);
    			StatusLED(RED);
    			}
    		}
    	while ((data[0]>600) && (data[1]>600) && (A<B)){ //weiter links
    		BackLED(OFF,ON);
    		speed=speed+10;
    		MotorSpeed(150,speed);
    		LineData(data);
    		taste=PollSwitch();
    		if (taste>0){
    			MotorSpeed(0,0);
    			StatusLED(RED);
    			}
    		}
    	while ((data[0]<400) && (data[1]<400) && (A<B)){ //weiter rechts
    		BackLED(ON,OFF);
    		speed=speed-10;
    		MotorSpeed(150,speed);
    		LineData(data);
    		taste=PollSwitch();
    		if (taste>0){
    			MotorSpeed(0,0);
    			StatusLED(RED);
    			}
    		}
    	
    	while(1){
    		StatusLED(RED);
    		}
    	
    	return 0;
    }
    Im Prinzip nichts anderes als vorhin!!
    Nur jetzt soll der ASURO auch mit dem Wechsel der Farben der Kanten zurechtkommen, also nicht in einer Endlosschleife while(1) stecken bleiben.
    Deswegen lese ich am Anfang mit A und B die Werte für links und rechts ein, egal welche Farbe die haben. Dann gehe ich in die einzelnen Schleifen und vergleiche die Bed. mit A und B. Das Problem ist nur, dass nach einem Programmdurchlauf A und B erneut eingelesen werden (oder?)...und falls ASURO grade 2mal auf weiß steht, dann stimmt gar nichts mehr. Kann man die zuerst gemessenen Werte irgendwo-/wie unveränderbar speichern ???

    Habt Geduld mit mir

  8. #28
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    oben rechts über deinem post ist ein button, da steht edit drauf. bitte editiere deine beiträge, und hänge das neue dran, sofern noch kein anderer nach dir gepostet hat.

    deinen code muss ich mir mal morgen zu gemüte führen, für heute bin ich zu müde... =)
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  9. #29
    Benutzer Stammmitglied
    Registriert seit
    10.05.2007
    Alter
    39
    Beiträge
    31
    Erst mal Entschuldigung, für mein Gespamme...ich hab den EDIT Button aber schon mal benutzt

    Und jetzt zu meiner neuesten Kreation.
    Erst mal kurz der Ablauf, was ich mir dabei gedacht habe.

    1. Einlesen ob rechtsschwarzlinksweiß oder andersrum
    2. Abspeichern in A und B
    while(1){
    3. Falls A>B (linksweißrechtsschwarz) -> 2 versch. while schleifen
    4. Falls A<B (linksschwarzrechtsweiß) -> 2 versch. while schleifen
    }

    Einfach mal anschauen!!


    Ich würde das ja mal gerne versuchen, aber so rein beim durchschauen denk ich mir, das müsste doch funktionieren

    Code:
    #include "asuro.h"
    
    int main(void){
    	unsigned int data[2];
    	unsigned char speed=150;
    	unsigned char taste;
    	unsigned char A=0,B=0;
    
    	Init();
    	LineData(data);
    	A=data[0];
    	B=data[1];
    	FrontLED(ON);
    	MotorDir(FWD,FWD);
    	
    	
    	if ( ((data[0]>550) && (data[1]<450)) || ((data[0]<450) && (data[1]>550)){
    	while(1){
    	do { 
    		BackLED(OFF,OFF);
    		MotorSpeed(150,150);
    		LineData(data);
    		taste=PollSwitch();
    		if (taste>0){
    			MotorSpeed(0,0);
    			StatusLED(RED);
    			}
    		}//ende do
    		while (((data[0]>550) && (data[1]<450)) || ((data[0]<450) && (data[1]>550)))
    
    	while ((data[0]>600) && (data[1]>600) && (A>B)){ //weiter rechts
    		BackLED(ON,OFF);
    		speed=speed-10;
    		MotorSpeed(150,speed);
    		LineData(data);
    		taste=PollSwitch();
    		if (taste>0){
    			MotorSpeed(0,0);
    			StatusLED(RED);
    			}
    		}
    	while ((data[0]<400) && (data[1]<400) && (A>B)){ //weiter links
    		BackLED(OFF,ON);
    		speed=speed+10;
    		MotorSpeed(150,speed);
    		LineData(data);
    		taste=PollSwitch();
    		if (taste>0){
    			MotorSpeed(0,0);
    			StatusLED(RED);
    			}
    		}
    	while ((data[0]>600) && (data[1]>600) && (A<B)){ //weiter links
    		BackLED(OFF,ON);
    		speed=speed+10;
    		MotorSpeed(150,speed);
    		LineData(data);
    		taste=PollSwitch();
    		if (taste>0){
    			MotorSpeed(0,0);
    			StatusLED(RED);
    			}
    		}
    	while ((data[0]<400) && (data[1]<400) && (A<B)){ //weiter rechts
    		BackLED(ON,OFF);
    		speed=speed-10;
    		MotorSpeed(150,speed);
    		LineData(data);
    		taste=PollSwitch();
    		if (taste>0){
    			MotorSpeed(0,0);
    			StatusLED(RED);
    			}
    		}
    	}//ende while
    	}//ende if
    	
    	while(1){
    		StatusLED(RED);
    		}
    	
    	return 0;
    }//ende main
    EDIT: Ich hab keine Ahnung warum jetzt alles bold ist, ich habe keinen Knopf gedrückt!!

  10. #30
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    sieht auf den ersten blick gar nicht schlecht aus. wird zeit dass du deinen asuro bekommst zum testen... =)

    edit: habe das bold weggemacht. das lag an der schlechten html-interpretation des phbb2-systems: du hast a<b geschreiben, und [b] bedeutet "BOLD" in html. wenn du sowas nochmal hast, musst du unten drunter die checkbox "HTML DEAKTIVIEREN" anklicken.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

Seite 3 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

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

12V Akku bauen