Aufgabenplan Servos / Relais

Hallo Arduino-Gemeinde,

ich bin neu hier und natürlich gleich mit einem Problem konfrontiert. Ich habe folgende Aufgabenstellung und bisher fehlt mir der richtige Ansatz. Meine Simulationen auf tinkercad waren nicht erfolgreich.

Gesteuert werden sollen 3 Servos und ein Relais.
Ausgangslage: Alle Servos stehen auf null Grad, Relais nicht geschaltet (stromlos)

Aufgabenstellung:
Servo 1 geht:

  • von 0 auf -90 grad + kurze Haltezeit (vielleicht 3 Sekunden)
  • wechselt die Position auf +90 grad + Haltezeit (zurück über 0 grad)
  • wechselt die Position auf -90 grad + Haltezeit (zurück über 0 grad)
  • wechselt die Position auf +90 grad + Haltezeit (zurück über 0 grad)
  • zurück auf 0 Grad
  • dann 15 min Pause
    Servo 2 (Zyklus 1):
  • beginnt, wenn die 15 min Pause von der Taskliste "Servo 1" abgelaufen sind
  • geht von den 0 grad auf 180 grad und hält diese Position
    Relais:
  • zieht an
    Servo 3:
  • beginnt, wenn Relais angezogen
  • fährt von 0 auf 45 grad
  • von 45 grad zurück auf null
  • von 0 auf 45 grad
  • von 45 zurück auf null grad
  • keine Pausen zwischen den Richtungsänderungen
    Servo 2 (Zyklus 2)
  • geht zurück auf 0 grad und hält die Position
    Relais:
  • wird wieder stromlos
    Servo 1:
    ...
    ...

Diese Aufgabenstellung wiederholt sich immer wieder (wird aber spätestens nach 8 Stunden beendet). Muss also nicht unbedingt im "loop" stehen.

Mir ist die "Grundarchitektur" des codes nicht ganz klar. Mit "delay" scheint es nichts zu werden, wegen der "Nachtwächterproblematik". Ich konnte leider auch kein sample finden, was meinem Problem nahe kommt und ich adaptieren kann. Könnt Ihr mir vielleicht etwas weiter helfen?

Vielen Lieben Dank vorab.

Beste Grüße Christian.

Muss also nicht unbedingt im "loop" stehen.

Wo solls denn stehen? als 3 km Spaghetticode im setup() ?

Versuch die Nachtwächtererklährung zu verstehen und mit dieser und einer Ablaufsteuerung = Endlicher Automat kannst Du das Machen was Du da beschreibst.

Grüße Uwe

Aehm, was ist ein "Nachtwächter"?

@zwieblum
Nachtwächter: BlinkwithoutDelay - Die Nachtwächtererklärung - Deutsch - Arduino Forum

@uwefed
Ich arbeite mich mal durch. Glaube aber realistisch, dass ich sicherlich noch Fragen haben werde. Auf Anhieb wird es sicher nicht gelingen.
Hast Du einen guten Link zum Endlichen Automat?

Ja, alternativ dachte ich setup(). Sind "nur" 31-32 Durchläufe, das wäre noch halbwegs zu überblicken.

Gruß Christian

zwieblum:
Aehm, was ist ein "Nachtwächter"?

Ablaufsteuerung
Meine Standardantwort zu Ablaufsteuerungen:

Eine Stichworte Sammlung für Google Suchen:
Endlicher Automat,
State Machine,
Multitasking,
Coroutinen,
Ablaufsteuerung,
Schrittkette,
BlinkWithoutDelay,

Blink Without Delay
Die Nachtwächter Erklärung

Intervall Macro
Multitasking Macros
INTERVAL Ersatzstoff
CooperativeTask

Och, das ist nett erklärt :slight_smile:

Allerdings sehe ich da keine Notwendigkeit, einen endlichen Automaten dafür abzustellen. Es passieren nie zwei Dinge gleichzeitig (oder ich habe es überlesen) und es muss zwischendurch keine Eingabe (Taster, Sensoren etc. ) ausgewertet werden. Das sollte meines Erachtens ganz gut mit delay gehen.

@sth77
Wenn es einfach gehen würde, wäre das ja toll. Ich bin hier am verzweifeln. Je mehr ich sehe und lese, je unverständlicher wird das Ganze. Habe zig Seiten durchforstet, etliche Videos gesichtet und es wird immer unklarer.
Es wäre schön, wenn jemand mal ein Beispiel mit Servos machen würde, inklusive Schaubild Hardwareaufbau (der Code mit gegebener Pin-Belegung wie im Schaubild). Dann könnte ein Dummi wie ich hier adaptieren und bedarfsgerecht anpassen. Zusätzlich erübrigen sich zukünftig Fragen Anderer, denn das Problem scheint nach Netzsuche recht gängig.
Das, was man zu den Thema findet sind Codeschnipsel, mal mit LED´s, Taster, Servos und was weiß ich noch alles. Da blicke ich vorne und hinten nicht durch (bin auch anscheinend nicht der Einzige). Allein den Code von einer LED auf einen Servo zu ändern, ist schon problematisch, wenn man die Logik vor lauter Commands nicht erfassen kann.

Dagegen ist ja php-schreiben ein Kindergarten...

Viellecht solltest du mal einfach ein Diagramm pinseln: X->Zeit, Y-> Servoposition und da alles eintragen, in verschiedenen Farben.

Hallo zwieblum. Mache ich.
Habe mir mal "minibloq" runtergeladen. Hoffentlich kommen hier erhellende Momente. Scheint vielleicht zu genügen und man lernt ja auch dabei.

Aehm ... viellecht wär's gscheiter dir ein nettes Buch über C oder C++ runterzuladen, z.b. den Klassiker hier: https://rkvalley.files.wordpress.com/2010/04/kernighan_ritchie_language_c.pdf

sth77:
Allerdings sehe ich da keine Notwendigkeit, einen endlichen Automaten dafür abzustellen. Es passieren nie zwei Dinge gleichzeitig (oder ich habe es überlesen) und es muss zwischendurch keine Eingabe (Taster, Sensoren etc. ) ausgewertet werden. Das sollte meines Erachtens ganz gut mit delay gehen.

Sehe ich eigentlich auch so. Wenn er mehr lernen will - OK. Aber rein für die Aufgabenstellung ist es nicht notwendig. Das kann man so wie es in er Liste steht linear runterprogrammieren. Wäre jetzt nur noch die Frage, ob die Servos mit Maximalgeschwindigkeit die jeweiligen Positionen anfahren sollen, oder ab das mit 'gemäßigter' Geschwindigkeit gehen soll.

Minoblq kann ich leider nicht nutzen, um den Code in Tinkercat zu testen

Ich schreibe gerade in Tinkercat von Hand und schaue mal, was dort rauskommt. Wenn ich damit durch bin, gebe ich den Code mal aus. Bisher steht alles im setup()

sth77:
Allerdings sehe ich da keine Notwendigkeit, einen endlichen Automaten dafür abzustellen. Es passieren nie zwei Dinge gleichzeitig (oder ich habe es überlesen) und es muss zwischendurch keine Eingabe (Taster, Sensoren etc. ) ausgewertet werden.

Du irrst!
Und zwar, in dem du "endlicher Automat" und Multitasking in einen Topf wirfst.
Das ist nicht das gleiche.

Die beiden Angelegenheiten findet man häufig gemeinsam vor, mehr auch nicht.
Ein gutes Team, das ist.

Das sollte meines Erachtens ganz gut mit delay gehen.

Ach, da gibts bestimmt ein paar geheime Randbedingungen, welche das unmöglich machen.
Steht ja auch so im Eingangsposting:

Mit "delay" scheint es nichts zu werden, wegen der "Nachtwächterproblematik".

Erstmal Danke für den Input.
Ich habe die Sache hintereinander weggeschrieben und es treten, oh Wunder, in der visuellen tinkerCad-Simulation Fehler auf.

  • die Servo´s drehen nicht, wie gewünscht und zappel nach der ersten Vollbewegung nur noch. Liegt das an tinkerCad, oder wird das "reallife" genauso sein?
  • Servo 1 soll ja in seiner Bewegung in einen negativen Winkel drehen. Das lässt sich so wohl nicht umsetzten. Wie definiere ich den Servo vor Start, dass seine Ausgangsposition 90 Grad ist (damit könnte man ja arbeiten)
  • das mit dem Relais kann ich nicht simulieren. da bin ich vollständig auf Ferndiagnose angewiesen. Würde der Code dafür passen?

Hier meine "Errungenschaft":


#include <Servo.h>

Servo myservo1;
Servo myservo2;
Servo myservo3;

int pos = 0;
const int relaisPin = 8;

void setup() {

// Servo 1 Aufgaben
// ________________________________________________________
myservo1.attach(11);

for (pos = 90; pos <= 180; pos += 10)
myservo1.write(pos);
delay(2000);

for (pos = 180; pos >= 0; pos -= 10)
myservo1.write(pos);
delay(2000);

for (pos = 0; pos >= 180; pos -= 10)
myservo1.write(pos);
delay(2000);

for (pos = 180; pos >= 0; pos -= 10)
myservo1.write(pos);
delay(2000);

for (pos = 0; pos >= 90; pos -= 10)
myservo1.write(pos);
delay(4000);

// Servo 2 Aufgaben 1
// ________________________________________________________
myservo2.attach(10);

for (pos = 0; pos <= 180; pos += 1)
myservo2.write(pos);
delay(2000);

// Relais Aufgaben 1
// ________________________________________________________
pinMode(relaisPin, OUTPUT);
digitalWrite(relaisPin, HIGH);
delay(1000);

// Servo 3 Aufgaben
// ________________________________________________________
myservo3.attach(11);

for (pos = 0; pos <= 45; pos += 10)
myservo3.write(pos);
delay(500);

for (pos = 45; pos >= 0; pos -= 10)
myservo3.write(pos);
delay(500);

for (pos = 0; pos <= 45; pos += 10)
myservo3.write(pos);
delay(500);

for (pos = 45; pos >= 0; pos -= 10)
myservo3.write(pos);
delay(500);

// Servo 2 Aufgaben 2
// ________________________________________________________
myservo2.attach(10);

for (pos = 180; pos <= 0; pos += 1)
myservo2.write(pos);
delay(2000);

for (pos = 0; pos <= 180; pos += 1)
myservo2.write(pos);
delay(2000);

// Relais Aufgaben 2
// ________________________________________________________
pinMode(relaisPin, OUTPUT);
digitalWrite(relaisPin, LOW);
delay(2000);

// WIEDER BEGINN VON VORN (SERVO 1 AUFGABEN)
// ________________________________________________________
}

void loop() {

}

Kannst du bitte schreiben, was du mit

for (pos = 90; pos <= 180; pos += 10)
myservo1.write(pos);             
delay(2000);

erreichen möchtest?

Hallo,

Vorschlag : ein paar Grudlagen lernen und mal die Beispiele zu Servo ansehen, dann wird das schon

Heinz

zwieblum:
Kannst du bitte schreiben, was du mit

for (pos = 90; pos <= 180; pos += 10)

myservo1.write(pos);            
delay(2000);



erreichen möchtest?

Der Plan war ja, die 0 Grad als 90 Grad definieren zu können, damit der Servo sozusagen negative Winkel fahren kann. Eine Eingabe mit -X Grad wäre ja zu einfach.

Nur fehlt mir hierfür der Befehl. Ich müsste dem Servo vorher irgendwie mitteilen, dass 90 Grad sein Ausgangswinkel ist, von dem er operiert.

Sprich: Um +90 Grad bis -90 Grad und dazwischen eine Nullstellung abzubilden.

Mit dem Standardcode für Servos beginnt der Servo ja immer von einer Ausgangsstellung und kann über diese hinaus nicht rückwärts laufen.

Aber was soll der Code machen? Er tut's nicht, das ist klar, aber was soll er tun?

Leuchtfeuer:
Sprich: Um +90 Grad bis -90 Grad und dazwischen eine Nullstellung abzubilden.

Addier zu deinem gewünschten Winkel einfach immer 90 dazu, und Du kommst auf 0...180 - das was die Servo-Lib haben will. '90' ist dann deine Nullstellung.

Und lerne zwischen den Dingen zu unterscheiden, die ins setup kommen, weil man sie nur 1x am Anfang macht ( z.B. Initiierungen wie 'servo,attach' und Pininitiierungen, wie pinMode) - und den Dingen, die dein Arduino regelmäßig immer wieder machen soll, und die deshalb in den loop kommen. Auch deine Abfolge soll sich ja schließlich immer wiederholen.

Auch die Servopins solltes Du am Anfang festlegen wie Du das mit dem Relaispin gemacht hast. Dann passiert es dir auch nicht, dass Du für 2 verschiedene Servos den gleichen Pin nimmst.