Anschluß: An den I2C-Bus (SCL/SDA).
Programmbeispiel: RP6Base_I2CMaster_03 (Beispiel wird mit dem RP6 mitgeliefert).
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
Anschluß: An den I2C-Bus (SCL/SDA).
Programmbeispiel: RP6Base_I2CMaster_03 (Beispiel wird mit dem RP6 mitgeliefert).
Gruß
Dirk
vielen dank
Marian Otte
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:
ich bekomme das mit dem Code einfügen einfach nicht hinCode:#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; }
Geändert von Marian Otte (16.03.2013 um 21:03 Uhr)
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
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
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
jo vielen danke du hast mir mal wieder sehr gut geholfen. Werde es gleich mal durchprobieren.
ich habe jetzt alles angeschossen und mit diesem programm kann ich mir auch die werte eines sensors ausgeben lassen.
Aber wenn ich eine if funktion z.B. If (distance < 10)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; }
{
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 21:03 Uhr)
Zeig mal, wie du den if-Teil genau einbindest!
Gruß
Dirk
Lesezeichen