Forum: Mikrocontroller und Digitale Elektronik For - Schleife für Arduino Servomotor


von Andreas P. (hammberger)


Lesenswert?

Hallo zusammen,

ich bin gerade dabei, mich in Arduino einzuarbeiten und habe ein 
Verständnisproblem:

Nachfolgend ist ein kleines Programm aus dem Internet um einen 
Servomotor anzusteuern. Der Motor dreht sich ständig hin und her.

Grund hierfür ist die For-Schleife. Aber warum bricht diese nicht nach 
einer 180°-Drehung ab? Die Schleife prüft doch ständig, ob pos < 180 ist 
und erhöht anschließend den Wert von pos um 1. Irgendwann ist pos = 180 
also nicht kleiner 180. Somit müsste die Schleife abbrechen! Tut sie 
aber nicht, sie fängt erneut von pos=0 an und zählt wieder hoch.


// Festlegen des Servo Pins
int servo = 7;

// Festlegen des Servo Pins
int servo = 7;

// Weitere Variablen für PWM und Drehwinkel (Position)
int pwm;
int pos;

/* Funktion um das Servo zu bewegen. Hier wird die Position
berechnet und der Wert der neuen Position an das Servo
übergeben. */

void servoMove(int servo, int pos){
  //Winkel in Mikrosekunden umrechnen
  pwm = (pos * 11) + 500;

  digitalWrite(servo, HIGH);

  delayMicroseconds(pwm);

  digitalWrite(servo, LOW);

  delay(20);
}

// Initialisieren des Servo Pins
void setup() {
   pinMode(servo, OUTPUT);
}

// Hauptprogramm
void loop() {
  for(pos=0; pos<180; pos++) {
    servoMove(servo, pos);
  }
}

von Hubert G. (hubertg)


Lesenswert?

Das Programm tut aber genau das. Es zählt hoch bis 180, dann ist die 
for-Schleife beendet und beginnt dann in der Hauptschleife mit der 
for-Schleife von neuem.

von Andreas P. (hammberger)


Lesenswert?

OK, Danke.

Das heißt quasi allgemein, wenn bei einer For-Schleife das Ende erreicht 
ist, (also Bedingung nicht mehr erfüllt), fängt sie von vorn an?

von spontan (Gast)


Lesenswert?

Nein! Heißt es nicht.

Bei Dir sind nur zwei Schleifen verschachtelt. Die For-Schleife und die 
Loop des Hauptprogramms, die läuft immer.

von ??? (Gast)


Lesenswert?

Wie entsteht die Formel pwm = (pos * 11) + 500;

von Jens M. (schuchkleisser)


Lesenswert?

Weil der Puls 500-2500 µs lang sein muss für 180° Drehwinkel.
Pos ist 0-180, das macht dann (0*11)+500 = 500 bis (180*11)+500=2480µs.
Passt.

Obwohl man normal eher 1000-2000 oder sogar nur 1100-1900 nutzt, manche 
Servos mögen nicht mehr und schlagen an.
Und nach allden Jahren gibt's mittlerweile Servo-libraries die direkt 
den Winkel annehmen.

von Einer K. (Gast)


Lesenswert?

??? schrieb:
> Wie entsteht die Formel pwm = (pos * 11) + 500;

Geradengleichung
(lineare Interpolation ?)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

??? schrieb:
> Wie entsteht die Formel pwm = (pos * 11) + 500;
Ich würde da sagen: "ich habe sie durch empirische Evaluation ermittelt" 
und einer, der weiß was das ist, würde korrekt hören: "ich habs 
ausprobiert und irgendwie hingebastelt".

von Jens M. (schuchkleisser)


Lesenswert?

Jo sagt's amoi, lest's ihr des a' wos do g'schrieb'n is?

Da wurde überlegt wie man 0-180° in 500-2500µs übersetzt.
Also hat man erstmal die Spanne und den Offset getrennt und kommt auf 
500 Offset und 2000 Spanne.
Die will man auf 180 abbilden, also in ein "digit" 2000/180, was 
zufälligerweise 11,11... ist.
Da man mit Integer rechnet, hat man das großzügig auf 11 gerundet und 
fertig.
Impulslänge in µs ist (Gewünschter Winkel in ganzen Grad* 11) + 500.

Kein Wunder, das hier so oft über Arduino gelästert wird: das ist euch 
zu einfach....

von Einer K. (Gast)


Lesenswert?

Jens M. schrieb:
> Kein Wunder, das hier so oft über Arduino gelästert wird: das ist euch
> zu einfach....

Irgendwie verwirrt heute?

Was hat Arduino damit zu tun, wenn dem Anfänger Wissen fehlt?
Bit du incl. der Geradengleichung auf die Welt gepresst worden?

von Jens M. (schuchkleisser)


Lesenswert?

Seit wann ist der Mod ein Anfänger?

von Einer K. (Gast)


Lesenswert?

Jens M. schrieb:
> Seit wann ist der Mod ein Anfänger?

Ist der Mod ein Arduino Jünger?

von Jens M. (schuchkleisser)


Lesenswert?

Weiß nicht.
Man sollte das hier ja auch nicht so rausposaunen, weil man dann gleich 
schief angekuckt wird.

von Nick M. (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Was hat Arduino damit zu tun, wenn dem Anfänger Wissen fehlt?

Weil der nicht mal eine
void main()
hat.

von r c (Gast)


Lesenswert?

Jens M. schrieb:
> Man sollte das hier ja auch nicht so rausposaunen, weil man dann gleich
> schief angekuckt wird.

Na logisch.

Die alten Herren hier möchten ja weiterhin 3 Wochen an ihren diskret 
aufgebauten LED Blinkerschaltungen arbeiten und noch für ihre Effizienz 
gelobt werden.

von Einer K. (Gast)


Lesenswert?

Jens M. schrieb:
> Man sollte das hier ja auch nicht so rausposaunen, ...
Meine Namenswahl empfindest du als falsch?



-----------
Jens M. schrieb:
> Kein Wunder, das hier so oft über Arduino gelästert wird: das ist euch
> zu einfach....
Alle Begründungen ausgegangen?

Dann ist das wohl nur eine ganz miese Diskiminierungsmasche.
Warum tust du das?
Was versprichst du dir davon?

von r c (Gast)


Lesenswert?

Nick M. schrieb:
> Weil der nicht mal eine
> void main()
> hat.

Falsch.

von Einer K. (Gast)


Lesenswert?

Nick M. schrieb:
> Weil der nicht mal eine
> void main()
> hat.

Wenn dann: int main()
Oder?

Und natürlich hat Arduino das.
Auch das erstellen eigener main() ist kein Problem.
Wahlweise in C++, C, oder auch Assembler.

von Jens M. (schuchkleisser)


Lesenswert?

Arduino Fanboy D. schrieb:
> Meine Namenswahl empfindest du als falsch?

Usernamen sind mir sowas von egal.
Sieht man an meinem ;)

Arduino Fanboy D. schrieb:
> Alle Begründungen ausgegangen?

Für was?
Die Formel bzw. der Code oben ist so grandios einfach, und ich kann nu 
wirklich nicht gut C.
Aber die Formel da ist was, 6. Klasse?
Das wurde nicht empirisch ermittelt, nur wurde das Problem sehr einfach 
und pragmatisch gelöst:
Zeit ausrechnen, Pin an, Busyloop, Pin aus, Busyloop.

Arduino Fanboy D. schrieb:
> Dann ist das wohl nur eine ganz miese Diskiminierungsmasche.

w0t?
Ich kann Arduino auch nutzen ohne mich drüber aufzuregen.
Wenn es den Job tut, bau ichs ein.
Gibts was anderes, bau ichs anders.
Der Name auf der Schachtel ist mir ebenso egal wie der Username in 
Foren.
Ich bin kein Rassist, aber... ;)

von Nick M. (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Und natürlich hat Arduino das.

Dann fehlt es im Ursprungsposting.
Aber das strotzt ja sowieso vor "Qualität"

von Jens M. (schuchkleisser)


Lesenswert?

Nick M. schrieb:
> Aber das strotzt ja sowieso vor "Qualität"

War vor 6 Jahren auch alles anders... ;)

von Joachim B. (jar)


Lesenswert?

Nick M. schrieb:
> Weil der nicht mal eine
> void main()
> hat.

hat sich versteckt

aber

Andreas P. schrieb:
> void setup() {
> void loop() {

hats ja verraten, nur nicht jedem!

von Einer K. (Gast)


Lesenswert?

Nick M. schrieb:
> Dann fehlt es im Ursprungsposting.
Nein.

Nick M. schrieb:
> Aber das strotzt ja sowieso vor "Qualität"
6 Jahre alt, es ist.
Wenn er/sie/es dem Hobby noch frönt, wird er/sie/es sich (hoffentlich) 
weiter entwickelt haben.

Jens M. schrieb:
> Ich bin kein Rassist, aber... ;)
Aber einer welcher mit Schaiße auf Arduino User wirft.

Das Gruppieren von Personen, anhand einer ihrer Eigenschaften, und diese 
Gruppe dann als ganzes zu bewerten, ist für mich die Grundessenz 
rassistischer Denkmuster.

Wie auch immer...
Deine eigene, von dir hoch gelobte Kompetenz, ist sicherlich auch nicht 
vom Himmel gefallen.

Gib ihnen die Zeit, welche du gebraucht hast.
Und ein bisschen mehr, weil sie nicht alle so firm, wie du, sein können.

von Jens M. (schuchkleisser)


Lesenswert?

Arduino Fanboy D. schrieb:
> Aber einer welcher mit Schaiße auf Arduino User wirft.

eben genau gerade nicht.
zumindest nicht das ich wüsste.

Arduino Fanboy D. schrieb:
> Und ein bisschen mehr, weil sie nicht alle so firm, wie du, sein können.

Genau das isses ja. bin ich nicht, weiß ich auch.

Herr jessas, geh in einen Lebensmittelmarkt deines Vertrauens, kauf eine 
Packung AA und mach die in deinen Ironiedetektor rein.
Die da drin sind scheinen leer zu sein.

von Wolfgang (Gast)


Lesenswert?

Nick M. schrieb:
> Weil der nicht mal eine
> void main()
> hat.

Wäre es schlimm, wenn es eine int main() wäre?

Die main.cpp von Arduino sieht im wesentlichen so aus:
1
int main(void)
2
{
3
  init();
4
  initVariant();
5
  setup();
6
    
7
  for (;;) {
8
    loop();
9
    if (serialEventRun) serialEventRun();
10
  }
11
  return 0;
12
}
Für den TO dürfte damit auch klar werden, warum seine for-Schleife nach 
dem Erreichen der 180 wieder von vorne anfängt.

von c-hater (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:

> Was hat Arduino damit zu tun, wenn dem Anfänger Wissen fehlt?

Weil eben Arduino verspricht, das auch Unwissende was gebacken bekommen. 
Es ist aber naturgemäß reiner Zufall, ob das dann tatsächlich klappt.

Schuld ist aber nicht der Anfänger, sondern die falschen Propheten, 
dieses unselige, geldgierige, hassenswerte Drecks-Pack.

> Bit du incl. der Geradengleichung auf die Welt gepresst worden?

Naja, jeder hat das in der Schule gelernt. Schätzungsweise 4 oder 5 
Klasse? Wer nichtmal das kann, ist als Programmierer einfach 
grundsätzlich vollkommen ungeeignet. Ende der Ansage!

von Einer K. (Gast)


Lesenswert?

c-hater schrieb:
> hassenswerte Drecks-Pack
Wers zuerst gerochen, dem ists aus der Hos gekrochen.

c-hater schrieb:
> Weil eben Arduino verspricht, das auch Unwissende was gebacken bekommen.
Naja...
Schnelle kleine Erfolge sind schon zu erreichen, trotz der doch arg 
komplexen C++ Welt.
Andere Programmierumgebungen stellen sich da gerne etwas querer.

Das Denken wird dennoch beansprucht, wenn es denn etwas weiter gehen 
soll.
Arduino, hin oder her, wird sich das nicht vermeiden lassen.

c-hater schrieb:
> Ende der Ansage!
Eigentlich bin ich recht froh, dass du nicht das Maß der Dinge bestimmen 
darfst.


--

Das einzige, was ich dir zu gute halten könnte, wäre, wenn du mit dir 
selber noch gnadenloser umgehen würdest.
Ist das so?

von Joachim B. (jar)


Lesenswert?

Moment mal, von c-hater hätte ich erwartet

zeh-hater schrieb:
> ...verspriht...auh...gebaken...
> ...tatsählich...
> Shuld...niht...falshen...
> ...Dreks-Pak...
> Shule...Shätzungsweise...
> nihtmal...einfah...
> grundsätzlih...

scnr

: Bearbeitet durch User
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.