-
        

Ergebnis 1 bis 6 von 6

Thema: Antikolisionsprogramm mit Tastern

  1. #1
    Erfahrener Benutzer Begeisterter Techniker Avatar von JensK
    Registriert seit
    27.02.2007
    Ort
    Hamburg
    Alter
    26
    Beiträge
    254

    Antikolisionsprogramm mit Tastern

    Anzeige

    ich habe mal ein programm mit meine Vater entworfen, wo der Asuro, wenn er irgendwo gegen fährt dem hinderniss ausweicht.

    nur jetzt haben wir ein problem... alle Taster senden immer verschieden signale von sich an den hyperterminal... wie kann man das programm optimieren, so dass es funktioniert?
    ich hoffe ihr könnt uns helfen

    schonmal vielen dank für eventuelle Hilfe

    MfG

    JensK
    wenn ihr die .hex braucht um es zu testen.. dann fragt einfach nach
    Code:
    /**************************************************************************************
    *
    * File Name:   test.c
    * Project  :   ASURO
    *
    * Ver.     Date         Author   Comments
    * -------  ----------   ------   ------------------------------
    * 1.00	   17.04.2006   mko		 build
    * 1.10	   17.04.2006   mko		 erweiterte asuro.h vom 27. September 2005 eingebunden
    * 1.20	   20.04.2006   mko		 erweitert um Odometriedaten und doppeltes Auslesen der 
    *								 Schalter
    * 1.30	   02.03.2007   mko		 erweitert "geradeausfahren"
    *
    ****************************************************************************************/
    
    
    #include "asuro.h"
    #define LA 0x20   // Taster links aussen
    #define LM 0x10   // Taster links mitte
    #define LI 0x8    // Taster links innen
    #define RI 0x4    // Taster rechts innen
    #define RM 0x2    // Taster rechts mitte
    #define RA 0x1    // Taster rechts aussen
    #define LRI 0xC   // Taster links und rechts innen
    #define LAM 0x30  // Taster links aussen und mitte
    #define LRM 0x12  // Taster links und rechts mitte
    #define RAM 0x3   // Taster rechts aussen und mitte
    
    #define LMIN 0x60 // Links läuft der Motor früher an als rechts
    #define RMIN 0x60 // rechts etwas höher beginnen
    #define LMAX 0x64 // Maximal 200, gleiche maximal Umdrehung für beide Seiten
    #define RMAX 0x64 // Maximal 200
    
    unsigned int i, j;
    unsigned int lspeed, rspeed;
    unsigned char taste1, taste2;
    unsigned int odata[1];
    
    int NachLinksAusweichen(void)
    {
    // LED einschalten
    	BackLED(OFF,ON);
    // Motor stoppen
    	MotorSpeed(0,0);
    // Rechtskurve zurück
    	MotorDir(RWD,BREAK);
    	MotorSpeed(120,0);
    	Msleep(1000);
    	MotorSpeed(0,0);
    // LED ausschalten
    	BackLED(OFF,OFF);
    // Weiterfahren
    	MotorDir(FWD,FWD);
    	lspeed=LMIN;
    	rspeed=RMIN;
    	return 0;
    }
    
    int NachRechtsAusweichen(void)
    {
    // LED einschalten
    	BackLED(ON,OFF);
    // Motor stoppen
    	MotorSpeed(0,0);
    // Linkskurve zurück
    	MotorDir(BREAK,RWD);
    	MotorSpeed(0,120);
    	Msleep(1000);
    	MotorSpeed(0,0);
    // LED ausschalten
    	BackLED(OFF,OFF);
    // Weiterfahren
    	MotorDir(FWD,FWD);
    	lspeed=LMIN;
    	rspeed=RMIN;
    	return 0;
    }
    
    int ZurueckSetzen(void)
    {
    // LED einschalten
    	BackLED(ON,ON);
    // Motor stoppen
    	MotorSpeed(0,0);
    // Linkskurve zurück
    	MotorDir(RWD,RWD);
    	MotorSpeed(LMAX,RMAX);
    	Msleep(1000);
    	MotorSpeed(0,0);
    // LED ausschalten
    	BackLED(OFF,OFF);
    // Weiterfahren
    	MotorDir(FWD,FWD);
    	lspeed=LMIN;
    	rspeed=RMIN;
    	return 0;
    }
    
    int Aufgeben(void)
    {
    // LED einschalten
    	BackLED(ON,ON);
    // Motor stoppen
    	MotorSpeed(0,0);
    // LED ausschalten
    	BackLED(OFF,OFF);
    // Status LED ausschalten
    	StatusLED(OFF);
    }
    
    int main(void)
    {
    	Init();
    	
    	// Vorwärts fahren
    	MotorDir(FWD,FWD);
    	// mit minimaler Geschwindigkeit beginnen
    	lspeed = LMIN;
    	rspeed = RMIN;
    	do
    	{
    		// Eine Sekunde mit dieser Geschwindigkeit fahren 
    		Msleep(1000);
    		// Solange Geschwindigkeit erhöhen, bis maximal Geschwindigkeit erreicht ist
    		if (lspeed < LMAX) lspeed++;
    		if (rspeed < RMAX) rspeed++;
    		MotorSpeed(lspeed,rspeed);
    		OdometrieData(odata);  // Auslesen der Umdrehung
    		PrintInt(odata[0]);    // Ausgabe auf serielle Schnittstelle
    		PrintInt(odata[1]);    // Ausgabe auf serielle Schnittstelle
    		taste1 = PollSwitch(); // Taster einmal abfragen
    		taste2 = PollSwitch(); // Taster zweitesmal abfragen
    		PrintInt(taste1);
    		PrintInt(taste2);
    		if (taste1 == taste2)  // beide Tastedrücke vergleichen
    		{
    			// Entscheiden, was zu tun ist
    			if (taste1 == LA) 
    				NachRechtsAusweichen();
    			else if (taste1 == LM) 
    				NachRechtsAusweichen();
    			else if ((taste1 == LI) || (taste1 == RI))
    				ZurueckSetzen();
    			else if (taste1 == RM) 
    				NachLinksAusweichen();
    			else if (taste1 == RA) 
    				NachLinksAusweichen();
    			else
    				Aufgeben();
    		}
    	} while (1);
    	return 0;
    }
    Angehängte Dateien Angehängte Dateien

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

    In der Suche "Problem AND Taster" eingeben und "|||-- Asuro" wählen.

    Ein Beispielthread:
    http://www.roboternetz.de/phpBB2/zei...ag.php?t=26648

    Gruß

    mic

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

  3. #3
    Erfahrener Benutzer Begeisterter Techniker Avatar von JensK
    Registriert seit
    27.02.2007
    Ort
    Hamburg
    Alter
    26
    Beiträge
    254
    ohh sry bin ahlt neu hier im fourm und wuste net wo man suchen kann..


    MfG

    JensK

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Kein Problem. Herzlich willkommen hier im Forum.

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

  5. #5
    Hallo,

    die meisten Tasterprobleme werden meiner Erfahrung nach auch durch diese kleinen Modifikationen an PollSwitch gelöst:

    Code:
    unsigned char PollSwitch (void){
      unsigned int i;
      
      // Kehrt sofort zurück, falls kein Taster gedrückt ist
      if (PIND & SWITCHES) return 0;
    
      DDRD |= SWITCHES;                     // Port-Bit SWITCHES als Output
      SWITCH_ON;                            // Port-Bit auf HIGH zur Messung
      ADMUX = (1 << REFS0) | SWITCH;        // AVCC reference with external capacitor
      Sleep (10);                           // Kondensator Zeit geben
    
      ADCSRA |= (1 << ADSC);                // Starte AD-Wandlung
      while (!(ADCSRA & (1 << ADIF)));     // Ende der AD-Wandlung abwarten
      ADCSRA |= (1 << ADIF);                // AD-Interupt-Flag zuruecksetzen
    
      i = ADCL + (ADCH << 8);               // Ergebnis als 16-Bit-Wert
    
      DDRD &= ~SWITCHES;                    // Pin SWITCHES als Eingang
      SWITCH_OFF;                           // Pull-Up abschalten
      Sleep (5);
    
      return ((10240000L / (long)i - 10000L) * 63L + 5000L) / 10000;
    
    }
    Die Abfrage des INT1/PD3"=Pins sofort zu Beginn ist eher eine Performance=Frage und unterbindet das Anwerfen des Wandlers, wenn sowieso keiner der Taster gedrückt ist.

    Wesentlich wichtiger ist das Rücksetzen von PD3 auf Input&PullUpOff direkt nach der Messung.

    In der ursprünglichen Version von PollSwitch wird lediglich SWITCH_OFF (=PORTD &= ~(1 << PD3)) durchgeführt, was PD3 als Output/GND hinterlässt. Damit lädt sich Kondensator C7 nach dem ersten Aufruf von PollSwitch nur noch auf die durch den Spannungsteiler R24/R23 (1k/1M) erzeugte Spannung auf (jedenfalls solange kein Taster gedrückt ist). Der nächste Aufruf von PollSwitch setzt PD3 zu Beginn zwar wieder auf HighPegel, wodurch eine zweckmäßige Messung prinzipiell gelingen kann -- Jedoch zeigt das Ergebnis wohl durch das träge Aufladen des Kondensators oftmals auch dann einen gedrückten Taster an, wenn tatsächlich keiner gedrückt ist.

    Natürlich muss unter Umständen zusätzlich noch der bekannte Multiplikator (bei mir 63) angepasst werden, damit überhaupt sinnvolle Werte zurückgegeben werden können. Die jedoch mitunter auch nach dieser "Kalibrierung" verbleibende gröbste Verwirrung der Taster -- nämlich die Fehlanzeige eines gedrückten Tasters -- sollte durch das Rücksetzen von PD3 behoben werden.

    HTH
    Thomas

  6. #6
    Erfahrener Benutzer Begeisterter Techniker Avatar von JensK
    Registriert seit
    27.02.2007
    Ort
    Hamburg
    Alter
    26
    Beiträge
    254
    supi also bei mir klappt jez alles... dankeschön

Berechtigungen

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