Probleme bei zufälliger Motorsteuerung

Hallo Leute,

Ich arbeite aktuell an einer Motorsteuerung mit einem L293.
Dummerweise kriege ich das mit der Tasterabfrage nicht so hin.

Der Arduino soll nach längerem drücken des Tasters den Modi von zufälligem drehen
auf normales drehen wechseln.

Der Code und die Schaltung sind im Anhang

Vielen Dank schonmal im vorraus ;D

PS: Ich arbeite erst ein Jahr mit dem Arduino (Ausbildungsbedingt), kann also sein das ich das
ein oder andere noch nicht weis.

Random_motor.png

Random_motor.txt (1.4 KB)

Keinen Plan was du da genau vorhast.

Du springst mit deinen sw_1 und sw_2 wild in den Abfolgen rum. Dann ist während deiner delays keine tasterabfrage. Der taster muss also genau zur richtigen Zeit gedrückt sein. Zu früh oder zu spät und nichts passiert. während dann ein Delay im Zufallsbereich 500-8000 läuft kannst du so oft Taster drücken wie du willst, da passiert nichts. Und der merkt sich das dann auch nicht.

Du solltest also zuerstmal die Delays rausbauen, wenn du auf Tastendruck reagieren willst.

Und mit Switch case dürfte der Code übersichtlicher werden.

https://www.arduino.cc/en/Reference/SwitchCase

Du möchtest eine Ablaufsteuerung basteln!
Einen einfachen endlichen Automaten.

Auch, um deine Zeitsteuerung, incl. Tastenabfrage zu realisieren, möchtest du gerne auf delay() verzichten.

Danke für die schnelle Antwort. Ich werde mit SwitchCase erstmal den Code umstrukturieren. Und dann das Ergebnis posten. Auf delay() zu verzichten ist wegen der random() Funktion aktuell bei meinem Kenntnisstand nicht möglich.

Auf delay() zu verzichten ist wegen der random() Funktion aktuell bei meinem Kenntnisstand nicht möglich.

Eine gute Gelegenheit an deinem Kenntnisstand zu arbeiten!

Bedenke:
Ohne gelingt dir die Tasterabfrage nicht vernünftig.

So nochmal die Erklärung, ich verwende 2 Modi der eine dreht den Motor zufällig in einer bedingt zufälligen Geschwindigkeit, der andere Modi dreht den Motor konstant in eine Richtung mit der gleichen
Geschwindigkeit. Die Tasterabfrage kann nur zwischen dem wechsel der Richtungen im zufälligen Modus geändert werden oder immer wenn er konstant läuft. Da ich die Aufgabe Ausbildungsbedingt mache kann es auch sein, dass in der Schaltung ein selbsthaltender Taster fehlt, der sich selbst per HIGH Signal resetet, wenn es das überhaupt gibt. Die Code modifikation mit SwitchCase funktioniert nicht so recht beziehungsweise ist wohl mein Versuch fehlerhaft. Der Versuch liegt anbei. Zu meinem Startcode, die Zufallsdelays sind die einzige mir gebliebene Möglichkeit die automatische random Funktion zu überbrücken und zwei Zustände wechselnd zu halten.

danke schonmal im vorraus ;D

Random_motor_2_SwitchCase.txt (1.63 KB)

Wenn du es hinbringst

Super

Wenn nicht frage nicht mehr, weil die delays dann die Ursache dafür sind und du die nicht beseitigen willst.

Delay blockiert alles. Du musst genau in der Pause zwischen den Motordrehbewegungen drücken. Nur das zählt dann. Wenn dir das reicht, funktioniert es ja schon, wenn nicht, dann musst du die Lösung suchen für

Taster mit Delay.

Dann bitte posten, weil die suchen andere auch noch.

Cream_and_Butter:
... die Zufallsdelays sind die einzige mir gebliebene Möglichkeit die automatische random Funktion zu überbrücken und zwei Zustände wechselnd zu halten.

Eine Anregung:

 unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= rdm_delay_time) {
      rdm_delay_time = random(500,8000);
      ...
  }

chefin:
Dann bitte posten, weil die suchen andere auch noch.

Bist Du sicher, danach sucht jemand? Mit millis geht das doch einfacher. Aber wenn Du möchtest: Mittels Tastendruck wird die Blinkfrequenz einer LED verändert. Die Reaktionszeit beträgt willkürlich gewählt unter 100 ms.

const int ledPin = 13, tasterPin = 2;
const unsigned int intervallA = 5000, intervallB = 900;
unsigned int intervall = intervallA;

void setup() {
  pinMode(tasterPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  digitalWrite(ledPin, !digitalRead(ledPin));
  delayT(intervall);
}

void delayT(uint32_t zeit) {
static bool aktStatus = LOW, altStatus = LOW;
static uint32_t z = 0;
  z = zeit / 100;
  while (z > 0) {
    altStatus = aktStatus;
    aktStatus = digitalRead(tasterPin);
    if (altStatus && !aktStatus) {
      if (zeit == intervallB) {
        intervall = intervallA;
      } else {
        intervall = intervallB;
      }
    }
    delay(100);
    z--;
  }
}

Sorry hatte die Ironie-tags vergessen.

War nicht so wirklich ernst gemeint. Aber wenn der Threadstarter unbedingt sein delay behalten will, dann soll er. Man kann ihm ja nur dazu raten es anders zu machen. Müssen tut er garnichts.

chefin:
Sorry hatte die Ironie-tags vergessen.

War nicht so wirklich ernst gemeint. ...

Hatte ich schon vermutet :slight_smile: Aber nix im Fernsehen, Forum offline, da kommt man schon auf komische Gedanken.

Meine Idee: Wenn man ein langes delay in viele kurze delays zerlegt, kann man auch noch einen Taster abfragen. Bei einem größeren Projekt zerlegt man die verschiedenen Aufgaben auch in kleine Teile, damit alle Aufgaben quasi parallel bedient werden.

Als ich millis() noch nicht kannte, habe ich mit einem Zähler gearbeitet, den ich auf Null dekrementierte. Zur Erlangung einer definierten Zeit nutzte ich delay(1). Damit bin ich ein ganzes Stück weitergekommen.

const int ledPin = 13;
const int intervall = 500;
int zaehler = 0;

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  if (zaehler == 0)
  {
    zaehler = intervall;
    digitalWrite(ledPin, !digitalRead(ledPin));
  }
  if (zaehler > 0)
  {
    zaehler--;
    delay(1);
  }
}

Nach der Entdeckung von millis() und der bewußten Verwendung endlicher Automaten ging dann für mich die Sonne am Arduino-Himmel auf 8)

So ich hab es nochmal probiert leider hat es nicht ganz so geklappt vielleicht seht ihr wodran es beim Code mangelt. Der Code Baukasten ist im Anhang

Der Code Baukasten ist im Anhang

Da ist nix mit Anhang ... ???

So jetzt mit Code außerdem hab ich den pwm pin des l293 direkt auf 5v gesteckt. Im Code sind 3 Versuche und die Variabeln sind vorraussichtlich schonmal für alle Versuche definiert...

Zufallsmotor.ino (1.82 KB)

Cream_and_Butter:
So jetzt mit Code ...

Dann ich auch:

const int richtung1 = 10;
const int richtung2 = 11;

unsigned long pM1 = 0; // previousMillis 1
unsigned long pM2 = 0; // previousMillis 2
unsigned long cM;      // currentMillis
unsigned int rdmi1;    // randomintervall 1, 8000
unsigned int rdmi2;    // randomintervall 2, 2000

int t = 1; // spätere Tastervariabel

void setup() {
  Serial.begin(9600);
  Serial.println("Anfang");
  pinMode(richtung1, OUTPUT);
  pinMode(richtung2, OUTPUT);
}

void loop() {
  cM = millis(); // currentMillis

  switch (t) {
    case 1:
      if (cM - pM1 >= rdmi1) {
        analogWrite(richtung1, 255);
        analogWrite(richtung2, 0);
        pM2 = cM;
        rdmi2 = random(500, 2000); // randomintervall 2, 2000
        t = 2;
        Serial.print("rdmi2: ");
        Serial.println(rdmi2);
      }
      break;
    case 2:
      if (cM - pM2 >= rdmi2) {
        analogWrite(richtung1, 0);
        analogWrite(richtung2, 255);
        pM1 = cM;
        rdmi1 = random(500, 8000); // randomintervall 1, 8000
        t = 1;
        Serial.print("rdmi1: ");
        Serial.println(rdmi1);
      }
      break;
  }
}

Funktioniert zufällig ganz ohne delay. Kleine Wortspielerei :slight_smile:

Danke agmue es funktioniert einwandfrei.
Wie schließe ich nun die Frage?

PS: Danke auch an alle anderen die geholfen haben ;D

Bitte gerne!

Cream_and_Butter:
Wie schließe ich nun die Frage?

In Post #0 könntest Du [erledigt] oder [gelöst] vor den Titel schreiben.