- Labornetzteil AliExpress         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 14 von 14

Thema: Labyrinth_programm

  1. #11
    Neuer Benutzer Öfters hier
    Registriert seit
    25.07.2012
    Beiträge
    7
    Anzeige

    Praxistest und DIY Projekte
    Hallo danke für eure Antworten!

    Ich habe mittlerweile ein eigenes Programm geschrieben, dass prinzipiell funktioniert.

    Mein Programm sieht folgendermaßen aus:


    #include "asuro.h"

    int main(void) {
    Init();
    int i;
    int grad=0;
    while(1) {

    if(PollSwitch()==0) {
    MotorDir(FWD,FWD);
    MotorSpeed(130,117);

    }

    else if(PollSwitch()!=0) {

    if (grad==0){

    MotorDir(BREAK,BREAK);
    MotorDir(RWD,RWD);
    MotorSpeed(100,100);
    for ( i=0 ; i<=220 ; i++)
    { Sleep (5000); }
    MotorDir(RWD,FWD);
    MotorSpeed(110,110);

    for ( i=0 ; i<=150 ; i++ )
    { Sleep ( 5000 ); }
    grad = 1;
    }


    else if (grad==1) {
    MotorDir(BREAK,BREAK);
    MotorDir(RWD,RWD);
    MotorSpeed(100,100);
    for ( i=0 ; i<=220 ; i++)
    { Sleep (5000); }
    MotorDir(FWD,RWD);
    MotorSpeed(110,110);

    for ( i=0 ; i<=340 ; i++ )
    { Sleep ( 5000 ); }
    grad = 0;
    }

    }




    }
    return 0;
    }


    Ich bin aber noch nicht ganz zufrieden mit dem Programm. Mir wäre es am liebsten, dass sich ASURO sozusagen nicht abwechselnd(wie bei diesem Programm) dreht, sondern dass er an Jeder ecke wieder mit dem linksdrehen anfängt. denn bei dem jetztigem programm kommt es öfters vor, dass der ASURO wieder durch den Beginn des Labyrinths herausfährt. Ist mein Anliegen einigermaßen verständlich?

    Kann mir von euch jemand weiter helfen. hab schon einiges probiert aber bin auf kein ergebnis gekommen.

    Gruß Philipp

    P.S im anhang befindet sich das programm in besserer Form
    Angehängte Dateien Angehängte Dateien
    • Dateityp: c test.c (771 Bytes, 3x aufgerufen)

  2. #12
    Neuer Benutzer Öfters hier
    Registriert seit
    25.07.2012
    Beiträge
    7
    ASURO soll also geradeausfahren solange er gegen keine wand fährt. ist dies dann doch der fall, soll er zunächst 90 ° links drehen und schauen ob dort auch eine wand ist. ist dort keine wand soll er seine fahrt fortsetzten und bei der nächsten wand das selbe tun. ist dort aber eine wand soll er sich um 180 ° in die andere Richtung drehen, seine Fahrt fortsetzten und bei der nächsten wand aber wieder mit dem linksdrehen beginnen.

  3. #13
    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

    Nur zeitgesteuert (und ungetestet!) ist das eine echte Herausforderung:

    Code:
    #include "asuro.h"
    
    #define BWD RWD // Rückwards bedeutet Backwards
    #define pwm_links 130
    #define pwm_rechts 117
    
    void Msleep_(uint16_t pause) // Funktion muss bei Libs mit 36kHz entfernt werden!
    {
    	if(pause) while(pause--) Sleep(72);
    }
    
    uint8_t taste(void)
    {
    	uint8_t t1, t2;
    	t1=PollSwitch();
    	t2=PollSwitch();
    	if(t1==t2) return(t1); // Wert gültig
    	return(0);
    }
    
    void vorwaerts(void)
    {
    	StatusLED(GREEN);
    	MotorSpeed(pwm_links, pwm_rechts);
    	MotorDir(FWD,FWD);
    }
    
    void bremsen(void)
    {
    	StatusLED(RED);
    	BackLED(OFF, OFF);
    	MotorSpeed(0,0);
    	MotorDir(BREAK, BREAK);
    	Msleep(50); // Bremszeit bis zum Stillstand
    }
    
    void rueckwaerts(void)
    {
    	BackLED(ON, ON);
    	MotorSpeed(pwm_links, pwm_rechts);
    	MotorDir(BWD,BWD);
    	Msleep(500);
    }
    
    void linksdrehen(void)
    {
    	BackLED(ON, OFF);
    	MotorSpeed(pwm_links, pwm_rechts);
    	MotorDir(BWD,FWD);
    	Msleep(300); // Zeit für 90°
    	bremsen();
    }
    
    void rechtsdrehen(void)
    {
    	BackLED(OFF, ON);
    	MotorSpeed(pwm_links, pwm_rechts);
    	MotorDir(FWD,BWD);
    	Msleep(300); // ditto
    	bremsen();
    }
    
    uint8_t testen(void)
    {
    	uint8_t temp=10; // Anzahl der Versuche
    	
    	vorwaerts();
    	FrontLED(ON);
    	while(--temp && !taste()) Msleep(20); // 20ms pro Versuch weiterfahren
    	if(temp) bremsen();
    	FrontLED(OFF);
    	return(temp); // Wenn temp != null wurde eine Taste gedrückt = Wand erkannt
    }
    
    int main(void)
    {
    	uint8_t schritt=0;
    
    	Init();
    
    	while(1)
    	{
    		vorwaerts(); // Vorwärts bis Hinderniss erkannt wird
    		while(!taste());
    		bremsen();
    		rueckwaerts();
    		bremsen();
    		
    		if(schritt++<3) // dreimal zuerst links abbiegen...
    		{
    			linksdrehen();
    			if(testen())
    			{
    			   rechtsdrehen();
    			   rechtsdrehen();
    			   if(testen()) rechtsdrehen();
    			}
    		}
    		else
    		{
    			rechtsdrehen();
    			if(testen())
    			{
    			   linksdrehen();
    			   linksdrehen();
    			   if(testen()) linksdrehen();
    			}
    			schritt=0;
    		}
    	}
    	return 0;
    }
    Wenn beim Kompilieren die Funktion Msleep() angemotzt wird, dann muss man diese umbenennen oder entfernen. Die Zeiten für die Drehungen, das Zurücksetzen und das Bremsen muss man anpassen. Das gilt auch für die PWM-Werte der Motoren.

    Keine Ahnung ob das halbwegs funktioniert...

    Gruß

    mic
    Geändert von radbruch (14.10.2012 um 13:59 Uhr) Grund: if(temp) bremsen(); eingefügt
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    25.07.2012
    Beiträge
    7
    danke für deine Antwort! Habe selbst mein ursprüngliches Programm mit deinen anregungen erweitert und es funktioniert jetzt eigentlich doch ziemlich gut. Perfekt wäre es, könnte ich auch noch ein programm zum geradeausfahren miteinbeziehen, aber das überschreitet mal wieder meine fähigkeiten

    Ich bin im Internet auf ein Odometrieprogramm gestoßen was eigentlich sehr gut funktioniert. Nur fällt es mir schwer dieses mit meinem zu ,,verbinden´´
    Ich hab mal die beiden Programme(das 2. befindet sich unter dem 1.) gestellt. habt ihr Ideen wie man diese verbinden könnte?

    Gruß Philipp
    Angehängte Dateien Angehängte Dateien
    • Dateityp: c test.c (2,1 KB, 8x aufgerufen)

Seite 2 von 2 ErsteErste 12

Stichworte

Berechtigungen

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

Solar Speicher und Akkus Tests