Frage zu Servo

Einen schönen Tag euch Allen,

ich habe eine Frage zu Servos.

Ich möchte den hier an meinem Arduino zum laufen bringen :

http://www.spektrumrc.com/Products/Default.aspx?ProdID=spmas2000l

Elektisch funktioniert er, also wenn ich ihn von Hand drehe, fährt er wieder zurück.
Na langen und aussichtlosen Versuchen habe ich einfach das Oszi zwischen dem eigentlichen Treiber und den Servo geklemmt. (Ich habe ein kleines Model von Horizon, dass ich aber nicht über deren Empfänger betreiben will sondern über den Arduino zu Forschungszwecken)

Auf dem Foto anbei habe ich den PWM Verlauf des Steuersignals für den Servos aufgezeichnet. Wenn ich am Arduino mein Oszi ranhänge mit der gängigen Servo.h schaut der Verlauf ganz anderes aus, bzw ist länger. Aber laut dem Header wäre ja wie auf meinem Bild genau der Bereich von etwa 500 - 2000 Millisekunden auch das, was wir hier haben…

Auch die Spannung habe ich gemessen. Beim Original Treiber ist die etwas zwischen 2 und 4 Volt, je nach Signal. Am Arduino ist sie nie über 1 Volt…
Wo liegt mein Fehler?

Vielen Danke schon mal für eure Hilfe!
Gruß Michl

Deine aufgezeichneten Signalverläufe können nicht stimmen.

Standard ist: alle 20ms ein Puls variabler Länge.
1500µs Pulslänge ist meist etwa die Mitte, min und max etwa bei 800µs bzw 2200µs, aber das variiert.

Elektisch funktioniert er, also wenn ich ihn von Hand drehe, fährt er wieder zurück.

Womit betrieben?

Am Arduino ist sie nie über 1 Volt....
Wo liegt mein Fehler?

Vielleicht an der Schaltung? Wie sieht die aus?

oder an der Spannung: Voltage:    3.2V - 4.2V
Dein Arduino bringt 5V.

Nachtrag:
Vielleicht hält sich dein Servo oder deine Fernsteuerung nicht an die üblichen konventionen?
Dann kannst du mal austesten, was der Servo mag:

int Hightime = 1500;
int Lowtime = 2000;
const int Servopin = tbd;

void setup() {
  pinMode(Servopin, OUTPUT); 
  noInterrupts();
}

void loop() {
  digitalWrite(Servopin,HIGH);
  delayMicroseconds(Hightime);
  digitalWrite(Servopin,LOW);
  delayMicroseconds(Lowtime);  
}

Hi Gunter,

ich glaube, das Ding muss über eine komplett andere Modulationsart verfügen??

Mein Oszi ist etwas älter und verfügt über keine Anleitung mehr. Die Einstellungen waren:

Timebase 1 ms (mir ist bei dem Ding nicht ganz klar, ob sich das jetzt auf ein "Kästchen" auf dem Oszi bezieht (eher schon) oder auf den ganzen Screen. Die Amplitude war 1v/cm. (Meine Skizzen sind Maßstabsgetreu)
Ich habe das einfach an die Steuerleitung dazu geklemmt. Ground vom Ozzi auf die Null vom Servo.

Wie auch immer, wenn ich mit den exakt gleichen Einstellungen am Oszi, nun am Arduino den Servoausgang messe, dann sind die Pulse komplett anderes. (So wie Du eben sagst) Kann es sein, dass der Hersteller sein eigens System hat? (Gibt dazu auch absolut keine Datenblätter)

Nicht die Spannung die den Servo betreibt. Die habe ich über ein Netzteil exakt bei 3,9 Volt.

Ich rede von der Spannung am PWM Ausgang. Der hängt direkt am Servo, nix dazwischen. Ich hab die Spannung am PWM einmal gemessen wenn der Regler von Horizon den Servo steuert: etwas +-2 Volt (das würde auch zum Oszi-BIld) passen.
Beim Arduino ist natürlich durch die Pulse nur alle 20 ms die gemittlete Spannung viel geringer.

Die Frage ist jetzt, kann man die Servo.h so umbauen, dass sie zu meinem Servo passt? Oder hab ich irgendwo einen denkfehler?

Hab Deinen Scetch grad mal laufen lassen. Vielen Dank.

Händisch war ich auch schon in etwa soweit.

Wenn ich das Signalkabel auf Null lege, bleibt er stehen, wenn ich es rausziehe, dann fährt er ganz nach oben bis Anschlag...

Laut http://www.rcslot.com/blog/spektrum-technology-what-is-it-how-does-it-work.html reagieren die Servos schneller als die Servos an den normalen Funkfernsteuerungen. PPM modulation bei 50Hz. Darum muß die Ansteuerung des Servos ander sein.
Wie genau weiß ich nicht.
Grüße Uwe

Guten morgen zusammen,

ich bin jetzt ein wenig weiter gekommen. Ja, die Servos sind brutal schnell. Sowas habe ich noch nie gesehen. :slight_smile: Ein Wimpernschlag und von oben bis unten! :slight_smile: Um die kleinen Hubschauber in der Luft zu halten muss das so sein. Bisher ist es mir mangels "Gefühl" und Übung auch nicht gelungen, das Ding manuell in der Luft zu halten...

Was wirklich äußerst seltam ist: bei dem Servo war ein Adapterkabel dabei. Ich hielt das erst für eine Verlängerung, aber nachdem ich bei diversen Messungen "seltame" Werte heraubekommen habe, musste ich das Kabel erstmal zerlegen.
Hier ist das Signalkabel mit dem +Kabel zusammengelötet. Das ist für verschiedene Recivertypen,wie ich gelesen habe. Wie das dann funktioniert? Keine Ahnung. Hier wird wohl das Signal auf die Spannung aufmoduliert. Soll mich nicht weiter jucken.

Ohne das Kabel habe ich den Servo tatsächlich mit Gunthers Scetch zum laufen gebracht. Wenn auch nur bedingt. Mal tut er was, mal nicht, mal zittert er wie verrückt...
Ich werde an der Uni mal mit nem guten Oszi exakte Messsungen machen. Wenn Du sagst, das ist PPM bei 50 Hz dann muss ja jeder Pulse (also an,aus) 2 ms lang sein. Was komisch ist, wenn man es mit Darstellungen im Netz vergleicht, dass bei mir der Puls negativ ist. Also hier werden laut Oszi -3 Volt angezeigt.... Wie könnte ich das realisieren? (Servo braucht 4 Volt) In dem ich den Servo bei + = 7V und Ground = 3 Volt und einen Spannungsteiler am PWM ausgang des Arduinos (max +3 V) betreibe?

Edit: Nach etwas Lektüre und Uwes Post bin ich mir auch nicht ganz sicher ob der Servo nicht sogar via PCM angesteuert wird. Wenn ich das richtig verstanden habe, kann er nur diskrete Werte ansteuern. Wenn dem so ist, dann müßte ich die Bitrate des Revicers wissen? Das würde auch das Zittern erklären... Denn mit Zwischenwerten kann er folglich nichts anfangen.

Mein Sketch ist ja nur ein Beispiel, wie du "von Hand", ohne die Servolib, Pulsformen erzeugen kannst um die, auf die das Servo reagiert herauzufinden.

Wenn du meinen Sketch mit dem Beispiel "readASCIIString" aus dem Ordner "communication" kombinierst, dann kannst du über den Seriellen Monior einfach die Werte für High und Lowzeit eingeben, solange probieren, bis du das gefunden hast, was funktioniert.
Wieviele Servos möchtest du denn ansteuern?

Guten morgen Gunther,

vielen Dank für die Antwort, ich werd es ausprobieren.

Damit du weißt, was ich vor habe. Ich habe hier 2 Rotorköpfe von dem hier:

http://www.horizonhobby.de/mcpx-brushless.html

Diese beiden habe ich, wie auf dem Bild im Anhang, zusammen gebaut. Ist wie bei nem CH-74 Chinook, nur, dass hier die Rotoren neben einander sind und nicht hintereinander. Dies soll nur mal als Testplatform dienen für ein gößeres Modell später. Warum dieses Modell? Weil es das kleinste (und somit günstigste) mit einem vollwertigen Rotorkopf mit Pitch ist. (Wie bei nem echten Heli) Insgesammt haben wir dann 6 Servos. (2x links/recht 2x vor/zurück, 2x pitch) Später haben wir nur einen Motor der beide Rotoren antreibt. Daher muss der Auftrieb über die Pitch gesteuert werden (anderes zu Quadcoptern, die das über die Drehzahl regeln) Das alles hier, rein zu testzwecken am Arduino (ohne Funk, verkabelt)

Ich habe für ein anderes Projekt schon Ultraschall sensoren und eine IMU integriert mit DCM, Kalman und PIDs.
Ich dachte, die Servos lassen sich ganz normal wie Andere auch steuern. Die beiden Motoren noch über ne Brushlessplatine dran und fertig. Ziel ist es, ersmal nur einen Schwebeflug zu erreichen. So einfach wird es wohl nicht werden.

TEC_MICHL:
Insgesamt haben wir dann 6 Servos.

Damit ist die Möglichkeit, das von Hand zu steuern gestorben.
Deine Servos scheinen alle 2,5ms einen Puls zu benötigen.
Wenn man das mit Microseconds() schalten will ist schon alleine damit der µC überlastet.
(ich habs bei mir so gemacht, weil ich mit der Servolib nicht glücklich war, aber ich habe auch 2 SErvos mit 50Hz ansteuerung)
Vielleicht findest du ja jemanden, der die Servolib gut genug kennt.

Hmm, okay, noch ist mir das nicht ganz klar. Ja, mit den 2,5 ms sehe ich auch so.

Ich denke so, wie der hier verhällt sich das, unter PulsPositionModulation:

Irgendwie stehe ich da noch ein bissl auf dem Schlauch... :frowning:
Wenn Du mir das nochmal "anfängerfreundlich" erklären könntest, wäre klasse. Was ist genau der Unterschied, zu meinem Servo, zu einem standard Servo. Die Pulsdauer ist kürzer?

Denn wenn ich jemanden finden soll, der sich mit der Servo Lib auskennt, dann sollte ich zumindest die Problemstellung richtig formulieren. :slight_smile: Vielen Dank!!

Noch ein Nachtrag:

Würde das mit dem hier funktionieren?

TEC_MICHL:
Noch ein Nachtrag:

Würde das mit dem hier funktionieren?

Pololu - Micro Maestro 6-Channel USB Servo Controller (Assembled)

ich denke nicht: Pulse rate configurable from 33 to 100 Hz
mit 2,5ms Pulsabstand bräuchtest du 400Hz.

Was ist genau der Unterschied, zu meinem Servo, zu einem standard Servo. Die Pulsdauer ist kürzer?

Ein normales Servo hat alle 20ms einen Puls dessen Dauer (ca.800µs-2200µs) die Servoposition bestimmt.
Dein Servo scheint alle 2,5ms einen Puls zu benötigen.

Mein Rat: probier mal mit einem einfachen Sketch aus, was funktioniert.
Die meisten "normalen" Servos arbeiten auch mit pulsen die seltener kommen, nur dann eben langsamer.

Nachtrag:
Schau mal hier: http://robotrack.org/include.php?path=article&contentid=210

400Hz ist die Standartfrequenz für Servo PPM Signale für schnelle Steuerungen wie sB Helikopter.
Grüße Uwe

Liebe Arduinofans,

wenn man in der Arduin servo.h die entprechenden Zeilen ändert in:

#define MIN_PULSE_WIDTH       1000// the shortest pulse sent to a servo
#define MAX_PULSE_WIDTH      2000// the longest pulse sent to a servo
#define DEFAULT_PULSE_WIDTH  1500     // default pulse width when servo is attached
#define REFRESH_INTERVAL    2500// minumim time to refresh servos in microseconds
#define SERVOS_PER_TIMER       1     // the maximum number of servos controlled by one timer
#define MAX_SERVOS   (_Nbr_16timers  * SERVOS_PER_TIMER)

(hab ich gefunden)
Dann klappt das mit den 400 Hz Servos, einer zum Test am Uno und theoretisch bis zu 8 am Mega, da er 4 Timer hat und je 2 für einen Servo nutzen kann. (Wird sich zeigen)
Siehe mein Video, hier werden jetzt 3 Positionen im 100 ms Takt angefahren:

Vielen Dank für Eure Hilfe! :smiley: