Hallo
Ich möchte gerne einen Servo (Digitales Segelwindservo RS-10 von Conrad : Betriebsspannung: 4,8- 7,2 V, max. Laufweg 5 x 360 Grad) mit dem Arduino so ansteuern, dass er sich um 180 Grad dreht und eine Pause einlegt. Meine Fragen sind jetzt nun: Brauche ich einen zusätzlichen Motortreiber und wenn ja welchen? Wie muss ich das genau verbinden, evt. auch mit einem zusätzlichen Netzteil? Benötige ich noch zusätzliche Bauelemente? Ist es überhaupt möglich eine Pause einzulegen, in der sich der Motor nicht bewegt? Wie schreibe ich dies in den Programmcode, da ich bisher leider nur Programmcodes gefunden habe, in der sich der Servomotor ohne Pause dreht.
Ich bin sehr dankbar für schnelle Antworten.
Liebe Grüße
Hallo Franziska...
Wie alle Servos dürfte auch dieser Servo eine eine Zielposition erwarten.
Diese fährt er dann an, und bleibt auch da stehen.
Hallo,
Du nimmst den Bsp. Code und fügst eine Pause ein. Servos benötigen eine gewisse Zeit um ihre Position anfahren zu können. Wenn Du keine zusätzlichen "Endlagensensoren" hast, mußte immer die max. Zeit warten die ein Servo für seinen max. Ausschlag benötigt. Ich nehme an der Bsp. Code wird ein delay drin haben. Entweder Du vergrößerst dieses oder baust es um auf millis(), sodass die loop nicht blockiert wird und du noch andere Sachen machen kannst. Und wenn die gewünschte Wartezeit vorbei ist, läßt du das Servo an eine andere Position fahren.
Und das RS-10 würde ich nicht über die 5V vom Arduino anschließen. Immer an ein extra Netzteil mit 5V. Massen natürlich verbinden.
Laut Bild bei Conrad.
rot .... +5V
schwarz ... Masse
weiß ... Steuerleitung
Hallo,
vielen Dank. Das hilft mir schon sehr. Einen Motortreiber oder ein Potentiometer benötige ich dann aber nicht zusätzlich, oder?
Etwas Code mit Pause beim Drehen:
if (millis() > servoMillis) {
switch (servoZustand) {
case 0:
servoblau.write(0);
servoZustand = 1;
servoMillis = millis() + 500;
break;
case 1:
servoblau.write(90);
servoZustand = 2;
servoMillis = millis() + 500;
break;
case 2:
servoblau.write(180);
servoZustand = 0;
servoMillis = millis() + 500;
break;
}
}
salomeK:
Hallo,vielen Dank. Das hilft mir schon sehr. Einen Motortreiber oder ein Potentiometer benötige ich dann aber nicht zusätzlich, oder?
Hallo,
Motortreiber braucht man für ein Servo nicht. Die werden direkt versorgt. Nur ein stabiles Netzteil. Dein RS-10 hat mehr Bums wie ein RS-2. Das RS-2 kann man noch direkt an den Arduino anschließen. Das RS-10 hat mehr Bums, zieht mehr Strom, was für den Arduino Board Spannungsregler zu viel wäre. Gesteuert werden Servos nur über ein PWM Signal. Darin ist die ganze Positionierung enthalten, was er machen soll.
Ob Du ein Poti benötigt weis ich nicht. Hängt davon ab wie und wodurch das Servo gesteuert werden soll. Zum testen der Funktionsweise ist ein Poti sicherlich sinnvoll. Wenn dann ein 10k Poti zwischen +5V und Masse und den Schleiferabgang an den Arduino analogen Eingang. Den liest Du aus und wertest ihn aus.
Dankeschön an Doc Arduino und agmue
ich habe nocheinmal Fragen zu dem Programmcode:
-
ist + 500 die Zeitangabe für die Pause oder was bedeutet + 500?
-
welche Angaben brauche ich noch fürs void setup und davor? Ich kenne mich leider nicht so gut damit aus...
Hallo,
ich denke Du hast ein Bsp. Code?
Der Code von agmue macht "nichts weiter" als aller 500ms einen Zustand weiter zu schalten. Das ist eine switch - case Anweisung. Die schaltet aller 500ms von 1 zu 2 und dann von 2 zu 3 und dann von 3 wieder auf 1 usw.
Und darin kannst Du Deine Servopositionen anfahren/aufrufen wie ebenfalls angedeutet. Also servoblau ersetzt Du mit Deinem bekannten Servopos. Befehl.
Hast Du dich schon mit deinem Bsp. Code beschäftigt? Zeig den mal her. Code Tags nicht vergessen!
Ich bin von dieser Anleitung ausgegangen und habe delay() durch millis() ersetzt.
Der ganze Sketch enthält noch eine Ampelschaltung und zwei Blaulichter:
// MEGA 2560
#include <Servo.h>
Servo servoblau;
boolean ein = HIGH;
boolean aus = LOW;
// Ampel 1 Belegung der Ausgaenge
byte ampel_1_RotPin = 53;
byte ampel_1_GelbPin = 52;
byte ampel_1_GruenPin = 51;
//
// Ampel 2 Belegung der Ausgaenge
byte ampel_2_RotPin = 50;
byte ampel_2_GelbPin = 49;
byte ampel_2_GruenPin = 48;
//
// Blaulicht Belegung der Ausgaenge
byte blau_1 = 43;
byte blau_2 = 42;
//
unsigned long ampelMillis;
unsigned long blauMillis;
unsigned long servoMillis;
#define ZEITROTPHASE 3000
#define ZEITGELBPHASE 1000
#define BLAUPHASE 100
//
enum ZUSTAENDE {ROT, ROTGELB, GRUEN, GELB};
byte zustand = ROT;
byte servoZustand = 0;
void setup() {
// Definiert die Pins als Aus- oder Eingang
pinMode(ampel_1_RotPin, OUTPUT);
pinMode(ampel_1_GelbPin, OUTPUT);
pinMode(ampel_1_GruenPin, OUTPUT);
pinMode(ampel_2_RotPin, OUTPUT);
pinMode(ampel_2_GelbPin, OUTPUT);
pinMode(ampel_2_GruenPin, OUTPUT);
pinMode(blau_1, OUTPUT);
pinMode(blau_2, OUTPUT);
servoblau.attach(8);
}
void loop() {
if (millis() > servoMillis) {
switch (servoZustand) {
case 0:
servoblau.write(0);
servoZustand = 1;
servoMillis = millis() + 500;
break;
case 1:
servoblau.write(90);
servoZustand = 2;
servoMillis = millis() + 500;
break;
case 2:
servoblau.write(180);
servoZustand = 0;
servoMillis = millis() + 500;
break;
}
}
// Blaulicht
if (millis() > blauMillis + 750) {
blauMillis = millis();
digitalWrite(blau_1, ein);
digitalWrite(blau_2, aus);
}
if (millis() == blauMillis + 50) {
digitalWrite(blau_1, aus);
digitalWrite(blau_2, aus);
}
if (millis() == blauMillis + 100) {
digitalWrite(blau_1, ein);
digitalWrite(blau_2, aus);
}
if (millis() == blauMillis + 150) {
digitalWrite(blau_1, aus);
digitalWrite(blau_2, aus);
}
if (millis() == blauMillis + 500) {
digitalWrite(blau_1, aus);
digitalWrite(blau_2, ein);
}
if (millis() == blauMillis + 550) {
digitalWrite(blau_1, aus);
digitalWrite(blau_2, aus);
}
if (millis() == blauMillis + 600) {
digitalWrite(blau_1, aus);
digitalWrite(blau_2, ein);
}
if (millis() == blauMillis + 650) {
digitalWrite(blau_1, aus);
digitalWrite(blau_2, aus);
}
//
// Ampelschaltung
if (millis() > ampelMillis) {
switch (zustand) {
case ROT:
digitalWrite(ampel_1_RotPin, ein);
digitalWrite(ampel_1_GelbPin, aus);
digitalWrite(ampel_1_GruenPin, aus);
digitalWrite(ampel_2_RotPin, aus);
digitalWrite(ampel_2_GelbPin, aus);
digitalWrite(ampel_2_GruenPin, ein);
zustand = ROTGELB;
ampelMillis = millis() + ZEITROTPHASE;
break;
case ROTGELB:
digitalWrite(ampel_1_RotPin, ein);
digitalWrite(ampel_1_GelbPin, ein);
digitalWrite(ampel_1_GruenPin, aus);
digitalWrite(ampel_2_RotPin, aus);
digitalWrite(ampel_2_GelbPin, ein);
digitalWrite(ampel_2_GruenPin, aus);
zustand = GRUEN;
ampelMillis = millis() + ZEITGELBPHASE;
break;
case GRUEN:
digitalWrite(ampel_1_RotPin, aus);
digitalWrite(ampel_1_GelbPin, aus);
digitalWrite(ampel_1_GruenPin, ein);
digitalWrite(ampel_2_RotPin, ein);
digitalWrite(ampel_2_GelbPin, aus);
digitalWrite(ampel_2_GruenPin, aus);
zustand = GELB;
ampelMillis = millis() + ZEITROTPHASE;
break;
case GELB:
digitalWrite(ampel_1_RotPin, aus);
digitalWrite(ampel_1_GelbPin, ein);
digitalWrite(ampel_1_GruenPin, aus);
digitalWrite(ampel_2_RotPin, ein);
digitalWrite(ampel_2_GelbPin, ein);
digitalWrite(ampel_2_GruenPin, aus);
zustand = ROT;
ampelMillis = millis() + ZEITGELBPHASE;
break;
}
}
}
Hallo,
achso, aber 500 ms könnte man nicht durch eine andere Zahl ersetzen? Ich hätte einen Beispielcode. Ich weiß aber nicht wie ich den mit code tags darstellen soll. Bei der Arduino Software gibt es ein Beispiel: Sweep (File>Examples>Servo>Sweep), so könnte ich das übernehmen, hätte dann aber das Problem mit den Pausen. Also nur 15 ms und ich weiß nicht ob ich diese Zahl verändern kann..
Sweep bestimmt über die Zeit die Drehgeschwindigkeit, bei einem Segelwindservo möglicherweise sinnvoll, wenn sonst zu schnell gewickelt wird. Das geht auch ohne delay():
#include <Servo.h>
Servo servoblau;
unsigned long servoMillis;
int servoPos = 0;
int servoMinPos = 0;
int servoMaxPos = 180;
int delta = -1;
const int pause = 15;
const int servoPin = 8;
void setup() {
Serial.begin(9600);
servoblau.attach(servoPin);
}
void loop() {
if (millis() > servoMillis) {
if (servoPos == servoMaxPos || servoPos == servoMinPos) {
delta = -1 * delta;
}
servoPos += delta;
servoblau.write(servoPos);
servoMillis = millis() + pause;
}
}
salomeK:
Ich hätte einen Beispielcode. Ich weiß aber nicht wie ich den mit code tags darstellen soll.
Hallo,
Du drückst in dem Fenster wo Du hier schreibst oben links über den Smilies den Code Tag Button </>. Dann kopierste den Code rein.
salomeK:
Hallo,
achso, aber 500 ms könnte man nicht durch eine andere Zahl ersetzen?
... hätte dann aber das Problem mit den Pausen. Also nur 15 ms und ich weiß nicht ob ich diese Zahl verändern kann.
Hallo,
die 500ms bzw. die 15ms sind doch nur die Pausen für das Servo damit es genügend Zeit hat seine neue Position zuerreichen. In dem Bsp. werden nur 1° Winkel gefahren. Das heißt die Pause kann kürzer sein. Wenn es aber bei 0° steht und es soll zu 180° fahren, dann dauert das länger, also muß man dem Servo auch mehr Zeit geben bis zum neuen Befehl. Das heißt, die Pausenzeiten kannst Du ändern wie du möchtest, nur zu kurz darf sie nicht sein. Sonst kann es unkontrolliert zucken. Kann beim digitalen Servo auch anders ein. Beschäftige Dich einfach mal mit dem Thema Servo Ansteuerung und welche Information in dem Steuersignal steckt. Wenn Du das verstanden hast, verstehste auch den Code besser.
Ich habe das jetzt mal ausprobiert und nichts passiert.. Muss ich den Motor zusätzlich zu dem Netzteil auch noch einmal mit 5 V und Gnd des Arduinos verbinden? Hab jetzt nämlich nur den Motor mit dem Netzteil und dem Arduino an Pin 9 verbunden.
Die Massen (GND) müssen verbunden sein. Sonst zeige mal Deinen Schaltplan, muß nicht hübsch sein.
Du kannst fehlgeschlagene Posts editieren und auch löschen
Wegen einer Anlage schau mal unter Attachments and other options bei Durchsuchen.
Wird schon noch!
das funktioniert leider auch nicht, denn es erscheint immer eine Fehlermeldung..
Hallo,
ohne Sketch und ohne Schaltplan brauchste hier nicht weitermachen. Ganz ehrlich. Wir können nicht hell sehen.
salomeK:
das funktioniert leider auch nicht, denn es erscheint immer eine Fehlermeldung..
Gestern wollte png nicht hochgeladen werden, funktionierte dann mit jpg.
Beschreibe genau, was nicht geht, dann wird Dir spätestens Uwe (Forumsmoderator) helfen. Seine Kristallkugel zickt manchmal, ist noch Beta.