- LiTime Speicher und Akkus         
Ergebnis 1 bis 8 von 8

Thema: Asuro mit Lichtsenoren anhalten !

  1. #1
    Neuer Benutzer
    Registriert seit
    03.05.2012
    Beiträge
    3
    Blog-Einträge
    1

    Asuro mit Lichtsenoren anhalten !

    Anzeige

    Praxistest und DIY Projekte
    Hallo liebe Community,

    ich steh noch ziemlich am Anfang der C Programmierung...
    Hab mich seit einiger Zeit schon mit dem Asuro beschäftigt und stehe nun vor einem kleinen Problem:
    Der Asuro soll gerade ausfahren und sobald ich eine Taschenlampe an die vorderen 2 Lichtsenoren halte ( Line Data... ) stehen bleiben ...
    Ich sollte noch erwähnen, dass ich die Lichtsenoren auf die andere seite also oberhalb des Asuros montiert hab damit ich mit der Taschenlampe besser hinkomme....
    Die Lichtsensoren funktionieren einbahnfrei! Also ich habe jetzt einen Code geschrieben.... Vielleicht könnt ihr mir helfen da er nicht stehen bleibt sonder lieber immer geradeaus weiterfährt .... naja Vielen Dank im Vorraus:
    Code:
    int main(void)
        {
    	Init();
        	unsigned int lineData[2], STOP[2]; // Stopwert seitenabhängig verwalten
    
        	FrontLED(ON); // Front LED an
        	Sleep(10); // 
        	LineData(lineData); // 
        	LineData(lineData);
    
        	STOP[0] = lineData[0]+60; // STOP wert Berechnen (links)
        	STOP[1] = lineData[1]+60; // STOP wert Berechnen (rechts)
    
        	while(1)
        	{
        		MotorDir(FWD,FWD); // vorwärts 
        		MotorSpeed(180,180);
        		BackLED(ON,ON);
    			Msleep(5000);
                  MotorDir(BREAK,BREAK);
    			  MotorSpeed(0,0);
        		do
        			LineData(lineData);
        		while ((lineData[0] > STOP[0]) && (lineData[1] > STOP[1])); //solange bis der eingelesene wert heller wird als STOP
    
    				Msleep(5000);
                  MotorDir(BREAK,BREAK);
    			  MotorSpeed(0,0);
    			  BackLED(OFF,OFF);
         
        		
        		
        	}
           return 0;
        }

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Deine MSleep Pausen sind ziemlich langweilig (5 Sekunden). Dann wird es schwierig zu bemerken wann genau er die Taschenlampe erkennt hat. Er könnte einfach schneller als dich sein und deine Taschenlampe nicht auf das richtige Moment im Visier haben.

    Auserdem wurde ich die BackLEDs als Zustand-ausgaben verwenden. Ein BackLED sollte nur an gehen wann die STOP-kondition an diesen Seite bemerkt ist. Nun geht es am Anfang der Auseren While-schleife bei beiden an. Und gerade am Ende wieder aus. Wo es ziemlich gleichzeitig wieder angeschalted wirt. (MotorDir und MotorSpeed dauern nur ein wenig fur den Asuro Prozessor.)

    Ich vermutte es geht schief in den Do-While Schleife. Dort steht:

    Code:
    do
                    LineData(lineData);
    Ich vermute die do-schleife ist mit diesen letzte Punkt-Komma zu ende gekommen. Die While-Zeile danach funktioniert wie ein Endloss-Schleife, aber ohne erneute LineData() Funktion anrufen. Es ist nur im Endloss-lauf wann die STOP werten bei den beiden Sensoren erreicht sind. Muss dass unbedingt in einer UND-vergleichung stehen? Oder wurde ein ODER-vergleichung auch stimmen? Weil das Letzte öfter passieren wird. Setzte die Befehlen zwischen do und While zwischen {} Klammern. Dann ist das Punkt-Komma Problem erledigt.


    Zu letzte: Ist diesen STOP-wert erhöhung von 60 auch realistisch? Erkennt Asuro die Taschen Lampe auch wann er kein Motor-Befehlen bekommt? Also nicht fahrt.
    Geändert von Valen (15.10.2012 um 18:44 Uhr)

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    P.S. Stehen bleibt er immer wann er nicht mit seine Rädern auf den Grund steht. Das erleichtert das Testen. Und du wirst nicht so schnell müde von das hinter her laufen.

  4. #4
    Neuer Benutzer
    Registriert seit
    03.05.2012
    Beiträge
    3
    Blog-Einträge
    1
    Danke für die schnelle Antwort also ich hab das mal angewendet ... also die Do schleife in Klammern aber irgendwie will er immernoch nicht ... der code schaut jetzt so aus ... ich hab außerdem die MSleep kleiner gemacht und die backlight nur in der while schleife angemacht... Letztendlich fährt er immernoch gerade aus ... Und ich renn schon nicht die ganze Zeit quer durch die Wohnung

    P.S Die Stoppwerte hab ich nochmal runtergesetzt ....
    Code:
      int main(void)
        {
    	Init();
        	unsigned int lineData[2], STOP[2]; // Stopwert seitenabhängig verwalten
    
        	FrontLED(ON); // Front LED an
        	Sleep(10); // 
        	LineData(lineData); // 
        	LineData(lineData);
    
        	STOP[0] = lineData[0]+10; // STOP wert Berechnen (links)
        	STOP[1] = lineData[1]+10; // STOP wert Berechnen (rechts)
    
        	while(1)
        	{
        		MotorDir(FWD,FWD); // vorwärts 
        		MotorSpeed(180,180);
        		BackLED(OFF,OFF);
    			Msleep(200);
                  
        		do{
        			LineData(lineData);
    				}
        		while ((lineData[0] > STOP[0]) && (lineData[1] > STOP[1])); //solange bis der eingelesene wert heller wird als STOP
    
    				Msleep(200);
                  MotorDir(BREAK,BREAK);
    			  MotorSpeed(0,0);
    			  BackLED(ON,ON);
         
        		
        		
        	}
           return 0;
        }
    Genau fast hätt ichs vergessen die zweifachen Stop werte sind zur sicherheit da er mal beim vergleichen welche falsch eingelesen hat...

    Viele Grüße Juli

  5. #5
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Für einen vernünftigen Stopwert solltest du zumindest das Mittel mehrerer Lesungen verwenden:

    Code:
        	FrontLED(ON); // Front LED an
        	Sleep(10); //
        	LineData(lineData); // ADC "anwärmen"
        	LineData(STOP);
        	LineData(lineData);
    
        	STOP[0] = (lineData[0]+STOP[0])/2 +10; // STOP wert Berechnen (links)
        	STOP[1] = (lineData[1]+STOP[1])/2 +10; // STOP wert Berechnen (rechts)
    (Die FrontLED dient ja wohl nur zur Deko...)

    Wenn die Schleife bis zum Beleuchten der Photodioden ausgeführt werden soll, muss man prüfen, ob beide Werte jeweils kleiner als STOP sind:

    while ((lineData[0] < STOP[0]) && (lineData[1] < STOP[1])); //solange bis der eingelesene Wert heller wird als STOP

    Nach

    Code:
                  MotorDir(BREAK,BREAK);
    			  MotorSpeed(0,0);
    			  BackLED(ON,ON);
    startet er aber sofort wieder durch!

    Gruß

    mic
    Geändert von radbruch (15.10.2012 um 22:07 Uhr)
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Genau, während er seine Sensoren misst fährt er einfach weiter. Er zittert nur zwischen fahren und anhalten für eine periode von 200 Milisekunden. Und geht deshalb auf halbe fahrt (von halbe fahrt).

    Hier ist meine Vorschlag. Achte auf die BackLEDs.

    Code:
    int main(void)
        {
    	Init();
    
    	unsigned int lineData[2], STOP[2]; // Stopwert seitenabhängig verwalten
    	
    	unsigned char Beleuchtet[2]; // Sensor wert über STOP-Wert? (boolean)
    		
    	LineData(lineData); // 
        LineData(lineData);
    
        STOP[0] = lineData[0]+10; // STOP wert Berechnen (links)
        STOP[1] = lineData[1]+10; // STOP wert Berechnen (rechts)
    
    	MotorDir(FWD,FWD);	// vorwärts   
        MotorSpeed(180,180);
        BackLED(OFF,OFF);
    	
    	while(1)
        {	
    		LineData(lineData);
    			
    		if (lineData[0] > STOP[0])
    		{	Beleuchtet[0]=1;	// Ich sehe eine Taschenlampe auf Links
    		}	
    		else Beleuchtet[0]=0;	// Ich sehe keine Taschenlampe auf Links
    		if (lineData[1] > STOP[1])
    		{	Beleuchtet[1]=1;	// Ich sehe eine Taschenlampe auf Rechts
    		}	
    		else Beleuchtet[1]=0;	// Ich sehe keine Taschenlampe auf Rechts
    			
    		// BackLEDs anschalten gleich wie Beleuchtung: 'Gultig' = ungleich 0 = ON, 'Nicht Gultig' = gleich 0 = OFF
    			BackLEDs(Beleuchtet[0],Beleuchtet[1]);
    			
    		// Sonnst kriegen wir keine Ahnung was passiert.		
    			
    		if (Beleuchtet[0] && Beleuchtet[1])
    		{
    			// Licht fällt auf Beide Sensoren
    			MotorDir(BREAK,BREAK);
    			MotorSpeed(0,0);
    		}
    		else
    		{
    			// Licht? Macht mich nichts!
    			MotorDir(FWD,FWD);	// Vorwärts wieder!  
    			MotorSpeed(180,180);
    		}
    				
    		Msleep(200);
    		BackLED(OFF,OFF);
                
    	}
    	
        return 0;
    }

  7. #7
    Neuer Benutzer
    Registriert seit
    03.05.2012
    Beiträge
    3
    Blog-Einträge
    1
    Also Das funktioniert einbahn frei jetzt danke also ich hab noch eine 2.Sache probiert die auch ganz gut hingehauen hat aber nie so genau wie dein COde ... Hier noch mein Code
    Code:
    #include "asuro.h"
    
    int main(void)
        {
    	Init();
        	unsigned int lineData[2], STOP[2]; // Stopwert seitenabhängig verwalten
    
        	      
            FrontLED(ON); // Front LED an
        	Sleep(10); //
        	LineData(lineData); // ADC "anwärmen"
        	LineData(STOP);
        	LineData(lineData);
    
        	STOP[0] = (lineData[0]+STOP[0])/2 +10; // STOP wert Berechnen (links)
        	STOP[1] = (lineData[1]+STOP[1])/2 +10; // STOP wert Berechnen (rechts)
        	
    
        	while(1)
        	{
        		
                  
    			MotorDir(BREAK,BREAK);
    			  MotorSpeed(0,0);
    			  BackLED(ON,ON);
    			
        		do{
        			LineData(lineData);
    				}
        		while ((lineData[0] > STOP[0]) && (lineData[1] > STOP[1])); //solange bis der eingelesene wert heller wird als STOP
                 
    			 
    			 MotorDir(FWD,FWD); // zurücksetzen
        		MotorSpeed(255,255);
        		BackLED(OFF,OFF);
        		Msleep(2000);
    			
    
    						/*Msleep(200);
                  MotorDir(BREAK,BREAK);
    			 
    			*/
         
        		
        		
        	}
           return 0;
        }
    Vielen Dank ich mach's als gelöst

    Juli

  8. #8
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Prima. So reicht ein Sensor zum Anhalten:

    while ((lineData[0] > STOP[0]) || (lineData[1] > STOP[1])); // solange die Photosensoren beleuchtet werden
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Ähnliche Themen

  1. Schrittmoter anhalten
    Von datatom im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 22.05.2012, 14:19
  2. Schrittmoter anhalten
    Von datatom im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 22.05.2012, 14:19
  3. Antworten: 6
    Letzter Beitrag: 28.11.2011, 17:01
  4. LED-Würfel mit taster anhalten
    Von pelikano im Forum C - Programmierung (GCC u.a.)
    Antworten: 0
    Letzter Beitrag: 01.06.2008, 11:44
  5. Bewegung anhalten
    Von Stratege993 im Forum Robby RP6
    Antworten: 16
    Letzter Beitrag: 26.12.2007, 13:08

Stichworte

Berechtigungen

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

LiFePO4 Speicher Test