Muss mich ein wenig mit Servosteuerung beschäftigen für den Modellbahnclub. Erst mal eine Vierergruppe. Das Problem ist das Zittern in den programmierten Endlagen. Jetzt möchte ich den jeweiligen Servopin bei der erreichten Endlage(ProgPos) abschalten. Wird mit servo1.detach();Servopin1=LOW gemacht. Ohne Servopin1=LOW bleiben die Servoimpulse weiterhin! Das aktivieren des Servopins mit servo1.attach(Servopin1) hat aber keinen Erfolg,bleibt deaktiv Nutze das Boardmittel #include <Servo.h> Bei der Unmenge an Informationen welche das Problem nicht lösen wird man richtig erschlagen. Wer kennt den Befehl oder Funktion dazu? MfG
:
Bearbeitet durch User
Al. K. schrieb: > Das Problem ist das Zittern in den programmierten Endlagen. > Jetzt möchte ich den jeweiligen Servopin bei der erreichten > Endlage(ProgPos) > abschalten. > Wird mit servo1.detach();Servopin1=LOW gemacht. > Ohne Servopin1=LOW bleiben die Servoimpulse weiterhin! > Das aktivieren des Servopins mit servo1.attach(Servopin1) hat aber > keinen Erfolg,bleibt deaktiv Tja, da würde ich einfach mal im Quelltext nachlesen, was die beiden Methoden detach und attach eigentlich tatsächlich tun, um herauszufinden, ob das eigentlich das ist, was du (bzw. dein Servo) brauchst, um das gewünschte Verhalten zu erreichen. Das setzt natürlich voraus, dass man weiss, was so ein Servo braucht, um das gewünschte Verhalten zu erreichen... Man könnte aber auch die servo.h nach Methoden durchforsten, die eventuell besser geeignet wären als detach/attach... Man muss es bloß wollen...
Ja,ja deine Vorschläge sind schon berechtigt aber leider nicht zielführend.Das deaktivieren geht ja, nur nicht das aktivieren. ...und man sollte nicht zum 10 000sten male das Rad neu erfinden sonder auf Erfahrung aufbauen, und diese Erfahrungen suche ich hier.Jeder welcher selbst hilfsbereit ist, weis das es immer Hilfsbereite gibt. Das sagt natürlich nicht, das ich trotzdem versuche das Problem Eigenständig zu lösen. MfG
:
Bearbeitet durch User
Al. K. schrieb: > Das Problem ist das Zittern in den programmierten Endlagen. Da würde lieber mal die Problemursache suchen, denn normal ist das nicht. > Das deaktivieren geht ja, nur nicht das aktivieren. Vermutlich wird die Antwort von dem konkreten Arduino Board abhängen und auch davon, ob du Hardware-PWM oder Soft-PWM nutzt. Ohne Arduino Framework hätte ich Dir (im Falle von AVR) empfohlen, den Ausgang im jeweiligen Timer-Control Register zu deaktivieren. Jetzt hast du wenigstens eine halbe Antwort. Die Arduino Spezialisten melden sich sicher noch innerhalb der nächsten tage. Nachtrag: Warum schaltest du das PWM Signal nicht einfach mit digitalWrite(pin,0) oder analogWrite(pin,0) aus? Das habe ich gerade der Arduino Doku (https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/) entnommen und im Quelltext gesehen, dass analogWrite beim Wert null stattdessen intern digitalWrite aufruft.
Stefanus F. schrieb: > Da würde lieber mal die Problemursache suchen, denn normal ist das > nicht. Es liegt wahrscheinlich an den Servos! Im Modellbau (Auto,Flugzeug usw.) werden die Servos ständig bewegt,so das dieses Zittern sehr selten auftritt, außerdem werden öfters bessere Qualitäten eingesetzt. Weichen aber z.B. werden wesentlich seltener geschaltet, so das das abschalten des Impulses eine Alternative ist. Manchmal reicht es die Wirkung zu bekämpfen, nicht die Ursache. Bei Servos zwischen 1,50-2,50 Euro Kosten. Ich nehme auch an das diese Ab/Zuschaltung einen bekannt ist und man das Wissen teilt, wenn ich es nicht selbst finde! MfG
:
Bearbeitet durch User
Al. K. schrieb: > Es liegt wahrscheinlich an den Servos! Sicher nicht. > Im Modellbau (Auto,Flugzeug usw.) werden die Servos ständig bewegt,so > das dieses Zittern sehr selten auftritt, außerdem werden öfters bessere > Qualitäten eingesetzt. Servos, die Verbrennungsmotoren ansteuern, sollten nicht wackeln. Auch, wenn mann geradeaus fahren oder fliegen will, geht das, ohne dabei einen Schlangenkurs hinyulegen Das Wacken kommt durch unterschiedliche Pulslaengen des Senders yustande - also deiner Software. Einfachster Test: Bau dein Programm so um, dass es nur ein Servo bedient. Deinen Quellcode verheimlichst du ja auch.
STK500-Besitzer schrieb: > Einfachster Test: Bau dein Programm so um, dass es nur ein Servo > bedient. Habe mit verschiedenen Servos getestet. Man hört sofort den Unterschied. Das kritischste ist in der Nähe der mechanischen Endlagen. Die Qualität ist 90%!
Al. K. schrieb: > Das kritischste ist in der Nähe der mechanischen Endlagen. > Die Qualität ist 90%! Vermutlich faehrst du dagegen und das Servo will nachregeln...
STK500-Besitzer schrieb: > Vermutlich faehrst du dagegen und das Servo will nachregeln... ein bisschen Erfahrung musste mir schon zutrauen, noch dazu da ich verschiedene Servos in der NÄHE de Enlage getestet habe. Stefanus F. schrieb: > 90% von was? Ich meinte 90% Sicherheit und Qualität macht die Mechanik des Servos aus!
Hallo Al. K. Al. K. schrieb: > ... für den Modellbahnclub. Etwas OT, aber vielleicht für dich bzw. deinem Modellbahnclub interessant Beitrag "Re: Zeigt her eure Kunstwerke (2017)" Ich weiß ja nicht, ob du diesen Thread verfolgst, deshalb der direkte Hinweis. Unterlagen stellte ich gerne zur Verfügung. Reinhard (der auch schon ein alter Knacker ist)
Danke für den Link, aber hier geht es mir nur ob ich die einzelnen Servo Impulse zur Laufzeit zu und abschalten kann. Wenn ich sie abschalten kann sollte man sie auch zur Laufzeit wieder zuschalten können! Eigentlich ist das was für unsere ARDUINO Jünger.;-)) Ich verliere die Hoffnung nicht!
Hallo, erstmal ein minimales kompilierbares Beispiel posten, bei dem der Effekt auftritt. Dann kann man weiter sehen. Viele liebe Grüße Timm
Was du vorhast geht nicht. Du kannst nicht einzelne "Servoimpulse" abschalten, da der Servo sonst in die eine Endlage fahren würde. Auch den kompletten Servo mit Versorgung abschalten geht nicht, da der dann ja kein Haltermoment mehr hat. Schau dir mal an wie die Servoansteuerung funktioniert https://www.mikrocontroller.net/articles/AVR-Tutorial:_Servo Da wird dir deutlich, dass wenn der Puls (in der Theoroie, in der Praxis kann es auch etwas darunter liegen) unter 1ms dauert, dann würde der Servo einfach versuchen so weit wie möglich in die Richtung zu fahren, welche die Pulsdauer von 1ms repräsentiert (also z.b. in die 0° Stellung ganz nach links) Da würde dein Servo sicher noch mehr zittern. Wichtig ist, dass das Signal für einen Winkelwert also immer die gleiche Pulslänge hat und die Periodendauer auch immer möglichst gleich lang ist (wenig Jitter). Ich kann dir aus meiner eher bescheidenen Erfahrung nur sagen, das es bei meinen alten Servos von Futaba etc aus den 90ern auch immer zu diesem Zitter-Effekt kam. Woran das lag habe ich nicht weiter untersucht. Entweder liegt es an den Servos, Störungen auf das Servosignalanschlusskabel, oder (was ich weniger glaube) an der Ansteuerung an sich. Ich hab das nicht näher untersucht, weil es für mich nur Spielerei war.
Timo N. schrieb: > das du vorhast geht nicht. Du kannst nicht einzelne "Servoimpulse" > abschalten, da der Servo sonst in die eine Endlage fahren würde. Oder auch nicht. Das, was dann passiert, ist schlicht vom Servo abhängig. Kann funktionieren, muß aber nicht. Al. K. schrieb: > Danke für den Link, aber hier geht es mir nur ob ich die einzelnen Servo > Impulse zur Laufzeit zu und abschalten kann. Klassiches Beispiel für den Fall, daß eine falsche Lösung für das falsche Problem gesucht wird, kombiniert mit Beratungsresitenz. Kein (einigermaßen normales) Servo zittert bei normaler Ansteuerung, auch nicht solche für nur 1,50, auch nicht kurz vor den Endlagen. Such das wirkliche Problem, und löse es, dann zittert auch nix. Oliver
:
Bearbeitet durch User
#include <Servo.h> // Pins festlegen int Servopin1 = 9; // Servo-Objekt erzeugen Servo servo1; // Ausgangsposition in Winkelgraden int pos1 = 90; void setup() { servo1.attach(Servopin1); //servo1.detach(); Serial.begin(9600); } void loop() { servo1.write(pos1); delay(150); if(Serial.available()) { char ch = Serial.read(); switch(ch) { case '1': pos1=10; break; // alles o.k. case '2': pos1=150; break; // keinerlei rütteln case '3': pos1=0; break; //Bewegt sich auf 0 mit ganz leichten Zittern case '4': pos1=180;break; // Servo bewegt sich bis 180 aber Rüttelt sehr stark case '5': pos1=5; break; // Alles o.k. case '6': pos1=160; break; // Rütteln case 'E': servo1.attach(Servopin1);Servopin1=HIGH; break; //1=Ein break; // case 'A': servo1.detach();Servopin1=LOW; break; //0=Aus break; // } } } // Mit Typgleichen Servo von 0- 180 alles o.k. // servo1.attach shaltet nicht wieder zu // serbo1.detach shaltet sen Servopin ab
Alle mir bekannten normalen RC-Servos werden bei Signalausfall einfach kraftlos. Diverse Traxxas, Savöx, Conrad, Hobbyking, Vaterra. Wenn ein Signal kommt, versuchen sie die Position anzufahren; wenn dabei das Signal grob aus dem üblichen Verfahrbereich von 900-2100µs rausfällt kann's auch mal knirschen. Fehlt es dagegen, passiert normal nix. Ich würde daher einfach mal probieren, ob nicht ein 74245 einfach alle Servos via OE stillegt. Ein Pin um alle Servos ein und auszuschalten, fertig. Was das Rütteln angeht: das scheint ja nur ziemlich am Ende des Verfahrwegs zu passieren. Genau da würde ich daher auch die Ursache vermuten: die Mechanik des Servos kann nicht weiter. Da hilft dann nur ein anderes Servo mit mehr Verfahrweg oder eine andere äußere Mechanik mit weniger.
:
Bearbeitet durch User
Jens M. schrieb: > Ich würde daher einfach mal probieren, ob nicht ein 74245 einfach alle > Servos via OE stillegt. Ein Pin um alle Servos ein und auszuschalten, > fertig. Das möchte ich vermeiden, da es einen Befehl zum Aktivieren und deaktivieren eines Servopins gibt. Die Servos brauchen kaum Kraft für eine TT- Weiche, die bleiben auf position bei wenigen Gramm Zugkraft. Werden aber selten gestellt! ...und kleiner wollte ich zum Arduinoverständnis das Arduinoprogramm nicht machen!
:
Bearbeitet durch User
Al. K. schrieb: > Das möchte ich vermeiden, da es einen Befehl zum Aktivieren und > deaktivieren eines Servopins gibt. Ja, und der stellt den Timer ein, soweit mir bekannt, belegt also Hardware. Schau dir den Quelltext der servo.h an und entscheide, was attach macht, was detach macht und was fehlen könnte. Vielleicht reichts ja auch, einfach wieder eine Position zu setzen ;) Detach dient jedenfalls nach meinen Infos dazu, den Timer wieder freizuräumen, nicht dazu das Servo abzuschalten.
:
Bearbeitet durch User
Würde mich wundern, wenn das etwas bringt. Servo-Signale sind Impulse variabler Länge. Sehr kurze Pulse (Wiki) bewirken die Fahrt zum einen Endpunkt, lange Impulse erzwingen die Fahrt zum anderen Endpunkt. Ich habe keine Ahnung was "Aus" = 0 oder "An" = 1 bewirken. Würde mich aber nicht wundern, wenn das undefiniert ist, da "Aus" wohl zu "kurz" ist und "An" zu "lang" wird. Also wie bereits gesagt: Ursache suchen.
Al. K. schrieb: > // Mit Typgleichen Servo von 0- 180 alles o.k.? Also geht es bei anderen baugleichen Servos und nur bei einem nicht???? Austauschen, da Servo defekt? Jens M. schrieb: > Alle mir bekannten normalen RC-Servos werden bei Signalausfall einfach > kraftlos. > Diverse Traxxas, Savöx, Conrad, Hobbyking, Vaterra. Signalausfall oder Ausfall der Versorgung(5V und GND)? Bei Signalausfall bei analogen Servos müsste der Servo ja die Endposition anfahren. Gibt es da eine interne Logik, die tatsächlich zwischen Mindespulslänge und gar keinem Puls unterscheidet? Soweit mir bekannt steckt da ja nur ein Komparator im Servo und der hat ja bei keinem Puls keinen Vergleichswert mehr bzw. einen ganz niedrigen, der das Anfahren der Endposition bewirken sollte. Warum wird er dann einfach kraftlos? Naja, ich hab keine Ahnung was bei neueren Servos so geht, aber ich dachte da hat sich nicht viel geändert. Bei Versorgungsausfall wird er kraftlos, das ist klar.
Timo N. schrieb: > Signalausfall oder Ausfall der Versorgung(5V und GND)? > Bei Signalausfall bei analogen Servos müsste der Servo ja die > Endposition anfahren. Gibt es da eine interne Logik, die tatsächlich > zwischen Mindespulslänge und gar keinem Puls unterscheidet? Soweit mir > bekannt steckt da ja nur ein Komparator im Servo und der hat ja bei > keinem Puls keinen Vergleichswert mehr bzw. einen ganz niedrigen, der > das Anfahren der Endposition bewirken sollte. Signalausfall, z.B. wenn der Empfänger keinen Sender mehr sieht und kein Failsafe hat. Und nein, ein echtes analoges Servo (also eins aus dem letzten Jahrtausend) regelt den Motor eh nur, wenn ein Servopuls reinkommt, durch Vergleich des Signals mit einem Monoflop am Istwert. Wenn da nichts reinkommt, bewegt sich der Motor nicht, und wenn es zu oft reinkommt brennt er durch, weil er zu oft angesteuert wird. Einfach, in dem das Monoflp gestartet wird, wenn der Eingang aktiv wird, und am Ende hört eins eher auf. Beide Signale gehen auf eine Halbbrücke, als bewegt sich der Motor am Ende des Eingangssignal in die Richtung des Signal das länger dauert. Heutzutage sind auch billigste Servos digital, also mit einem Mikrocontroller, und der hat das gleiche Problem: wohin, wenn kein Sollwert kommt? Also stellt er den Motor aus. Zumindest bei allen, die in meiner Kiste liegen. Dauert manchmal ein paar Sekunden, aber irgendwann hört das Knurren auf.
:
Bearbeitet durch User
Timo N. schrieb: > Gibt es da eine interne Logik, die tatsächlich > zwischen Mindespulslänge und gar keinem Puls unterscheidet? Ja, anders kenne ich das nicht. Hast du meinen Lösungsvorschlag übersehen?: > Warum schaltest du das PWM Signal nicht einfach mit > digitalWrite(pin,0) oder analogWrite(pin,0) aus?
Stefanus F. schrieb: > Hast du meinen Lösungsvorschlag übersehen?: >> Warum schaltest du das PWM Signal nicht einfach mit >> digitalWrite(pin,0) oder analogWrite(pin,0) aus? Sicher das das geht? Afaik aktiviert die Servo.h einen Interrupt im Timer, der sich um einige Servopins kümmert. Der dürfte das überschreiben. Oder setzt digitalwrite im Gegenzug den Interrupt aus?
Jens M. schrieb: > Sicher das das geht? Ich habe es nicht probiert. Aber laut Arduino Doku und Quelltext schaltet man damit das Signal ab (außer an zwei eingeschränkten Pins). Und ich weiss mit Sicherheit, dass normale Servos dann in Bereitschaft gehen.
Stefanus F. schrieb: > Hast du meinen Lösungsvorschlag übersehen?: >> Warum schaltest du das PWM Signal nicht einfach mit >> digitalWrite(pin,0) oder analogWrite(pin,0) aus? Das Funktioniert nicht. Man sieht das der Pin kurz abgeschaltet wir und wieder aktiviert. servo2.detach(); digitalWrite(Servopin2,0); Nur wenn vorher deaktiviert wird ist der Pin abgeschaltet. Das hatte ich aber schon geschrieben! ...aber er lässt sich nicht wieder aktivieren! Das sollte doch jeden Fortgeschrittenen Arduiner interessieren warum das so ist? Timm R. schrieb: > erstmal ein minimales kompilierbares Beispiel posten, bei dem der Effekt > auftritt. Dann kann man weiter sehen. Na nützt der Code was,wie ich schon sagte für dieses Problem ist mein Code nicht relevant! Jens M. schrieb: > Sicher das das geht? es geht eben nicht!
:
Bearbeitet durch User
c-hater schrieb: > Man muss es bloß wollen... na du bist ja Experte mit solchen Antworten. Kannst du jetzt was zielführendes dazu sagen? Das ab und zuschalten von einzelnen Servopins dürfte doch kein Problem sein. ..oder ist das ein Fehlverhalten der Servo.H, dann sollte dies doch korrigiert und öffentlich gemacht werden.;-))
Ich als 'Ohne Arduino IDE' Nutzer von AVRs schalte die PWM dadurch ab, das ich den entsprechenden Pin zum Eingang umschalte.
1 | DDRB &= ~(1 << PB5); // Schaltet Pin B5 auf Eingang um |
2 | PORTB &= ~(1 << PB5); // schaltet etwaigen Pullup aus |
Die PWM Funktion und der Timer werden dadurch nicht verändert. Aktivieren dann wieder mit
1 | DDRB |= (1 << PB5); |
Werde ich mal testen! Kann machen was ich will, abschalten geht, aber nicht zuschalten. Möchte mich jetzt nicht mehr darum kümmern, muss morgen mein Vorführdemomodell fertig haben. Seit über einen Jahr mal wieder Arduino, da will ich nicht nach möglicherweise Fehlern in der Servo.h suchen Das sollten die ,welche besser Bescheid wissen. aber trotzdem Danke für die gewollte Hilfe. Werde nicht die Ursache sondern die Wirkung beheben, externes abschalten des Servoimpulses!
:
Bearbeitet durch User
Al. K. schrieb: > Kann machen was ich will, abschalten geht, aber nicht zuschalten. Getrennte (ausreichende - meine Billig "Micro Servo 9g" wollen wenigsten 250-300 mA Spitzenleistung bei 5 V) Stromversorgung des Servos, mit ordentlichen Elkos dran. In der Endposition brauchen die 7 mA - und da wackelt nichts. Wenn die zu schwach versorgt werden, dann bleiben die in der Endposition hängen und starten nicht mehr - auch und gerade nach einem detach(). Wenn Du ein detach() absetzt geht die Steuerleitung auf high, was nicht immer förderlich ist.
:
Bearbeitet durch User
Damit funktioniert es bei mir prima (bei getrennter, ausreichender Versorgung des Servos):
1 | #include <Servo.h> |
2 | |
3 | // Pins festlegen
|
4 | int Servopin1 = 9; |
5 | |
6 | // Servo-Objekt erzeugen
|
7 | Servo servo1; |
8 | |
9 | // Ausgangsposition in Winkelgraden
|
10 | int pos1 = 90; |
11 | |
12 | |
13 | void setup() |
14 | {
|
15 | servo1.attach(Servopin1); |
16 | Serial.begin(9600); |
17 | }
|
18 | |
19 | void loop() |
20 | {
|
21 | servo1.write(pos1); |
22 | |
23 | if (Serial.available()) |
24 | {
|
25 | char ch = Serial.read(); |
26 | switch (ch) |
27 | {
|
28 | case '1': pos1 = 10; break; // alles o.k. |
29 | case '2': pos1 = 150; break; // keinerlei rütteln |
30 | case '3': pos1 = 0; break; // Bewegt sich auf 0 mit ganz leichten Zittern |
31 | case '4': pos1 = 180; break; // Servo bewegt sich bis 180 aber Rüttelt sehr stark |
32 | case '5': pos1 = 5; break; // Alles o.k. |
33 | case '6': pos1 = 160; break; // Rütteln |
34 | case 'E': servo1.attach(Servopin1); break; // 1=Ein |
35 | case 'A': servo1.detach(); break; // 0=Aus |
36 | }
|
37 | }
|
38 | }
|
Falls das nicht hilft und Du "größere Strecken" bis zum Servo hast wäre das vielleicht eine Idee: http://www.aero-hg.de/IMPEDANZIMPULS.html Dann kannst Du auch noch mit einem 10nF Kondensator Impuls/GND experimentieren.
:
Bearbeitet durch User
Johann J. schrieb: > Damit funktioniert es bei mir prima (bei getrennter, ausreichender > Versorgung des Servos): Vor 50 Jahren war das nicht anders! Habe es noch mal mit einen Servo getestet...und es ging jetzt! Mit 4 Servos und es ging jetzt auch. Warum auch immer, habe wahrscheinlich Servo1-4 durcheinandergebracht! Nutze die Abschaltung noch nicht, da das Demo erst mal fertig werden musste. Jetzt läuft es (Enlagenbegrenzungs Speicherung,letzte Pos Speicherern. Endlagen Einstellung und Speicher im EE. Reicht jetzt, muss es nur morgen auf ein Brett nageln!
:
Bearbeitet durch User
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.