PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Arduino Servoansteuerung



AgesKing
15.11.2012, 17:05
Servus Forum,

ich hab ein sehr merkwürdiges Problem und denke mir fehlen ein paar Grundsätzliche Kenntnisse um dieses zu verstehen. Ich steuer mit meinem Arduino Uno einen kleinen ServoMotor an (RB-65PG) über die mitgelieferten Bibliotheken und dazu noch ein SerialLCD Display.

Beides kann ich einzeln ganz hervorragend steuern. Ich hab den Code jetzt so weit reduziert bis nur noch das Problem sichtbar sein sollte.
Wenn ich auch nur irgendeine Zeile von dem gerade auskomentierten Code, mit laufen lasse. Wackelt der Servo auf einmal nur noch dumm rum (aber er zeigt die Temperatur und den Winkel auf dem Display an)



#include <SerialLCD.h>
#include <SoftwareSerial.h>
SerialLCD slcd(11,12);
#include <Servo.h>

int tempPin=1;
Servo myservo; // create servo object to control a servo
int PotiPin = 0;
int PotiValue = 0;
void setup() {
slcd.begin(); //set up
myservo.attach(5); // attaches the servo on pin 5 to the servo object
}
void loop() {


float temp = analogRead(tempPin);
temp = (float)(1023 - temp)*10000/temp;
temp = 1/(log(temp/10000)/3975+1/298.15)-273.15;

/*
slcd.setCursor(0,0);
slcd.print(temp,2);
*/

PotiValue = analogRead(PotiPin);
PotiValue = map(PotiValue,0,1024,0,180);
myservo.write(PotiValue);

float Potiwert = myservo.read(); //ich hatte kurz die Idee hier den Umweg über die Variable Potiwert zu machen. es geht weder so noch direkt
/* slcd.setCursor(0,1);
slcd.print(Potiwert,2);
*/
}

oderlachs
21.11.2012, 09:34
Ich werde mal im schlauen Buch nachschauen, dazu gibt es ein gutes Beispiel darinnen das werde ich mal als src code hier reinstellen. siehe mal HIER (http://arduino-praxis.ch/download/) Quellcode der Bücherbeispiele zum downloaden

Im Setup-Block , hast Du da "pinMode(servoPin , OUTPUT) " gesetzt ????

Habe das mal selber probiert läuft bestens. Kannst Du den den Servo direkt mit dem Poti nun steuern ??? das habe ich nicht richtig verstanden hier.
Gruss
OL

PS. Hast Du dann Fragen zum Artikel im Buch, schreibe mich bitte per PN an !

AgesKing
21.11.2012, 18:10
hi, also den Servopin hab ich nicht als OUTPUT gesetzt. Aber ich hab das noch nie gemacht und irgendwie funktionierts eigentlich immer. Kann es sein, dass das nicht nötig ist wenn man die <Servo.h> nutzt?
Aber ich werd das morgen gleich probieren.

Im Prinzip funktioniert die Schaltung solange die rot markierten Texte auskommentiert sind.
Irgendwie scheint es ein Problem zu geben wenn der Servo und die LCD Anzeige gleichzeitig in Betrieb genommen werden.

Mal funktioniert der Servo dann gar nicht mehr, und mal zittert er. Obwohl beides einzeln funktioniert.
Ich hab dann mal eingestellt, dass sich die LCD Anzeige nur so ca alle halbe Sekunde aktualisiert (mit millis();) und dann gings ein bisschen besser, hatte ich das Gefühl aber der Servo zittert immer noch mehr, als ohne LCD Anzeige.

P.S. (ich hab den Servo testweise auch über eine externe Stromquelle aufm Breaboard verbunden. das macht keinen Unterschied)

oderlachs
22.11.2012, 12:17
Ich hatte fast auf die Spannungsversorgung getippt, aber du schreibst ja das es auch bei externer Spannungsversorgung zittert. Eine Frage sind es getrennte Spannungsquellen je eine Aurduino und je eine fürs Servo ? Ich hatte das auch mal dieses Zittern, da war die Spannung vom ArduBoard nicht so richtig stabil.
Nun ja es gibt immer Wunder...

5Volt-Junkie
26.11.2012, 20:18
Vorab eine Frage was für ein Board und welche GUI-Version Du im Einsatz hast?

Evtl. beißen sich die Interrupts der beiden Teile gegenseitig (LCD & Servo).

MechatronikTechniker
15.10.2013, 16:22
Hab da auch mal eine Frage.
Wenn ich einen Servo ganz normal an Spannung (5V) lege, und an der Steuerleitung einen Potentiometer anbringe (um die Spannung zu regulieren), kann ich die Drehung doch auch steuern.
Oder muss man einen Servomotor immer Programmieren?
Kenn mich nur in der Insustriesteuerungstechnik aus. Mit Chips und Boards hab ich nicht so viel am Hut.
Würde aber gerne einen Servo via Knopfdruck um ca 90° nach oben fahren lassen.
Sollte ich alles mit einem Programm steuern müssen, wäre ich über eine Stückliste dankbar sein.
Entweder über C++ oder Arduino. Mit der Programmierung kenn ich mich da bedingt aus, aber was ich alles brauch, Board Shield eca.
Hoff hier auf nen Profi der mich aus dem Schlamassel holt.
Dank euch im Voraus.

Wsk8
15.10.2013, 19:15
Vorab mal zum eigentlichem Thema. Ich glaube auch, dass hier das LCD einfach zu viel Zeit verschlingt, weshalb das PWM Signal nicht mehr korrekt erzeugt wird.

@MechatronikTechniker (https://www.roboternetz.de/community/members/61014-MechatronikTechniker)
Nein, du brauchst ein PWM-Signal am Servo um es zu Steuern. Sowas kannst du aber normal auch rein mit HW machen. Mit einem NE555 z.b. Den 555 kannst du dann auch mit einem Poti ansteuern.

mfg

MechatronikTechniker
16.10.2013, 14:10
@Wsk8
Erst einmal vielen Dank für die Antwort.
Momentan verfüge ich über einen AT-Mega 168 auf einem Arduinoboard.
Eigentlich möchte ich einen Servomotor mit einem kleinen Taster so ansteuern damit er sich um 90° nach oben bewegt.
Was du mit HW meinst kann ich leider nicht deuten.
Was ich aber machen werde ist, ein Programm in Arduino schreiben und mal schauen ob es funktioniert.
Ebenso muss ich mir ein weiteres Arduinoboard besorgen, damit ich es in die Maschine einbauen kann.
Soweit ich weis gibt es fertige Boards bei denen ich das Programm aufspielen kann.
Danach verdrahte ich alles, schalte den Knopf und ich hoffe es klappt.
Sollte ich noch Fragen haben, wende ich mich an euch / dich.

P.s: sollte mir jemand einen Rat geben können, mit welchem Board ich mich kleinstmöglich halten kann, oder mir nen Verbesserungsvorschlag geben kann, wär ich dankbar.
Bin noch Anfänger und werde das Zeug erst noch in der T-Schule durchkauen. Brauchen tu ich es aber jetzt schon.

Hubert.G
16.10.2013, 18:01
Wenn du für das Servo nur zwei Stellungen brauchst, dann schau dir Conrad 234915 an.
Statt dem dem einen Poti zwei einbauen und eines davon mit dem Taster überbrücken.

Wsk8
16.10.2013, 18:28
HW = Hardware.
Ein Arduinoboard um 1 Servo mit 1 Taster anzusteuern ist wie mit Kanonen auf Spatzen schießen, völlig overpowered.

mfg

oberallgeier
16.10.2013, 18:44
float temp = analogRead(tempPin);
temp = (float)(1023 - temp)*10000/temp;
temp = 1/(log(temp/10000)/3975+1/298.15)-273.15;
Die Arduinobibliotheken kenne ich nicht (leider kann ich nicht sagen . . .). Auch Deinen RB-65PG kenne ich nicht, scheint aber ein analoger Servo zu sein.

Hast Du die Servoversorgung von der gleichen Stromquelle wie den Controller? Dann wäre das ein Problem . . . Hast Du GND von Servo und GND vom Controller verbunden (klick mal) (http://www.rn-wissen.de/index.php/Servos#Ansteuerung:_Signalform_und_Schaltung) - sonst schon wieder ein Problem.

Mir kommt so vor, dass Du hier einen Logarithmus berechnest und sonst ein bisschen floating point. Vermutlich braucht dieser Rechenschritt (dazu diese FP-Rechnungen) ne halbe Sekunde oder mehr - in der Zeit will der Servo schon mal so ungefähr zehn neue Informationen haben. Wenn er die nicht bekommt, dann schmollt er - merkt man meist daran, dass er (fast) garnix macht.

redround
17.10.2013, 09:59
Im deutschen Arduino-Forum wurde die letzten Tage auch das Zittern eines Servos diskutiert. Die Angebote Lösung scheint sehr elegant zu sein: http://forum.arduino.cc//index.php?topic=193284.15

oberallgeier
17.10.2013, 10:35
Die Arduinobibliotheken kenne ich nicht (leider kann ich nicht sagen . . .) ...
Im deutschen Arduino-Forum ... Zittern eines Servos diskutiert. Die Angebote Lösung scheint sehr elegant ...Interrupt abschalten damit Servos nicht zittern halte ich doch eher für recht unelegant.

Die verlinkte, längere Diskussion beruhigt mich in meiner Aussage, dass ich die Bibliotheken nicht kenne . . . Da hänge ich lieber die Zeit rein, bis ich die Wünsche der Servos begriffen (http://www.rn-wissen.de/index.php/Servo#Ansteuerung:_Signalform_und_Schaltung) habe und einigermassen weiß, was ich tue. Zumal interruptgetriebene Servobewegungen nach meiner Meinung das einzig Richtige sind - bei der Frequenz von 50 Hz ist das ja auch eher sterbenslangweilig für den Servo. Ich betreibe meine 10-Servo-Platine (https://www.roboternetz.de/community/threads/61379-Kopfsache-und-ein-m1284-etliche-Servos-viel-Alu?p=574467&viewfull=1#post574467) (ausbaubar bis 16..20) mit mehreren Interrupts und der Möglichkeit das Ganze a) über I²C und b) über UART zu steuern. Auflösung theoretisch 0,4 µs Pulslänge, praktisch sind das besser als 0,4 Grad Servobewegung bzw. 9 Bit (hier ein bisschen Code dazu) (https://www.roboternetz.de/community/threads/61379-Kopfsache-und-ein-m1284-etliche-Servos-viel-Alu?p=577715&viewfull=1#post577715). Servos sind kleine und "mittlere" aus Billigserien (3,95 bis 15 Steine). Immerhin kann ich dann mit etlichen Servos simultan wahlweise full speed oder SlowMotion fahren (Video).

(http://www.youtube.com/watch?v=Kt4UiEaTicc)Dies nur als Bemerkung, warum ich kaum fertige Bibliotheken verwende.