- LiFePO4 Speicher Test         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 24

Thema: RP6 Ultraschallsensor SRF08

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    27.11.2012
    Beiträge
    52

    RP6 Ultraschallsensor SRF08

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,

    ich wollte gerne wissen wo und wie ich 3 SRF08 Ultraschallsensoren am RP6 oder an seinem Erweiterungsboard m32 anschließen kann.
    Außerdem habe ich noch keine Idee wie ich den Ultraschallsensor abfragen kann. Kann mir jemand vieleicht ein Codebeispiel senden.



    Danke
    Marian Otte

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Anschluß: An den I2C-Bus (SCL/SDA).
    Programmbeispiel: RP6Base_I2CMaster_03 (Beispiel wird mit dem RP6 mitgeliefert).
    Gruß
    Dirk

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    27.11.2012
    Beiträge
    52
    vielen dank

    Marian Otte

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    27.11.2012
    Beiträge
    52
    ach ja und außerdem möchte ich gerne noch wissen wie das programm aussieht wenn ich die Ultrschallsensoren an das Atmega 32 anschließen will?
    Der Rp6 läuft im Slave modus.
    Ich habe das beispielpgrogramm von der base für das Atmega 32 umgeschrieben aber irgenwie funktioniert das nicht.

    Danke Marian Otte

    Das sähe dann bei mir so aus:

    Code:
    #include "RP6ControlLib.h" 		
    #include "RP6I2CmasterTWI.h"
    #include "RP6Control_I2CMasterLib.h"  
    
    #define SRF_ADR  0xE6
    
    
    void changeSRFAddr(uint8_t old_addr, uint8_t new_addr)
    {
    	I2CTWI_transmit2Bytes(old_addr, 0, 0xA0);
    	I2CTWI_transmit2Bytes(old_addr, 0, 0xAA);
    	I2CTWI_transmit2Bytes(old_addr, 0, 0xA5);
    	I2CTWI_transmit2Bytes(old_addr, 0, new_addr);
    }
    
    
    #define MEASURE_US_LOW 	0
    #define MEASURE_US_HIGH 1
    
    uint16_t distance;
    
    void I2C_requestedDataReady(uint8_t dataRequestID)
    {
    	uint8_t messageBuf[8];
    	static uint8_t dist_tmp;
    	switch(dataRequestID)
    	{
    		case MEASURE_US_HIGH: 
    			I2CTWI_getReceivedData(messageBuf, 2);
    			dist_tmp = (messageBuf[0]);
    			I2CTWI_transmitByte(SRF_ADR, 3);
    			I2CTWI_requestDataFromDevice(SRF_ADR, MEASURE_US_LOW, 1);
    		break;
    		case MEASURE_US_LOW:
    			I2CTWI_getReceivedData(messageBuf, 2);
    			distance = messageBuf[0] + (dist_tmp << 8);
    		
    			writeString_P("Distance: ");
    			writeInteger(distance, DEC);
    			writeString_P(" cm | ");
    			uint16_t dist_count;
    			for(dist_count = distance; dist_count > 4; dist_count-=2)
    				writeChar('#');
    			writeChar('\n');
    		break;
    	}
    }
    
    void I2C_transmissionError(uint8_t errorState)
    {
    	writeString_P("\nI2C ERROR --> TWI STATE IS: 0x");
    	writeInteger(errorState, HEX);
    	writeChar('\n');
    }
    
    void task_SRF(void)
    {
    	static uint8_t measureInProgress = false;
    	if(!measureInProgress) 
    	{
    		if(TWI_operation == I2CTWI_NO_OPERATION)
    		{
    			I2CTWI_transmit2Bytes(SRF_ADR, 0, 81);
    			measureInProgress = true;
    			setStopwatch1(0);
    		}
    	}
    	else if(getStopwatch1() > 70)
    	{
    		I2CTWI_transmitByte(SRF_ADR, 2);
    		I2CTWI_requestDataFromDevice(SRF_ADR, MEASURE_US_HIGH, 1);
    		measureInProgress = false;
    		setStopwatch1(0);
    	}
    }
    
    int main(void)
    {
    	
    	
    	I2CTWI_initMaster(100);
    	I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady);
    	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);
    
    	setLEDs(0b111111);
    	mSleep(500);	   
    	setLEDs(0b000000);
    	
    	
    
    	startStopwatch1();
    	
    	while(true)  
    	{
    		task_SRF();
    		task_I2CTWI();
    		
    	}
    	return 0;
    }
    ich bekomme das mit dem Code einfügen einfach nicht hin
    Geändert von Marian Otte (16.03.2013 um 20:03 Uhr)

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Dein Code dürfte auch nicht ohne Fehler kompilieren.

    Versuch mal, nicht den Code "einzufügen", sondern so wie er ist an die M32 anzupassen:
    - ControlLib anstelle der BaseLib einbinden
    - Im Main:
    -- ControlLib initialisieren
    -- setLEDs auf 4 Einsen/Nullen in der Klammer ändern: setLEDs(0b1111)
    -- powerON() entfernen
    -- task_RP6System() entfernen
    Gruß
    Dirk

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    27.11.2012
    Beiträge
    52
    habe ich doch und ich meinte den code in Das forum einfügen und nicht in den Roboter
    also sollte das programm geändert auch auf dem m32 funktionieren oder nicht?

    Danke Marian Otte

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Ja, das Programm sollte mit den genannten Änderungen auf der M32 laufen.
    Bei deinem Code sehe ich aber z.B. nicht die Initialisierung der ControlLib im Main: initRP6Control();
    Gruß
    Dirk

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    27.11.2012
    Beiträge
    52
    jo vielen danke du hast mir mal wieder sehr gut geholfen. Werde es gleich mal durchprobieren.

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    27.11.2012
    Beiträge
    52
    ich habe jetzt alles angeschossen und mit diesem programm kann ich mir auch die werte eines sensors ausgeben lassen.

    Code:
    #include "RP6ControlLib.h" 		
    #include "RP6I2CmasterTWI.h"
    #include "RP6Control_I2CMasterLib.h"  
    
    #define SRF_ADR  0xE2
    #define SRF_ADRS1 0xE4
    #define SRF_ADRS2 0xE6
    
    
    void changeSRFAddr(uint8_t old_addr, uint8_t new_addr)
    {
    	I2CTWI_transmit2Bytes(old_addr, 0, 0xA0);
    	I2CTWI_transmit2Bytes(old_addr, 0, 0xAA);
    	I2CTWI_transmit2Bytes(old_addr, 0, 0xA5);
    	I2CTWI_transmit2Bytes(old_addr, 0, new_addr);
    }
    
    
    #define MEASURE_US_LOW 	0
    #define MEASURE_US_HIGH 1
    
    uint16_t distance;
    
    void I2C_requestedDataReady(uint8_t dataRequestID)
    {
    	uint8_t messageBuf[8];
    	static uint8_t dist_tmp;
    	switch(dataRequestID)
    	{
    		case MEASURE_US_HIGH: 
    			I2CTWI_getReceivedData(messageBuf, 2);
    			dist_tmp = (messageBuf[0]);
    			I2CTWI_transmitByte(SRF_ADR, 3);
    			I2CTWI_requestDataFromDevice(SRF_ADR, MEASURE_US_LOW, 1);
    		break;
    		case MEASURE_US_LOW:
    			I2CTWI_getReceivedData(messageBuf, 2);
    			distance = messageBuf[0] + (dist_tmp << 8);
    			writeStringLCD("Distance: ");
    			writeIntegerLCD(distance, DEC);
    			writeStringLCD(" cm | ");
    			
    			writeCharLCD('\n');
    			setCursorPosLCD(0,0);
    		break;
    	}
    }
    
    void I2C_transmissionError(uint8_t errorState)
    {
    	writeString_P("\nI2C ERROR --> TWI STATE IS: 0x");
    	writeInteger(errorState, HEX);
    	writeChar('\n');
    }
    
    void task_SRF(void)
    {
    	static uint8_t measureInProgress = false;
    	if(!measureInProgress) 
    	{
    		if(TWI_operation == I2CTWI_NO_OPERATION)
    		{
    			I2CTWI_transmit2Bytes(SRF_ADR, 0, 81);
    			measureInProgress = true;
    			setStopwatch1(0);
    		}
    	}
    	else if(getStopwatch1() > 70)
    	{
    		I2CTWI_transmitByte(SRF_ADR, 2);
    		I2CTWI_requestDataFromDevice(SRF_ADR, MEASURE_US_HIGH, 1);
    		measureInProgress = false;
    		setStopwatch1(0);
    	}
    	
    	
    	else if(getStopwatch1() > 70)
    	{
    		I2CTWI_transmitByte(SRF_ADR, 2);
    		I2CTWI_requestDataFromDevice(SRF_ADRS1, MEASURE_US_HIGH, 1);
    		measureInProgress = false;
    		setStopwatch1(0);
    	}
    }
    
    int main(void)
    {
        initRP6Control(); 
    	initLCD();
        I2CTWI_initMaster(100);
    	I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady);
    	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);
    
    	setLEDs(0b111111);
    	mSleep(500);	   
    	setLEDs(0b000000);
    	
    	startStopwatch1();
            
    	
    	while(true)  
    	{
    		task_SRF();
    		task_I2CTWI();
    	}
    	return 0;
    }
    Aber wenn ich eine if funktion z.B. If (distance < 10)
    {
    rotate(50, Left, 90, true);
    moveAtSpeed(80,80);
    }
    einbinde fährt der Roboter immer nur die Rotate funktion.
    Kann mir jemand bitte helfen was ich jetzt noch umschreiben muss damit meine funktion klagpp.
    Außerdem möchte ich noch wissen wie ich mehere Sensoren in einem Programm auslesen kann und die angabe dann in cm ausgegeben wird.

    Würde mich über eine Antwort sehr freuen.

    Marian Otte

    - - - Aktualisiert - - -

    Außerdem habe ich noch das prolem mit den bumpern, ich bekomme es nicht hin die vom atmega 32 aus abzufragen.
    Kann mir jemand helfen.

    Marian Otte
    Geändert von Marian Otte (16.03.2013 um 20:03 Uhr)

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Zeig mal, wie du den if-Teil genau einbindest!
    Gruß
    Dirk

Seite 1 von 3 123 LetzteLetzte

Ähnliche Themen

  1. RP6 Ultraschallsensor an Erweiterungsplatine
    Von Berghuhn im Forum Robby RP6
    Antworten: 10
    Letzter Beitrag: 15.12.2010, 21:54
  2. UltraschallSensor SRF08 - günstig kaufen
    Von boeser_bube im Forum Sensoren / Sensorik
    Antworten: 2
    Letzter Beitrag: 19.11.2008, 21:36
  3. Ultraschallsensor SRF08
    Von AR@HTL im Forum Sensoren / Sensorik
    Antworten: 1
    Letzter Beitrag: 16.04.2007, 15:46
  4. Einfallswinkel Ultraschallsensor SRF08 / SRF10 Stufen
    Von Phil54 im Forum Sensoren / Sensorik
    Antworten: 7
    Letzter Beitrag: 12.05.2005, 20:40
  5. srf08 ultraschallsensor setzt aus.
    Von pebisoft im Forum Sensoren / Sensorik
    Antworten: 1
    Letzter Beitrag: 25.11.2004, 17:45

Stichworte

Berechtigungen

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

Solar Speicher und Akkus Tests