Servo zufällig verschiedene Positionen ansteuern lassen

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.

micha438:
Das ist ultra schwierig und für euch, die ihr euch schon lange damit beschäftigt vermutlich easy.

Nein ist es nicht.
Für mich ist sogar noch schwieriger, weil ich nicht weiss, was Du da hast, machst, oder wie Du denkst.
Das fängt schon damit an:

Ich wusste vorher noch nciht mal, was dieser serial monitor ist und wenn ich den einschalte kommen nur kryptische Zeichen.

Und ja, ein paar Grundlagen brauchst Du schon.
Ich schreib es nochmal - weil es so easy ist: Bevor Du mit den sich bewegenden Servos was anfängst, brauchst Du ein funkions- und tragfähiges Grundgerüst, mit dem Du rund um die Zeiten und Funktionen erstmal etwas hast, was Du erweitern kannst.

Und ich verweise Dich nochmals auf das pdf.
Und nein, egal was Du machst - das ist keine Aufgabe die man zwischen Frühstück und Abendessen bastelt UND versteht.

Wenn Du jetzt - seit meinem Codepost zum ersten Mal - damit um die Ecke kommst, das Du im Code die Initialisierung des serial.begin nicht mit der Zahl im Seriellen Monitor unten rechts in Einklang bringen kannst, waren alle vorherigen Posts vollkommen nutzlos.
Ich habe dann nämlich an Dir vorbei geredet, weil Du niemals verstanden haben kannst, was ich Dir vermiteln wollte.

Nicht easy.

Ich seh schon, es geht darum dass ich selbst Programmieren lernen soll. Ich hab das Thema hier überschätzt und mein Prof wohl, der davon 0 Ahnung hat und mir das über den Zaun geworfen hat und ja ich hab gehofft, dass mir jemand den Code schreiben kann weil ich erkenne,dass ich das nicht schaffe.
Ich hab die Nacht damit herumexperimentiert, aber ich schaff das nie bis Ende der Woche zu kapieren.
Das ist wie wenn Ihr einen Mainframe aufsetzen sollt und das Ding zum ersten Mal seht.

Ich muss dem das zurückgeben und sagen ich kann das nicht, das soll am Freitag sein komisches Modell ansteuern aber ich kann nicht zaubern.

Trotzdem danke für die Tipps, ihr meints ja gut.

Micha

micha438:
Ich seh schon, es geht darum dass ich selbst Programmieren lernen soll.

das hat (bisher) niemand gesagt.

Ich hab das Thema hier überschätzt und mein Prof wohl, der davon 0 Ahnung hat und mir das über den Zaun geworfen hat und ja ich hab gehofft, dass mir jemand den Code schreiben kann weil ich erkenne,dass ich das nicht schaffe.

Ich muss dem das zurückgeben und sagen ich kann das nicht, das soll am Freitag sein komisches Modell ansteuern aber ich kann nicht zaubern.

Das Thema ist nicht so schwer.
Und ja, ich hab hier auch schon dem einen oder anderen ganz viel Code geschrieben.
Sogar schon Bewässungssteuerungen funktionsfähig gehabt, den User dann aber dahin geführt und schliesslich das fertige Ergebnis geteilt.

Bis Freitag!?! Das ist doch eine Ewigkeit!
Ich versteh die Mentalität nicht. Nein, etwas fertiges bekommst Du nicht - zumindest nicht von mir.
Allerdings frage ich mich ernsthaft, wie das sonst an der Uni funktioniert.
Du willst irgendwann (hoffentlich) einen Abschluß in Geologie haben. Da ist eigenes und selbstständiger erarbeiten Grundlage für ein erfoglreiches Ergebnis. Wenn Du schon an so einer Aufgabe Dein Scheitern festmachst, dann möchtest Du über Deine Gesamteinstellung zur Lösung von Aufgaben nachdenken.

Mir ist das Wurscht.
Der Sketch bleibt. Die Informationen auch. Leg Dich aufs Ohr. Nimm dann das pdf und durchsuch es nach Dingen, die du nicht verstehst. Und wenn Du serieller Monitor ardunio hyroplyphen in einer Suchmaschine eingibst, bekommst Du mindestens 30000 Ergebnisse.

Deine Entscheidung.

@micha438: Du hast nie gesagt, dass die jemand den Code schreiben soll. Wenn du das gesagt hättest, dann hätte mindestens ein böser Mensch nach dem Budget gefagt und dann mehr oder weniger freundlich "dream on" geantwortet.

In der Zeit, die du bisher auf der Suche nach einer Abkürzung verbraucht hast, hättest du locker die paar Grundbegriffe lernen und die Aufgabe locker erledigen können.

Um bei deinem Mainframe-Beispiel zu bleiben: "Oh Gott, ein Mainframe! Keine Ahnung! Aaaaahhhh! I'm lost! Mach du das für mich!" ist der flasche Zugang. "Schick, ein Mainframe. Wo ist die Doku? Gibt's einn Tutorial? Wie unterscheidet sich das Ding von meiner Unix-Hobel?" - damit kommst du weiter.

Na Zwieblum, ich hab nur ne Aufgabe bekommen mit der ich normal nix anfangen kann, weil ich keine Ahnung vom Programmieren habe und das nicht so schnell lernen kann und es auch nicht meine Materie ist. Deswegen hate ich um Hilfe gebeten bei jenen, die das mal schnell aus der Hand aufschreiben könnten. Aber es sieht so aus, dass das auch keiner hier kann.

nix für ungut, aber vielleicht kommst du auch mal in die Lage, dass du schnell Hilfe brauchst und der Feuerwehrmann gibt dir dann den Schlüssel und das Handbuch vom MAN Löschfahrzeug und sagt: "Wenn Sie vorher gesagt hätten, dass wir ihr Haus löschen sollen hätten wir geantwortet : "dream on"

Werd doch erstmal ausgebildeter Feuerwehrmann bevor du die 112 wählst. Wir hätten wenigstens sehen wollen, dass du den Tank auffüllst und die Leiter ausfährst.

Ich versteh ja, dass ihr nicht irgendwie was umsonst machen wollt, aber 100 Spezialisten in einem Forum, die das Thema meist aus dem FF beherrschen und keine 5 Minuten bräuchten um zu helfen schreiben 15 Threads warum sie nicht helfen. Naja. Schade.

(deleted)