-         

Ergebnis 1 bis 9 von 9

Thema: Seltsamer Taster-Fehler

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    09.07.2011
    Ort
    Leonberg, Stuttgart
    Beiträge
    11

    Seltsamer Taster-Fehler

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo

    ich habe einen, für mich sehr mysteriösen, Fehler bei meinem Asuro. Damit ihr mir helfen könnt, muss ich aber wahrscheinlich ersteinmal mein kleines Programm erklären.

    Main-Datei:
    startet den Motor und soll anschließend nur noch auf Kollisionen reagieren.

    Code:
    int main(void)
    {
    
    	Init();
    	
    	MotorDir(FWD,FWD);
    	MotorSpeed(180,180);
    	
    	while(1) 
    	{
    		Kollisionskontrolle ();
    		Msleep(10);
    	}
    
    }
    Kollisionskontrolle:
    überprüft zuerst ob eine Kollision vorliegt (5mal in for-Schleife, da sonst Fehler auftraten ( einzelne falsche Werte) )
    anschließend wird je nachdem, welcher Schalter gedrückt ist eine andere Drehung durchgeführt


    Code:
    void Kollisionskontrolle (void)
    {
    	char Zaehler = 0; // Zaehler für die Kontrolle der Taster
    	int i;
    	
    	// Teste auf Kollision
    	for (i=0; i<5; i++)
    	{
    		if (PollSwitch() != 0)		Zaehler++;
    		
    		Msleep(1);
    	} 
    	
    	// Ist der Zahler größer als 1, so leigt eine Kollision vor
    	// In diesem Fall muss anhand des Pollswitch-Wertes, der auf Zaehler übergeben wird
    	// unterschieden werden wie zu reagieren ist.
    	if (Zaehler > 1)		
    	{
    		Zaehler = PollSwitch();
    				
    		// Stößt ganz links an - Asuro dreht 45° rechts
    		if (Zaehler == 32)
    		{
    			// K1 gedrückt - 45° nach rechts drehen
    			Drehung(45, 150);
    		}
    		
    		// Stößt ganz rechts an - Asuro dreht 45° nach links
    		else if (Zaehler == 1)
    		{
    			// K6 gedrückt - 45° nach links drehen
    			Drehung(-45, 150);
    		}
    		
    		// Stößt anders an - Asuro dreht 180°
    		else
    		{
    			// 90° Drehung 
    			Drehung(180, 150);
    		}
    	}
    }
    Drehung:
    Hier wird zuerst die aktuelle Geschwindkeit gespeichert. Anschließend der roboter ein Stück zurückgefahren und anschließend die Drehung durchgeführt. Zum Schluss fährt der Asuro mit der ursprünglichen Geschwindigkeit weiter.

    Code:
    void Drehung (int Grad,unsigned char Geschwindigkeit)
    {
    	int Faktor = 4;          // spezifischer Faktor - Je nach Reibung einzustellen damit Drehung etwa stimmt
    	unsigned char Left_Speed;
    	unsigned char Right_Speed;
    	
    	// Ursprüngliche Geschwindigkeit übernehmen
    	Left_Speed = OCR1A;
    	Right_Speed = OCR1B;
    	
    	
    	// Kurz zurücksetzen
    	MotorDir(RWD,RWD);
    	MotorSpeed(120,120);
    	Msleep(200);
    	MotorSpeed(0,0);
    	
    	// Unterscheide Links und Rechtsdrehung
    	if(Grad >0) // Rechtsdrehung
    	{
    		MotorDir(FWD,RWD);
    		MotorSpeed(Geschwindigkeit,-Geschwindigkeit);
    		Msleep(Grad * Faktor);
    	}
    	else
    	{
    		MotorDir(RWD,FWD);
    		MotorSpeed(-Geschwindigkeit,Geschwindigkeit);
    		Msleep(-Grad * Faktor);
    	}
    	
    	
    	
    	MotorDir(FWD,FWD);
    	MotorSpeed(Left_Speed,Right_Speed);

    Hat soweit bei meinen ersten Versuchen auch wunderbar funktioniert. Stell ich die Geschwindigkeit aber höher als ca. 150 macht der Asuro was er möchte. Teilweiße dreht er sich mehrfach, bzw die ganze Zeit. Eigentlich immer beginnt er sogar nicht mit vorwärtsfahren, bis ein Hindernis kommt, sondern beginnt direkt mit einer 180° Drehung.

    Ich habe mit einem kleinen Programm die Funktion der Taster getestet (auch bei laufendem Motor in verschiedenen Geschwindigkeiten). Dabei habe ich bis auf ganz wenige einzelne Fehler fast nur richtige Werte bekommen.
    Das Programm sah in etwa so aus:

    Code:
    if (PollSwitch() != 0)     UartPutc ('1');
    
    else UartPutc('0');
    
    Msleep(1);
    Ich habe mittlerweile alles mögliche ausprobiert und konnte auch im Quelltext keinen Fehler entdecken. Ich stehe etwas ratlos vor dem Problem. Deshalb hoffe ich, dass sich hier jemand die Mühe macht sich das mal genauer anzusehen.

    Vielen Dank
    Tausendacht

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.782
    Blog-Einträge
    8
    Entprellung der Taster, einer von unzähligen Threads zu diesem Thema:
    http://www.arexx.com/forum/viewtopic.php?f=19&t=1544

    [Edit]
    Zu: "Dabei habe ich bis auf ganz wenige einzelne Fehler fast nur richtige Werte bekommen."

    Code:
    	// Teste auf Kollision
    	for (i=0; i<5; i++)
    	{
    		if (PollSwitch() != 0)		Zaehler++;
    		
    		Msleep(1);
    	} 
    	
    	// Ist der Zaehler größer als 1, so liegt eine Kollision vor
    	// In diesem Fall muss anhand des Pollswitch-Wertes, der auf Zaehler übergeben wird
    	// unterschieden werden wie zu reagieren ist.
    	if (Zaehler > 1)		
    	{
    		Zaehler = PollSwitch();
    Jeder PollSwitch()-Fehler in der zaehler++ -Schleife würde dazu führen, dass die If-Bedingung erfüllt wird. Anschließend wird bei Zaehler = PollSwitch(); wieder der viel häufigere richtige Wert der Tasten eingelesen. Ist dieser dann nicht 1 oder 32 landet deine if-else-Kette hier:

    Code:
    		else
    		{
    			// 90° Drehung 
    			Drehung(180, 150);
    		}
    Geändert von radbruch (16.08.2011 um 17:41 Uhr)

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

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    09.07.2011
    Ort
    Leonberg, Stuttgart
    Beiträge
    11
    Hallo Radbruch

    Vielen Dank (schon wieder) für deine schnelle Antwort.

    Die Sache mit der Entprellung muss ich mir Morgen oder nacher noch genauer durchlesen. Ich versuche mich noch in die Materie einzuarbeiten und brauche deshalb für Alles etwas länger.

    Jeder PollSwitch()-Fehler in der zaehler++ -Schleife würde dazu führen, dass die If-Bedingung erfüllt wird. Anschließend wird bei Zaehler = PollSwitch(); wieder der viel häufigere richtige Wert der Tasten eingelesen. Ist dieser dann nicht 1 oder 32 landet deine if-else-Kette hier:
    Die if-Bedingung (Zaehler>1) wäre nur dann erfüllt, wenn (mindestens) 2 Fehler innerhalb von 5 Durchläufen (5ms) auftreten.
    Mit dem oben beschriebenem Progrämmchen hab ich dies überprüft und hatte nie 2 Fehler hintereinander, maximal jeder 2000. übermittelte Wert war ein falscher. Deshalb denke ich, dass hier kein Fehler liegen dürfte, oder verstehe ich Dich falsch?

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    09.07.2011
    Ort
    Leonberg, Stuttgart
    Beiträge
    11
    Ich hab mir Deinen Link durchgelesen und den Taster-Test aus der Library durchgeführt. Alle Taster liefern exakt den richtigen Wert. Nur wenn mindestens 4 Taster gedrückt sind kann es sein, dass der Wert um 1 abweicht.

    Ich hab also weiterhin keien Ahnung was da falsch läuft...

  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
    Zeig doch bitte mal eine komplette und komplierfähige Version von deinem Kollision-Programm.

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

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    09.07.2011
    Ort
    Leonberg, Stuttgart
    Beiträge
    11
    Normalerweiße auf 3 Dateien verteilt, hier der Einfachheit halber in einer:

    Code:
    #include "asuro.h"
    
    // Prototypen
    void Kollisionskontrolle (void);
    void Drehung (int Grad,unsigned char Geschwindigkeit);
    
    int main(void)
    {
    
    	Init();
    	
    	MotorDir(FWD,FWD);
    	MotorSpeed(210,210);
    	
    	while(1) 
    	{
    		Kollisionskontrolle ();
    		Msleep(5);
    	}
    	
    
    	return 0;
    }
    
    
    
    
    
    
    void Kollisionskontrolle (void)
    {
    	char Zaehler = 0; // Zaehler für die Kontrolle der Taster
    	int i;
    	
    	// Teste auf Kollision
    	for (i=0; i<5; i++)
    	{
    		if (PollSwitch() != 0)		Zaehler++;
    		
    		Msleep(1);
    	} 
    	
    	// Ist der Zahler größer als 1, so leigt eine Kollision vor
    	// In diesem Fall muss anhand des Pollswitch-Wertes, der auf Zaehler übergeben wird
    	// unterschieden werden wie zu reagieren ist.
    	if (Zaehler > 1)		
    	{
    		Zaehler = PollSwitch();
    		
    		// Unterschiedliche Reaktionen
    		
    		// Stößt ganz links an - Asuro dreht 45° rechts
    		if (Zaehler == 32)
    		{
    			// K1 gedrückt - 45° nach rechts
    			Drehung(45, 150);
    		}
    		
    		// Stößt ganz rechts an - Asuro dreht 45° nach links
    		else if (Zaehler == 1)
    		{
    			// K6 gedrückt - 45° nach links
    			Drehung(-45, 150);
    		}
    		
    		// Stößt anders an - Asuro dreht 180°
    		else
    		{
    			// 90° Drehung
    			Drehung(180, 150);
    		}
    	}
    }
    
    
    
    void Drehung (int Grad,unsigned char Geschwindigkeit)
    {
    	int Faktor = 4;
    	unsigned char Left_Speed;
    	unsigned char Right_Speed;
    	
    	// Ursprüngliche Geschwindigkeit übernehmen
    	Left_Speed = OCR1A;
    	Right_Speed = OCR1B;
    	
    	
    	// Sicherheitshalber kurz zurücksetzen
    	MotorDir(RWD,RWD);
    	MotorSpeed(120,120);
    	Msleep(200);
    	MotorSpeed(0,0);
    	
    	// Unterscheide Links und Rechtsdrehung
    	if (Grad >0) // Rechtsdrehung
    	{
    		MotorDir(FWD,RWD);
    		MotorSpeed(Geschwindigkeit,-Geschwindigkeit);
    		Msleep(Grad * Faktor);
    	}
    	else // Linksdrehung
    	{
    		MotorDir(RWD,FWD);
    		MotorSpeed(-Geschwindigkeit,Geschwindigkeit);
    		Msleep(-Grad * Faktor);
    	}
    	
    	
    	
    	MotorDir(FWD,FWD);
    	MotorSpeed(Left_Speed,Right_Speed);
    	
    }

  7. #7
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.782
    Blog-Einträge
    8
    So vielleicht:
    Code:
    void Kollisionskontrolle (void)
    {
    	char Zaehler = 0; // Zaehler für die Kontrolle der Taster
    	char sw[5]; // Speicher für 5 Tastenwerte
    	int i;
    
    	// Teste auf Kollision
    	for (i=0; i<5; i++)
    	{
    		sw[i]=PollSwitch(); // Tastenwert speichern
    		if (sw[i] != 0) Zaehler++; // Wenn eine Taste erkannt wird Zähler erhöht
    
    		Msleep(1);
    	}
    
    	// Wurde fünf mal die selbe Taste erkannt?
    	if ((Zaehler == 5) && (sw[0]==sw[1]) && (sw[0]==sw[2]) && (sw[0]==sw[3]) && (sw[0]==sw[4]))
    	{
    		//Zaehler = PollSwitch();
    		Zaehler=sw[0];
    
    		// Unterschiedliche Reaktionen
    ...

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

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    09.07.2011
    Ort
    Leonberg, Stuttgart
    Beiträge
    11
    Guten morgen

    Ich habe deine Änderung vorgenommen und den Asuro geflasht. Momentan dreht er sich bei einem Aufprall zumindestens nicht mehrfach.
    Dafür kommt es vor, dass er nachdem er gegen einen Schrank oder Ähnliches fährt anschließend nur noch rückwärts fährt.
    Manchmal verändert er nach einer normaler Drehung auch die Geschwindigkeit, was wohl die Geschwindigkeit beim Drehen ist, jedoch nicht die ursprüngliche.
    Ein weiterer Fehler ist, dass er sich manchmal nach einem aufprall endlos dreht. Manchmal beginnen während der Fehler auch LEDs zu leuchten...

    Alle Versuche die ich unternommen hab um nach einem System hinter dem Fehler zu suchen laufen ins leere... der kleine hat wohl nen widerspenstiges Eigenleben entwickelt.
    Geändert von Tausendacht (17.08.2011 um 11:32 Uhr)

  9. #9
    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

    Wenn die LEDs blinken gabs einen Reset oder eine "VL"-Meldung. Beides könnte von schwachen/leeren Akkus kommen, z.B. nach längerer Fahrtdauer, oder von den Erschütterungen beim Aufprall.

    Grundsätzlich muss man bedenken, dass jede Kollision den asuro komplett erschüttert. Die Taster sind fast schon am Ende des Betätigungswegs, wenn der Kontakt durchschaltet. Und sie werden dann bis zum Anschlag gedrückt, weil der asuro nicht schnell genug bremsen kann. Dadurch ist die mechanische Belastung an der Platine recht hoch. Schlechte Lötstellen, Kontaktprobleme im Batteriehalter oder am Schalter, Blockierströme der Antriebe, und was weiß ich noch alles, könnte stören.
    PHP-Code:
    int main(void)
    {
        
    int i;

        
    Init();
        
        for(
    i=1i<10i++) // Reseterkennung
        
    {
           
    StatusLED(3);
           
    Msleep(200);
        }
        
    StatusLED(GREEN);
        
        while(
    1)
        {
            
    MotorDir(FWD,FWD);
            
    MotorSpeed(210,210);

            
    Kollisionskontrolle ();

            
    Msleep(5);
        }
        return 
    0;

    Zusätzlich könntest du die Tastenwerte zur Kontrolle an ein Terminal senden:
    http://www.roboternetz.de/community/...ernd-kollision
    http://www.roboternetz.de/community/...l=1#post284529
    http://www.roboternetz.de/community/...rekt-auslesen?
    http://www.roboternetz.de/community/...e-korrigieren?

    Gruß

    mic

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

Ähnliche Themen

  1. seltsamer ueberlauf ??
    Von goara im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 03.02.2008, 23:26
  2. Asuro Taster K1 - Fehler Hilfe
    Von Alex23 im Forum Asuro
    Antworten: 2
    Letzter Beitrag: 04.07.2007, 13:42
  3. Seltsamer Sensor
    Von Der_Anfänger im Forum Sensoren / Sensorik
    Antworten: 17
    Letzter Beitrag: 17.06.2007, 14:38
  4. Seltsamer Fehler - wer weiß Rat?
    Von Powell im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 26.11.2006, 21:57
  5. seltsamer IR-Empfänger
    Von StEndres im Forum Elektronik
    Antworten: 8
    Letzter Beitrag: 19.02.2006, 19:43

Berechtigungen

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