Naja wenn er rotiert ist doch alles super? Warum sollte er danach was machen? Du musst danach wieder moveAtSpeed aufrufen...
ich habe den rp6 zu weihnachten bekommen und das m32 und das lcd display dazu. es hat alles super gefunzt, bis ich das m32 draufgebaut habe. seitedem weiß ich nich wie ich die motoren richtig ansteuere. hier is meine arbeit (is vieles aus beispielen kopiert):
wenn ich moveAtSpeed(x,x) schreibe, dann fährt er auch, aber wenn ich rotate benutze, dann macht er das zwar auch, aber danach passiert nichts mehrCode:#include "RP6ControlLib.h" #include "RP6I2CmasterTWI.h" #include "RP6Control_I2CMasterLib.h" void I2C_requestedDataReady(uint8_t dataRequestID) { checkRP6Status(dataRequestID); } void I2C_transmissionError(uint8_t errorState) { writeString_P("\nI2C ERROR - TWI STATE: 0x"); writeInteger(errorState, HEX); writeChar('\n'); } void Bumpers(void) { if (bumper_left || bumper_right) { moveAtSpeed(0,0); if (bumper_left) { changeDirection(BWD); moveAtSpeed(150,150); } else if (bumper_right) { move(60,BWD,1000,1); changeDirection(FWD); moveAtSpeed(150,150); } else if (bumper_left && bumper_right) { move(60,BWD,500,1); rotate(60,LEFT,90,1); changeDirection(FWD); moveAtSpeed(60,60); } } } void ACS (void) { if(obstacle_left) { setCursorPosLCD(1, 12); writeStringLCD_P("LEFT"); rotate(50, RIGHT, 180, 1); } else { clearPosLCD(1, 12, 4); } if(obstacle_right) { setCursorPosLCD(1, 0); writeStringLCD_P("RIGHT"); moveAtSpeed(90,40); } else { clearPosLCD(1, 0, 5); } if(obstacle_left && obstacle_right) { setLEDs(0b0110); setCursorPosLCD(1, 7); writeStringLCD_P("MID"); moveAtSpeed(0,0); changeDirection(FWD); moveAtSpeed(50,50); } else { setLEDs(0b0000); clearPosLCD(1, 7, 3); } if(obstacle_left) { setLEDs(0b0001); } if(obstacle_right) { setLEDs(0b1000); } if(obstacle_left && obstacle_right) { sound(140,10,0); } else { if(obstacle_left) sound(100,5,0); if(obstacle_right) sound(120,5,0); } } int main(void) { initRP6Control(); initLCD(); ACS_setStateChangedHandler(ACS); BUMPERS_setStateChangedHandler(Bumpers); I2CTWI_initMaster(100); I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady); I2CTWI_setTransmissionErrorHandler(I2C_transmissionError); sound(180,80,25); sound(220,80,25); setLEDs(0b1111); showScreenLCD("ATTENTION", ""); mSleep(1000); setLEDs(0b0000); 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); startStopwatch1(); changeDirection(FWD); moveAtSpeed(80,80); while(true) { task_I2CTWI(); task_LCDHeartbeat(); } return 0; }
ich bitte um hilfe, bin noch absoluter neuling
lg mo
thx
Naja wenn er rotiert ist doch alles super? Warum sollte er danach was machen? Du musst danach wieder moveAtSpeed aufrufen...
also ich hab des so gedacht, dass wenn halt was im weg is, dass er dann stehen bleibt und rotiert. danach soll er wieder weiter fahren. und des tut er aber nicht, auch nicht mit nem neuen move befehl.
ich hab das alles schon erstellt ohne m32 und display, das schaut bei mir so aus:
und wenn ich das auf die base auflade, dann funzt es einwandfrei. und des alles hätt ich halt jetz gern mit m32...Code:#include "RP6RobotBaseLib.h" void Crash (void) { if (bumper_left || bumper_right) { moveAtSpeed(0,0); } if (bumper_left) { move(60,BWD,500,1); mSleep(500); rotate(60,RIGHT,90,1); changeDirection(FWD); moveAtSpeed(60,60); } else if (bumper_right) { move(60,BWD,500,1); mSleep(500); rotate(60,LEFT,90,1); changeDirection(FWD); moveAtSpeed(60,60); } else if (bumper_left && bumper_right) { move(60,BWD,500,1); rotate(60,LEFT,90,1); changeDirection(FWD); moveAtSpeed(60,60); } } void Achtung (void) { if (obstacle_left) { rotate(60,RIGHT, 45,1); changeDirection(FWD); moveAtSpeed(60,60); } else if (obstacle_right) { rotate(60,LEFT, 45,1); changeDirection(FWD); moveAtSpeed(60,60); } } int main (void) { initRobotBase(); setLEDs(0b111111); mSleep(500); setLEDs(0b011111); mSleep(500); setLEDs(0b001111); mSleep(500); setLEDs(0b000111); mSleep(500); setLEDs(0b000011); mSleep(500); setLEDs(0b000001); mSleep(500); setLEDs(0b000000); mSleep(1000); BUMPERS_setStateChangedHandler(Crash); ACS_setStateChangedHandler(Achtung); powerON(); setACSPwrMed(); changeDirection(FWD); moveAtSpeed(60,60); while(true) { task_RP6System(); } return 0; }
Guck dir dazu doch mal die Beispiele an, da wird ja ziemlich genau das gemacht, was du willst.
Hallo Willkommen im Forum
nur mal zwei Anmerkungen für den Anfang:
Bitte Suche dir für weitere Threads aussagekräftigere Namen und verwende für Code die dafür vorgesehenen Codetags.
(Änderungen eingefügt von radbruch ;)
Wenn du deine Motoren über die m32 Erweiterung steuern willst, wirst du dies mithilfe des I2C Buses des RP6 machen müssen. (Die Anleitung wird dir dabei weiterhelfen)
@ fabian: hab ich ja, darauf hab ich ja vieles kopiert, damit ichs dann umschreiben kann. im beispiel control move wird da rotate benutzt, ich hab alles aus move kopiert, einschließlich makefile usw und trotzdem geht bei mir rotate zwar noch, aber dann macht der robot nix mehr. ein evtl vorhandener heartbeat hört auf... ich bin am verzweifeln
@shedepe: ich werde es mir merken. ich bin am verzweifeln, ich versuch das schon zwei tage zum laufen zu kriegen, aber es klappt nicht.
die anleitung hab ich schon angeschaut. ich frage mich ja nur, warum moveAtSpeed funzt und rotate nicht. die gehen doch beide zum motor???
Also das letzte von dir gepostete Programm führt ja nur einmal den Befehl moveAtSpeed aus und geht dann in die Endlosschleife. Deine weiteroben im Code definierten Funktionen musst du aus der MainFunktion natürlich auch aufrufen
also das hier wie es jetzt is:
ACS_setStateChangedHandler(ACS);
BUMPERS_setStateChangedHandler(Bumpers);
und dann in der main funktion auch nochmal
task_ACS();
task_Bumpers();
hab ich des richtig verstanden?
aber jetzt nochmal was anderes: selbes problem wieder...
er fährt vorwärts wie er soll, wenn ich nen bumper drücke hält er an und fährt n stück zurück. so und jetz kommt rotate und des macht er nicht. dann passiert nichts mehrCode:#include "RP6ControlLib.h" #include "RP6I2CmasterTWI.h" #include "RP6Control_I2CMasterLib.h" void Bumpers(void) { if (bumper_left || bumper_right) { moveAtSpeed(0,0); if (bumper_left) { move(60,BWD,500,1); rotate(60, RIGHT, 45, BLOCKING); changeDirection(BWD); moveAtSpeed(70,70); } else if (bumper_right) { move(60,BWD,500,1); rotate(60, LEFT, 45, BLOCKING); changeDirection(FWD); moveAtSpeed(70,70); } else if (bumper_left && bumper_right) { move(60,BWD,500,1); rotate(60, RIGHT, 180, BLOCKING); changeDirection(FWD); moveAtSpeed(70,70); } } } void watchDogRequest(void) { static uint8_t heartbeat2 = false; if(heartbeat2) { clearPosLCD(0, 14, 1); heartbeat2 = false; } else { setCursorPosLCD(0, 14); writeStringLCD_P("#"); heartbeat2 = true; } } void I2C_requestedDataReady(uint8_t dataRequestID) { checkRP6Status(dataRequestID); } void I2C_transmissionError(uint8_t errorState) { writeString_P("\nI2C ERROR - TWI STATE: 0x"); writeInteger(errorState, HEX); writeChar('\n'); } int main(void) { initRP6Control(); initLCD(); //ACS_setStateChangedHandler(ACS); BUMPERS_setStateChangedHandler(Bumpers); WDT_setRequestHandler(watchDogRequest); I2CTWI_initMaster(100); I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady); I2CTWI_setTransmissionErrorHandler(I2C_transmissionError); sound(180,80,25); sound(220,80,25); setLEDs(0b1111); showScreenLCD("################", "################"); mSleep(500); showScreenLCD("I2C-Master", "Movement..."); mSleep(1000); setLEDs(0b0000); 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); moveAtSpeed(70,70); while(true) { task_checkINT0(); task_I2CTWI(); } return 0; }
kann mir denn keiner helfen?
Lesezeichen