Forum: Mikrocontroller und Digitale Elektronik 3 Servos automatisieren


von Jens Kießling (Gast)


Lesenswert?

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

von STK500-Besitzer (Gast)


Lesenswert?

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.

von Max H. (hartl192)


Lesenswert?

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
von Noch einer (Gast)


Lesenswert?

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).

von Magic S. (magic_smoke)


Lesenswert?

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).

von Tom Thomsen (Gast)


Lesenswert?

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 ;-)

von Rudolph R. (rudolph)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

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.

von Rudolph R. (rudolph)


Lesenswert?

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.

von Patrick B. (p51d)


Lesenswert?

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
von Rudolph R. (rudolph)


Lesenswert?

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.

von Servokenner (Gast)


Lesenswert?

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

von wühlke (Gast)


Lesenswert?

Was zeigt ein Oszi auf Signal- und Stromversorgung des/der Servos im 
Einschalteaugenblick bis Ruckelende?

von Harald W. (wilhelms)


Lesenswert?

Servokenner schrieb:

> ROFL
> Software in Billig Servos, der war gut
> YMMD

Ich denke, sog. Digitalservos werden wohl alle einen µC eingebaut haben.

von STK500-Besitzer (Gast)


Lesenswert?

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...

von Harald W. (wilhelms)


Lesenswert?

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.

von Rudolph R. (rudolph)


Lesenswert?

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.

von Jens Kießling (Gast)


Lesenswert?

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

von Max H. (hartl192)


Lesenswert?

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
von Patrick B. (p51d)


Lesenswert?

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...

von Stefan F. (Gast)


Lesenswert?

Manche Servos kann man dazu bringen, sich langsamer zu bewegen, indem 
man die Pausen zwischen den Impulsen (normal ca 19ms) größer macht.

von Rudolph (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Rudolph (Gast)


Lesenswert?

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.

von Jens Kießling (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.