Hallo
Ich habe mal eine Frage zu den Hitec HS-5065MG Servos. Man kann diese ja mit zum Beispiel dem DPC-11 Programmiergerät so einstellen, dass der Start und Endpunkt speziell dem Einbauort angepasst ist. Nun stellt sich mir aber die Frage, ignoriert das der Arduino? Ich habe einen Testsketch der über einen Taster die Servos auf 85 Grad stellen soll und bei nochmaligem drücken wieder auf 0 Grad zurück. Als ich die Servos an den Arduino angeschlossen habe zirpten sie stark obwohl ich den Deadband höher eingestellt habe. Das heisst sie erreichten die Nullposition beim Starten nicht und stiessen mit dem Servoarm an, was das zirpen verursachte. Nach kürzester Zeit bevor ich alles vom Strom trennen konnte, rauchten zwei Servos.
Ich gehe mal davon aus, dass die Arduinos eine andere Nullstellung senden als ich bei den Servos als Nullstellung programmiert habe? Sonst wären sie ja nicht mit voller Kraft angestossen um auf Null zu drehen wo es gar nicht sein sollte. Wie kann ich denn nun die Nullstellung die der Arduino sendet, so einstellen, dass sie der Nullstellung entspricht, die ich am Servo programmiert hatte? Wenn ich da nicht einfach 0 senden kann, was dem Startpunkt entspricht, dann macht die Servoprogrammiering ja irgendwie gar keinen Sinn!? Oder sehe ich da etwas nicht richtig?
Als Servobibliothek habe ich die VarSpeedServo.h Bibliothek verwendet. Da gibt man den Winkel in Grad und die Geschwindigkeit an.
Weiss vielleicht jemand Bescheid und hat schon Erfahrungen gemacht mit den Hitec digital Servos/Programmierung von Start- und Endpunkt?
Grüsse
Stef
Ich weiss nicht Bescheid, hab evtl. aber eine Idee.
stef308:
Ich habe mal eine Frage zu den Hitec HS-5065MG Servos. Man kann diese ja mit zum Beispiel dem DPC-11 Programmiergerät so einstellen, dass der Start und Endpunkt speziell dem Einbauort angepasst ist. Nun stellt sich mir aber die Frage, ignoriert das der Arduino? Ich habe einen Testsketch der über einen Taster die Servos auf 85 Grad stellen soll und bei nochmaligem drücken wieder auf 0 Grad zurück. Als ich die Servos an den Arduino angeschlossen habe zirpten sie stark obwohl ich den Deadband höher eingestellt habe. Das heisst sie erreichten die Nullposition beim Starten nicht und stiessen mit dem Servoarm an, was das zirpen verursachte. Nach kürzester Zeit bevor ich alles vom Strom trennen konnte, rauchten zwei Servos.
Es fehlt der Code um da evtl. was rauszulesen.
ABER:
Das programmieren der Servos scheint nicht trivial zu sein.
Laut dem hier beim HFP-20:
lässt sich ein Überlastschutz einrichten.
Laut dem hier beim dpc-11:
geht das aber nur bei der 7xxx Reihe.
Ich denke, bevor Du damit weiter arbeitest, solltest Du ggfls. nochmal nachsehen, ob es eine Möglichkeit gibt mit dem HFP-20 den Überlastpunkt festzulegen.
Und dann nicht vergessen, die Werte auch zu überprüfen, bevor die an "fremder" Hardware angeschlossen werden....
Grundsätzlich werden solche Servos nicht über einen 'Winkel' sondern über Impulse definierter Länge angesteuert. Dein Servo akzeptiert lt. Datenblatt Impulse von 0,9ms ... 2,1ms. Mittelstellung des Servo ist üblicherweise bei 1,5ms Impulslänge. Das lässt sich bei deinem Servo aber ändern. Die programmierbaren Endlagen dürften die Stellungen sein, die das Servo bei 0,9ms bzw. bei 2,1ms Pulslänge anfährt ( vermute ich mal ... ). Wie es sich dann bei Werten ausserhalb dieses Bereiches verhält ... ? - Die meisten digitalen Servos die ich kenne ignorieren solche Impulse einfach.
Von dieser Programmierung weis die Servo-Lib natürlich nichts - woher auch. Die Servo-Lib macht nichts anderes, als solche Impulse zu erzeugen. Gibst Du Winkelwerte vor, rechnet die Servo-Lib das in Impulswerte um, wobei die Endwerte da meist ziemlich extrem sind. Z.B. 0° = 0,54ms, 180° = 2,4ms.
D.h. grundsätzlich darfst Du die Winkelwerte der Servo-lib nicht so ernst nehmen. Die berechnet daraus einfach Impulslängen. Was dein Servo letztendlich daraus macht, ist der Servo-Lib herzlich egal.
P.S. eigentlich bieten aber alle Servo-Libs die Möglichkeit, die Impulslängen für 0° und 180° vorzugeben. Damit kannst Du die Umrechnung anpassen.
Das mit dem Überlastschutz habe ich gesehen, so viel ich mich erinnern mag. Ich muss mal ein Servo am DPC-11 anschliessen und schauen. Guter Hinweis, danke!
Das mit den Impulsweiten war auch ein guter Hinweis! In der Lib die ich brauche steht:
attach(pin, min, max ) => Attaches to a pin setting min and max values in microseconds default min is 544, max is 2400
Ich habe natürlich nur den attach Befehl genommen und den Pin definiert. Dann muss ich mal versuchen die min und max zu ergänzen. Ich versuche mal die 900 als min und 2100 als max zu definieren. Dann sollte es die Winkelwerte ja korrekt mappen.
Irgendwie ist es mir aber nicht einleuchtend, warum der Arduino, resp. der Servo dann nicht die Werte die der Arduino sendet als korrigierten Bereich versteht. Mit korrigiertem Bereich meine ich die Start- und Endpunkte die ich mit dem Servoprogrammer eingestellt hatte. Dann ist dies ja überhaupt nicht zu gebrauchen/nutzlos. Ich habe geglaubt, dass die Elektronik des Servos dann die empfangenen Werte so interpretiert, dass die "neue" Nullstellung die ich mit dem Startpunkt programmiert habe, mit den 0 Grad die der Arduino sendet einstellt! Wenn das Servo die gesendete Impulslänge trotzdem als "Standard Startpunkt" interpretiert, dann kann man sich den Servoprogrammer und die Zeit das so einzustellen ja sparen!
Wenn das Servo gleich abgeraucht ist scheint mir das trotz digitaler Einstellmöglichkeiten kein gutes Servo zu sein.
Ich habe schon alle möglichen Billigservos mit zu kurzen oder zu langen Impulsen angesteuert. Man konnte den Motor summen hören aber sie sind nicht innerhalb von Sekunden abgeraucht.
Naja, in der Preisklasse denke ich, dass man da schon ein besseres Servo erwarten darf. Man bezahlt für dieses Servo zwischen 25-35 Euro!
Wenn dies wirklich sein sollte, dann ist es ja eine Frechheit so viel zu verlangen und die Qualität stimmt überhaupt nicht.
Ich schreib Multiplex sonst mal an was die dazu sagen... Als Garantiefall kann ich das ja schlecht angeben.
Ich würde mir einen kleinen Testsketch schreiben, mit dem ich direkt die Impulsbreiten vorgeben kann. In den Servo Libs kann man ja statt der Winkelwerte auch direkt die Pulsbreiten in µs angeben. Wenn Du das dann z.B. über den seriellen Monitor vorgibst, kannst Du genau feststellen, was dein Servo bei den jeweiligen Pulsbreiten macht. Dann kannst Du auch feststellen, wie sich die Programmierung der Endlagen auswirkt.
stef308:
Ich habe geglaubt, dass die Elektronik des Servos dann die empfangenen Werte so interpretiert, dass die "neue" Nullstellung die ich mit dem Startpunkt programmiert habe, mit den 0 Grad die der Arduino sendet einstellt!
Da weder das Servo weis, welche Impulsbreite der Arduino bei 0° erzeugt, noch der Arduino weis, was Du am Servo programmiert hast, ist das prinzipiell nicht möglich. Letztendlich musst Du diese Anpassung selbst machen.
Genau das werde ich machen. Meine Idee war, mal zu testen, wenn ich im attach die min und max Längen direkt so wähle, dass das Servo meinen gewünschten Bereich anfährt. Dann muss ich die Servo selbst nicht programmieren.
Der Grund warum ich das machen wollte war, damit die Servos selbst die min und max Werte wüssten wo sie sich bewegen dürfen und ich mit dem Arduino dann in der VarSpeedServo Lib die Mittelstellung die bei jedem Start/Stromversorgung angefahren wird dem min Wert übereinstimmt und sich das Servo nicht bewegt und still bleibt. Wenn ich nun aber jedes Servo im attach mit den passenden min und max Impulslängen einrichte, dann wird wohl jedes Servo individuell angesteuert wie ich es brauche, aber das Zucken beim Einschalten auf die Mittelstellung wird nicht mehr zu richten sein. Dann müsste ja jedes Servo eine separate Mittelposition gleich dem dazugehörigen min Wert haben.
Naja, dann muss man sich mit abfinden mit dem auf und ab der Servoarme beim Start.
Wenn ich die Drehrichtung der Servos ändern will, geht das über den Arduino auch, z.B. mit negativen Impulslängen, oder muss ich das noch mit dem DPC-11 direkt am Servo umprogrammieren?
Hab es mal getestet! Der Test zeigte, dass ich nur die Impulslängen im Arduino angeben musste, damit die Vorprogrammierung am Servo funktioniert. Das heisst, die Vorprogrammierung ist wirklich mit den Impulslängen min und max überschrieben und gespeichert. Das heisst die Einstellungen die ich gemacht habe sind schon wirksam, aber da der Arduino offensichtlich einen Default-Wert von min 544 und max 2400 in der Lib hat, drehte sich das Servo krumm und schief und total falsch!
Hier mein Testcode:
#include <VarSpeedServo.h>
int button = 2; //button an Pin 2 angeschlossen
int buttonState = 0; //Speichert den Zustand des Tasters
int lastButtonState = 0; //Speichert den vorherigen Zustand des Tasters
int servoState = 0; //Speichert Servoposition: 0 = Servo Position eins, 1 = Servo Position zwei
VarSpeedServo servo; //Deklariert den Namen des ersten Servos
void setup() {
pinMode(button, INPUT_PULLUP);
servo.attach(9,900,2100); //servo an Pin 9 angeschlossen mit min. Impulslänge 900ms und max. Impulslänge 2100ms
servo.write(0); //Gibt die Grundstellung des Servo beim start an (Position eins)
}
void loop() {
buttonState = digitalRead(button); //Liest button und speichert in buttonState
if ((buttonState == LOW) && (lastButtonState == HIGH)) { //Wenn buttonState gleich aus und lastButtonState gleich an, dann...
servoState = 1 - servoState; //Servoposition gleich "Servo Position zwei" minus vorherige Servoposition
delay(20); //Entprellen des Tasters
}
lastButtonState = buttonState; //Aktueller buttonState gleich lastButtonState
if (servoState == 1) { //Wenn state gleich 1, dann...
servo.write(180,0); //Stelle servo auf 180 Grad
}
else {
servo.write(0,0); //Stelle servo auf Startposition 0 Grad
}
}
Habe dies gar nicht wahrgenommen, dass man so einfach die min und max Impulslängen einstellen kann. Ich habe nämlich in der .h Datei die Werte ein wenig angepasst :
Ich wage nochmals einen Test mit meinem System, nachdem ich die Impulslängen in meinem Sketch hinterlegt habe. Ist ja keine grosse Sache, da alle gleichen Servos die gleiche Impulsweite haben 
stef308:
Wenn ich die Drehrichtung der Servos ändern will, geht das über den Arduino auch, z.B. mit negativen Impulslängen, oder muss ich das noch mit dem DPC-11 direkt am Servo umprogrammieren?
Wie stellst Du dir negative Impulslängen vor? Nein, die Impulslängen haben mit der Drehrichtung nur indirekt zu tun. Die Impulslängen bestimmen die Position, zu dem sich das Servo bewegen soll. Welche Drehrichtung sich daraus ergibt, hängt ausschließlich vom Servo ab.
Entspricht die kürzeste Impulslänge der Position ganz 'links', so wird es sich beim längerwerden der Impulse nach rechts bewegen. Ist die kürzeste Impulslänge die Position ganz 'rechts', so wird es sich beim verlängern der Impulse nach links bewegen.
Habs getestet. Also sofern die Servos sich noch bewegen würden, dann würde es funktionieren. Ich hab in meinem Sketch noch irgendwo einen Bug drin. Der Testsketch hat ja funktioniert.
Die Drehrichtung habe ich mit dem DPC-11 gedreht. Das funktioniert ganz gut.