-         

Ergebnis 1 bis 9 von 9

Thema: Wie lass ich die Motoren langsam anfahren?

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.12.2004
    Beiträge
    206

    Wie lass ich die Motoren langsam anfahren?

    Anzeige

    hallo.
    gleich vorweg, ich fang mit c grad an, und darum hab ich nicht so den peil.
    sonst hab ich avrs mit Bascom geproggt.
    den asuro hab ich mir mal wegen c gekauft. und jetzt ein kleines problem.

    ich will daß er langsam anfährt. leider geht das nicht so wie ich mir das vorstellt. es funktioniert so halb. leider "pulst" er die motoren.

    hier mal das programm, damit ihr mir meinen fehler sagen könnt,

    danke!!


    Code:
    #include "asuro.h"
    
    unsigned int spd;
    
    int main(void){
    
    	Init();
    
    //------- Programmschleife -------- 
    	while (1){
    		if (PollSwitch()>0) {
    		MotorSpeed(0,0);
    		StatusLED(RED);
    		MotorDir(RWD,RWD);
    		spd=90;
    		MotorSpeed(spd,spd);
    		}
    
    else  {
    
    //------ Kein Hindernis -------
    	StatusLED(GREEN);
    	if (spd<255) {
    		MotorDir(FWD,FWD);
    		for (spd=1; spd<=255; spd=spd+1) {
    			MotorSpeed(spd,spd);
    			Sleep(100);
    				}
    		}
    	else {
    		}
    }
    	}
    
    while (1);
    return 0;
    
    	
    }
    hab schon einiges geändert und umgebastelt. leider alles mit dem ähnlichen ergebnis.

    wenn mir da mal einer bitte meinen fehler erklären könnte.... DANKE!!

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.07.2007
    Beiträge
    349
    Wenn kein Hindernis erkannt wird geht das Programm in die for Schleife, erhöht die Geschwindigkeit, und verlässt danach die for Schleife mit Geschwindigkeit=255. Beim nächsten Durchlauf der while Schleife wird wieder kein Hindernis erkannt - es wird wieder in die for Schleife gesprungen, die mit spd=1 initialisiert wird. Was passiert? Asuro wird abgebremst, langsam erhöht sich die Geschwindigkeit wieder auf 255.

    Lass die for Schleife weg, und platziere das Sleep außerhalb aller if/else Abfragen.
    Grüße,
    Harri

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    168
    Hallo raptor_79,

    hier dein modifiziertes Programm:

    Code:
    #include "asuro.h"
    
    unsigned int spd;
    
    int main(void){
    
       Init();
    
    //------- Programmschleife --------
       while (1){
          if (PollSwitch()>0) {
          if (PollSwitch()>0)
          {
          MotorSpeed(0,0);
          StatusLED(RED);
          MotorDir(RWD,RWD);
          spd=90;
          MotorSpeed(spd,spd);
          msleep(1500); //1,5 sekunden rückwärts
          MotorSpeed(0,0);
          }
          }
    
    else  {
    
    //------ Kein Hindernis -------
       StatusLED(GREEN);
       MotorDir(FWD,FWD);
       if (spd<255) {
       spd++;   
          }
       else {
          spd = 1;
          }
       MotorSpeed(spd, spd);
    }
       }
    
    return 0;
       
    }
    Ich hoffe das hilft dir weiter.
    Bei Fragen einfach melden ...

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.07.2007
    Beiträge
    349
    @H3llGhost: Eine Zeitverzögerung fehlt(im else Zweig), sonst laufen die Motoren schlagartig wieder mit Vollgas.
    Grüße,
    Harri

  5. #5
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.782
    Blog-Einträge
    8
    StatusLED(GREEN);
    MotorDir(FWD,FWD);
    if (spd<255) {
    spd++;
    }
    else {
    spd = 1;
    }
    MotorSpeed(spd, spd);
    Und das funktioniert? Bei 8MHz jagt spd auf 255 und startet dann wieder bei 1?

    Diese verschachtelten PollSwitch() sind doch Unsinn! Wirklich richtig ist nur das mehrfache Einlesen und Vergleichen der Tastenwerte:

    Code:
    unsigned char t1,t2;
    t1=PollSwitch();
    t2=PollSwitch();
    if ((t1 == t2) && ( t1 > 0)) {
    msleep(1500); //1,5 sekunden rückwärts
    Wir sollten für Einsteiger erstmal bei der orginalen Library bleiben:

    unsigned int i;
    for(i=0; i<500; i++) Sleep(72); // 1/2 Sekunde Verzögerung

    Gruß

    mic

    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 Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    168
    Hallo radbruch,

    eigentlich wollte ich das auch mit dem Vergleichen der Tastenwerte machen, aber irgendwie kam ich nicht auf die Idee von dir ...
    Das hatten wir erst am Donnerstag in der Schule ...

    Stimmt ...
    Der 8MHz ist ja relativ schnell ...
    Habe ich nicht dran gedacht ... xD
    Bin ja bis jetzt auch noch ein Anfänger würde ich sagen ...

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.07.2007
    Beiträge
    349
    Man kann auch eine Funktion für die Kollissionstaster verwenden, die einem die richtigen Werte zurückliefert.
    Code:
    unsigned char fkt_taster(void)
    {
        unsigned char taster=0;
    
        taster=PollSwitch();
    
        if(taster==PollSwitch() && taster!=0)
            return taster;
        else
            return 0;
    }
    Grüße,
    Harri

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

    Bin ja bis jetzt auch noch ein Anfänger würde ich sagen ...
    Schon klar, aber gerade als Anfänger würde ich nie ungeprüften (= auf dem eigenen asuro getestet) Code abliefern. Obwohl ich mich inzwischen seit über einem Jahr mit dem asuro beschäftige mache ich das auch nur sehr selten (und es geht auch meist schief).

    Natürlich kann man auch eine Funktion basteln oder die Tasten als Menu mit Case auswerten:

    Code:
    #include "asuro.h"
    
    unsigned char t1, t2;
    int main(void){
    	Init();
    	while(1)
    	{
    	   t1=PollSwitch();
    	   t2=PollSwitch();
    	   if (t1 == t2) switch(t1){
    	      case 1: BackLED(OFF,ON); break;
    	      case 32: BackLED(ON,OFF); break;
    	      case 4: StatusLED(YELLOW); break;
    	      case 8: StatusLED(GREEN); break;
    			case 2: MotorSpeed(0,150); break;
    	      case 16: MotorSpeed(150,0); break;
    			case 18: FrontLED(ON); MotorSpeed(150,150); break;
    	      default: BackLED(OFF,OFF); FrontLED(OFF); \
    				StatusLED(RED); MotorSpeed(0,0); break;
    		} // Ende if/switch
    	} // Ende Main
       return 0;
    }
    Oje, wir driften wieder ins OffTopic..

    Code:
    #include "asuro.h"
    
    unsigned char t1, t2;
    unsigned int loop_count;
    
    int main(void){
    	Init();
    	loop_count = 0;
    	while(1)
    	{
    		t1 = PollSwitch();
    	   t2 = PollSwitch();
    	   if (t1 && (t1 == t2))
    	   {
    	      MotorDir(RWD,RWD);
    	      MotorSpeed(100,200);
    	      for(t1=255; t1; t1--) Sleep(127);
    	      MotorSpeed(0,0);
    			MotorDir(FWD,FWD);
    	      loop_count=0;
    		}
    		if (loop_count < 2000)
    		{
    			loop_count = loop_count + 1;
    		   MotorSpeed(loop_count/10,loop_count/10);
      		}
    	} // Ende Mainloop
       return 0;
    }
    ... und sind wieder drin *grins*

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.12.2004
    Beiträge
    206
    DANKE leute!!!!

    macht einfach spaß dieses forum... wegen den leuten...

    werd das mal testen. leider ist meine zeite gerade etwas knapp.

    werd dann morgen oder übermorgen mal ein ergebnis abliefern.

    war mit einer variante des programms sooo knapp vor der lösung. hatte es auch fast so.

    also, danke noch mal.

Berechtigungen

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