Pages: [1] 2   Go Down
Author Topic: Servo zappelt (mit Servo-Lib)  (Read 1033 times)
0 Members and 1 Guest are viewing this topic.
D-49565 Bramsche
Offline Offline
Sr. Member
****
Karma: 6
Posts: 477
Geht nich ? Gipp's nich !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

... nur unter bestimmten Umständen !

Nach dem ich meine gute alte Robbe FX-18 nun auslesen kann (http://forum.arduino.cc/index.php?topic=182681.msg1354354#msg1354354),
wollte ich "eben mal schnell" auch mit in dem Sketch einige Servos mitlaufen lassen.
Entsprechende Code habe ich mir aus nem anderen Testsketch hier geholt, mit dem ich schon erfolgreich (zappelfrei) dies und das getetet habe.

Sobald ich auch nur einen Servo initialisiere, geht das Gezappel los: Der Servo schüttelt sich mit geschätzt 20 Hz.
Laufen tut er aber trotzdem, wenn ich ihn von der Fernsteuerung bediene.

Als Timer hab ich in o.g. Sketch mal auf 4 gewechselt, damit sich das nicht mit dem zuerst initialisiertem Timer5 der Servo-Lib stört.
Der Interrupt-Eingang ist dann ICP4 auf Pin 49 (am Mega).
Das funzt ja so weit auch ....

Nun jabe ich im Sketch alles Stück für Stück auskommentiert, so das die Loop leer läuft und aktiv nur noch 1 Servo initialisiert wird.
Sonst passiert nichts weiter ..... aber der Servo zappelt nach wie vor in Mittelstellung.

In der Servo-Lib hab ich bis auf Timer5 alles andere auskommentiert - keine Änderung.

Dieses Phänomen verschwindet erst, wenn ich meine Fersteuerung ausschalte !
Sprich es kommen kein Signal mehr auf Pin 49 (der eh nicht mehr gelesen wird).

Was geht hier vor sich ? Hilfe bitte.
Logged

To young to die - never to old for rock'n roll

Offline Offline
Newbie
*
Karma: 4
Posts: 27
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wie genau ist denn das Servo mit dem Arduino verbunden?
Ich habe die Vermutung du verwechselst da was,  PPM und PWM, beides mit RC zu tun,  aber funktionieren hier unterschiedlich.
« Last Edit: August 16, 2013, 05:10:22 pm by Sijjim » Logged

D-49565 Bramsche
Offline Offline
Sr. Member
****
Karma: 6
Posts: 477
Geht nich ? Gipp's nich !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nein, ich verwechsle da sicher nichts.

Das PPM-Signal (also das kombinierte Signal der Fersteuerung mit 8-Kanälen) lese ich mit o.g. Sketch aus.
Ich verwende Timer4 mit 0,5µs Auflösung und triggere mit der steigenden Fklanke den Timer am Pin ICP4 der Mega.
Das funktioniert ja auch 1A.

Zum Steuern der Servo's (mit einem PWM-Signla) benutze ich die handelsübliche Servo-Lib.
Das hatte ich vorab in einem anderen Sketch ausgiebig betreff Timings für max. Werte bei verschiedenen Servos ausbrobiert.
Die Servos werden direkt aus dem Mega gesteuert, haben aber eine separate Versorgung aus einem Akku.
Das zappelt nix oder ist irgendwie unruhig.
Auch das funktioniert 1A.

Bringe ich nun beide Sketche zusammen entsteht eben der genannte Effekt.

Ich habe das eben auch noch mal nur mit dem Servo-Sketch alleine ausprobiert.
Motoren lassen sich sauber fahren, aber:
Sobalb ich die Fernsteuerung einschalte und es werden PPM-Signale an Pin 49 gesendet, geht das Gezappel los !

Was stört da wen und warum ?

Nachtrag:
Gleiches Verhalten, wenn ich auf ICP5 / Pin 48 umstecke.
Ich definiere (im Servo-Sketch) keinen dieser Pins als Eingänge !
« Last Edit: August 17, 2013, 04:10:15 am by TERWI » Logged

To young to die - never to old for rock'n roll

Offline Offline
Newbie
*
Karma: 4
Posts: 27
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Zeig doch mal den Sketch, viele Augen sehen mehr als 2  smiley-grin
Logged

D-49565 Bramsche
Offline Offline
Sr. Member
****
Karma: 6
Posts: 477
Geht nich ? Gipp's nich !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das ist sicherlich vollkommen richtig, aber es hat ganz offensichtlich nichts mit dem Sketch zu tun.
Ich kann auch die Demo der Servo-Lib namens "sweep" (http://arduino.cc/en/Tutorial/Sweep) nehmen.

So bald das PPM Signal an Pin 48 oder 49 des Mega anliegt, wird gezappelt !

Da muss irgendwas, was eigentlich direkt zum Timer4 / 5 gehört, den Dino sonstwie mächtig aus dem Tritt bringen.
Nur was ?

Wie gesagt:
Die Servo-Lib scheint ja alles verfügbare an Timer zu nutzen was geht.
Ich habe explizit alles bis auf Timer5 (auch mal nur Timer3) ausmarkiert und in Setup jeweils mit

#if defined (_useTimerX)
  Serial.println(F("- Timer used: X"));
#endif

geprüft, welcher genutzt wird.

Es zappelt.
Logged

To young to die - never to old for rock'n roll

D-49565 Bramsche
Offline Offline
Sr. Member
****
Karma: 6
Posts: 477
Geht nich ? Gipp's nich !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Keiner eine Idee ?
Logged

To young to die - never to old for rock'n roll

Offline Offline
Newbie
*
Karma: 1
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Moin,
habe mich gerade registriert - Vorstellung kommt später

zu Deinem Problem (nur so eine Idee):
kann es sein, dass die Robbe in das Board "funkt" ? d.h. der Sender der Robbe stört irgendwie den Arduino
was passiert, wenn Du Dich mit der Robbe entfernst ?
oder hängt das Bedienteil per Draht am Arduino ?

Gruss
Mike
Logged

D-49565 Bramsche
Offline Offline
Sr. Member
****
Karma: 6
Posts: 477
Geht nich ? Gipp's nich !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ja, natürlich hängt die "am Draht" dran. Siehe: http://forum.arduino.cc/index.php?topic=182681.msg1354354#msg1354354
Ich nehme das Signal aus der Schüler-/Lehrer-Buchse ab.
Es sind ca. 2m geschirmte Leitung dran.
Einstrahlen tut da nix - jedenfalls zappelts nicht mehr, wenn ich den Kollektor des Transistors am Ende der Leitung vor dem Eingang 48 oder 49 abnehme.

Das muss irgendwas internes im / mit dem Arduino sein ....
Logged

To young to die - never to old for rock'n roll

D-49565 Bramsche
Offline Offline
Sr. Member
****
Karma: 6
Posts: 477
Geht nich ? Gipp's nich !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich hab dieses Prob mal im internationalen Forum eingestellt und nach nur ca. einer halben Stunde hat mir Grumpy_Mike ein Lichtlein aufgehen lassen.

Ganz offensichtlich treten sich hier 2 Interrupts gegenseitig auf die Füße - also ein Timing-Problem !

Jetzt, wo ich mit der Nase darauf gestossen wurde, kann ich es sogar sehen:
Jedesmal, wenn die ISR für das PPM-Signal "fertiggesampled" hat und Werte ausgibt, wird ja auch der Motor angesteuert, bzw. mache ich div Serial.print's.
Der Takt der LED auf dem Bord ist genau die "Zappelfrequenz". Alle ~67ms neue Werte =>> also etwa 15Hz.
.... wobei das ganze aber offensichtlich nichts mit der Ausgabe via Seriell zu tun hat, denn es jittert weiter auch wenn ich das alles auskommentiere.

Um nun sicher zu gehen, dass das nicht nur allein mit Interrupt-Compare eines Timers in diesem speziellen Fall zusammenhängt, habe ich mal die alte Auswerte-Routine genommen wo ich mit  attachInterrupt(0, EvalPPM, RISING);   die Signal auswerte und die Zeiten mittels micros() ermittle.
-> Das gleiche in grün, es reicht auch hier wieder nur das anschießen des PPM-Signal auch wenn attachinterrupt auskommentiert ist.

Watt'n schietkroam würde der Norddeutsche nun sagen.  smiley-confuse

Interessanterweise fühlt sich aber offensichtlich nur die Servo-Lib dadurch gestört.
Den internen Timer scheint das nicht zu beeindrucken, gibt er mir die mircros() ganz offensichtlich korrekt aus.

Was tun sprach Zeus.
Hat jemand "auf die schnelle" eine Idee / Vorschläge, wie man Servos auch anders steuern kann, bevor ich hier div. Räder neu erfinde ?  smiley-roll
« Last Edit: August 20, 2013, 06:48:58 am by TERWI » Logged

To young to die - never to old for rock'n roll

Munich/Germany
Offline Offline
God Member
*****
Karma: 9
Posts: 642
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Drum nehm ich grundsätzlich nur den hier: http://www.watterott.com/de/Micro-Maestro-6-Channel-USB-Servo-Controller-Assembled
Da braucht mein Arduino nur die Kommandos geben (seriell) und muss sich ansonsten um nichts kümmern. Hat einstellbare Geschwindigkeit und Ramping und kann sogar vom PC gesteuert werden. In der großen Ausführung lassen sich 24 Servos gleichzeitig steuern, wobei bis zu 127 Controller miteinander verkettet werden können (= 3048 Servos smiley-eek ).
Logged

_______
Manfred

D-49565 Bramsche
Offline Offline
Sr. Member
****
Karma: 6
Posts: 477
Geht nich ? Gipp's nich !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hmmmm ..... das wäre sicherlicherlich eine sehr elegante Lösung.
Macht dann aber in meinem Fall für einen 12-Kanal-Controller mit Versand schon wieder schlappe 31 Taler.
Treibt mich nich zwingend in den Ruin, aber ....

Das muss doch auch "so" gehen ?
Fände ich sehr betrüblich, wenn ein Arduino nur mit einem IR zur Zeit umgehen kann.
Was mein "HELUINO"-Projekt betrifft:
Da nimmt zwar der Senderseitige Dino die Signale auf und hat eigentlich so weiter mit nichts zeitkritischem zu kämpfen.
Alle weiter wird in der Loop ermitelt und ist nicht zeitkritisch.
Allerdings kommen zu nicht definierbaren Zeiten Daten über den Telemetrie-Transceiver (NRF24L01) und das geht auch via Interrupt.
Das könnte man auch noch ändern.

Aber:
Auf der Enpfängerseite im Heli passiert ähnliches.
Ich sende ja kontinuierlich Daten für die Servos und das geht auch via Interrupt. Auch das lässt sich nötigenfalls ändern.
Allerdings hätte ich auch gerne die Ist-Rotordrehzahl gewusst und wie soll ich die genau ohne ISR ermitteln ?
Zeiten sind hier ähnlich mit 800-1800 U/Min = alle ca. 77 bis 38ms ein "Tick".
Dazu käme noch bei Bedarf die Auswertung eines Ultraschallsignals für den Bodenabstand ...

Ich kann doch nicht 2 Dino's in den Flieger bauen, nur weil der eine ein Zeitproblem hat .....
Logged

To young to die - never to old for rock'n roll

Offline Offline
Faraday Member
**
Karma: 79
Posts: 2727
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Reicht es vielleicht wenn du während der kritischen ISR die Interrupts deaktivierst so dass die Routine nicht unterbrochen werden kann? Wenn in der Zeit ein anderes Interrupt-Flag gesetzt wird wird das glaube ich nach der Re-Aktivierung abgearbeitet.
Logged

D-49565 Bramsche
Offline Offline
Sr. Member
****
Karma: 6
Posts: 477
Geht nich ? Gipp's nich !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Gute Frage ! Welchen wann ?
Dazu müsste ich erst mal kapieren, wie die Servo-Lib eigentlich arbeitet.
Ich werde das mal auf einen Timer ausdünnen und zerpflücken. Vielleicht kommt ja noch ein Lichtlein ....
Logged

To young to die - never to old for rock'n roll

Offline Offline
Faraday Member
**
Karma: 79
Posts: 2727
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich habe mir mal die Servo Lib angesehen. Welcher Timer da verwendet ist unterschiedlich. Aber alle Timer-ISRs rufen letztendlich die Methode handle_interrupts(...) auf. Die steht am Anfang als erstes nach den defines.

Mach da mal cli() am Anfang und sei() am Ende. Die Arduino-Funktionen noInterrupts() und interrupts() sollten da auch gehen, aber die werden das nur kapseln.
Logged

D-49565 Bramsche
Offline Offline
Sr. Member
****
Karma: 6
Posts: 477
Geht nich ? Gipp's nich !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Schade, schade, schade ... kein Hauptgewinn. Sprich: Keine Änderung.

Noch mal zur Erinnerung:
Dieses "Servo-Zappeln" tritt ja auch auf, wenn ich nur allein die Servo-Lib einbinde, einen Servo instanziere - also mit attach einen Pin zuweise.
Da muss ich nicht mal eine write() oder writemicroseconds() ablassen, das zappelt auch so !

Für mich absolut unverständlich, da hier der In-Pin für das PPM-Signal (sonst mit attachInterrupt(0, EvalPPM, RISING);  oder auf einen ICP) in keiner Weise zugewiesen wurde.
D.h., es sollte den Dino nicht scheren, was sich da an Pin 12 oder 49 tut - tut es aber offensichtlich doch.

Und wer nun denkt: Ah, es hängt vielleicht mit einem Interruptbezogenem Eingang zusammen ..... der irrt ebenfalls: Das macht der an jedem Pin ! Auch über 22.

Ich krieg das echt nicht auf den Schirm.
Ist das ein Hardwarefehler ?
Logged

To young to die - never to old for rock'n roll

Pages: [1] 2   Go Up
Jump to: