- fchao-Sinus-Wechselrichter AliExpress         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 23 von 23

Thema: RP6 - Schulprojekt: Ultraschall und Labyrinth

  1. #21
    Neuer Benutzer Öfters hier
    Registriert seit
    25.01.2012
    Beiträge
    7
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Die IF Abfrage scheint immer "false" zu sein, da immer das ELSE durchgeführt wird. Ich hab da meine Hand, 'ne Zeitung, etc. vorgehalten, aber der Roboter fährt ungeniert weiter. Der erkennt offensichtlich das Hindernis nicht.

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

    Es wird immer der else-Zweig ausgeführt, weil obstacle_left und obstacle_right vom Tasksystem gesetzt werden, wenn etwas im Blickfeld erscheint:

    Code:
    		// Prüfe, ob xxxx eine Öffnung ist
    		task_ACS();		
    		if (obstacle_left && obstacle_right)
    (ungetestet)

    Tasksystem direkt vor der Abfrage der Variablen könnte funktionieren. Das ACS muss man auch noch initialisieren:

    Code:
    enableACS();
    //setACSPwrLow();
    setACSPwrMed();
    //setACSPwrHigh();
    Das sollte noch irgendwo vor der While()-Schleife erledigt werden.

    Gruß

    mic

    [Edit]
    Das wird so auch nicht funktionieren, weil der ACS-Task mehrere Aufrufe benötigt. Der Task funktioniert wie eine Schrittkette:

    #define ACS_STATE_IDLE 0
    #define ACS_STATE_IRCOMM_DELAY 1
    #define ACS_STATE_SEND_LEFT 2
    #define ACS_STATE_WAIT_LEFT 3
    #define ACS_STATE_SEND_RIGHT 5
    #define ACS_STATE_WAIT_RIGHT 6

    Vermutlich mußt du auf das Blocking verzichten und die Bewegungen mit dem Tasksystem ausführen:
    https://www.roboternetz.de/community...eAtSpee-Befehl
    Geändert von radbruch (26.01.2012 um 18:01 Uhr)
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #23
    Neuer Benutzer Öfters hier
    Registriert seit
    25.01.2012
    Beiträge
    7
    Also, ich habe jetzt etwas mit Tasksystem, was erstmal die Basisbewegung darstellt.

    In meinem Beispiel wird Bumper links für "Hindernis" und Bumper rechts für "Kein Hindernis" verwendet. Da sollen dann irgendwann mal die ACS-Tasks hin, da ich da aber ja im Moment hänge habe ich das erstmal mit den Bumpern gemacht, damit ich die in der Testumgebung eben fix drücken kann.

    Code:
    #include "RP6RobotBaseLib.h" 	
    
    #define STATE_START						0
    #define STATE_LEFT_OBSTACLE 			1
    #define STATE_FRONT_OBSTACLE			2
    #define STATE_RIGHT_OBSTACLE			3
    #define STATE_ALL_OBSTACLE				4
    #define STATE_MOVE_FORWARD				5
    
    uint8_t move_state = STATE_START;
    
    void move_stateMachine(void)
    {
    	switch(move_state)
    	{
    		case STATE_START:
    			setLEDs(0b010000); 
    			move_state = STATE_LEFT_OBSTACLE;
    			rotate(50, LEFT, 90, true);
    		break;
    		
    		case STATE_LEFT_OBSTACLE:
    			if(isMovementComplete())
    			{
    				if(getStopwatch1() > 500)
    				{
    					writeString_P("Blinke links");
    					statusLEDs.LED5 = !statusLEDs.LED5;
    					updateStatusLEDs();
    					setStopwatch1(0);
    				}
    				if(bumper_left)
    				{
    					writeString_P("Bumper links getroffen");
    					writeString_P("HINDERNIS");
    					setLEDs(0b011001); 
    					rotate(50, RIGHT, 90, true);
    					move_state = STATE_FRONT_OBSTACLE;
    				}
    				if(bumper_right)
    				{
    					writeString_P("Bumper rechts getroffen");
    					writeString_P("KEIN HINDERNIS");
    					setLEDs(0b011001); 
    					move_state = STATE_MOVE_FORWARD;
    				}
    			}
    		break;
    		case STATE_FRONT_OBSTACLE:
    			if(isMovementComplete())
    			{
    				if(getStopwatch1() > 500)
    				{
    					writeString_P("Blinke links");
    					statusLEDs.LED5 = !statusLEDs.LED5;
    					updateStatusLEDs();
    					setStopwatch1(0);
    				}
    				if(bumper_left)
    				{
    					writeString_P("Bumper links getroffen");
    					writeString_P("HINDERNIS");
    					setLEDs(0b011001); 
    					rotate(50, RIGHT, 90, true);
    					move_state = STATE_RIGHT_OBSTACLE;
    				}
    				if(bumper_right)
    				{
    					writeString_P("Bumper rechts getroffen");
    					writeString_P("KEIN HINDERNIS");
    					setLEDs(0b011001); 
    					move_state = STATE_MOVE_FORWARD;
    				}
    			}
    		break;
    			
    		case STATE_RIGHT_OBSTACLE:
    			if(isMovementComplete())
    			{
    				if(getStopwatch1() > 500)
    				{
    					writeString_P("Blinke links");
    					statusLEDs.LED5 = !statusLEDs.LED5;
    					updateStatusLEDs();
    					setStopwatch1(0);
    				}
    				if(bumper_left)
    				{
    					writeString_P("Bumper links getroffen");
    					writeString_P("HINDERNIS");
    					setLEDs(0b011001); 
    					rotate(50, RIGHT, 90, true);
    					move_state = STATE_ALL_OBSTACLE;
    				}
    				if(bumper_right)
    				{
    					writeString_P("Bumper rechts getroffen");
    					writeString_P("KEIN HINDERNIS");
    					setLEDs(0b011001); 
    					move_state = STATE_MOVE_FORWARD;
    				}
    			}
    		break;
    		
    		case STATE_ALL_OBSTACLE:
    			if(isMovementComplete())
    			{
    				if(getStopwatch1() > 500)
    				{
    					writeString_P("Blinke links");
    					statusLEDs.LED5 = !statusLEDs.LED5;
    					updateStatusLEDs();
    					setStopwatch1(0);
    				}
    				if(bumper_left)
    				{
    					writeString_P("Bumper links getroffen");
    					writeString_P("ERROR! GEFANGEN!");
    					setLEDs(0b011001); 
    					rotate(50, RIGHT, 90, true);
    				}
    				if(bumper_right)
    				{
    					writeString_P("Bumper rechts getroffen");
    					writeString_P("KEIN HINDERNIS");
    					setLEDs(0b011001); 
    					move_state = STATE_MOVE_FORWARD;
    				}
    			}
    		break;
    		
    		case STATE_MOVE_FORWARD:
    			if(isMovementComplete())
    			{
    				move(50, FWD, DIST_MM(250), true);
    				move_state = STATE_START;
    			}
    		break;
    	}
    }
    
    int main(void)
    {
    	initRobotBase(); 
    	setLEDs(0b111111);
    	mSleep(1000);
    	
    	powerON();
    	
    	startStopwatch1();
    	
    	while(true) 
    	{		
    		move_stateMachine();
    		task_RP6System(); 
    	}
    	return 0;
    }

    Meine Frage ist nun, wie spreche ich denn nun die ACS-Tasks an. Geht das nicht einfach so wie die Bumper!?

    Und noch etwas zu meiner Peinlichkeit: Was genau meint eigentlich das Blocking? Habe es mir einfach so zusammengeschnipselt.

Seite 3 von 3 ErsteErste 123

Ähnliche Themen

  1. Labyrinth
    Von asuro11 im Forum Sensoren / Sensorik
    Antworten: 14
    Letzter Beitrag: 10.05.2009, 13:02
  2. Beispielprogramm Labyrinth
    Von Joee im Forum Asuro
    Antworten: 10
    Letzter Beitrag: 07.07.2007, 17:45
  3. Hilfe für Labyrinth-Roboter?
    Von Scott im Forum Vorstellung+Bilder+Ideen zu geplanten eigenen Projekten/Bots
    Antworten: 21
    Letzter Beitrag: 23.05.2005, 18:19
  4. [ERLEDIGT] Kugel Labyrinth
    Von sinclair im Forum Mechanik
    Antworten: 11
    Letzter Beitrag: 03.12.2004, 13:55
  5. Robby durch ein Labyrinth
    Von Maro im Forum Robby CCRP5
    Antworten: 1
    Letzter Beitrag: 13.08.2004, 20:29

Berechtigungen

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

12V Akku bauen