-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: um einen Gegenstand herum/ Odometrie

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    01.12.2006
    Beiträge
    11

    um einen Gegenstand herum/ Odometrie

    Anzeige

    Entschuldigt meine allg. Unwissenheit zu diesem Thema, da ich noch recht neu bin.
    Aber nun zu meiner Frage: Mir ist bewusst dass es zu diesem thema schon viele threats gibt, aber die nützen alle nichts (desswegen brauche ich eine privatanpassung von einem netten menschen) : ich habe hier einen prgrammcode, bei dem ich selbst nach mehrmaligem drüberschauen nicht den fehler finden konnte, denn wenn ich ihn ausführe, macht der roboter nicht das was er soll, er fährt nur geradeaus. Der Editor hat scheinbar keinen fehler gebracht.


    Code:
    #include "asuro.h"
    
    int main(void) {
    	Init ();
    
    	int cm90=16.5;
    	int s1=10;
    	int s2=20;
    	int i, t;
    	for(i=0;i<10;i++)
    	{
    		PollSwitch();
    	} 
    	t=PollSwitch();
    
    	while (1) {
    		if (t>=1) {
    			Encoder_Init();
    			while (encoder[LEFT]<=cm90*3) 
    			{
    				MotorDir(FWD,FWD);
    				MotorSpeed(160,0);
    			}
    			cm90=0;
    			MotorDir(BREAK,BREAK);
    			MotorSpeed(0,0);
    			while (encoder[LEFT]<=s1*3) 
    			{
    				MotorDir(FWD,FWD);
    				MotorSpeed(160,160);
    			}
    			MotorDir(BREAK,BREAK);
    			MotorSpeed(0,0);
    			cm90=0;
    			while (encoder[RIGHT]<=cm90*3) 
    			{
    				MotorDir(FWD,FWD);
    				MotorSpeed(0,160);
    			}
    			MotorDir(BREAK,BREAK);
    			MotorSpeed(0,0);
    			cm90=0;
    			while (encoder[LEFT]<=s2*3) 
    			{
    				MotorDir(FWD,FWD);
    				MotorSpeed(160,160);
    			}
    			MotorDir(BREAK,BREAK);
    			MotorSpeed(0,0);
    			cm90=0;
    			while (encoder[RIGHT]<=s1*3) 
    			{
    				MotorDir(FWD,FWD);
    				MotorSpeed(0,160);
    			}
    			MotorDir(BREAK,BREAK);
    			MotorSpeed(0,0);
    			cm90=0;
    			while (encoder[LEFT]<=s1*3) 
    			{
    				MotorDir(FWD,FWD);
    				MotorSpeed(160,0);
    			}
    			MotorDir(BREAK,BREAK);
    			MotorSpeed(0,0);
    			cm90=0;
    		} else  {
    			MotorDir (FWD,FWD);
    			MotorSpeed(160,160);
    		}
    	}
    	return 0;
    }
    DiV RacerD

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.11.2006
    Ort
    Geislingen a. d. Steige
    Alter
    26
    Beiträge
    344
    Hallo RacerD,

    Code:
    for(i=0;i<10;i++)
       {
          PollSwitch();
       }
       t=PollSwitch();
    dieser teil muss mit in die while(1){} da er nur 10 taktzüklen ausgeführt wird.

    MfG Martinl

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    01.12.2006
    Beiträge
    11
    geholfen hat es nicht... aber trotzdem vielen dank

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    01.11.2006
    Beiträge
    433
    das problem liegt an dem ganzen zeugs was bei der if abfrage ausgeführt wirdl.
    probier mal obs geht, wenn du erst noch encoderset(0,0) aufurfst.

    wenn nich könntest du doch auch einfach go unt turn hernehmen.
    ...

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    01.12.2006
    Beiträge
    11
    encoderset(0,0) kennt er scheinbar nicht

    was go und turn betrifft.... übt das mich ja nicht...aber gut.. ich werde es versuchen

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    01.11.2006
    Beiträge
    433
    EncoderSet(0,0)

    kennt er vieleicht schon. ich bin halt zu fual dei umschalttaste zu benutzen
    ...

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    21.03.2004
    Ort
    73061 Ebersbach
    Alter
    48
    Beiträge
    52
    ist es nicht so, dass am anfang

    for(i=0;i<10;i++)
    {
    PollSwitch();
    }
    t=PollSwitch();
    hier testest du ob schalter gedrückt (10 zyclen)!!

    dann gehst du in dei while
    while (1) {
    if (t>=1) {
    ..schnipp...
    } else {
    MotorDir (FWD,FWD);
    MotorSpeed(160,160);
    }
    und in der while testest du den taster.

    nur wird in der while nie der taster aktualisiert und somit fährt asuro immer gerade aus ....
    es sei denn, der taster würde gedrückt werden bevor!!!!!!! er losfähr.

    hmm das hat martin schon geschrieben...


    aber in der schleife...
    teste mal

    Code:
     #include "asuro.h"
    
    int main(void) {
       Init ();
    
       int cm90=16.5;
       int s1=10;
       int s2=20;
       int i, t;
    
    
       while (1) {
          for(i=0;i<10;i++)
       	  {
        	  PollSwitch();
       	  }
          t=PollSwitch();
          if (t>=1) { //Scahlter wurde gedrückte
             Encoder_Init();
             while (encoder[LEFT]<=cm90*3)
             {
                MotorDir(FWD,FWD);
                MotorSpeed(160,0);
             }
             cm90=0; //warum setzt du den cm90 auf 0?
             MotorDir(BREAK,BREAK);
             MotorSpeed(0,0);
    
          } else  {
             MotorDir (FWD,FWD);
             MotorSpeed(160,160);
          }
       }
       return 0;
    }
    aber sag mal wass soll da genau passieren?
    taste gedrückt und dann....
    1. while in if abfrage -->drehe rechts
    while (encoder[LEFT]<=cm90*3)
    {
    MotorDir(FWD,FWD);
    MotorSpeed(160,0); //rechts drehen
    }
    dann geradeausfahren..... (2. while)

    dann setzt du cm90 auf 0 damit ist die 3. while unsinnig
    cm90=0;
    while (encoder[RIGHT]<=cm90*3)
    {
    MotorDir(FWD,FWD);
    MotorSpeed(0,160);
    }
    danach sieht es für mich so aus als ob die s2 und s1 viel kleiner als encoder -->while wird nicht gefahren


    gruß
    ralf

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    01.11.2006
    Beiträge
    433
    ist es nicht so, dass am anfang


    for(i=0;i<10;i++)
    {
    PollSwitch();
    }
    t=PollSwitch();
    hier testest du ob schalter gedrückt (10 zyclen)!!
    da wird benötigt, weil bei einmaligem aufruf falsche werte drannstehen können, weil sich dieser kondensator da noch nciht entladen hat.
    ...

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    01.12.2006
    Beiträge
    11
    also erstmal ein großes danke an euch beide: EDH und Downad

    @Downad
    ok das mit dem taster IN der schleife hab ich geändert
    was nun das program machen soll? nunja es sollte etwa sowas machen:

    sobald er an meinen Finger (representativ für einen Gegenstand) stößt, sollte er eine rechtsdrehung machen , ein stück vorwärts fahren, links drehn, vorwärts wieder links und mit der vorderseite zum finger zeigend, also genau 180° gedreht im gegensatz zur startposition. (hoffenltich versteht das jemand)

    natürlich muss er nach dem anstoßen noch ein stück zurück fahren. Aber das sollte erstmal ein versuch sein, dass die Befehlsfolge eingehalten wird.

    Zitat Zitat von Downad
    Code:
    cm90=0; //warum setzt du den cm90 auf 0?
    Das ist natürlcih unsinn, was ich da geschrieben hab. t sollte 0 gesetzt werden.


    Zitat Zitat von Downad
    danach sieht es für mich so aus als ob die s2 und s1 viel kleiner als encoder -->while wird nicht gefahren
    Das verstehe ich nicht, beim geradeausfahren (gleiche variablen, nur beim motor 160 links sowohl rechts) ist er genau meine angegebene strecke gefahren... vllt zählt mein encoder anders?

    mfg RD

  10. #10
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    naja... also bis auf kleine abweichungen sollten eigentlich alle encoder gleich zählen =)

    poste mal den aktuellen code, so wie er im moment ist (nach allen korrekturen).
    kleinschreibung ist cool!

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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