- fchao-Sinus-Wechselrichter AliExpress         
Seite 6 von 8 ErsteErste ... 45678 LetzteLetzte
Ergebnis 51 bis 60 von 76

Thema: ASURO Teilwettbwerb 1.2: Bring den Schatz auf der Linie ...

  1. #51
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Anzeige

    Praxistest und DIY Projekte
    Das glaube ich Dir gerne, was mich aber interessieren würde, wie man das denn anwendet ?
    Schickst Du ein Zeichen üder UART und schaust, was da zurückkommt, oder wie ?
    Vielleicht ist das eine blöde Frage, aber ich hab mich bis jetzt mit so einer Art Sensorik nicht auseinandergesetzt .....
    Helligkeit,Temperatur,Widerstand ja, aber Abstandmessung mit IR ist für mich schwarze Magie(bis jetzt)

    Gruß Sebastian

  2. #52
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.05.2005
    Beiträge
    734
    Das geht relativ einfach, indem man den Port PD1 auf LOW setzt. Damit sendet die IR-Diode mit 36kHz. Das ist die Frequenz, die der IR-Empfänger SFH 5110-36 braucht. Zum Detektieren des reflektierten Signals dann den Eingang PD0 auf LOW prüfen. Das ist die einfache Variante mit maximaler Empfindlichkeit.

    Ich habe das Programm noch dahingehend verändert, dass ich die Sendeleistung mittels einstellbarer Pulsbreite ändern kann. Damit kann ich die Empfindlichkeit des Sensors variieren und auf den Abstand rückschliessen. Aber Abstandsmessung ist zu hoch gegiffen. Wie bei anderen IR-Detektoren (IS471, TSOP und andere, Ausnahme sind die Sharp-Detektoren, die funktionieren nach einem anderen Prinzip) ist es abhängig von der Stärke der Reflektion, ob dunkle oder helle Flächen, schräge oder direkte Reflektion. Dennoch funktioniert es erstaunlich gut.

    Gruss Waste

  3. #53
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    37
    Beiträge
    826
    Sachmal, kannste nicht mal dass ganze darüber vielleicht zusammen fassen und einen Thread damit machen? Ich glaube da wäre ich nicht der einzige der daran Interesse hat.

    Also ich hab den Thread oben schon gesehen, nur ist der doch etwas unübersichtlich finde ich.

    Vielleicht dann auch mit (Pseudo-)Code abschnitten.
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

  4. #54
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.05.2005
    Beiträge
    734
    OK, mach ich. Aber lasst mir bisschen Zeit.

    Waste

  5. #55
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    37
    Beiträge
    826
    Klar. Gerne.

    Danke
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

  6. #56
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    12.06.2005
    Ort
    Südwestdeutschland
    Beiträge
    1.147
    Blog-Einträge
    3
    @waste. Habe mir gerade Dein Video angeschaut.
    Respekt, Gratulation !
    Dein Roboter scheint ziemlich exakt zu fahren, hast Du eigene Motorroutinen geschrieben ?
    Sogar ein Marker auf der Linie damit man sehen, wie genau der Asuro den Becher zurückschiebt. Jetzt wird das eine echte Herausforderung für alle Übrigen.

    Gruss,
    stochri

  7. #57
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.05.2005
    Beiträge
    734
    Die Strecke wird mittels Odometrie gemessen.
    Hier der gesamte Code vom 1.Teilwettbewerb. Ich denke, es ist soweit dokumentiert, dass man es versteht.
    Code:
    /*******************************************************************************
    *
    * Description: Asuro Wettbewerb 1.2
    *
    *****************************************************************************/
    #include "asuro.h"
    #include <stdlib.h>
    
    unsigned char speed;
    int speedLeft,speedRight;
    unsigned int lineData[2];
    int i, i1, ADOffset;
    
    void FollowLine (void)
    {
    	LineData(lineData);
    	i = (lineData[0] - lineData[1]) - ADOffset;
    	if ( i > 4) {				//Line is left
    		StatusLED(GREEN);
    		speedRight = speed - 2 * i;
    		if (speedRight < 0x01) speedRight = 0x00;
    	}
    	else if ( i < -4) {		//Line is right
    		StatusLED(RED);
    		speedLeft = speed + 2 * i;
    		if (speedLeft < 0x01) speedLeft = 0x00;
    	}
    	else {
    		StatusLED(OFF);
    		speedLeft = speedRight = speed;
    	}
    	MotorSpeed(speedLeft,speedRight);
    }
    
    int main(void)
    {
    unsigned char weiter, flag=FALSE;
    unsigned int data[2];
    int weg, weg1;
    
    	Init();
    	DDRD |= (1 << DDD1);			//initialisiert IR-Detektor
    	PORTD &= ~(1 << PD1);
    	OCR2  = 0xFE;					//Pulsbreite 1
    
    	while(1){
    		MotorDir(FWD,FWD);
    		StatusLED(GREEN);
    		speed = 160;
    		switched=1;
    		while(switched){				// warte bis Schatz entwendet wird
    			Msleep(100);
    			StartSwitch();				// INT1 auf Eingang, Spannung geht hoch 
    			Msleep(5);					// wartet wegen der Zeitkonstante R23*C7
    			switched=0;StartSwitch();	// macht Interrupt endgültig scharf
    		}
    		StatusLED(RED);					// Schatz ist fort (rotwerde)
    		Msleep(1000);					// warte noch 1 sec, dann Suche
    		
    		FrontLED(ON);
    		LineData(lineData);
    		ADOffset = 0;
    		speedLeft = speedRight = speed;
    		weg=0;
    		while((PIND & (1 << PD0))){		// fahre solange auf Linie bis IR-Det. was findet
    			FollowLine();
    			OdometrieData(data);			// bestimme Weglänge
    			if ((data[0] < 560) && (flag == TRUE)) {flag = FALSE; weg++;}
    			if ((data[0] > 640) && (flag == FALSE)) {flag = TRUE; weg++;}
    		}
    		weg1=weg+10;						// merke Wegstrecke
    		StatusLED(OFF);
    		MotorDir(BREAK,BREAK);
    		MotorDir(BREAK,RWD);		// rechts drehen
    		MotorSpeed(160,160);
    		Msleep(900);
    		MotorDir(BREAK,BREAK); Msleep(200);
    		MotorDir(FWD,FWD);
    		MotorSpeed(160,160);
    		Msleep(300);
    		MotorDir(FWD,FWD);			// fahre Halbkreis um Schatz
    		MotorSpeed(120,190);
    		Msleep(2800);
    		MotorDir(BREAK,BREAK); Msleep(200);
    		MotorDir(BREAK,FWD);		// links drehen
    		MotorSpeed(160,160);
    		weiter=1;
    		while(weiter){				// solange bis Linie entdeckt wird
    			FrontLED(OFF);
    			LineData(lineData);
    			i = (lineData[1] - lineData[0]);
    			FrontLED(ON);
    			LineData(lineData);
    			i1 = (lineData[1] - lineData[0]);
    			if ( (i1-i) > 30) weiter=0;			//Linie in Sicht
    		}
    		Msleep(40);								//Nachlauf für Linienmitte
    		MotorDir(BREAK,BREAK); Msleep(100);
    		MotorDir(FWD,FWD);
    		speedLeft = speedRight = speed;
    		while((PIND & (1 << PD0))){			// fahre auf Linie bis IR-Det. was findet
    			FollowLine();
    		}
    		speed=100;								// reduziere Geschwindigkeit zum Andocken
    		while(!switched){						// fahre bis angedockt ist
    			FollowLine();
    		}
    		StatusLED(GREEN);
    		speed=180;
    		MotorSpeed(speed,speed);				// gib Gas zum Schieben des Schatzes
    		weg=0;
    		while(weg<weg1){						// schiebe gemerkte Strecke zurück
    			FollowLine();
    			OdometrieData(data);
    			if ((data[0] < 560) && (flag == TRUE)) {flag = FALSE; weg++;}
    			if ((data[0] > 640) && (flag == FALSE)) {flag = TRUE; weg++;}
    		}
    		MotorDir(BREAK,BREAK);
    		Msleep(100);
    		MotorDir(RWD,RWD);
    		MotorSpeed(160,160);
    		Msleep(100);
    		MotorDir(BREAK,BREAK);Msleep(200);
    		MotorDir(BREAK,RWD);		// rechts drehen
    		MotorSpeed(160,160);
    		Msleep(850);
    		MotorDir(BREAK,BREAK); Msleep(200);
    		MotorDir(FWD,FWD);
    		MotorSpeed(160,160);
    		Msleep(300);
    		MotorDir(FWD,FWD);			// Halbkreis
    		MotorSpeed(120,190);
    		Msleep(2800);
    		MotorDir(BREAK,BREAK); Msleep(200);
    		MotorDir(BREAK,FWD);		// links drehen
    		MotorSpeed(160,160);
    		weiter=1;
    		while(weiter){				// solange bis Linie entdeckt wird
    			FrontLED(OFF);
    			LineData(lineData);
    			i = (lineData[1] - lineData[0]);
    			FrontLED(ON);
    			LineData(lineData);
    			i1 = (lineData[1] - lineData[0]);
    			if ( (i1-i) > 30) weiter=0;			//Linie in Sicht
    		}
    		Msleep(40);								//Nachlauf für Mitte
    		StatusLED(GREEN);
    		MotorDir(BREAK,BREAK); Msleep(100);
    		MotorDir(FWD,FWD);
    		speed=150;
    		speedLeft = speedRight = speed;
    		while((PIND & (1 << PD0))){			// fahre auf Linie bis IR-Det. was findet
    			FollowLine();
    		}
    		speed=100;								// reduziere Geschwindigkeit zum Andocken
    		StartSwitch();				// INT1 auf Eingang, Spannung geht hoch 
    		Msleep(5);					// wartet wegen der Zeitkonstante R23*C7
    		switched=0;StartSwitch();	// macht Interrupt endgültig scharf
    		while(!switched){						// fahre bis angedockt ist
    			FollowLine();
    		}
    		MotorSpeed(0,0);						// angedockt, bleib stehen
    	}
        return 0;
    }
    Viel Spass beim Studieren!
    Waste

  8. #58
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.05.2005
    Beiträge
    734
    @Andun
    Ein neuer Thread für den Umbau des IR-Detektor ist da:
    https://www.roboternetz.de/phpBB2/vi...?p=99791#99791

    Gruss
    Waste

  9. #59
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.06.2004
    Ort
    Aachen
    Beiträge
    2.674
    Gemeint ist switch (case):

    Code:
    switch (variable) {
    case 0: 
    tue dies;
    	
    case 1:
    tue das;
    
    case 2:
    tue das;
    };

  10. #60
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    37
    Beiträge
    826
    Zitat Zitat von waste
    @Andun
    Ein neuer Thread für den Umbau des IR-Detektor ist da:
    https://www.roboternetz.de/phpBB2/ze...?p=99791#99791

    Gruss
    Waste
    DAANKEEE!!!

    Ich werde mich jetzt auch mal daran mahcen dein obiges Scripte zu lesen und zu verstehen.
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

Seite 6 von 8 ErsteErste ... 45678 LetzteLetzte

Berechtigungen

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

12V Akku bauen