- Labornetzteil AliExpress         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 30 von 30

Thema: fehler in einfachem fahrprogramm und ich finde ihn nicht :(

  1. #21
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.12.2007
    Ort
    Berlin
    Alter
    40
    Beiträge
    211
    Anzeige

    Praxistest und DIY Projekte
    SO GEHTS

    Code:
    // Cruise Behaviour:
    
    #include "RP6RobotBaseLib.h" 	
    
    #define IDLE  0
    
    #define TURN_SPEED 60
    #define MOVE_SPEED 100
    
    #define MOVE_FORWARDS 1
    
    
    
    void behaviour_cruise(void)
    
    {
    	uint8_t turn_direction = LEFT;
    	
    			move(MOVE_SPEED, FWD, DIST_MM(2000), BLOCKING);
    			rotate(TURN_SPEED, turn_direction, 102, BLOCKING);
    
    			move(MOVE_SPEED, FWD, DIST_MM(100), BLOCKING);
    			rotate(TURN_SPEED, turn_direction, 102, BLOCKING);
    			move(MOVE_SPEED, FWD, DIST_MM(2000), BLOCKING);
    
    		rotate(TURN_SPEED, RIGHT, 102, BLOCKING);			
    		move(MOVE_SPEED, FWD, DIST_MM(100), BLOCKING);
    		rotate(TURN_SPEED, RIGHT, 102, BLOCKING);
    
    }
    	
    // akku_load:
    
    void Batt(void)
    {
    	setStopwatch1(400);
    
    	
    
          		startStopwatch1();
                if(getStopwatch1() > 300)
                {
    
                      writeString_P("\nADC Akku: Voll");
                      writeInteger(adcBat, DEC);
                      writeChar('\n');
                   if(adcBat  > 900)
    						{                   
                         setLEDs(0b001001);
                   		writeString_P("\nADC Akku: >9V");
                   	}	
                   else if(adcBat < 901 && adcBat > 800)
                   {
                   		writeString_P("\nADC Akku: >8V");
                         statusLEDs.LED4 = !statusLEDs.LED4;
                         statusLEDs.LED1 = !statusLEDs.LED1;
                         updateStatusLEDs();
                   }
                   
    					else if(adcBat < 801 && adcBat > 700)
    								{
      					     		setLEDs(0b000001);
      					     		writeString_P("\nADC Akku: >7V");
    								}
    					else if(adcBat < 701 && adcBat > 590)
    					{		
    							statusLEDs.LED1 = !statusLEDs.LED1;
    										updateStatusLEDs();
    										writeString_P("\nADC Akku: Leer");
                   } 		
    				else if(adcBat < 591 && adcBat > 500)
    					{		
    										writeString_P("\nADC Akku: Laden!");
    										powerOFF();
    					}
                   
                      setStopwatch1(0);
    				
                
               } 
    }                
                 
    
    int main (void)
    
       {
    
    	initRobotBase(); 	
    
    	startStopwatch1();
    	powerON();
    	while(true) 
    
    		{
    		task_ADC();
    		Batt();
    		behaviour_cruise();
    
    		task_RP6System();
    
    		behaviour_cruise();
    
    		}
    
    
    return 0;
    }

  2. #22
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.12.2007
    Ort
    Berlin
    Alter
    40
    Beiträge
    211
    so jetzt müssen da noch bumper und IR dazu, dann habe ich mienen staubwischer

  3. #23
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.12.2007
    Ort
    Berlin
    Alter
    40
    Beiträge
    211
    wie mache ich das er dann bei bumperaktivität sein fahrprogramm unterbricht ... klar es gibt unzählige beispiele ... aber so einfach findi hc das noch nicht ...

    Danke erstmal für die Hilfe von vorhin!

  4. #24
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2007
    Ort
    Kornwestheim (kWh)
    Beiträge
    1.118
    das geht am einfachsten mit ifs:
    Code:
    if(bumper nicht gedrückt)
    {
        
         // hier dein Programmteil
       
    }
    else
    {
         // die Bumperauswertung
    }
    NACHTEIL: der fährt dann erstmal 2m, oder eben 2cm an die wand und dann x sec gegen die wand, bis er es merkt


    Bessere und schonenedere Variante:
    mit Zähler und while-schleife
    Code:
     // benötigt Variable zaehler (für 2m fahren wird die wohl seeeehr hoch gezählt, mach also am besten long int oder mehr)
    
    void main(void)
    {
      // initialisierungscode usw.
    
    zaehler=0;
    
    // Motoren an
    
    while((zaehler < wasweißichwieviel) && (kein Bumper gedrückt))
    {
      zaehler++ ;
      // wenn zaehler für die Zeitverzögerung nicht ausreicht,
      // nochmal so ne "while"-schleife (MIT "&&(Bumper.... )" )
      // evtl Batteriestand ausgeben
    }
    
     // Motoren aus
    
    
    if(BumperX gedrükt)   // auswertung für Bumper X
    {
       // deine Reaktion
    {
    
     // Auswertung der anderen Bumper
    
    
      // dann dasselbe noch mit den anderen wende- und vorwärtsbewegungen
      // NICHT VERGESSEN: zaehler nach jeder while-schleife wieder auf 0 setzen, aber NIE in einer while-schleife
    }
    setze für "(keine) Bumper gedrückt" eben den passenden Ausdruck ein (also z.B. "if(PIND & (1 << PD5))" )
    und für "wasweißichwieviel" eben den Maximalwert, bis zu dem dein Robby die Variable "zaehler" zählen soll (die ist für die Zeitverzögerung zuständig)

    EDIT: dann brauchst du deine stopwatch auch nicht mehr.
    habs auch nochn bissle lesbarer gemacht
    Gruß, AlKi

    Jeder Mensch lebt wie ein Uhrwerk, wie ein Computer programmiert...
    ==> UMPROGRAMMIEREN!

    Kubuntu

  5. #25
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.10.2007
    Ort
    Solingen
    Alter
    32
    Beiträge
    177
    wofür ist eigentlich dein "setStopwatch1(400);" in Batt() ?

  6. #26
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.12.2007
    Ort
    Berlin
    Alter
    40
    Beiträge
    211
    das ist ein fetzten unwissen heit

  7. #27
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.10.2007
    Ort
    Solingen
    Alter
    32
    Beiträge
    177
    Du hast unten in der Funktion Batt ein setStopwatch1(0);
    Das wird doch am Anfang der Funktion eh wieder auf 400 gesetzt,
    wiso machst du nicht das setStopwatch1(0) zu setStopwatch1(400) und machst dann oben die Zeile weg ?

    Sparst du dir eine ( verwirrende ) Zeile Code.

  8. #28
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.10.2007
    Ort
    Solingen
    Alter
    32
    Beiträge
    177
    Zu dem Fahren:

    Du kannst ja machen, dass er solange geradeaus fährt bis er auf eine Wand trifft oder mleft_dist oder mright_dist = 2m oder 2cm ist. Wenn mleft_dist oder mright_dist =2m oder 2cm ist musst du sie natürlich wider auf Null stellen.
    Dann hört er direkt auf zu fahren wenn er vor eine Wand trifft.

    MfG blenderkid

  9. #29
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.10.2007
    Ort
    Solingen
    Alter
    32
    Beiträge
    177
    mleft_dist bzw mright_dist misst die Strecke die der RP6 seit dem Programmstart gefahren ist.

  10. #30
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.12.2007
    Ort
    Berlin
    Alter
    40
    Beiträge
    211
    ok ... "meißel"
    ich werd mich mal dran setzen ... hoffe das klappt
    ja das mit der stopwatch war dann klar ...
    Danke, werd heute aber nicht mehr all zu viel schaffen ...

Seite 3 von 3 ErsteErste 123

Berechtigungen

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

Labornetzteil AliExpress