Servo zufällig verschiedene Positionen ansteuern lassen

Hallo liebe Arduino Spezialisten,
ich bräuchte mangels fehlenden Programmmierkenntnissen mal eure Hilfe.

Für ein Modellbauprojekt für die Uni soll der Arduino ein Servo / Fahrtregler steuern.

Das Servo soll zunächst in 0- Stellung sein, damit der Regler startet.

Danach soll das Servo / dder Fahrtregler zufallsgesteuert 4 Werte anfahren 20 Grad / 50/ 120 und 180 Grad.

Zwischen den Positionen sollen zufallsgesteuerte Pausen zwischen 10 Sekunden und 60 Sekunden sein.

Wer kann mir mit dem Programmcode helfen?

Extrem lieben Dank Eure Michaela

Sag mal, auch als Anfänger kann man doch einen vernünftigen Titel reinschreiben.
Dann sieht gleich jeder wo dein Problem ist.

Das du Anfänger bist, brauchst du nicht zu schreiben.

Was den Programmcode betrifft, kannst du in die Beispiele der Library/IDE schauen, da wird alles gezeigt.

Und mit einem aussagekräftigen Titel wird dein Beitrag auch besser gefunden.

micha438:
ich bräuchte mangels fehlenden Programmmierkenntnissen mal eure Hilfe.

Wie sehen denn die eigenen Programmierkenntnisse aus?
Random und ne Handvoll Variablen und constanten sollten ja an ner Uni eigentlich kein Problem sein.

"Millenials don't read manuals"

(deleted)

Hallo zusammen,
Mein Sketch schaut bisher so aus. Das Servo läuft damit per Zufall auf verschiedene Positionen, und am Anfang auf die Startposition. Soweit gut. Leider bekomme ich keine zufälligen delays zwischen den Servopositionen hin.
Hab das mit dem delay versucht, funktioniert aber leider nicht :frowning:

Wie muss das formuliert werden, dass er die verschiedenen Positionen anfährt und aber immer zufällig alle 30 - 60 Sekunden wieder auf eine neue Position fährt?

LG, Michaela

#include <VarSpeedServo.h>


#define SERVO_P2 11 // Servo connected to PIN 11
#define WAIT_I 1000 // wait after init in ms
unsigned long pause_1;

#define POS_L 20 // left endstop
#define POS_R 160 // right endstop
#define POS_O 20 // oben endstop
#define POS_U 160 // unten endstop

#define WAIT_EN 350 // wait time at endstop in ms
#define WAIT_IN 500 // wait time at each angular increment in ms


VarSpeedServo servo2; // create servo object to control a servo


void setup()
{

servo2.attach(SERVO_P2); // attaches the servo on pin 11 to the servo object
servo2.write(POS_O); // tell servo to go to init position

delay(WAIT_I); // wait a little bit
}


void loop()
{
int posX = 0; // variable to store the servo position
int posY = 0; // variable to store the servo position
pause_1 = 100000 * random (1,100);  //Zeiten von 3 bis 30 Sekunden
delay(25);
   
int gotoX = (int) random(POS_L, POS_R);
delay(25);
   
pause_1 = 100000 * random (1,100);  //Zeiten von 3 bis 30 Sekunden


int gotoY = (int) random(POS_O, POS_U);



servo2.write(gotoY,10); // tell servo to go to position in variable 'pos'

delay(WAIT_IN); // waits for the servo to reach the position
}

ohne delay(pause_1) wird's auch schwierig :slight_smile:

(deleted)

micha438:
Das Servo soll zunächst in 0- Stellung sein, damit der Regler startet.
Danach soll das Servo / dder Fahrtregler zufallsgesteuert 4 Werte anfahren 20 Grad / 50/ 120 und 180 Grad.
Zwischen den Positionen sollen zufallsgesteuerte Pausen zwischen 10 Sekunden und 60 Sekunden sein.

micha438:
Wie muss das formuliert werden, dass er die verschiedenen Positionen anfährt und aber immer zufällig alle 30 - 60 Sekunden wieder auf eine neue Position fährt?

pause_1 = 100000 * random (1,100);  //Zeiten von 3 bis 30 Sekunden

int gotoX = (int) random(POS_L, POS_R);
pause_1 = 100000 * random (1,100);  //Zeiten von 3 bis 30 Sekunden
int gotoY = (int) random(POS_O, POS_U);

Ich hab mal beides zusammengefasst, weil das, was Du im Ausgangspost beschreibst im Code nicht vorhanden ist und zudem die Erklärung im Code weder das beschreibt, was Du im Ausgangspst willst noch im Code generierst.

Ich für mein Verständnis bin davon ausgegangen, das der Servo genau 4 Positionen anfahren soll, die zufällig gewählt werden.
Derzeit fährst Du alles an zwischen 20 und 160.
Dann willst Du zufällige Pausen haben zwischen 10 und 60 sekunden.
Im Code generierst Du Zahlen zwischen 100000 und 10000000 (vermutlich ms); Beschreiben tust zwischen 3 und 30 sekunden; Verwendung aber keine.

Und, während Du den Servo noch mit posY beschreibst, geht posX komplett verloren.

Als erstes trenne Dich davon delay() zu verwenden.
In der Zeit ist dein Code fest an der Stelle und Du hast keine Chance etwas anderes zu machen.

Dann erklär doch mal, ob die Positionsänderungen unabhängig von einander ablaufen können, also posX - wartenposX - posY - posX- wartenposY- wartenposX - posX - wartenposX - posY - posX...., oder ob immer zuerst posX - warten - posY - warten.

Und dann bitte nochmal die Aufgabenstellung mit den anzufahrenden Positionen nochmal genauer.

"Dann erklär doch mal, ob die Positionsänderungen unabhängig von einander ablaufen können, also posX - wartenposX - posY - posX- wartenposY- wartenposX - posX - wartenposX - posY - posX...., oder ob immer zuerst posX - warten - posY - warten."

Also, der Ablauf sollte so ausschauen:

1)Fahrtregler geht auf Position 0 damit er aktiviert / initialisiert wird
2)Fahrtregler hat 4 Geschwnidigkeiten, die er erreichen kann und startet mit einer der 4 zufällig
3) Fahrtregler hält diese Geschwindigleit 30-50 Sekunden (zufällig)
4) Fahrtregler geht auf die nächste zufällige Geschwindligkeit, vorzugsweise nicht auf die bisherige

Das ganze im Loop

Ich hatte mich da etwas eingelesen und experimentiert s.o. aber die Abfolge ist dann doch recht kompliziert für mich mit den vielen Variablen und ich kenne die Befehle nicht wirklich gut.
Bin für jede Hilfe dankbar.

Gruß, Michaela

@micha348
Auch als Anfänger solltest du auf die Wünsche und Anregungen der Helfer eingehen.
Da du als Anfänger es evtl. überlesen hast, gerne nochmal:
Ändere deinen Titel in einen Sinnvollen Titel, der auch dein Problem widergespiegelt.
Das kannst du im Eingangspost jederzeit machen.

Für weitere Fragen git es ein "How to use this Forum", das solltest du unbedingt lesen.

micha438:
"Dann erklär doch mal, ob die Positionsänderungen unabhängig von einander ablaufen können, also posX - wartenposX - posY - posX- wartenposY- wartenposX - posX - wartenposX - posY - posX...., oder ob immer zuerst posX - warten - posY - warten."

Bitte nicht Texte kopieren und in ein neues Post einfügen.
Dafür gibt es die "quote" Funktion unten, oder aber du markierst den Teil im Posting-Editor.

Also, der Ablauf sollte so ausschauen:

1)Fahrtregler geht auf Position 0 damit er aktiviert / initialisiert wird
2)Fahrtregler hat 4 Geschwnidigkeiten, die er erreichen kann und startet mit einer der 4 zufällig
3) Fahrtregler hält diese Geschwindigleit 30-50 Sekunden (zufällig)
4) Fahrtregler geht auf die nächste zufällige Geschwindligkeit, vorzugsweise nicht auf die bisherige

Das ganze im Loop

Na das ist ja nun nichts, was nicht machbar wäre. :wink:
Allerdings, wenn Du frisch anfängst, dann fang nicht damit an, den Servo zu bewegen, sondern mit den Zeiten und Funktionen erstmal ein Grundgerüst zu bauen, aus dem sich das dann weiterentwickeln lässt.

Da Du UNI machst, gibt es von mir nichts fertiges - Aber die Idee, wie so ein Grundgerüst aussehen kann.
Und dann beschäftige Dich mit den Dingen, die da drin enthalten sind.
Gute Lektüre dazu findet sich in dem runterladbaren pdf von Andreas:
https://www.arduinoforum.de/code-referenz

// Forumsketch: https://forum.arduino.cc/index.php?topic=700996.msg4711220#msg4711220
const int servopos[] = {0, 20, 50, 120, 180}; // die möglichen Positionen - Erweiterbar
// const int waitforServo = 500; // Mindestzeit für den Servo, um an Position zu kommen - entfällt, weil Pausezeit Mindestzeit überschreitet
unsigned long lastmillis; // Merker für Zeit
const unsigned long pause_min = 2000; // millisekunden
const unsigned long pause_max = pause_min + 3000;
unsigned int pause_time = pause_min; //Initialisierung der Pause zwischen Servobewegungen
int old_pos = 0, new_pos = 0;
void setup()
{
  Serial.begin (115200);
  randomSeed (millis());
  lastmillis = servo_bewegung (servopos[0]); // Start an Position 0
}

unsigned long servo_bewegung (const int pos)
{
  Serial.print (F ("übernommene Position: "));
  Serial.print (pos);
  Serial.println (F (" kann angefahren werden"));
  return millis();
}

void loop()
{
  if (millis() - lastmillis > pause_time)
  {
    Serial.println (F ("Pause abgelaufen"));
    while (new_pos == old_pos)
    {
      new_pos = random (1, sizeof (servopos) / sizeof (int));
      Serial.println (F ("errechnete Position "));
      Serial.println (new_pos);
    }
    Serial.print (F ("Übergebe an Servo: "));
    Serial.println (servopos[new_pos]);
    lastmillis = servo_bewegung (servopos[new_pos]);
    old_pos = new_pos;
    pause_time = random (pause_min, pause_max + 1);
    Serial.print (F ("Warte jetzt für: "));
    Serial.print (pause_time);
    Serial.println (F (" Millisekunden"));
  }
  // Serial.println(F("Hier kann noch was zwischendurch gemacht werden")); // Die Zeile auskommentieren, um zu sehen was passiert
}

Ich studiere doch nur Geologie und muss jetzt diese Idee vom Prof umsetzen :frowning: Ich finde dafür mach ich das nicht so schlecht, aber ich hab noch nie was programmiert.

Ersteinmal danke für den Code oben. Jetzt muss ich das servo definieren, oder? Hab das mal gemacht aber es bewegt sich nicht. Muss man sicher unten nochmal mit aufgreifen, aber wo?

// Forumsketch: https://forum.arduino.cc/index.php?topic=700996.msg4711220#msg4711220
const int servopos = {0, 20, 50, 120, 180}; // die möglichen Positionen - Erweiterbar
// const int waitforServo = 500; // Mindestzeit für den Servo, um an Position zu kommen - entfällt, weil Pausezeit Mindestzeit überschreitet
unsigned long lastmillis; // Merker für Zeit
const unsigned long pause_min = 2000; // millisekunden
const unsigned long pause_max = pause_min + 3000;
unsigned int pause_time = pause_min; //Initialisierung der Pause zwischen Servobewegungen
int old_pos = 0, new_pos = 0;

#include <VarSpeedServo.h>

#define SERVO_P2 11 // Servo connected to PIN 11
#define WAIT_I 1000 // wait after init in ms

void setup()
{
Serial.begin (115200);
randomSeed (millis());
lastmillis = servo_bewegung (servopos[0]); // Start an Position 0
}

unsigned long servo_bewegung (const int pos)
{
Serial.print (F (“übernommene Position: “));
Serial.print (pos);
Serial.println (F (” kann angefahren werden”));
return millis();
}

void loop()
{
if (millis() - lastmillis > pause_time)
{
Serial.println (F (“Pause abgelaufen”));
while (new_pos == old_pos)
{
new_pos = random (1, sizeof (servopos) - 1);
Serial.println (F ("errechnete Position "));
Serial.println (new_pos);
}
Serial.print (F ("Übergebe an Servo: "));
Serial.println (servopos[new_pos]);
lastmillis = servo_bewegung (servopos[new_pos]);
old_pos = new_pos;
pause_time = random (pause_min, pause_max + 1);
Serial.print (F (“Warte jetzt für: “));
Serial.print (pause_time);
Serial.println (F (” Millisekunden”));
}
// Serial.println(F(“Hier kann noch was zwischendurch gemacht werden”)); // Die Zeile auskommentieren, um zu sehen was passiert
}

micha438:
Ich studiere doch nur Geologie und muss jetzt diese Idee vom Prof umsetzen :frowning: Ich finde dafür mach ich das nicht so schlecht, aber ich hab noch nie was programmiert.

Ersteinmal danke für den Code oben. Jetzt muss ich das servo definieren, oder? Hab das mal gemacht aber es bewegt sich nicht. Muss man sicher unten nochmal mit aufgreifen, aber wo?

Hol Dir mal den Sketch nochmal - ich hab da noch was zugefügt, damit Du nicht in Verwiirung kommst…

Und dann bitte, bitte: Wenn Ich nicht lesen kann, was code ist und was quote, mach ich hier nicht weiter.
Wenn Du unten auf “quick Reply” gehst, ist das was vorher drin stand schon fertig formatiert.
Wenn Du das noch anpassen willst, geh auf “preview” und modifiziere im Editor - gehe wieder auf “preview” und sieh Dir Deinen Post an.

Wenn Du den Sketch jetzt startest, dann siehst Du die Ausgaben auf dem seriellen Monitor - anhand der Ausgaben kannst Du sehen, wo Du wann was einfügen musst. Einfach die Stelle im Code suchen, wo die Ausgabe erzeugt wird.

Hallo xy_project,
Werde zumindest mal richtig zitieren ;D . Bin echt am Verzweifeln, hab mir da zuviel vorgenommen :cold_sweat: wie kann ich nur das Servo da mit reinbringen damit das Ding die Befehle unten übernimmt. ich glaub ich brauch da doch mehr Hilfe als du glaubst. Das wird gleich total kompliziert, sobald da Schleifen drin sind. Wäre mehr als toll, wenn du mir helfen kannst ich sitz grad so ratlos da :slight_smile:

Micha

RTFM !

Oder ist Google defekt?

micha438:
Bin echt am Verzweifeln, hab mir da zuviel vorgenommen

wie kann ich nur das Servo da mit reinbringen damit das Ding die Befehle unten übernimmt.

Ich hab den Sketch extra etwas komplizierter gemacht.
Du musst und sollst dabei was lernen. Alles kann und will ich Dir nicht abnehmen.

definiere Deinen Servo-PIN
lade Deine Servo-lib
initialisiere Deine Servolib
Und dann such die Stelle im Code, an der Dir der serielle Monitor ausgibt welche Position der Servo bekommt.
Übergebe dem Servo genau da die Position.
Und dann erwähne in der Dokumentation, die partnerschaftliche Herkunft :wink:

(deleted)

zwieblum:
RTFM !

Oder ist Google defekt?

He das ist gemein. Jemand, der noch nie programmiert hat kann nicht einfach ein Manual hernehmen und aus den ganzen Informationen in kurzer Zeit mal eben ein funktionsfähiges Programm schreiben. Ich wusste vorher noch nciht mal, was dieser serial monitor ist und wenn ich den einschalte kommen nur kryptische Zeichen. Das ist ultra schwierig und für euch, die ihr euch schon lange damit beschäftigt vermutlich easy.

Habe versucht die Dinge einzubauen, hoffentlich korerkt gepostet. Leider kommen nur rote Fehlermeldungen :frowning:

// Forumsketch: https://forum.arduino.cc/index.php?topic=700996.msg4711220#msg4711220 99,9% geholfen durch my_xy_projekt
const int servopos = {0, 20, 50, 120, 180}; // die möglichen Positionen - Erweiterbar
// const int waitforServo = 500; // Mindestzeit für den Servo, um an Position zu kommen - entfällt, weil Pausezeit Mindestzeit überschreitet
unsigned long lastmillis; // Merker für Zeit
const unsigned long pause_min = 2000; // millisekunden
const unsigned long pause_max = pause_min + 3000;
unsigned int pause_time = pause_min; //Initialisierung der Pause zwischen Servobewegungen
int old_pos = 0, new_pos = 0;

#include <VarSpeedServo.h>
#define SERVO_P1 10 // Servo connected to PIN 10
servo_t.write(gotoX,40); // tell servo to go to position in variable ‘pos’

delay(WAIT_IN); // waits for the servo to reach the position

void setup()
{
Serial.begin (115200);
randomSeed (millis());
lastmillis = servo_bewegung (servopos[0]); // Start an Position 0
}

unsigned long servo_bewegung (const int pos)
{
Serial.print (F (“übernommene Position: “));
Serial.print (pos);
Serial.println (F (” kann angefahren werden”));
return millis();
}

void loop()
{
if (millis() - lastmillis > pause_time)
{
Serial.println (F (“Pause abgelaufen”));
while (new_pos == old_pos)
{
new_pos = random (1, sizeof (servopos) / sizeof (int));
Serial.println (F ("errechnete Position "));
Serial.println (new_pos);
}
Serial.print (F ("Übergebe an Servo: "));
Serial.println (servopos[new_pos]);
lastmillis = servo_bewegung (servopos[new_pos]);
old_pos = new_pos;
pause_time = random (pause_min, pause_max + 1);
Serial.print (F (“Warte jetzt für: “));
Serial.print (pause_time);
Serial.println (F (” Millisekunden”));
}
// Serial.println(F(“Hier kann noch was zwischendurch gemacht werden”)); // Die Zeile auskommentieren, um zu sehen was passiert
}

Doch, kann er. Das nennt man “recherchieren”. Am besten auf der Arduino Homepage. Dann IDE starten, Demoprogramme anschauen. Komischer Weise ist da fast dein Problem drinnen.

Das was du machst, ist eine Abkürzung suchen, die es nur dann gibt, wenn jemand anders deinen Job macht.