- SF800 Solar Speicher Tutorial         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 18 von 18

Thema: lienefolger: Xbus benutzen

  1. #11
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo Fieke,

    erst mal must du festlegen, was passieren soll, wenn der RP6 auf ein Hindernis stößt. Da er ja wohl auf der Linie bleiben soll (sonst würde ja das Linienfolgen keinen Sinn machen), könnte er bei einem Hindenis nur anhalten und warten, bis es wieder weg ist ODER er könnte auf der Linie wenden und in die andere Richtung fahren.

    Dein Hauptprogramm bleibt dazu dein Linienfolgeprogramm. In den Main-Teil (vor der while(true)-Schleife) kopierst du nur:
    ACS_setStateChangedHandler(acsStateChanged);
    powerON();
    setACSPwrMed();

    ... und schreibst eine neue Routine void acsStateChanged(void):
    Für die ersten Tests kannst du z.B. anhalten (moveAtSpeed(0,0) ), wenn ein Hindernis erkannt wird und weiterfahren (moveAtSpeed(slinks,srechts) ), wenn kein Hindernis mehr da ist.

    Der Befehl moveAtSpeed(slinks,srechts), der jetzt in der While(true)-Schleife am Ende steht, müßte dann raus. ODER: Du setzt in der Routine void acsStateChanged(void) nur ein Flag (Stoppen oder nicht), das du dann mit einer If-Konstruktion in der Hauptschleife abfragst.

    Gruß Dirk

  2. #12
    Neuer Benutzer Öfters hier
    Registriert seit
    30.11.2008
    Beiträge
    13
    Vielen dank vor alle Hilfe!
    Ich habe noch etwas anderes zu fragen. Wie kann ich Werten von die acsStateChanged(); zurückgeben an die while(true) loop in die int main()?
    Denn in die Bibliothek die acsStateChanged function via die ACS_setStateChangedHandler(); angerufen werd.
    Gruss Fieke

  3. #13
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hallo Fieke,

    acsStateChanged() wird immer aufgerufen, wenn sich am Zustand der beiden Variablen obstacle_left und obstacle_right etwas ändert.

    Dann kann man da entscheiden, ob man etwas machen oder wie man darauf reagieren möchte.

    Man braucht aber nicht unbedingt in der acsStateChanged() etwas zu tun.

    Es ginge auch, die beiden obstacle_left und obstacle_right irgendwo im Programm abzufragen. Wenn beide = 0 sind, dann ist kein Hindernis erkennbar.
    Nachteil: Man testet die beiden eventuell umsonst, weil sie sich gar nicht geändert haben. Dazu dient acsStateChanged().

    So etwa klar?

    Gruß Dirk

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    30.11.2008
    Beiträge
    13
    Hallo Dirk,

    Danke vor ihre Hilfe!

    Es wirkt beinahe. Wann ich die obstacle_left und obstacle_right benutzen mit eine anderes programm (bumper(); zum Beispiel, sehe unterstehend Program), liese die Robot die obstacle_left und obstacle_right nicht mehr aus.

    Code:
     
    #include "RP6RobotBaseLib.h" 
    
    void bumper(void)
    {
    	uint8_t bumperl = getBumperLeft();
    	uint8_t bumperr = getBumperRight();
    	
    	
    	if (bumperl || bumperr)
    		{
    			moveAtSpeed(0,0);
    			
    			move(40, BWD, DIST_MM(100), true);
    			
    			rotate(40, RIGHT, 180, true);
    					
    			writeString_P("\n OEPS, bumper geraakt");
    		}
    		
    	else 
    	{
    		writeString_P("\n geen bumper");
    		setMotorDir(FWD, FWD);
    		moveAtSpeed(30,30);
    	}
    }
    
    void acsStateChanged(void)
    {
    	writeString_P("\nACS status is veranderd\n");
    	
    }
    
    	
    int main(void)
    {
    	initRobotBase(); 				
    	ACS_setStateChangedHandler(acsStateChanged);
    	powerON();
    	setACSPwrMed();
    	uint8_t y=0;
    				
    	while(true)
    	{
    		writeString_P("\ny = ");
    		writeInteger(y, DEC);
    				
    		writeString_P("\n bumper checken!");
    				
    		task_ACS();
    		writeString_P("\n na task_ACS ");
    		
    		task_motionControl();
    		writeString_P("\n na motionControl");
    		
    		task_ADC();
    		writeString_P("\n Na ADC checken");
    		
    		task_RP6System();
    		
    		bumper();
    		
    		writeString_P("\n obstacle left = ");
    		writeInteger(obstacle_left, DEC);
    		
    		writeString_P("\n obstacle right = ");
    		writeInteger(obstacle_right, DEC);
    						
    		writeString_P("\n\n");
    		mSleep(1000);
    		y++;
    	}
    	
    	
    	return 0;
    }
    Aber wenn die Bumper eingedrükt ist und die move und rotate function ausgefürht werden, liese die Robot die Werten von obstacle_left und obstacle_right wohl aus.

    Warum liese es die Werten nicht konstant aus?

    Gruss Fieke

  5. #15
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hallo Fieke,

    es gibt in deiner Hauptschleife zu viele Dinge, die bewirken, dass die Tasks zu langsam aufgerufen werden. Auf jeden Fall darf in der Hauptschleife keine Pause sein (mSleep(1000) ) und die Textausgaben würde ich auch in ein Unterprogramm verlagern und z.B. über eine Stopwatch nur 1x / Sekunde ausgeben oder nur, wenn z.B. obstacle_... TRUE ist.
    In der bumper-Funktion sind move und rotate auch blockierend. Auch das verzögert den Ablauf der Hauptschleife.

    Die Kunst ist letztlich, alle deine Aufgaben auch als Tasks zu schreiben und in die Main-Schleife einzubinden. Jede Task sollte möglichst schnell wieder verlassen werden und die Kontrolle an die Hauptschleife abgeben. In der Main-Schleife selbst sollte es keine Verzögerungen oder Textausgaben geben.

    Main-Loop:
    Code:
    while(true) 
       { 
          task_MyTask_1();
          task_MyTask_2();
          task_RP6System(); 
       } 
       return 0; 
    }
    Gruß Dirk

  6. #16
    Neuer Benutzer Öfters hier
    Registriert seit
    30.11.2008
    Beiträge
    13
    Hallo Dirk,

    Vielen dank vor alle Hilfe! Die Program wirkt!
    Es ist vor ein Projekt auf meine Schule. Dank deine Hilfe kann ich das Projekt gut beenden.

    Angenehmen Festtagen!

    Gruss Fieke

  7. #17
    Neuer Benutzer Öfters hier
    Registriert seit
    30.11.2008
    Beiträge
    13
    Hallo,

    Das Projekt ist fertig. Die Robot kann die Liene folgen und stoppen bei ein Obstacle. Er braucht die Obstacle Sensoren und die gemachte Lienefolg sensor. Ich habe die Lienefolgsensor in zwei teilen erbaut.

    Unterstehend das Programm vor das Projekt.

    Code:
    #include "RP6RobotBaseLib.h" 	// moet er altijd bij
    
    uint8_t afstandlezen(uint8_t slinks, uint8_t srechts)
    {
    	task_ACS();	
    	task_RP6System();
    	
    	if(obstacle_left || obstacle_right)
    	{
    		slinks = 0;
    	}
    	
    	return slinks;
    	
    }
    
    uint8_t licht(uint8_t slinks, uint8_t srechts)
    {
    	task_ACS();
    	uint8_t lichtlinks;
    	uint8_t lichtrechts;
    	uint8_t lichtgrens = 990;
    	
    	task_ADC;
    	
    	lichtlinks = adcLSL;
    	lichtrechts = adcLSR;
    	
    	if(lichtlinks > lichtgrens || lichtrechts > lichtgrens)
    	{
    		slinks=0;
    		srechts=0;
    	}
    	
    	return slinks;
    }
    
    
    uint8_t lijnvolgenlinks(uint8_t snelheidlinks, uint8_t snelheidrechts)
    {
    	task_ACS();
    	DDRA &= ~E_INT1;
    	
    	DDRC &= ~(SCL | SDA);
    	
    	uint8_t templinks;
    	uint8_t temprechts;
    	uint8_t tempmidden;
    	
    	PORTC &= ~SCL;
    	PORTC &= ~SDA;
    				
    	uint8_t m101;
    	uint8_t l100;
    	uint8_t ll110;
    	uint8_t r001;
    	uint8_t rr011;
    	uint8_t niks000;
    	uint8_t alles111;
    	
    	uint8_t delervooruit = 2;
    	uint8_t delerneteraf = 2;
    	uint8_t delerverafoptel = 2;
    	uint8_t delerverafaftrek = 2;
    	
    		
    		if (snelheidlinks > 20 || snelheidrechts > 20)
    		{
    			delervooruit = 5;
    		}
    		
    		tempmidden = PINA & E_INT1;
    		templinks = PINC & SCL;
    		temprechts = PINC & SDA;
    		uint8_t casus;
    		
    		if(templinks && !tempmidden && temprechts)
    		{
    			casus=101;
    		}
    		
    		if(templinks && !tempmidden && !temprechts)
    		{
    			casus=100;
    		}
    		
    		if(templinks && tempmidden && !temprechts)
    		{
    			casus=110;
    		}
    		
    		if(!templinks && !tempmidden && temprechts)
    		{
    			casus=001;
    		}
    		
    		if(!templinks && tempmidden && temprechts)
    		{
    			casus=011;
    		}
    		
    		if(!templinks && !tempmidden && !temprechts)
    		{
    			casus=000;
    		}
    		
    		if(templinks && tempmidden && temprechts)
    		{
    			casus=111;
    		}
    		
    		
    		switch(casus)
    		{
    			case 101: 	if(l100 > 0)
    						{
    							snelheidlinks = snelheidrechts - (snelheidrechts/delerneteraf);
    						}
    						
    						if(ll110 > 0)
    						{
    							snelheidlinks = snelheidrechts - (snelheidrechts/delerverafaftrek);
    						}
    						
    						else
    						{
    			
    							snelheidlinks = snelheidlinks +(snelheidlinks/delervooruit);		
    						}
    						setMotorDir(FWD,FWD);						
    						m101++; l100=0; ll110=0; r001=0; rr011=0; niks000=0; alles111=0; break;
    			
    			case 100: 	snelheidlinks = snelheidlinks - (snelheidlinks / 4);
    						if (snelheidlinks < 30)
    						{
    							snelheidlinks = 30;
    						}
    						
    						setMotorDir(FWD,FWD);
    						m101=0; l100++; ll110=0; r001=0; rr011=0; niks000=0; alles111=0; break;
    			
    			case 110: 	snelheidlinks=snelheidlinks+(snelheidlinks/delerverafoptel);
    						
    						setMotorDir(FWD,BWD);
    						m101=0; l100=0; ll110++; r001=0; rr011=0; niks000=0; alles111=0; break;
    			
    			case 001: 	snelheidlinks=snelheidlinks-(snelheidlinks/delerneteraf);
    						
    						setMotorDir(FWD,FWD);
    						m101=0; l100=0; ll110=0; r001++; rr011=0; niks000=0; alles111=0; break;
    			
    			case 011: 	snelheidlinks=snelheidlinks-(snelheidlinks/delerverafaftrek);
    						
    						setMotorDir(BWD,FWD);
    						m101=0; l100=0; ll110=0; r001=0; rr011++; niks000=0; alles111=0; break;
    			
    			case 000: 								
    
    						m101=0; l100=0; ll110=0; r001=0; rr011=0; niks000++; alles111=0; break;
    		
    			case 111: 				
    						m101=0; l100=0; ll110=0; r001=0; rr011=0; niks000=0; alles111++; break;
    			
    		}
    		task_ACS();
    		if(snelheidlinks > 50)
    		{
    			snelheidlinks = 50;
    		}
    		task_RP6System();
    		
    		
    		if(snelheidlinks < 10)
    		{
    			snelheidlinks=10;
    		}
    		
    		task_ACS();			
    		return snelheidlinks;
    }
    
    uint8_t lijnvolgenrechts(uint8_t snelheidlinks, uint8_t snelheidrechts)
    {
    	task_ACS();
    	
    	uint8_t templinks;
    	uint8_t temprechts;
    	uint8_t tempmidden;
    					
    	uint8_t m101;
    	uint8_t l100;
    	uint8_t ll110;
    	uint8_t r001;
    	uint8_t rr011;
    	uint8_t niks000;
    	uint8_t alles111;
    	
    	uint8_t delervooruit = 2;
    	uint8_t delerneteraf = 2;
    	uint8_t delerverafoptel = 2;
    	uint8_t delerverafaftrek = 2;
    		task_RP6System();	
    		
    		if (snelheidlinks > 20 || snelheidrechts > 20)
    		{
    			delervooruit = 5;
    		}
    		
    		tempmidden = PINA & E_INT1;
    		templinks = PINC & SCL;
    		temprechts = PINC & SDA;
    		uint8_t casus;
    		task_RP6System();
    		if(templinks && !tempmidden && temprechts)
    		{
    			casus=101;
    		}
    		
    		if(templinks && !tempmidden && !temprechts)
    		{
    			casus=100;
    		}
    		task_RP6System();
    		if(templinks && tempmidden && !temprechts)
    		{
    			casus=110;
    		}
    		
    		if(!templinks && !tempmidden && temprechts)
    		{
    			casus=001;
    		}
    		
    		if(!templinks && tempmidden && temprechts)
    		{
    			casus=011;
    		}
    		
    		if(!templinks && !tempmidden && !temprechts)
    		{
    			casus=000;
    		}
    		
    		if(templinks && tempmidden && temprechts)
    		{
    			casus=111;
    		}
    		
    		task_RP6System();
    		switch(casus)
    		{
    			case 101: 						
    						if(r001 > 0)
    						{
    							snelheidrechts = snelheidlinks - (snelheidlinks/delerneteraf);
    						}
    						
    						if(rr011 > 0)
    						{
    							snelheidrechts = snelheidlinks - (snelheidlinks/delerverafaftrek);
    						}
    						
    						else
    						{
    			
    							snelheidrechts = snelheidlinks;
    						}
    						setMotorDir(FWD,FWD);
    						
    						m101++; l100=0; ll110=0; r001=0; rr011=0; niks000=0; alles111=0; break;
    			
    			case 100: 	snelheidrechts=snelheidrechts-(snelheidrechts/delerneteraf);
    						
    						setMotorDir(FWD,FWD);
    						m101=0; l100++; ll110=0; r001=0; rr011=0; niks000=0; alles111=0; break;
    			
    			case 110: 	
    						snelheidrechts=snelheidrechts-(snelheidrechts/delerverafaftrek);
    						setMotorDir(FWD,BWD);
    						m101=0; l100=0; ll110++; r001=0; rr011=0; niks000=0; alles111=0; break;
    			
    			case 001: 	
    						snelheidrechts=snelheidrechts-(snelheidrechts/4);
    						if(snelheidrechts < 30)
    						{
    							snelheidrechts = 30;
    						}
    						setMotorDir(FWD,FWD);
    						m101=0; l100=0; ll110=0; r001++; rr011=0; niks000=0; alles111=0; break;
    			
    			case 011: 	
    						snelheidrechts=snelheidrechts+(snelheidrechts/delerverafoptel);
    						setMotorDir(BWD,FWD);
    						m101=0; l100=0; ll110=0; r001=0; rr011++; niks000=0; alles111=0; break;
    			
    			case 000: 	m101=0; l100=0; ll110=0; r001=0; rr011=0; niks000++; alles111=0; break;
    		
    			case 111: 	m101=0; l100=0; ll110=0; r001=0; rr011=0; niks000=0; alles111++; break;
    		}
    		task_ACS();
    		
    		
    		if(snelheidrechts > 50)
    		{
    			snelheidrechts = 50;
    		}
    		
    		
    		if(snelheidrechts <10)
    		{
    			snelheidrechts=10;
    		}
    		task_ACS();			
    		return snelheidrechts;
    }
    	
    int main(void)
    {
    	initRobotBase(); 			
    	
    	uint8_t vstart = 10;			
    	
    	powerON();
    	
    	DDRA &= ~E_INT1;	
    	DDRC &= ~(SCL | SDA);	
    	PORTC &= ~SCL;
    	PORTC &= ~SDA;
    	
    	setACSPwrMed();
    	
    	uint8_t slinks = vstart;
    	uint8_t srechts = vstart;
    	uint8_t snelheidlinks;
    	uint16_t xlinks;
    	uint8_t zlinks;
    	uint8_t afstand;
    	uint8_t x = 0;
    		
    	
    	while(true)
    	{	
    		task_RP6System();
    		slinks = lijnvolgenlinks(slinks,srechts);
    		srechts = lijnvolgenrechts(slinks,srechts);
    		
    		task_RP6System();
    		//slinks = licht(slinks, srechts);
    		task_RP6System();	
    					
    		slinks = afstandlezen(slinks, srechts);
    		task_RP6System();
    		
    		if(slinks == 0)
    		{
    			srechts = 0;
    		}
    		
    		task_RP6System();	
    		
    		moveAtSpeed(slinks,srechts);
    		
    		task_RP6System();			
    	}
    	
    	return 0;
    }
    Ich habe auch ein Film on youtube gemacht: http://www.youtube.com/watch?v=H-tXpLv0l_M

    Vielen dank vor alle Hilfe!

    Gruss Fieke

  8. #18
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hallo Fieke,

    das Projekt ist super geworden! \/


    Gruß Dirk

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

LiFePO4 Speicher Test