Forum: Mikrocontroller und Digitale Elektronik startposition servo


von simone (Gast)


Lesenswert?

Hi leute ich habe ein problem:
ich steuere eine servo zwischen 0 und 180 grad an.
wenn ich den arduino einschalte will ich das er in die startposition von 
0grad fährt und dann auf knopfdruck losfährt. aber iwie wird der befehl 
ignoriert.
ich hab als ersten befehl in der loop myservo.write(0) stehen..damit er 
bevor er den taster abfragt dahin fährt...aber er tuts nicht?
iwer eine ahnung warum?

von kunibert (Gast)


Lesenswert?

simone schrieb:
> iwer eine ahnung warum?

Servo hat keinen Strom?

von Karl H. (kbuchegg)


Lesenswert?

simone schrieb:
> Hi leute ich habe ein problem:
> ich steuere eine servo zwischen 0 und 180 grad an.
> wenn ich den arduino einschalte will ich das er in die startposition von
> 0grad fährt und dann auf knopfdruck losfährt. aber iwie wird der befehl
> ignoriert.
> ich hab als ersten befehl in der loop myservo.write(0) stehen..damit er
> bevor er den taster abfragt dahin fährt...aber er tuts nicht?
> iwer eine ahnung warum?

loop ist sowieso schon die falsche Funktion.

In der Arduino Umgebung hast du 2 dir vorgegebene Funktionen.
Die eine ist setup(). In die kommt die ganze Initialisierung rein und 
alles was beim Start einmalig zu machen ist.

Die andere ist loop(), in der dann die laufend auszuführende 
Programmlogik kommt. Anders als setup() wird loop() vom Arduino 
Framework ständig und immer wieder aufgerufen. Daher ist dort NICHT der 
Ort um einmalige Hochfahr-Einstellungen zu machen.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

> aber iwie wird der befehl ignoriert.

Der Befehl wird ganz sicher nicht ignoriert. Ein Computer ist nicht in 
der Lage einen Befehl einfach so zu ignorieren. Dein Programm ist 
fehlerhaft. Sprich: Du gibst die falschen Befehle.

gewöhn dir eine derartige Ausrede gleich gar nicht an. Das ist die 
falsche Herangehensweise. Ein Computer macht exakt und zu 100% genau das 
was du ihm im Programm befohlen hast. Wenn das nicht das ist, was du 
eigentlich wolltest, dann ist das immer und zu 100% ein Indiz dafür, 
dass deine Befehle nicht mit dem übereinstimmen, was du eigentlich 
erreichen wolltest. Mit anderen Worten: Du ganz alleine bist die 
Schuldige, weil Du in deinen Befehlsfolgen fehlerhaft gearbeitet hast.

: Bearbeitet durch User
von simone (Gast)


Lesenswert?

hey leute vieln dank für die schnellen antworten.. den befehl in die 
initialisierung reinzupacken hab ich auch schon versucht..hat auch nix 
gebracht drum dachte ich an die loop.

hier ist mein code:
1
 #include <Servo.h>  
2
3
Servo myservo;  // create servo object to control a servo
4
// twelve servo objects can be created on most boards
5
6
int pos = 0;    // variable to store the servo position
7
int button=2;   // PIN2 als eingang für taster
8
9
void setup() {
10
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
11
  pinMode(button,INPUT_PULLUP); 
12
 myservo.write(pos);              
13
  
14
}
15
16
void loop() {
17
18
if(digitalRead(button)==LOW)
19
{
20
  for (pos = 0; pos <= 90; pos += 20) { // goes from 0 degrees to 180 degrees
21
    // in steps of 1 degree
22
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
23
    delay(15);                       // waits 15ms for the servo to reach the position
24
  }
25
  delay(2000);
26
  
27
    for (pos = 90; pos <= 180; pos += 20) { // goes from 0 degrees to 180 degrees
28
    // in steps of 1 degree
29
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
30
    delay(15);                       // waits 15ms for the servo to reach the position
31
  }
32
33
  delay(2000);
34
  
35
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
36
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
37
    delay(15);                       // waits 15ms for the servo to reach the position
38
  }
39
}
40
41
}

wo ist mein fehler?

lg simone

: Bearbeitet durch User
von uwe (Gast)


Lesenswert?

Wie lange soll er denn laut Programm in 0 Position bleiben?! Zeig mal 
die Zeile in der das steht!

von Karl H. (kbuchegg)


Lesenswert?

Was genau beobachtest du?
Bis jetzt wissen wir ja nur, was du wolltest. Aber was macht dein 
Konstrukt tatsächlich?

von Karl H. (kbuchegg)


Lesenswert?

Karl H. schrieb:
> Was genau beobachtest du?
> Bis jetzt wissen wir ja nur, was du wolltest. Aber was macht dein
> Konstrukt tatsächlich?

d.h. fährt denn dein Servo, wenn du die Taste drückst?

von Mike (Gast)


Lesenswert?

simone schrieb:
> den befehl in die
> initialisierung reinzupacken hab ich auch schon versucht.

Und hast du dem Servo auch Zeit gegeben, auf die Position zu fahren?

p.s. Es ist ausgesprochen mühselig deinen Code mit den ganze wilden 
Zeilenumbrüchen zu lesen. Entweder du hängst ihn als Anhang dran oder du 
packst ihn in Code-Tage, z.B. [ C] ... [ /C] (ohne Leerzeichen)

von simone (Gast)


Lesenswert?

mein konstrukt steuert den servo so an, dass er von 0 grad bis 
90dreht...kurz wartet und dann auf 180dreht und am schluss wieder ohne 
zwischenstopp nach 0grad zurück. Genau das macht er auch nur das er wenn 
ich ihn dazwischen stopp und "abdrehe" gleich die 90 anfährt von wo aus 
er gerade steht. aber genau das will ich verhindern, er soll von 0 
wegfahren wenn ich den taster drücke

beim initialieren will ich dass er solange bei 0 bleibt bis ich den 
taster drücke

lg

von Karl H. (kbuchegg)


Lesenswert?

simone schrieb:
> mein konstrukt steuert den servo so an, dass er von 0 grad bis
> 90dreht...kurz wartet und dann auf 180dreht und am schluss wieder ohne
> zwischenstopp nach 0grad zurück.

Das geht aus dem Code hervor.

> Genau das macht er auch nur das er wenn
> ich ihn dazwischen stopp und "abdrehe" gleich die 90 anfährt von wo aus
> er gerade steht. aber genau das will ich verhindern, er soll von 0
> wegfahren wenn ich den taster drücke

Worauf ich eigentlich hinaus will:
Funktioniert denn deine Tasterabfrage?

Was istm wenn du einfach ein leeres
1
void setup() {
2
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
3
  pinMode(button,INPUT_PULLUP); 
4
  myservo.write(0);                
5
}
6
7
void loop()
8
{
9
}

machst, fährt dann das Servo zuverlässig in die 0° Position?
(Man kann bei abgeschalteter Spannungsversorgung auch vorsichtig mit der 
Hand verdrehen. Jedesmal wenn du dann die Spannungsversorgung wieder 
anlegst und damit das Programm neu startet, muss das Servo wieder in die 
0 Position fahren)

>
> beim initialieren will ich dass er solange bei 0 bleibt bis ich den
> taster drücke
>
> lg

von Karl H. (kbuchegg)


Lesenswert?

Karl H. schrieb:

>> ich ihn dazwischen stopp und "abdrehe" gleich die 90 anfährt von wo aus
>> er gerade steht.

aber nur wenn die Taste gedrückt ist.

Wie hast du deine Taste elektrisch angeschlossen?

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
Noch kein Account? Hier anmelden.