Hast Du die Masse der externen Stromversorgung an die an des RP6 gekoppelt ? Dem sollte so sein. Steht irgendwo oben in diesem Thread
die antwort habe ich jetzt selber: im namen der "RP6ControlServo.c" war durch copy und paste ein blank hinter dem "c", die datei wurde somit nicht als *.c erkannt.
so weit so gut, die stromversorgung der Servos habe ich getrennt vom RP, einen wackler in meiner verdrahtung beseitigt.
jetzt lässt sich die datei kompilieren, beim kontaktieren der Servos zu den pins PC7,PC5,PC3 (egal welches servo an welchem pin) fährt der servo zum linken anschlag (von vorne gesehen) und zuckt dann dort vor sich hin, als wollte er noch weiter.
ein fortschritt, aber ganz richtig kanns ja noch nicht sein, oder?
gruß inka
Hast Du die Masse der externen Stromversorgung an die an des RP6 gekoppelt ? Dem sollte so sein. Steht irgendwo oben in diesem Thread
Ich habe bereits bis Unendlich gezählt. Zweimal, und zurück
jetzt habe ich die massen von RP6 und der externen servoversorgung verbunden.
servo 2 an pin 5 / PC3 tut das erwartete, auch die beiden anderen servos, wenn ich sie an diesem pin anschliesse. Am pin 3 / PC5 und pin 1 / PC7 fahren die Servos an einen anschlag und bleiben dort. sie zucken auch nicht.
in der demodatei habe ich nur die initialisierung in
initSERVO(SERVO2 | SERVO4 | SERVO6);
geändert. Muss ich noch etwas ändern?
Hat es schon jemand in der praxis mit drei oder mehr Servos getestet?
Ein anderes programm, mit 3 servos, allerdings mit dieser funktion
-----------------------------
for(c=0; c<50; c++)
{
PORTC |= IO_PC7; // Impulsstart servo I
sleep(12); // 1 = 0.1ms warten = Servoposition 1
PORTC &= ~IO_PC7; // Impulsende
sleep(150); //50ms warten
}
-------------------------------
funktionieren alle drei servos!
gruß inka
Also ich benutze die Lib mit allen acht Servos ohne Probleme.
Acht gleichzeitig ist halt auch mit externer Versorgung etwas kritisch, aber prinzipiell geht es.
Wenn du die Servos 2, 4, 6 benutzt, must du natürlich auch die Variablen servo2_position, servo4_position, servo6_position in der Demo verwenden, um diese Servos anzusteuern.Am pin 3 / PC5 und pin 1 / PC7 fahren die Servos an einen anschlag und bleiben dort. sie zucken auch nicht.
Es sieht so aus, als ob du servo4_position und servo6_position gar nicht änderst.
Gruß Dirk
hi Dirk,
danke für den entscheidenden hinweis - es läuft!!!!
gruß inka
hi allerseits,
ich versuche mit den drei Servos ein paar positionen nacheinander anzufahren, zunächst mal zwei. mit dem code (in Dirks democode eingesetzt)
geht es nicht. Muss ich in die while-true schleibe noch einmal zwei zählschleifen einbauen, oder wird das nacheinander abarbeiten der zwei positionen auf eine andere art erreicht?Code:while(true) { servo2_position = 30; servo4_position = 50; servo6_position = 120; task_SERVO(); mSleep(3); servo2_position = 80; servo4_position = 100; servo6_position = 20; task_SERVO(); mSleep(3); }
danke...
gruß inka
Die Positionsveränderungen der jeweiligen Servos erfolgt sehr schnell hintereinader. Versuch es mal mit einem Timer, der die jeweiligen Positione alle 2 Sek. oder so Ändert. Sollte dann funktionieren. Ist Ähnlich, als wenn Du versuchen würdest Deinen Arm alle 10 Millisekunden zu strecken, zu beugen und wieder zu strecken. Das geht einfach nicht,
Ich habe bereits bis Unendlich gezählt. Zweimal, und zurück
@inka:
Da gibt es einige Möglichkeiten.
Am Einfachsten:
In der while(1)-Schleife gibt es eine Stopwatch-Abfrage (a-la: if (getStopwatch2() > nnn) ...). Darin änderst du dann die 3 Servopositionen.
Das kann man z.B. so machen, dass man die Positionen in einem Array ablegt. In deinem Fall wäre das z.B. ein Array mit 3 Werten je Position. Die Größe (Zahl der Positionen) hängt von der Länge der Bewegung ab, die du machen willst.
Jedesmal, wenn die Stopwatch-Abfrage aufgerufen wird (also alle nnn ms) übergibst du die Werte aus dem Array an die Variablen servoX_position. Dann zählst du noch den Index des Array um 1 hoch.
Dadurch kannst du jede komplexe Bewegung der 3 Servos abspulen.
Wenn das alles in deinem Programm noch besser wird, gibt es mehrere Bewegungsabläufe als Funktionen in der while(1)-Schleife:
Jede Bewegung sieht so ähnlich aus:Code:while(true) { task_SERVO(); // The main servo task Bewegung1(); Bewegung2(); }
Gruß DirkCode:void BewegungX(void) { if (getStopwatchY() > nnn) { // Change position every nnn ms // Hole 3 Servopositionen aus dem Array // Lege sie in 3 servoX_position ab // Inkrementiere den Array-Index setStopwatchY(0); } }
hi allerseits,
ich habe ein bischen mit dem beispielprogramm von proevofreak experimentiert und habe eine frage:
so, wie es ist, funktioniert es für sevo I. Wenn ich servo 2 initialisiere und in position "180" fahren lasse (ist noch for der whileschleife) tut servo 2 das, die ganze mimik fängt aber bei weiteren bewegungen von servo 1 zu zittern und wackeln. servo 2 verharrt in der zugewiesenen position...Code:#include "RP6BaseServoLib.h" int main(void) { initRobotBase(); /* Servo1 in die linke Stellung vordefiniert */ initSERVO(SERVO1/* | SERVO2*/ ); startStopwatch2(); if (getStopwatch2() < 100) {servo1_position = 55; // servo2_position = 180; writeString("Servopos: 55 \n");} while(true) { if (getStopwatch2() > 1000 && getStopwatch2() < 2000) {servo1_position = 0; writeString("Servopos: left \n");} if (getStopwatch2() > 3000 && getStopwatch2() < 4000) {servo1_position = RIGHT_TOUCH; writeString("Servopos: right \n");} if (getStopwatch2() > 5000 && getStopwatch2() < 6000) {servo1_position = MIDDLE_POSITION; writeString("Servopos: middl_pos \n");} if (getStopwatch2() > 7000) {setStopwatch2(0);} task_SERVO(); mSleep(3); } return 0; }
die Servos werden extern versorgt, die massen sind verbunden...
wieso das so ist - ich komme einfach nicht drauf...
gruß inka
Lesezeichen