- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 5 von 5

Thema: Asuro in RC-Auto

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

    Asuro in RC-Auto

    Anzeige

    Powerstation Test
    Hallo
    hab mir vor ca 2 wochen einen asuro zugelegt. Den habe ich dann sofort in ein kaputtes RC Auto(Porsche) eingebaut, in dem aber die motoren noch funktioniert haben. Die Taster habe ich mit kabeln nach außen geführt und am rc befestigt. Die BackLED habe ich auf dem Dach befestigt. Die Infrarot Schnittstelle habe ich vorne befestigt, um auch entfernungen zu messen. Funktioniert alles Hardware und Software technisch super. Nur beim Linienverfolgung habe ich ein Problem. Der Lenkmotor ist zu träge, um eine lenkung schnell auszuführen. Deshalb hat der RC Asuro wenn er einlenkt schon die Linie verloren. Ich könnte zwar den Antrieb verlangsamen, aber da das RC normalerweiße ein 9,6 Volt Auto ist, und ich mit 5,5 Volt fahre, befürchte ich, das der Motor nicht in Gang kommt. Und würde auch nicht gut aussehen, wenn ein Porsche so langsam fährt . Nun habe ich mir gedacht, das ich so programmiere, das wenn links und rechts von der Linie das Licht gleich ist(mit Toleranz) das er dann immer gerade aus fährt. Und sobalt er zb eine rechtskurve schneidet, wird eine funktion abgespielt, die eine halbe sek nach rechts fahren lässt. Nun meine Frage: Wie kann ich bei der Linienverfolgung eine Toleranz einstellen? Mein bisheriger Code:



    Code:
    		
                    LineData(data);
    		if (data [0] == data [1] )
    			{
    				vor(200);
    				BackLED(OFF,OFF);
    			}
    		if (data [0] < data [1] )
    			{
    				links(400);
    				BackLED(ON,OFF);
    			}
    		if (data [0] > data [1] )
    			{
    				rechts(400);
    				BackLED(OFF,ON);
    			}
    Der funktioniert auch, nur halt wenn links und rechts der identische wert zurückkommt.

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.01.2008
    Alter
    32
    Beiträge
    239
    hallo joi

    ich glaube das hir müsste funktionieren:

    Code:
    #define toleranz 10  //toleranz definieren, um sie leichter ändern zu können
    
    int main()
    {
    
    //...
    
    if(data[0]>(data[1]+toleranz))
    {
    //code falls links größer als rechts + Toleranz
    }
    else if(data[0]<(data[1]-toleranz))
    
    {
    //code falls links kleiner als rechts - Toleranz
    }
    else
    {
    //wert sind gleich (mit toleranz)
    }
    ich hoffe du kannst etwas damit anfangen
    mfg hai1991

    P.S.: wer großbuchstaben oder rechtschreibfehler findet darf sie behalten

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    12.08.2008
    Beiträge
    11
    also toleranzmäßig funkitoniert mehr oder weniger ist noch ne einstellungssache. Aber er braucht so lange, um die Sensoren für die linienverfolgung abzufragen. Kann man den Code "beschleunigen"?
    Code:
    #include "asuro.h"
    #include <stdlib.h>
    #define toleranz 20
    
    void delay(int zlr);
    void gerade();
    void zuruck(int timezuruck);
    void links(int timelinks);
    void rechts(int timerechts);
    void vor(int timevor);
    void lk(int timelk);
    void rt(int timert);
    void taster();
    void porsche();
    
    unsigned char taste;
    unsigned char PollSwitch(void);
    unsigned int data[2];
    unsigned int j=1;
    /*Lenkung ist linker Motor
    Rechts ist FWD
    Links ist RWD
    
    Antrieb ist rechter Motor
    Vorfährts ist FWD
    Rückfährts ist RWD
    */
    
    int main(void)
    {            
    Init();
    DDRD |= (1 << DDD1);   // Port D1 als Ausgang
    PORTD &= ~(1 << PD1);   // PD1 auf LOW
        while (1)
      {
      FrontLED(ON);
      BackLED(ON,OFF);
      delay(500);
      BackLED(ON,ON);
      delay(500); 
      gerade();
      delay(1000);
      MotorDir(BREAK,BREAK);
      while (1)
      {
    	if (PIND & (1 << PD0))
        {
    		MotorSpeed(255,255);
    		LineData(data);
    		taste = PollSwitch();
    		
    		porsche();
    	}
    	  
    	
    	else
    	{
    		
    		MotorSpeed(255,150);
    		LineData(data);
    		taste = PollSwitch();
    		
    		porsche();
    	}
    	}
      
      }
      return 0;
    }
    
    void delay (int zlr)
    {
      unsigned int i;
      i = 1;
      while (i < zlr)         
      {
         Sleep (72);         
         i++;
      }
      return;
    }
    
    void gerade()
    {
    	MotorDir(FWD,BREAK);
    	delay(1000);
    	MotorDir(RWD,BREAK);
    	delay(500);
    }
     
    void zuruck(int timezuruck)
    {
    	MotorDir(BREAK,RWD);
    	delay(timezuruck);
    }
    
    void links(int timelinks)
    {
    	MotorDir(RWD,FWD);
    	delay(timelinks);
    }
    
    void rechts(int timerechts)
    {
    	MotorDir(FWD,FWD);
    	delay(timerechts);
    }
    
    
    void vor(int timevor)
    {
    	MotorDir(BREAK,FWD);
    	delay(timevor);
    }
    
    void lk(int timelk)
    {
    	MotorDir(RWD,BREAK);
    	delay(timelk);
    }
    
    void rt(int timert)
    {
    	MotorDir(FWD,BREAK);
    	delay(timert);
    }
    
    void taster()
    		{
    		if (taste == 1) //Rechts vorne
    			{
    				gerade();
    				zuruck(1000);
    				links(500);
    				vor(700);
    				rechts(600);
    				vor(500);
    				rechts(400);
    				links(1000);
    				rechts(500);
    			}
    		if (taste == 2) //2te von Rechts vorne	
    			{
    				gerade();
    				zuruck(1000);
    				links(500);
    				vor(700);
    				rechts(600);
    				vor(500);
    				rechts(400);
    				links(1000);
    				rechts(500);
    			}
    			
    		if (taste == 4) //Mitte vorne
    			{
    				gerade();
    				zuruck(1500);
    				MotorDir(BREAK,BREAK);
    				delay(200);
    				lk(500);
    				vor(1500);
    				rt(1000);
    				zuruck(2500);
    				lk(1000);
    				vor(2500);
    				rt(500);
    			}
    			
    		if (taste == 7) //2te von Links vorne
    			{
    				gerade();
    				zuruck(1000);
    				rechts(500);
    				vor(700);
    				links(600);
    				vor(500);
    				links(400);
    				rechts(1000);
    				links(500);
    			}
    		if (taste == 16) //Links Vorne
    			{
    				gerade();
    				zuruck(1000);
    				rechts(500);
    				vor(700);
    				links(600);
    				vor(500);
    				links(400);
    				rechts(1000);
    				links(500);
    			}
    		if (taste == 31) //hinten
    			{
    				gerade();
    				links(500);
    				rechts(1000);
    				links(1000);
    				rechts(500);
    			}
    		}
      
    
    void porsche()
      {
      		if (taste > 0)
    			{
    				taster();
    			}
    			
    		else if(data[0]>(data[1]+toleranz))
    			{
    				links(500);
    				BackLED(ON,OFF);
    			}
    			
    		else if(data[0]<(data[1]-toleranz))
    			
    			{
    				rechts(400);
    				BackLED(OFF,ON);
    			}
    			
    		else
    			{
    				vor(200);
    				BackLED(ON,ON);
    			} 
      }

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

    ich habe mir gerade den Code mal so auf die schnelle angeguckt ...
    Ich würde die Dinge verändern:

    1. Entferne die erste While-Schleife aus der Main
    2. Benutze eine For-Schleife in der Delay-Funktion
    3. Benutze switch in der Funktion taster

  5. #5
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    void delay (unsigned int zlr)
    {
    while (zlr--) Sleep (72);
    }

    ... wäre auch elegant :)
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Berechtigungen

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

12V Akku bauen