PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wo ist der Fehler?



Ezalo
06.08.2010, 17:56
Wie schon im Titel steht: "Wo ist der Fehler?"


#include "RP6RobotBaseLib.h"

int main (void){
initRobotBase();
powerON();
while(1){
changeDirection(FWD);
moveAtSpeed(160,160);
mSleep(5000);
}
return 0;
}

MfG

Ezalo

Magelan1979
06.08.2010, 18:28
Wie ist denn die Fehlermeldung ?

radbruch
06.08.2010, 18:28
Hallo

MoveAtSpeed() verwendet das Tasksystem des RP6:


/**
* This function sets the desired speed value.
* The rest is done automatically. The speed is regulated to this speed value
* independent of Battery voltage, surface, weight of the robot and other things.
*
* You need to call task_motorSpeedControl(); frequently out of the main loop!
* otherwise this function will not work!
* Or use task_RP6System which includes this call.
*
* The function limits maximum speed to 200! This has been done because the maximum
* possible speed gets lower over time due to battery discharging (--> voltage drop).
* And the gears and motors will live longer if you don't stress them that much.
*
* Also 200 leaves a bit room to the maximum possible PWM value when you
* put additional load onto the Robot or drive up a ramp etc.
*
*/
void moveAtSpeed(uint8_t desired_speed_left, uint8_t desired_speed_right)
{
if(desired_speed_left > 200) desired_speed_left = 200;
if(desired_speed_right > 200) desired_speed_right = 200;
mleft_des_speed = desired_speed_left;
mright_des_speed = desired_speed_right;
}
(Aus RP6RobotBaseLib.c)

Das bedeutet, man muss das Tasksystem regelmässig aufrufen:


#include "RP6RobotBaseLib.h"

int main (void){
initRobotBase();
powerON();
changeDirection(FWD);
moveAtSpeed(160,160);
startStopwatch1();
setStopwatch1(0);
while(getStopwatch1() < 5000) // 5 Sekunden vorwärts
{
task_motionControl(); // sollte das nicht task_motorSpeedControl() sein???
// task_RP6System(); // alternativ könnte man auch alle Tasks abarbeiten
sleep(100); // schneller bringt nichts
}
stop(); // Anhalten
while(1);
return 0;
}(ungetestet)

mSleep() ist eine Sackgasse, weil der RP5 in der Zeit nichts anderes machen kann. Deshalb besitzt der RP6 ein Tasksystem und hebt sich damit mit seiner Library deutlich von den Mitbewerbern ab ;)

Gruß

mic

Ezalo
06.08.2010, 18:47
Ok, lässt sich also absolut nicht mit Asuro vergleichen ^^

Danke

Ezalo
06.08.2010, 19:18
habe den Code von dir geflasht


#include "RP6RobotBaseLib.h"

int main (void){
initRobotBase();
powerON();
changeDirection(FWD);
moveAtSpeed(160,160);
startStopwatch1();
setStopwatch1(0);
while(getStopwatch1() < 5000){
task_motionControl();
sleep(100);
}
stop();
while(1);
return 0;
}

Aber er hält nicht mehr an :D

SlyD
07.08.2010, 15:47
Das liegt wohl daran das stop() nicht direkt die Motoren anhält sondern nur den Befehl an die Regelschleife weiterleitet.


> "Wo ist der Fehler?"

Na ganz klar Anleitung nicht gelesen und Beispielprogramme nicht genau genug angeschaut ;)

MfG,
SlyD

Ezalo
07.08.2010, 16:04
Joa, da is in diesem Falle was dran ^^ Dachte das wird schon, aber ist halt stark anders als bei Asuro.

Und dachte unteranderem auch das ich von radbruch schon was funktionstüchtiges bekomme. Naja, werd mich jetzt mal um die Akkus und Encoder kümmern und dann mal ordentlich einlesen :D

SlyD
07.08.2010, 16:10
> ist halt stark anders als bei Asuro.

Das ist auch absichtlich so - der RP6 soll ja auch was neues für Vorbesitzer vom ASURO bieten.
Man kann das natürlich auch so simpel machen wie beim ASURO - nur kann man dann nicht so einfach so viele Sachen "gleichzeitig" steuern.
(Motorregelung, ACS, IRCOMM, I2C Bus Kommunikation usw.)

MfG,
SlyD

radbruch
12.08.2010, 16:48
stop();
while(1) task_motionControl(); // oje
return 0;
(ungetestet)