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
1 | [c]C(++)-Code[/c] |
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
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
Was zeigt ein Oszi auf Signal- und Stromversorgung des/der Servos im Einschalteaugenblick bis Ruckelende?
Servokenner schrieb: > ROFL > Software in Billig Servos, der war gut > YMMD Ich denke, sog. Digitalservos werden wohl alle einen µC eingebaut haben.
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
Jens Kießling schrieb: > nur 5 mal läufft und dann bei > Null stoppt . Das könnte man so lösen:
1 | loop() |
2 | {
|
3 | static char counter = 0; |
4 | if(counter < 5) |
5 | {
|
6 | // Code der in deiner loop() steht hier einfügen
|
7 | counter++; |
8 | }
|
9 | else
|
10 | {
|
11 | servos.write(0); |
12 | servoh.write(0); |
13 | servod.write(0); |
14 | }
|
15 | // counter hier wieder auf 0 setzten um Sequenz wieder zu starten.
|
16 | }
|
:
Bearbeitet durch User
Rudolph R. schrieb: > 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. Für "gute" Servos musst hier noch mindestens eine 0 anhängen...
Manche Servos kann man dazu bringen, sich langsamer zu bewegen, indem man die Pausen zwischen den Impulsen (normal ca 19ms) größer macht.
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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.