Servo.h austricksen oder lieber anders?

Hallöchen.
Ich hab beschlossen, dass mein kleiner Segway ne Stütze bekommen soll.
Die möchte ich mit nem Servo betätigen- dazu sind die Dinger schliesslich perfekt.

Wo ich den rantüdele, ist prinzipiell egal aber- die Servo.h blockiert mir die PWM auf Pin9 beim Uno!
Und genau dort (und auf der 11 auch) brauche ich sie zwingend für die Fahrmotoren.
Hab auch schon versucht, die "softServo"-Bibliothek zu benutzen, die lässt sich aber gar nicht erst compilieren- veraltet?

Bevor ich jetzt dan halben Segay umbauen muss, stellt sich mir die Frage ob das Problem nicht irgendwie zu umgehen wäre?

Die Idee, das Servo beim fahren kurzerhand abzumelden mit detach() hatte ich schon, aber das gibt Startprobleme, da ja das Teil sich erst mal aufrichten muss, ehe die Stütze hochgeklappt werden kann.
Im Grunde braucht das Servo nur zwei Stellungen anfahren können: Stütze unten oder eben oben.

Hi Sly,

kannst du Sketch oder deine komplette Pinbelegung posten? Gunther hatte sich mal eine kleine Funktion geschrieben, mit der sich der Servo immer näher dem eigentlich sollWert nähert.

Das PPM-Signal es Servo ist teilweise identisch mit einem PWM Signal hat aber eine höhere Frequenz (490 statt 50Hz).
Versuch mal ob der Servo mit dem PWM-Signal funktioniert. Du brauchst relativ kleine Werte ca 25 bis 52.
Alternativ nimmst Du einen anderen Controller (oder zB Server Platine von Pololu) und steuerst mit dem den Servo an. Die ansteuerung des Kontrollers kannst Du bei Selbstbau auch einfach mit einem Pin realisieren (L stütze unten H oben).
Grüße Uwe

Du kannst Servos auch Problemlos ohne die Servo.h ansteuern.

Servos erwarten ca. alle 20ms einen Impuls einer Länge von ca. 700µs bis 2400µs. Die Länge des Pulses bestimmt die Lage des Servoarmes.
die 20ms sind unkritisch. Wenn die Pulse seltener werden, reagieren die meisten Servos darauf, in dem sie langsamer werden.

du kannst also sowas machen:

if (millis() - lastpulse > 20){
  lastpulse = millis();
  noInterrupts();
  digitalWrite(ServoPin,HIGH); /
  delayMicroseconds(pulselength);
  digitalWrite(ServoPin,LOW);
  interrupts(); 
}

(Nach einer Idee von Jurs)

Das unschöne daran ist, dass du eben alle 20ms deinen Code mit delayMicroseconds() für ca. 2ms blockierst.
Wenn das für deinen Fall kein Problem ist, dann kann du es machen.
Wenn dein Ständer in beiden Positionen mechanisch eigenstabil ist, reicht es ja auch, den Servo nur zum Stellen anzusteuern, dann brauchst du keine Pulse mehr schicken.

Im Anhang ein Sketch mit einer Funktion, die die Umrechnung von Winkel in Pulse übernimmt, für die Ansteuerung von mehreren Servos. wenn du die Konstante "wievieleServos" auf 1 setzt, dann eben nur für Ein Servo.

Servo_refresh.ino (2.13 KB)

Danke, das schau ich mir sofort an.
Uwes Methode funktioniert leider nicht: das Servo singt nur in verschiedenen Tonlagen.
Das das Servo dann nur Signale kriegt, wenn es sich bewegen muss, ist ok: in der abgesenkten Stellung ist die Stütze sowieso mechanisch blockert (durchs Eigengewicht), und angehoben: die wiegt nix, die bleibt auch so oben denke ich.

@sschultewolter: du hast recht- ich könnte andere Pins für die Motorregelung benutzen, und das Problem damit einfach umschiffen. Aber dann müsst ich mir noch nen neuen Stecker bauen, langsam überlege ich eh schon, ob ich mir nicht einfach ein Shield baue, was die gesamte Peripherie für den Segway enthält (bzw. die Verkabelungen) und das einfach aufstecke.
Damit könnte man manchem Zirkus aus dem Wege gehn. aber auch das funktioniert erst, wenn eine endgültige Belegung geklärt ist, momentan weiss ich noch nicht, wie weit ich die Spielereien treiben will, aufs Display z.B. warte ich ja noch.

Rabenauge:
aufs Display z.B. warte ich ja noch.

Dann würde ich die Servo.h sowieso nicht nehmen. Ich habe den Eindruck, die verträgt sich nicht mit dem I2C bus.

Paß auf daß die Servos wirklich stehen bleiben wo sie sind wenn sie keine Impulse mehr bekommen. So sicher ist das nicht.

Mechanisch blockeren wenn der Servo verucht den Ständer zu bewegen ist keine gute Idee.
Grüße Uwe

Hallo Sly,

wenn Du das Servo nur in 2 Positionen steuern willst, dann nimm doch nen digital-Pin. Dahinter einen Servertester (Schaltpläne, feritig oder als Bausatz zuhauf im www) und ermittle empirisch welche Potiwerte Du für die beiden Stellungen brauchst. Bischen rechnen, 2 Widerstände in Reihe und einen überbrückst Du mit einem Transi (Basis über 1k Ohm oder so am Digital-Pin). Dann brauchst Du Dir keine Gedanken über PPM, PWM usw. mehr zu machen.

MfG Mekanax

  1. das Beispiel funktioniert schon mal.
    Inzwischen hab ich aber nen paar Geschichten umgebaut innen drin, daher hab ichs noch nicht in die eigentliche Software einbauen können- das kommt aber als nächstes.

  2. ich weiss dass ich das Servo nicht die ganze Zeit unter Last halten kann bzw. sollte. Hab ich auch nicht vor, die Stütze ist so angeordnet, dass sich der RCWay nur recht locker drauf abstützt, dabei wird sie ein bisschen gegen nen Anschlag gedrückt-weiter gehts nicht. Die ist keineswegs dafür gedacht, das Ding stundenlang so zu parken (das geht, aber dann kann ich ihn auch ausschalten, auch dann hält die so), sondern soll eher ne Art Stromsparmodus sein: wenn ne Minute nicht egfahren wird, setzt das Teil sich auf der Stütze ab und die Balanceregelung wird abgeschalten.
    Aus dieser Position sollte er auch alleine wieder starten können (kräftig genug sind die Antriebe allemal).
    Wenn die Stütze hochgeklappt ist, wird das Servo mit 3Gramm belastet oder so- schwerer ist die nicht. Wenn sich das Ding wirklich verstellen sollte (manche Servos entwickeln ein Eigenleben wenn sie keine klaren Kommandos bekommen), kann ich immer noch "gelegentlich" mal die Position wieder schicken.
    Momentan (ohne Display und RC) braucht das Programm für die Hauptschleife um die 3000µs, da ist also durchaus noch Luft.

  3. Servotester wäre eine gute Idee nur: das Ding ist ziemlich voll inzwischen. Aber wenn ich das mit dem Shield durchziehen sollte (ist bisher weder beschlossen noch abgelehnt), könnt man den dadrauf packen, mal sehn, aber vorerst gehts ohne, denke ich.

Mal schauen, erstmal muss ich das Programm sowieso neu organisieren, um die "Lande-Routine" überhaupt einbauen zu können.