Hallo !
Ich habe die Bordkanone eines RC - helis automatisiert . Sie wird über 3
Servos angesteuert , schwenkt , hebt und dreht sich um die eigene Achse
.
Der Mechanismus wird über einen RC-Schalter mittels Sender eingeschaltet
.
Dabei bekommtt der Arduino nano zuerst Strom , befor die Servos
zugeschaltet werden .
Es funzt soweit ganz gut . Allerdings ist die erste Bewegung der Servos
immer schnell und ruckartig , danach laufen sie schön langsam und
gleichmäßig .
Ich habe nicht wirklich Ahnung von dieser Materie und mir nur das
nötigste angelesen , damit ich die Kanone verwirklichen konnte .
Es wäre nett , wenn mir jemand helfen könnte und mir sagt , wo der
Fehler liegt bzw. wie ich es ändern könnte . Video könnte ich an PN
schicken .
Hier ist mein Sketch :
#include <Servo.h>
Servo servos; Schwenken
Servo servoh; Heben
Servo servod; Drehen
int pos = 0;
void setup()
{
servos.attach(3);
servoh.attach(5);
servod.attach(6);
}
void loop()
{
servod.write(100);
{
}
for(pos = 5; pos <= 45; pos += 1)
{
servos.write(pos);
delay(30);
}
for(pos = 0; pos <= 60; pos += 1)
{
servoh.write(pos);
delay(30);
}
for(pos = 45; pos >= 5; pos -= 1)
{
servos.write(pos);
delay(30);
}
for(pos = 60; pos >= 0; pos -= 1)
{
servoh.write(pos);
delay(30);
}
for(pos = 5; pos <= 25; pos += 1)
{
servos.write(pos);
delay(30);
}
for(pos = 0; pos <= 35; pos += 1)
{
servoh.write(pos);
delay(30);
}
for(pos =25; pos >= 5; pos -= 1)
{
servos.write(pos);
delay(30);
}
for(pos = 35; pos >= 0; pos -= 1)
{
servoh.write(pos);
delay(30);
}
}
Danke Jens
Die Servos bekommen eine Position vorgegeben und wenn die nicht mit der
aktuellen übereinstimmt, bewegen sie sich schnellstmöglich dorthin.
Du müsstest also die Position wissen, an der sie sich befinden, bevor du
ihnen die erste zuweist.
Jens Kießling schrieb:> Allerdings ist die erste Bewegung der Servos> immer schnell und ruckartig, danach laufen sie schön langsam und> gleichmäßig.
Liegt das vllt. daran, dass der Servo bei Anschalten nicht in der 0
Position ist und diese weil du bei 0 beginnst so schnell wie möglich
anfährt? Versuch mal den Servo vor dem Einschalten manuell in die 0
Position zu drehen. Um das ohne zusätzliche Hardware/Sensoren zu lösen
fällt mir kein Weg ein.
PS: Für C(++) Code bitte in Zukunft die Formatierung verwenden
Dürfte nicht weiter stören, wenn die Servos nur beim Einschalten des
Fliegers zucken.
Den Arduino die ganze Zeit eingeschaltet lassen und mit dem RC-Schalter
nur einen Eingang des Arduino schalten. Im Programm abfragen und in
Neutralstelluing fahren.
Wenn der Arduino keine LEDs hat und du die Sleep-Modi des AVR nutzt,
kannst du den Stromverbrauch vernachlässigen. (Oder wie gehabt einfach
mit delay arbeiten und die paar Milliampere ignorieren).
Der Arduino muß wissen, welche Position die Servos beim Abschalten
hatten und sich diese merken. Ansonsten startet Dein Programm immer bei
Null, egal wo die Servos gerade standen und die Servos fahren
schnellstmöglich den vorgegebenen Punkt an.
Bastel in Dein Programm eine Referenzierung mit ein. Diese wird z.B.
über einen Taster am Arduino beim Einschalten des Modells gestartet und
fährt die Servos in die Startposition. Die Servos werden danach nicht
mehr bewegt, beginnen also beim Start des Schwenkprogramms weich zu
laufen.
Solange das Modell fliegt müssen die Servos referenziert bleiben, also
das Programm im Arduino darf nicht irgendwo gestoppt und neu gestartet
werden. Es darf nur angehalten werden, ohne daß der Arduino abgeschaltet
wird. Sonst vergisst er die aktuelle Stellung der Servos. Beim Stopp des
Programms könnte der Arduino die Stromversorgung zu den Servos
abschalten, um den Strom dafür zu sparen.
Alternativ kannst Du auch die Stromversorgung des Arduino so auslegen,
daß er das Abschalten erkennt und noch genug Elko-gepufferte Zeit hat,
die aktuelle Position der Servos ins EEPROM zu schreiben. Diese wird
dann beim Start ausgelesen und solange die Servos nicht manuell verdreht
werden, hast Du immer einen weichen Anlauf. Also müßte man den Arduino
vor dem Start kurz anschmeißen, damit die Servos auf ihre Position
gefahren werden, wenn sie verdreht worden sind.
Die Schreibzugriffe aufs EEPROM sind zu minimieren, das EEPROM hält
nicht ewig (beim AVR laut Datenblatt 100.000 Schreibzyklen pro Zelle).
magic s. schrieb:> Die Schreibzugriffe aufs EEPROM sind zu minimieren, das EEPROM hält> nicht ewig (beim AVR laut Datenblatt 100.000 Schreibzyklen pro Zelle).
Das dürfte deutlich über der Anzahl der Schaltzyklen des Einschalters
liegen. Ok, man sollte vielleicht nicht bei jeder Ausgabe eines Pulses
an den Servo die aktuelle Servoposition im EEPROM sichern ;-)
Naja, ich spiele auch gerade mit einem Servo rum und musste ebenfalls
feststellen, dass der Servo Teil beim Einschalten einmal ruckt.
Wenn der beim Einschalten kein Signal hat fährt der jedesmal ein Stück
Richtung Anschlag und nicht nur so ein kleines bisschen, sondern so gut
15°.
Und selbst wenn das Teil im Anschlag ist läuft der noch an.
Wenn ich die Schaltung in meiner Null-Position aus schalte und dann
wieder einschalte, dann ruckelt das Ding einmal ganz kräftig.
Das ist ein "Tower Pro MG996R".
Mir fällt nichts ein, was ich dagegen "von aussen" machen kann.
Die Software in dem Servo ist einfach Müll, die bekomme ich aber auch
nicht geändert, weil ich den Controller da drin nicht mal identifziert
habe.
Wahrscheinlich sind da nur 12 Zeilen Code drin und der versucht die 0V
Position des Potis anzufahren, bevor die erste AD-Wandlung durch ist.
Es wäre auch hilfreich, wenn der Servo eine kleine Start-Verzögerung
drin hätte und/oder auf das erste Signal warten würde.
Dann würde es auch was bringen sich die Position zu merken auf den man
den gefahren hat und dem Servo diese Position wieder mitzuteilen.
Aber wenn der Servo schon einfach so anläuft sobald der Spannung hat,
dann ruckt der eben auch wenn man dem exakt die Position gibt auf der er
beim Abschalten stand.
Würde mich nicht wundern, wenn das sogar absichtlich eingebaut ist. So
zeigen die Servos über ein kleines Zucken der Ruder, daß sie jetzt
"scharf" sind.
Die Lösung des Problems liegt einfach darin, nicht jedesmal den Strom
auszuschalten.
Rolf M. schrieb:> Die Lösung des Problems liegt einfach darin, nicht jedesmal den Strom> auszuschalten.
Naja, irgendwann muss man abschalten und mein Servo zumindest zeigt kein
"kleines Zucken", der rappelt richtig.
Rudolph R. schrieb:> Mir fällt nichts ein, was ich dagegen "von aussen" machen kann.> Die Software in dem Servo ist einfach Müll, die bekomme ich aber auch> nicht geändert, weil ich den Controller da drin nicht mal identifziert> habe.
Schon mal OpenServo angeschaut? Da kannst du sicher die Software massiv
aufbessern und sogar die Dinger per I2C steuern. Wenn du das
Feedbacksignal auslesen kannst, hast du die Probleme mit der
Positionierung gelöst.
Patrick B. schrieb:> Schon mal OpenServo angeschaut?
Auch nicht schlecht, damit hätte man dann alle Optionen.
Nur bekommen kann man die scheinbar nicht mehr.
Immerhin gibt es die ganzen Daten, damit könnte man sich die nachbauen.
Meine erster Gedanke war aber eher, den vorhandenen Controller zu
benutzen,
ich habe aber nur kurz in den Servo reingesehen und als ich da irgendein
chinesisches Teil drin gefunden habe den gleich wieder zugemacht.
Wahrscheinlich wäre es aber günstiger, sich entweder bessere Servos zu
suchen oder bekannt hackbare.
Rudolph R. schrieb:> Die Software in dem Servo ist einfach Müll, die bekomme ich aber auch> nicht geändert, weil ich den Controller da drin nicht mal identifziert> habe.
ROFL
Software in Billig Servos, der war gut
YMMD
Harald W. schrieb:> Servokenner schrieb:>>> ROFL>> Software in Billig Servos, der war gut>> YMMD>> Ich denke, sog. Digitalservos werden wohl alle einen µC eingebaut haben.
die sind dann aber nicht billig...
STK500-Besitzer schrieb:> Harald W. schrieb:>> Servokenner schrieb:>>>>> ROFL>>> Software in Billig Servos, der war gut>>> YMMD>>>> Ich denke, sog. Digitalservos werden wohl alle einen µC eingebaut haben.>> die sind dann aber nicht billig...
...aber preiswert.
http://www.amazon.de/gp/product/B00MUBV7ZO?psc=1&redirect=true&ref_=oh_aui_detailpage_o05_s00
Ich hielt den erst für preiswert, inzwischen tendiere ich mehr zu
billig.
Aber um meinen Servo ging es ja garnicht, der Jens hat sich nur nicht
wieder gemeldet.
Ich wollte ja nur einwerfen das alle Versuche die Position beim
Abschalten zu speichern nichts nützen wenn der Servo auch ruckelt obwohl
er beim Einschalten die Position bekommt auf der er steht.
Um das zu testen muss man sein Programm ja nur mal so ändern, dass es
eine feste Position ausgibt.
Einschalten, Ausschalten, wieder Einschalten.
Hallo again !
Sorry , dass ich mich jetzt erst wieder melde , aber ich hatte
Gartenwochen-
ende ohne Internet !!!
Vielen Dank an Alle , die mir helfen wollen .
Das mit der Nullposition der Servos leuchtet ein , beim Ausschalten
stehn die ja irgendwo .
Was mich interessieren würde ist , kann man meinen Sketch (siehe oben)
so verändern , dass er nicht dauern läuft ( bis man ausschaltet )
sondern das die programmierte Sequenz zB. nur 5 mal läufft und dann bei
Null stoppt . Wie gesagt ich habe keine Ahnung von Steuerungen , deshalb
muß Alles sehr einfach und für mich noch verständlich gehalten werden .
mfg Jens
Ich habe gerade nochmal mit meinem Servo was ausprobiert, da ich den
fiesen Ruckler ja auch weg haben möchte.
Erstmal ist da wirklich kein µC drin, da ist ein AA51880 verbaut:
http://www.agamem.com.tw/AA51880.asp
Die Idee an dem Ding irgendwas zu verändern kann mal also vergessen.
Also was kann man noch machen.
Ohne Ansteuerung fährt mein Servo beim Einschalten ein Stück weit.
Mit 0V auf der Steuer-Leitung passiert das gleiche.
Aber mit High-Pegel auf der Steuer-Leitung passiert quasi gar nichts.
Ich habe jetzt eine Verzögerung drin, die ersten 30ms bekommt der Servo
nur High-Pegel, unterstützt von einem 10k Pullup, damit der Pegel auch
da ist während mein Controller noch aus dem Reset kommt.
Das erste Bild zeigt das Einschalten, das Gezappel am Anfang kommt von
meiner BEC.
Für das zweite Bild habe ich die Verzögerung nochmal rausgenommen,
anhand der Störungen auf der Versorgung kann man erkennen, dass der
Motor sich für über 300ms nach dem Einschalten bewegt.
Alles natürlich unter der Bedingung, dass die Position statisch ist,
also beim Einschalten wieder die Position gesendet wird die beim
Abschalten angefahren war.
Damit macht mein Servo dann bestenfalls noch ganz leise "Tick" beim
Einschalten und keine erkennbare Bewegung.
Beim Arduino würde ich die drei Ausgänge im setup() auf High setzen, ein
delay von 30ms benutzen und dann die PWM aktivieren.
Rudolph schrieb:> Alles natürlich unter der Bedingung, dass die Position statisch ist,> also beim Einschalten wieder die Position gesendet wird die beim> Abschalten angefahren war.
Und genau da liegt im Modellbau meistens das Problem.
Du kannst beim Transport des Modells normalerweise nicht verhindern,
dass du absichtlich oder unabsichtlich die Servos verstellst.
Karl H. schrieb:> Du kannst beim Transport des Modells normalerweise nicht verhindern,> dass du absichtlich oder unabsichtlich die Servos verstellst.
Das ist sicher richtig, mein Problem war aber nicht, dass die Position
angefahren wird die ich gerne hätte.
Das macht meine Software jetzt auch, abschalten, verdrehen, einschalten.
Dann wird das ganz sauber angefahren.
Aber beim Einschalten auf der Start-Position hat der Servo ganz fies
rechts-links gezappelt - und das ist jetzt weg.
Hallo !
Vielen Dank nochmal an Alle , speziell an Max H. , werde ich testen .
Ich muß nur erst meine Mechanik wieder zusammenbauen u. einstellen , da
ch neue Seitenteile konstruiert habe .
Melde mich nach test wieder .
Schönen Abend
Jens