- fchao-Sinus-Wechselrichter AliExpress         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 19 von 19

Thema: Asuro Programmierung

  1. #11
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.09.2010
    Alter
    30
    Beiträge
    129
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Ja ich wollte überprüfen ob der Wert jetzt dem Wert davor mit der toleranz von + - 1 entspricht. Da das auch mal sein kann, dass der Asuro beim fahren die 2 gleichen Werte bekommt wollte ich mit dem zaehler hochzählen. Wenn es dann 100 mal der gleiche wert ist sollte er umdrehen weil er da wahrscheinlich stecken geblieben ist.
    Hab das ganze jetzt mit dem Motorwiederstand gemacht und es geht ganz gut. Es kommen aber manchmal noch "Fehlalarme" aber da muss ich noch ein bisschen mit den Werten spielen.

    Mir ist jetzt aber aufgefallen dass wenn jetzt alles funktioniert der Asuro ziemlich ausgelastet ist. Er erkennt die Tischkante, aber oft einen kleinen wenig zu spät. Könnte das auch an der langsam leere Batterie liegen oder ist das weil er soviel zum arbeiten hat?

  2. #12
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Hier ist den Verzögerung vermute ich. Wie oft passiert das, das kein IR Signal empfangen wird? Weil speed immer > 0 (einmal eingestellt mit 130, und keine änderung) ist wird er jeder Durchlauf (wann kein IR-Signal empfangen ist seit diesen Durchlauf und den vorherigen) einer halbe Sekunde warten

    Code:
    if (speed > 0) Msleep(500);

  3. #13
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Hier ist den Verzögerung vermute ich. Wie oft passiert das, das kein IR Signal empfangen wird? Weil speed immer > 0 (einmal eingestellt mit 130, und keine änderung) ist wird er jeder Durchlauf (wann kein IR-Signal empfangen ist seit diesen Durchlauf und den vorherigen) einer halbe Sekunde warten

    Code:
    if (speed > 0) Msleep(500);

  4. #14
    Benutzer Stammmitglied
    Registriert seit
    10.05.2010
    Beiträge
    38
    Kann der überhaupt mit der 500 umgehen?
    Asuro kann doch nur bis 255 rechnen... oder nicht?

  5. #15
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    In seinem Code für Msleep ist dauer definiert als int.

    void Msleep(int dauer)

    Deshalb kann dauer zwischen -32,768 bis 32,767 sein. Aber Sleep kann nur mit werten bis 255 arbeiten.

  6. #16
    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

    Da das auch mal sein kann, dass der Asuro beim fahren die 2 gleichen Werte bekommt...
    Ist dir klar, dass die Odometrie-Werte keine Impulse sind sondern nur die vom Sensor gemessene Helligkeit bedeutet? Die mit OdometrieData() eingelesenen Werte schwanken deshalb auch im Stillstand.

    Der Werteverlauf (ohne Fremdlichteinflüsse) bewegt sich nahezu sinusförmig zwischen min- und Maxwert. Die Kunst bei der Odometrie besteht nun darin, aus diesen Werten einen Flankenwechsel zu erkennen. Ansätze und umfangreiche Diskussionen (teilweise mit sehr aufschlussreichen Diagrammen) gibt es schon ein paar hier im Forum. Um so eine Stillstandserkennung zu Programmieren benötigt man leider schon etwas höhere Weihen:
    https://www.roboternetz.de/phpBB2/ze...ag.php?t=49901

    Eine Programmgrenze sehe ich hier:

    Code:
             else if (PollSwitch() != 0)
             {
                Sleep(255);
                if(PollSwitch() != 0)
                {
    Wenn PollSwitch() "Störungen" einfängt, wird jedesmal eine Sleep(255)-Pause eingefügt.

    Effektiver wäre folgender Ansatz für PollSwitch():
    Code:
    #include "asuro.h"
    
    char t1, t2; 
    
    int main (void)
    {
    	t1=0; // mit "keine Taste" vorbelegen
    	while(1)
    	{
    	   t2=t1; // alten Wert der Tasten merken
    		t1=PollSwitch(); // aktuellen Wert einlesen
    		// t1=PollSwitch(); // eventuell nötig damit der ADC sauber umschalten kann
    
    	   if(t1 && t1==t2) // nur wenn Taste gedrückt und beide Werte gleich sind
    	   {
    	      // Ab hier stehen dann alle Tastenfunktionen:
    	      // if(t1==1 // K6
    	      // if(t1==32 // K1
    	      // if(t1||&b111000) // K4 oder K5 oder K6
    		}
    
    		// Linienabfrage
    			
    		// Odometrie
    			
    		// und was sonst noch nötig ist.
       }
       return 0;
    }
    Dafür gibt es aber auch andere Lösungsansätze.

    Gruß

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

  7. #17
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.09.2010
    Alter
    30
    Beiträge
    129
    So habe das mit den Tastern verbessert.
    Der ganze Code sieht jetzt in etwa so aus:



    Code:
    #include "asuro.h"
    #include <stdlib.h>
    
    unsigned char ir1;
    
    #define PWM_STEP 5 
    #define MESSZEIT 500 //ms
    #define FULL_L 130
    #define FULL_R 130
    
    /* Motor vorwärts */
    void MotorFwd(void)
    {
      MotorDir(FWD,FWD);
      MotorSpeed(FULL_L,FULL_R);
    }
    
    /* Motor rückwärts */
    void MotorRwd(void)
    {
      MotorDir(RWD,RWD);
      MotorSpeed(FULL_L,FULL_R);
    }
    
    /* Motor rückwärts Links */
    void MotorRwdL(void)
    {
      MotorDir(RWD,RWD);
      MotorSpeed(FULL_L,0);
    }
    
    /* Motor rückwärts Rechts */
    void MotorRwdR(void)
    {
      MotorDir(RWD,RWD);
      MotorSpeed(0, FULL_R);
    }
    
    /* Motor stop */
    void MotorStop(void)
    {
      MotorSpeed(0,0);
    }
    
    int main (void)
    {
    
    	unsigned int lData[2];
    	
    	unsigned char sw, speed;
    	unsigned char ir;
    	int t1, t2;
    	int u;
    	int Reibung_links;
    	int Reibung_rechts;
    	unsigned char ir2;
    	
    	
    	Init();
    	DDRD |= (1 << DDD1);   // Port D1 als Ausgang
    	PORTD &= ~(1 << PD1);   // PD1 auf LOW
    	OCR2  = 0xFB;
    	speed=130; 
    	Encoder_Init();
    
    	for(;;)
        {
    		ir=PIND & (1 << PD0); 
    		FrontLED(ON);
    		LineData(lData);
    					
    		if (PIND & (1 << PD0))
    		{
    			if(lData[1] <= 80 && lData[1] >= 10)
    			{
    				BackLED(ON,ON);
    				StatusLED(GREEN);
    				MotorDir(RWD, RWD);
    				MotorSpeed(190, 190);
    				Msleep(500);
    				MotorDir(BREAK, RWD);
    				MotorSpeed(0, 150);
    				Msleep(500);
    			
    			}
    			else
    			{
    				FrontLED(ON);
    				BackLED(OFF,OFF);
    				StatusLED(RED);
    				MotorDir(FWD, FWD);
    				MotorSpeed(140, 140);
    			}
    			
    		}
    		else 
    		{
    			  BackLED(ON,ON);
    			  MotorDir(RWD,RWD);
    			  MotorSpeed(speed,speed);
    			  if (speed > 0) Msleep(500);
    			  MotorDir(BREAK,RWD);
    			  MotorSpeed(0,speed);
    			  if (speed > 0) Msleep(500);
    		}
    		
    		
    			
    		ir1=ir;
    		ir2=ir1; 
    		
    		sw = PollSwitch();
    		
    		   if (sw & 0x04)
    		   {
    			  OCR2  = 0xFC;
    		   }
    		   if (sw & 0x08)
    		   {
    			  OCR2  = 0xFB;
    		   }
    		   
    			u=Batterie(); // u=922 entspricht 5.03V
    			Encoder_Set(0,0); // Messung starten
    			Msleep(500); // 500 ms Messen
    
    			Reibung_links =  PWM*u*10/255-25*encoder[LEFT];
    			Reibung_rechts = PWM*u*10/255-25*encoder[RIGHT];
    			
    			LineData(lData); // nochmals erneut prüfen ob  er eine Tischkante erreicht hat,
    //da er ja 0,5 Sekunden für das Messen gebraucht hat.
    			
    			if(lData[1] <= 80 && lData[1] >= 10) 
    			{
    				BackLED(ON,ON);
    				StatusLED(GREEN);
    				MotorDir(RWD, RWD);
    				MotorSpeed(190, 190);
    				Msleep(500);
    				MotorDir(BREAK, RWD);
    				MotorSpeed(0, 150);
    				Msleep(500);
    			}
    			
    			if(Reibung_links >= 108 || Reibung_rechts >= 108) //Jetzt prüfen ob die Reibung den bestimmten Wert erreicht hat
    			{
    				BackLED(ON,ON);
    				StatusLED(YELLOW);
    				MotorDir(RWD, RWD);
    				MotorSpeed(150, 150);
    				Msleep(800);
    				MotorDir(BREAK, RWD);
    				MotorSpeed(0, 150);
    				Msleep(530);
    			}
    			
    				t1 = PollSwitch();
    				t2 = PollSwitch();
    				
    				if (t1 == 0 && t2 == 0)         
    				{
    				  MotorFwd();          /* vorwärts fahren */
    				  FrontLED(ON);
    				  BackLED(OFF,OFF);
    				}
    				else if (t1 && t2 && t1 == t2)
    				{
    				  MotorStop();
    				  if (t1 & 0x07) /* Tasten links gedrückt? */
    				  {
    					MotorRwdL();       /* Rückwärtskurve links fahren */
    					FrontLED(OFF);
    					BackLED(ON,OFF);
    				  }
    				  if (t1 & 0x38) /* Tasten rechts gedrückt? */
    				  {
    					MotorRwdR();       /* Rückwärtskurve rechts fahren */
    					FrontLED(OFF);
    					BackLED(OFF,ON);
    				  }
    				  Msleep(1000);        /* 1 Sekunde fahren */
    				}	
        }
    	return 0;
    }
    Nun kommen aber noch 2 Warnungen:

    test.c:136: warning: suggest parentheses around arithmetic in operand of |
    test.c:137: warning: suggest parentheses around arithmetic in operand of |

    in diesen Zeilen:

    Reibung_links = PWM*u*10/255-25*encoder[LEFT];
    Reibung_rechts = PWM*u*10/255-25*encoder[RIGHT];

  8. #18
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Multiplikation und Teilungen haben eine höhere Priorität als Addieren und Subtraktion.

    http://www.rn-wissen.de/index.php/C-...der_Auswertung

    Den Compiler gibt den Warnung das es möglich eine andere berechnungs-ordnung macht als du wünscht. Runde Klammern haben immer die Höchste Priorität. Ich empfehle dich auch den beiden seiten der || und && logische-stellungen im if-regeln mit runde Klammern zu trennen.

  9. #19
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.09.2010
    Alter
    30
    Beiträge
    129
    Ok danke.
    Das mit der Tischkante klappt nun auch wieder, nur wenn der Asuro schräg auf die Tischkante zufährt fällt er noch runter.
    Hat jemand noch einen Verbesserungsvorschlag, damit das nicht passiert weil ich glaube nicht, dass man da sehr viel machen kann.

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

Solar Speicher und Akkus Tests