- fchao-Sinus-Wechselrichter AliExpress         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 18 von 18

Thema: Bumper über M32

  1. #11
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    39
    Beiträge
    1.516
    Anzeige

    E-Bike
    Das liegt daran das Du die
    task_checkINT0();
    task_I2CTWI();

    dort nicht regelmäßig aufrufst. Dort wird geprüft ob sich was verändert hat.

    Ist genauso wie auf der RP6Base - da muss nur stattdessen die task_RP6System(); ständig aufgerufen werden.

    Das muss in jede für längere Zeit blockierende while Schleife o.ä. rein.

    MfG,
    SlyD

  2. #12
    Neuer Benutzer Öfters hier
    Registriert seit
    27.03.2010
    Beiträge
    28
    Hi SlyD,
    danke für die schnelle Antwort.
    Im "void snake" funktioniert es jetzt, aber im "void scan" noch nicht so richtig.
    Ich habe die Abfrage direkt eine Zeile unter do{ in der do While schleife eingfügt, aber es wird nur so jeder 2te oder 3te Bumperdruck registriert, in der "void snake" werden alle erkannt?!?!?!?
    Danke

  3. #13
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    39
    Beiträge
    1.516
    Das könnte an den ganzen Verzögerungen liegen die da drin sind.
    Wenn Du den Bumper LANGE drückst wird es immer klappen denke ich.
    "sound" ist blockierend und fügt eine Pause ein du kannst stattdessen versuchen es mit beep (s. Kommentare in der Lib und Doku) und einer Stopwatch zu lösen wenn da unbedingt die drei Töne reinmüssen - aber das ist halt etwas aufwändiger.

    Wenn viel "gleichzeitig" passieren soll darf man keine festen Pausen ins Programm einbauen (von ein paar wenigen Millisekunden mal abgesehen).

    MfG,
    SlyD

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    27.03.2010
    Beiträge
    28
    Hi,
    so hab die sounds verkürzt, jetzt gehts besser, aber wenn ich einen Bumper drücke fährt er ein Stück zurück und dreht sich ein paar Grad.
    So habe ich es programmiert, funktioniert also.
    Aber er bleibt dann stehen und fährt mit dem Programm nicht fort.
    Wie komme ich aus dem UP Bumper wieder raus?

  5. #15
    Neuer Benutzer Öfters hier
    Registriert seit
    27.03.2010
    Beiträge
    28
    Keiner einen Vorschlag? [-o< [-o< [-o<

    Hier das UP-Bumper
    Code:
    void bumpersStateChanged(void)
    {
    	// Bumper status changed
    	writeString_P("Bumper betätigt: ");
    			if(bumper_right && bumper_left)
    			{
    			writeString_P("Beide!");
    			move(50,BWD, DIST_MM(100), BLOCKING);
    			rotate(35,RIGHT,30,BLOCKING);
    			changeDirection(FWD);
    			}
    			
    	else	if(bumper_left)
    			{
    			writeString_P("Links!");
    			move(50,BWD, DIST_MM(100), BLOCKING);
    			
    			rotate(35,RIGHT,30,BLOCKING);
    			changeDirection(FWD);
    			}
    			
    	else	if(bumper_right)
    			{
    			writeString_P("Rechts!");
    			move(50,BWD, DIST_MM(100), BLOCKING);
    			rotate(35,RIGHT,30,BLOCKING);
    			changeDirection(FWD);
    			}
    			
    	else
    	{
    			writeString_P("Frei!");
    	}
    	
    			writeChar('\n');
    	
    }
    Mir ist gerade aufgefallen das er nur zurück fährt, die Drehung macht er schon garnicht mehr.
    Wenn ich das Rückwärtsfahren und die Drehung weg lösche, geht er im Programm weiter?!?!?!?!?!?

  6. #16
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    39
    Beiträge
    1.516
    > BLOCKING

    Ist in Event Handlern nicht sinnvoll nutzbar genauso wie jegliche längere Pausen.
    Das musst Du anders lösen.

    (am einfachsten wird es für Dich sein einfach die Bumper selbst in der Hauptschleife abzufragen - sauber wird es wie in den Subsumptions-Beispielprogrammen mit Zustandsautomaten)

    MfG,
    SlyD

  7. #17
    Neuer Benutzer Öfters hier
    Registriert seit
    27.03.2010
    Beiträge
    28
    Puh,
    das klingt aber gerade kompliziert.
    Kannst du mir vielleicht ein bissle genauer sagen was du meinst
    Oder eine kleine Befehlszeile als Beispiel posten.
    Damit ich weis nach was ich suchen muss.

    Hier mal mein kompletter Code:
    Code:
    // Includes:
    
    #include "RP6ControlLib.h" 		// The RP6 Control Library. 
    								// Always needs to be included!
    
    #include "RP6I2CmasterTWI.h"	// I2C Master Library
    
    
    /*****************************************************************************/
    /*****************************************************************************/
    // Include our new "RP6 Control I2C Master library":
    
    #include "RP6Control_I2CMasterLib.h"
    
    /*****************************************************************************/
    #define I2C_RP6_BASE_ADR 10
    //#define adc2 ;
    
    /*
     * Timed Watchdog display only - the other heartbeat function
     * does not work in this example as we use blocked moving functions here.
     */
    void watchDogRequest(void)
    {
    	static uint8_t heartbeat2 = false;
    	if(heartbeat2)
    	{
    		clearPosLCD(0, 14, 1);
    		heartbeat2 = false;
    	}
    	else
    	{
    		setCursorPosLCD(0, 14);
    		writeStringLCD_P("#"); 
    		heartbeat2 = true;
    	}
    }
    
    /*****************************************************************************/
    // I2C Requests: 
    
    void I2C_requestedDataReady(uint8_t dataRequestID)
    {
    	checkRP6Status(dataRequestID);
    }
    /*****************************************************************************/
    
    void bumpersStateChanged(void)
    {
    	// Bumper status changed
    	writeString_P("Bumper betätigt: ");
    			if(bumper_right && bumper_left)
    			{
    			writeString_P("Beide!");
    			move(50,BWD, DIST_MM(100), BLOCKING);
    			rotate(35,RIGHT,30,BLOCKING);
    			changeDirection(FWD);
    			}
    			
    	else	if(bumper_left)
    			{
    			writeString_P("Links!");
    			move(50,BWD, DIST_MM(100), BLOCKING);
    			rotate(35,RIGHT,30,BLOCKING);
    			changeDirection(FWD);
    			}
    			
    	else	if(bumper_right)
    			{
    			writeString_P("Rechts!");
    			move(50,BWD, DIST_MM(100), BLOCKING);
    			rotate(35,RIGHT,30,BLOCKING);
    			changeDirection(FWD);
    			}
    			
    	else
    	{
    			writeString_P("Frei!");
    	}
    	
    			writeChar('\n');
    	
    }
    
    
    int z; //Globale Variable
    
    void scan (int ds) 
     {
    				writeString_P("\nDS\n");
    				writeInteger(ds, DEC );
       int max; 
       do 
       { 
    	task_checkINT0();
    	task_I2CTWI();
    	
          sound(20,50,1);//Tonhöhe,Zeit,Pause
    	  		
    		int16_t adc2r = readADC(ADC_2); 
    		int16_t adc3r = readADC(ADC_3);
    		
    		max=adc2r-adc3r;		
    
    					writeString_P("\nrechts SCAN\n");
    					writeInteger(adc2r, DEC );
    					writeString_P("\nlinks SCAN\n");
    					writeInteger(adc3r, DEC );
    		
    		moveAtSpeed(50,0); //Drehe 
    		setLEDs(0b1111); 
    		
       } 
    	while(!(max<(ds-15))); //Bis neu gemessener Wert stark von dem Übergebenen Anfangswert abweicht 
    		
    	moveAtSpeed(0,0);
    	
    	uint8_t i;
    	uint8_t j;
    					for(i = 1; i < 4; i++)			//Sirene--> Abeichung zum Startwert erkannt
    					{
    						for(j = 230; j > 46; j-=2)
    						{
    							setBeeperPitch(j);
    							mSleep(5);
    						}
    						for(; j < 230; j+=2)
    						{
    							setBeeperPitch(j);
    							mSleep(5);
    						}
    						//  Beeper aus:
    						setBeeperPitch(0);
    					}
    	
    	rotate(40,LEFT,10,BLOCKING); //Ein kleines Stück zurückdrehen
    	mSleep(2000);
    	changeDirection(FWD);
    	
    	}
    
    void Snake (int dif)
    {
    		task_checkINT0();
    		task_I2CTWI(); 
    
    
    					sound(20,40,0);
    					sound(215,60,0);
    					
    		int16_t adc2 = readADC(ADC_2);
    		int16_t sSnake = adc2;
    		int16_t adc3 = readADC(ADC_3);
    		int16_t sSnake2 = adc3;
    
    		int a,b;
    
    		a=(sSnake-sSnake2); //Neuer Wert wird genommen
    		
    		b=0;
    
    			if (a>dif+12)
    			{
    		 
    				writeString_P("\na ist grosser dif\n");
    				writeInteger(a, DEC );
    				setLEDs(0b1100);
    
    				moveAtSpeed(50,0); //rechts drehen
    				b=1;
    			}
    				
    			else if(a<dif-12)
    			{
    
    				writeString_P("\na ist kleiner dif\n");
    				writeInteger(a, DEC );
    				setLEDs(0b0011);
    
    				moveAtSpeed(0,50); //links drehen
    				b=1;
    			}
    			
    			else if (b==0)
    			{
    
    				writeString_P("\na ist gleich dif\n");
    				writeInteger(a, DEC );
    				setLEDs(0b0110);
    			
    				moveAtSpeed(40,40); //gerade fahren Richtung Feuer
    				z=a;
    			}
    			
    			else if((sSnake>420||sSnake2>420))
    			{
    
    				writeString_P("\nFeuer erreicht Löschen\n");
    				writeString_P("\nFeuer erreicht links\n");
    				writeInteger(sSnake, DEC );
    				writeString_P("\nFeuer erreicht rechts\n");
    				writeInteger(sSnake2, DEC );
    				moveAtSpeed(0,0);
    			
    					DDRC |= IO_PC7; //PC7 als Ausgang Lüfter 5-Volt
    					PORTC |= IO_PC7;  // Lüfter an
    					mSleep(500);	  // 0,5s
    					PORTC &= ~IO_PC7; // Lüfter aus
    			
    				move(60,BWD, DIST_MM(200), BLOCKING);
    				rotate(40,RIGHT,65,BLOCKING);
    				mSleep(4000);
    				changeDirection(FWD);
    			
    				adc2 = readADC(ADC_2);
    				sSnake = adc2;
    				adc3 = readADC(ADC_3);
    				sSnake2 = adc3;
    
    				a=(sSnake-sSnake2);
    				z=a;
    			
    				scan(z);
    			}
    }
    
    // I2C Error handler
    
    /**
     * This function gets called automatically if there was an I2C Error like
     * the slave sent a "not acknowledge" (NACK, error codes e.g. 0x20 or 0x30).
     */
    void I2C_transmissionError(uint8_t errorState)
    {
    	writeString_P("\nI2C ERROR - TWI STATE: 0x");
    	writeInteger(errorState, HEX);
    	writeChar('\n');
    }
    
    /*****************************************************************************/
    // Main function - The program starts here:
    
    int main(void)
    {
    	initRP6Control();  
    	initLCD();
        
    	writeString_P("\n\nRP6 CONTROL M32 I2C Master Example Program!\n"); 
        writeString_P("\nMoving...\n"); 
    	
    	DDRA &= ~ADC3;
    	DDRA &= ~ADC2;
    	// ---------------------------------------
    	WDT_setRequestHandler(watchDogRequest); 
    	BUMPERS_setStateChangedHandler(bumpersStateChanged);
    	// ---------------------------------------
    	// Init TWI Interface:
    	I2CTWI_initMaster(100);  
    	I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady);
    	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);
    
    
    	sound(180,80,25);
    	sound(220,80,25);
    
    	setLEDs(0b1001);
    
    	// ---------------------------------------
    	
    	I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_ACS_POWER, ACS_PWR_MED);
    	I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT, true);
    	I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT_RQ, true);
    	
    	
    int16_t adc2 = readADC(ADC_2);
    int16_t sSnake = adc2;
    			writeString_P("\nadc2 MAIN\n");
    			writeInteger(sSnake, DEC );
    
    int16_t adc3 = readADC(ADC_3);
    int16_t sSnake2 = adc3;
    			writeString_P("\nadc3 MAIN\n");
    			writeInteger(sSnake2, DEC );
    
    int dd;
    
    dd=(sSnake-sSnake2); //Startwert
    
    scan(dd);
    
    //Nach dem ersten Scannen geht es hier weiter
    setLEDs(0b0001);
    
    sSnake=readADC(ADC_2);
    			writeString_P("\nneu rechts  ADC2\n");
    			writeInteger(sSnake, DEC );
    sSnake2=readADC(ADC_3);
    			writeString_P("\nneu links ADC3\n");
    			writeInteger(sSnake2, DEC );
    
    
    dd=(sSnake-sSnake2); //Feuer gefunden Neuer Wert
    			writeString_P("\ndd zu dif\n");
    			writeInteger(dd, DEC );
    
    z=dd;
    
    while (true)
    {
    task_checkINT0();
    task_I2CTWI();
    Snake(dd);
    dd=z;
    }
    	return 0;
    }
    Danke

  8. #18
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    39
    Beiträge
    1.516
    Na alles damit: move(50,BWD, DIST_MM(100), --->>> BLOCKING <<<------ )
    Darfst Du im Event Handler NICHT verwenden.

    Wie Du es richtig machst steht in der RP6 Anleitung bei Zustandsautomaten / State Machines und in den zugehörigen Beispielen.
    (ich hab keine Zeit das hier genauer zu erklären sorry)

    MfG,
    SlyD

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

Labornetzteil AliExpress