- LiTime Speicher und Akkus         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 18

Thema: Bumper über M32

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    27.03.2010
    Beiträge
    28

    Bumper über M32

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,
    ich habe meinen RP6 gerade mit ein paar Wärmesensoren ausgestattet.
    Diese werden über die M32 ausgewertet.
    Soweit läuft alles, aber jetzt wollte ich die Bumper mit ins Programm einfügen.
    Leider reagieren die nicht!
    Was mache ich falsch.
    Hier der Quellcode.
    Code:
    // Includes:
    
    #include "RP6ControlLib.h"
    #include "RP6I2CmasterTWI.h"	
    #include "RP6Control_I2CMasterLib.h"
    
    /*****************************************************************************/
    #define I2C_RP6_BASE_ADR 10
    
    // I2C Requests: 
    
    /**
     * The I2C_requestedDataReady Event Handler
     */
    void I2C_requestedDataReady(uint8_t dataRequestID)
    {
    	checkRP6Status(dataRequestID);
    }
    
    /*****************************************************************************/
    
    void bumpersStateChanged(void)
    {
    	// Bumper status changed, output current state and play sounds:
    	writeString_P("Bumpers changed: ");
    	if(bumper_right && bumper_left)
    	{
    		writeString_P("MIDDLE!");
    		sound(200,100,0);
    	}
    	else
    	{
    		if(bumper_left)
    		{
    			writeString_P("LEFT!");
    			sound(200,50,10);
    			sound(150,20,0);
    		}
    		else if(bumper_right)
    		{
    			writeString_P("RIGHT!");
    			sound(200,50,10);
    			sound(150,20,0);
    		}
    		else
    		{
    			writeString_P("FREE!");
    		}
    	}
    	writeChar('\n');
    }
    
    
    int z; //Globale Variable
    
    void scan (int ds) 
     { 
    					writeString_P("\nDS\n");
    					writeInteger(ds, DEC );
       int max; 
       do 
       { 
          sound(100,10,20);
    	  sound(245,10,30);
    	  sound(215,60,10);
    		
    		int16_t adc2r = readADC(ADC_2); 
    		int16_t adc3r = readADC(ADC_3);
    		
    		max=adc2r-(adc3r+5); //Wert der Umgebung wird genommen
    		
    					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 
     }
    
    void Snake (int dif)
    {
    					sound(225,40,0);
    					sound(215,60,0);
    					sound(205,80,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+10)
    {
    		writeString_P("\na ist grosser dif\n");
    		writeInteger(a, DEC );
    setLEDs(0b1100);
    
    moveAtSpeed(50,0); //rechts drehen
    b=1;
    }
    
    if(a<dif-5)
    {
    		writeString_P("\na ist kleiner dif\n");
    		writeInteger(a, DEC );
    setLEDs(0b0011);
    moveAtSpeed(0,50); //links drehen
    b=1;
    }
    
    if (b==0)
    {
    				writeString_P("\na ist gleich dif\n");
    				writeInteger(a, DEC );
    setLEDs(0b0110);
    moveAtSpeed(40,40); //gerade fahren Richtung Feuer
    z=a;
    }
    
    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);
    					sound(245,10,0);//Abeichung zum Startwert erkannt
    					sound(235,20,0);
    					sound(225,40,0);
    					sound(215,60,0);
    					sound(205,80,0);
    					sound(215,60,0);
    					sound(225,40,0);
    					sound(235,20,0);
    					sound(245,10,0);
    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)
    {
    Snake(dd);
    task_checkINT0();
    task_I2CTWI();
    dd=z;
    }
    	return 0;
    }
    Danke für eure Hilfe
    roy-sam

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    27.03.2010
    Beiträge
    28
    Hat keiner eine Idee???

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.11.2010
    Beiträge
    773
    Hi Roy-Sam,
    sorry, dass ich dir jetzt gar nicht weiterhelfen kann, ich hab auch nur eine Frage: Welche Wärmesensoren benutzt du? Die Snakevision vom Azuro?
    Dein Programm gefällt mir nämlich Klappt das ansonsten?
    Gruß,
    Fabian

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    27.03.2010
    Beiträge
    28
    Hallo Fabian,
    schade warte schon seit gestern auf eine Antwort, komme einfach nicht weiter.
    Ja es ist das Snakevision vom Azuro.
    Es funktioniert soweit, außer halt die Bumper!

    Also hat jemand eine Idee, was ich mit den Bumpern falsch mache?

    Gruß
    roy-sam

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    14.11.2010
    Ort
    Kempten
    Alter
    40
    Beiträge
    52
    Hi,
    was klappt den bei dir genau nicht?
    Laut deinem Code soll es piepsen und auf die Schnittstelle die Daten übergeben.
    Soll der RP6 auch dabei fahren?

    Übrigens, auf dem Mainboard muss Slaveprogramm geladen sein.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    27.03.2010
    Beiträge
    28
    Hi Xenergy,

    also in der Base ist das Slaveprog. geladen.

    Außerhalb der Bumperabfrage habe ich ja ein Programm laufen das Ständig nach Wärmequellen sucht (void scan...), wenn es eine gefunden hat soll der RP6 zur Wärmequelle fahren (void snake...).
    Danach wieder mit scannen beginnen usw. usw.

    Das funktioniert soweit, jetzt wollte ich halt die Bumperabfrage mit einbinden, um zu testen ob es geht piepst er halt nur und gibt eine Meldung über die Schnittstelle aus.

    Später soll er, wenn ein Bumper betätigt wird z.B.: rückwärts fahren und sich ein Stück drehen, danach soll der Normale Scanvorgang weitergehen.

    Danke
    roy-sam

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    39
    Beiträge
    1.516
    Funktioniert es denn mit den Beispielprogrammen und funktionieren die Bumper beim Selftest?

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    27.03.2010
    Beiträge
    28
    Zitat Zitat von SlyD
    Funktioniert es denn mit den Beispielprogrammen und funktionieren die Bumper beim Selftest?
    Ja die Bumper funktionieren. in den Beispielprogrammen und beim Selftest.

  9. #9
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    39
    Beiträge
    1.516
    Was wird denn im Terminal ausgegeben wenn das Programm läuft und Du die Bumper drückst?
    Mach evtl. noch mehr Debug ausgaben rein - auch in die Master Lib aus den Beispielprogrammen (die übrigens erst im letzen Beispiel komplett ist also diese verwenden! )

    Auf den ersten (1 Minute) Blick seh ich da auch keinen Fehler habe keine Zeit das genauer durchzugehen da musst Du wohl oder übel etwas "Debuggen" (also der normalzustand bei Softwareentwicklung ).

    MfG,
    SlyD

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    27.03.2010
    Beiträge
    28
    Hi,
    also die Bumper funktionieren doch, nur leider sind sie nicht "übergeordnet" d.h. wenn ich die Bumper drücke und der RP6 gerade im "Void scan" Unterprogramm ist, reagiert er nicht auf die Bumper.
    Wenn er im "void Snake" UP ist dann reagiert er ab und zu mal.
    An der stelle wo ich ein Stück rückwärts fahre und mich drehe, reagiert er auf alle Bumperänderungen.
    Kann ich irgendwie die Bumperabfrage als oberste Priorität festlegen, so das er immer auf die Bumper reagiert?

    Danke für eure Hilfe.
    roy-sam

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

LiTime Speicher und Akkus