Go Down

Topic: Servosteuerung über "Servo lib" macht keinen Muckser (Read 2175 times) previous topic - next topic

mmi

Mar 05, 2012, 06:56 am Last Edit: Mar 05, 2012, 07:11 am by mmi Reason: 1
Hallo,

mit Servos hatte ich mangels Bedarf noch nie experimentiert - bis gestern. Ein paar Billigservos vom Typ "Tower Pro SG90" hatte ich mir schon vor längerer Zeit besorgt - diese sind eigentlich recht weit verbreitet und im Modellbau nicht nur für Spielereien eingesetzt.

Rot an Vcc, Braun an GND und gelb als Steuerleitung (PWM Pin 11) - das sollte eigentlich passen. Der Servo ist an eine externe 5V-Spannungsversorgung angeschlossen, für gemeinsame Masse mit dem Arduino ist gesorgt.

Für einen ersten Test habe ich aus den beiden Examples der Servolib "sweep" gewählt:

Code: [Select]

// Sweep
// by BARRAGAN <http://barraganstudio.com>
// This example code is in the public domain.

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
               // a maximum of eight servo objects can be created

int pos = 0;    // variable to store the servo position

void setup() {
 myservo.attach(11);  // attaches the servo on pin 11 to the servo object
}

void loop() {
 for(pos = 0; pos < 180; pos += 1)  { // goes from 0 degrees to 180 degrees in steps of 1 degree
   myservo.write(pos);                    // tell servo to go to position in variable 'pos'
   delay(15);                                   // waits 15ms for the servo to reach the position
 }
 for(pos = 180; pos>=1; pos-=1) {    // goes from 180 degrees to 0 degrees
   myservo.write(pos);                   // tell servo to go to position in variable 'pos'
   delay(15);                                  // waits 15ms for the servo to reach the position
 }
}


Der Servo reagiert auf diesen Code seltsamerweise überhaupt nicht. Ich habe auch den Servo ausgetauscht und andere PWM-Ports probiert - dasselbe Ergebnis.

Lasse ich die Servo-Bibliothek weg und spreche den Servo einfach mit z.B. "analogWrite(11, 100)" an, dreht er nach rechts und hängt an der Endposition, die Stromaufnahme steigt auf ca. 500 mA. Ändere ich "100" in z.B. "50" oder "150", ändert sich eigentlich nichts, er dreht immer in die gleiche Richtung bis zum Endanschlag.
Ich stecke ihn dann auch schnell ab, um Schäden (hoffentlich) zu vermeiden und drehe ihn per Hand wieder in die Mittenposition.  Dasselbe Verhalten gibt es auch mit den beiden anderen, neuen Servos.

Wie gesagt, sehr seltsam finde ich, daß bei Verwendung der Servo-Lib gar nichts passiert. Ich habe auch schon einen anderen Arduino angeschlossen - gleiches Verhalten, ebenso erfolglos.

Habe ich da eine Serie kaputter Servos erwischt ??

Gruß, mmi.

sth77

Ich frage mich jedes mal, wer die Geschichte in die Welt gesetzt hat, dass Servos mit einer PWM angesteuert werden...
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

mmi

Ok, das dachte ich bis jetzt auch - frag mich nicht warum. ;)
Hast Du einen guten Link, um mein (Fehl-)Wissen zu korrigieren ?

mmi

#3
Mar 05, 2012, 07:24 am Last Edit: Mar 05, 2012, 07:29 am by mmi Reason: 1
Hab's gefunden - mit PWM via analogWrite kann es so einfach nicht klappen.

Zitat:
Die Servos aus dem Modellbau steuert man ja idR. über die Länge eines
High-Pulses, meist zw. 1 und 2ms alle 20ms, .5ms ist dabei die
Mittelstellung.

Jetzt habe ich es auch begriffen. ;)

Bleibt mein Problem, warum es mit der Servo-Lib nicht funktioniert.

sth77

Na geht doch. ;) Ich denke, das Datenblatt zu deinen Servos dürfte der erste Ansatzpunkt sein. Eventuell ergeben sich aus den Angaben dort Abweichungen vom Standard-Timing.
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

uwefed

1,5mS ist die Mittelstellung.
Die Lösung Deines Problems weiß ich auch nicht.
Du scheinst alles richtig zu machen.
Grüße Uwe

mmi

Wenn man sich auf die Schnelle informiert, ist's manchmal schon schwierig, die Spreu vom Weizen zu trennen - ich hätte gleich Euch fragen sollen, aber nachdem es im engl. Forum einen ausgiebigen thread dazu gab, wo einer beharrlich "analogWrite" verwendet - da meint man schnell, es ist normales PWM. :(

Man sieht auch einige Schaltpläne, wo der Servo direkt über 5V am Arduino versorgt  wird - vermutlich auch nicht unbedingt empfehlenswert.

Ein ausführliches Datenblatt habe ich auch auf der Seite des Herstellers zu diesem Typ nicht finden können, aber mit 1ms < 1.5ms > 2 ms sollte man kaum falsch liegen.

Danke Euch für die Tipps !

Mit der servo library wird der Fehler dann wohl softwareseitig zu suchen sein, da habe ich oft die neueste Version des avr-gcc, möglicherweise läuft da was schief.

Gruß, mmi.

sth77

Also bei mir funktionierte die Servo-Library ausnahmslos immer und sie macht ja auch nicht viel, was Fehlverhalten hervorrufen könnte. Probier doch mal, den Servo manuell anzusteuern, eben ohne Bibliothek und die (angenommenen) Timings per delay testen.
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

mmi

Habe ich mir für heute abend vorgenommen - da sollte für den groben Test ein "digitalWrite" mit entsprechendem "delay" genügen.

uwefed


Habe ich mir für heute abend vorgenommen - da sollte für den groben Test ein "digitalWrite" mit entsprechendem "delay" genügen.

Ja genügt. vieleicht besser Du mimmst http://arduino.cc/en/Reference/DelayMicroseconds

Grüße Uwe

sth77

Gängig ist für die Servostellung am linken Anschlag 1ms, also die kürzeste Zeitspanne, die mit delay möglich ist. Sollte für einen Test eigentlich reichen. Aber weil wir ja schon über möglichen Abweichungen von der Standardansteuerung sprachen, kann man Uwes Vorschlag durchaus einbinden.
Probiere die 1 ms (HIGH) vorerst mit 19ms Pause (LOW), gem. Wikipedia sind die 20 ms (entspricht 50Hz) zwar nicht kritisch, aber immerhin eine Grundlage. ;)
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

mmi

#11
Mar 05, 2012, 08:34 pm Last Edit: Mar 05, 2012, 08:42 pm by mmi Reason: 1
Beispiel:

Code: [Select]

void setup() {
 pinMode(12, OUTPUT);
}

void loop() {
 digitalWrite(12,HIGH);
 delayMicroseconds(1000);
 digitalWrite(12,LOW);
 delayMicroseconds(19000);
}


Servo fährt mit dieser Routine nach rechts bis zum Anschlag, dasselbe auch, wenn ich 2000/18000 verwende - also immer nach rechts.

Das sei jetzt aber erstmal egal, denn es wird skurriler, irgendwas ist mit meinem Duemilanove faul, denn die delays werden nicht korrekt ausgeführt.

Habe deshalb alles abgesteckt und will nur die LED an Pin 13 mit delay(4000), also im 4 Sek.-Rhythmus blinken lassen. Sie blinkt aber recht exakt im 1 sek. Rhythmus - die delays sind 4x schneller als codiert! Sonst geht aber alles wie gewohnt, auch die Baudraten über die Serielle.

Habe der Einfachheit halber den Prozessor ausgetauscht: gleiches Ergebnis. Was kann da die Ursache sein ? Läuft der etwa nur noch mit 4 Mhz ?

mkl0815

Quote
Habe deshalb alles abgesteckt und will nur die LED an Pin 13 mit delay(4000), also im 4 Sek.-Rhythmus blinken lassen. Sie blinkt aber recht exakt im 1 sek. Rhythmus

Hmm, aber wenn Du ein "delay(16000) einstellst, sind es dann tatsächlich 4 Sekunden? Ansonsten würde ich fast darauf tippen, das der "normale" Blink-Sketch auf dem Board läuft.

mmi

Nene, der originale sketch ist das nicht, der ist schon lange über Bord gegangen - es liefen ja alle meine Servoversuche vorher.

Bei 16000 werden es in der Tat 4 Sek.

mmi

Der Servo hat jetzt erstmal Zwangspause.

Mit dem Duemilanove und der Blinkzeitdauer habe ich folgendes festgestellt:

- "Burn Bootloader": Fuses und Bootloader über ISP mit AVR MKII neu geflasht
- siehe da: jetzt stimmt das delay, auch nach mehreren resets mit reset button
- Programmer abgeklemmt, selbes Programm über USB neu geladen
- wieder derselbe Fehler (delay 4x so schnell)

Diese Prozedur mit anderem Prozessor wiederholt, gleiches Ergebnis.

Dazu wäre noch zu sagen, daß ich auf diesem Arduino vor dem Servo ein RTC shield von ELV im Einsatz hatte. Dieses kam mit einer falsch eingebauten Transildiode, die eigentlich evtl. auftretende Spannungsspitzen nach Masse ableiten sollte. So trat aber generell ein kurzschlußähnlicher Zustand auf, den ich erst nach mehreren Minuten bemerkte. Clock-IC war sehr heiß (ging aber nicht kaputt). Ich vermute mal, daß diese erhöhte Stromaufnahme (Shield läuft mit 3.3 V) doch irgendwas auf dem Arduinoboard in Mitleidenschaft gezogen hat. Das ist aber eine andere Baustelle, ich muß mir jetzt erst einen Clone zusammenlöten und melde mich dann demnächst zum Servothema nochmal.

Die Chancen stehen gut, daß dann auch die Servolib es tut :)

Go Up