Eine frage @ Radbruch
in deinem Programm verstehe ich leider nur den ersten teil ](*,) den komplexeren teil verstehe ich nicht, da die demo mit meinen roboterarm wesentlich besser lief würde ich gerne wissen wie ich es anpassen könnte
mfg
martin
Druckbare Version
Eine frage @ Radbruch
in deinem Programm verstehe ich leider nur den ersten teil ](*,) den komplexeren teil verstehe ich nicht, da die demo mit meinen roboterarm wesentlich besser lief würde ich gerne wissen wie ich es anpassen könnte
mfg
martin
Verständlicher? Ich befürchte nein :(Code:// Die schon gestarteten Stoppuhren werden auf null gesetzt, alle Demos bei 0 starten
setStopwatch1(0);
setStopwatch2(0);
setStopwatch3(0);
// Nach "for(c=0;c<6;c++)" hat c den Wert 6. Die folgende Schleife wird solange
// ausgeführt wie c einen Wert != 0 enthält.
while(c)
{
// Der Wert in c wird mit Hilfe der LEDs dargestellt.
setLEDs(1<<c);
// Sind seit dem letzten reseten der Stopwatch1 mehr als 1000ms vergangen?
if(getStopwatch1()>1000)
{
// Wenn ja, dann Stopwatch1 wieder auf null setzen und Demo für Servo1 ausführen
setStopwatch1(0);
// Unter Berücksichtigung der letzten Servoposition die nächste Position laden
switch(servo1)
{
case 38: servo1=30; break;
case 30: servo1=20; break;
case 20: servo1=14; break;
case 14: servo1=21; break;
case 21: servo1=31; break;
case 31: servo1=38; break;
}
}
// Alle 100ms wird das Demo für Servo2 weitergetaktet
if(getStopwatch2()>100)
{
setStopwatch2(0);
// Servo2 weiterdrehen, wenn Ende Schwenkbereich erreicht ist, wieder neu starten
// Nach jedem Schwenk wird hier c um eins verkleinert bis schlieslich "while(c)"
// nicht mehr erfüült ist und die Demoschleife abgebrochen wird.
servo2++;
if (servo2 > 38) { servo2=14; c--; }
}
if(getStopwatch3()>300)
{
setStopwatch3(0);
// Alle 300ms soll das Servo3 eine Endlage anfahren. Das ist im Video de Beeper
if (servo3 == 10) servo3=50; else servo3=10;
}
task_RP6System(); // Verträglichkeitstest ;)
}
So nachdem ich wieder zeit hatte etwas herumzubasteln und programmieren stoße ich auf das nächste problem das demoprogramm von radbruch bewegt im zweiten teil den arm ganz langsam in eine position und schlägt danach ruckartig in die ausgangsposition
siehe hier=> http://www.youtube.com/user/maddingo.../1/QuIyrsbIIHs
wie kann man dies vermeiden , sodass der arm sich die ganze zeit langsam und sanft bewegt??
lg
martin
Hallo
Du könntest zwischen die Ansteuerung der Servos Pausen machen.
...
for(i=0;i<50;i++)
{
Servo(23);
mSleep(40);
}
...
Je größer die Zeit bei mSleep ist desto langsamer bewegt sich der Servo. Allerdings wird bei zu hoher Sleeptime die Bewegung etwas abgehackt aussehen also immer mit kleinem mSleep arbeiten.
Gruß Thund3r
das verstehe ich ja nur guck mal in den text von radbruch und mein video an die bewegung nach oben klappt langsam nur nach unten haut der arm
Hallo
Ah jezt ich glaub ich weiß was du meinst.
Ähnliches Prob hatte ich bei meinem Arm genauso.
Bei mir lag es schlicht und einfach an der Schwerkraft. Die Servos schafften es mit Kraft den Arm hoch zu hieven und wenn es dann runterging saußte dieser nach unten da kein Widerstand da war und sich der verhältnismäßig schwere Arm nach unten drückte (Schwerkraft).
Ich hab das mit folgender Methode versucht zu kompensieren:
...
int c;
for(c=0;c<=50;c++)
{
Servo3(10);
mSleep(50-c);
}
...
Hier im Video von 0:10 bis 0:12 zu erkennen.
Ich hoffe das ist das was du meintest :D
Gruß Thund3r
Hallo
Ich habe das nun noch nicht getestet, aber es sollte funktionieren:
Für eine schnellere Bewegung könnte man die Aufrufe häufiger machen, z.B.:Code:int8_t drehrichtung=1;
if(getStopwatch2()>100)
{
setStopwatch2(0);
servo2 += drehrichtung;
if (servo2 > 38) { drehrichtung= -1; c--; }
if (servo2 < 14) { drehrichtung= +1; }
}
if(getStopwatch2()>50)
oder die Schrittweite erhöhen:
drehrichtung = +2; bzw. drehrichtung = -2;
@Thund3r:
Hier geht es um die nichtblockierende Ansteuerung der Servos mit Timer1-Interrupt und den Stopwatches...
Gruß
mic
an welche stelle sollte ich den text jetz einfügen ??