Gleichstrommotor tut nicht ganz was er soll_Aussetzer_falsche Richtung

Hallo zusammen,
ich bin ganz neu im Arduino-Bereich und als eines der ersten kleinen Projekte habe ich versucht einen Gleichstrommotor anzusteuern.
Dazu verwende ich den Arduino Uno R3 und den Motortreiber L298N.
Der Motor soll sich erst mit fast höchster Geschwindigkeit 2 Sekunden rechtsrum drehen und dann mit ca. halber Geschwindigkeit 3 Sek. linksrum.
Das macht er auch, aber nach einer unbestimmten Anzahl Zyklen hat er immer wieder Aussetzer in der Form daß er nachdem er rechtsrum gedreht hat erst ca. 2 Sek. Pause macht und dann gleich wieder rechtsrum dreht. Das macht er ein oder auch zwei/drei Mal, dann läuft er wieder für mehrere Zyklen wie er soll.
Das sollte doch eigentlich nicht passieren. Der Code ist doch eindeutig.
Weiß zufällig jemand woran das liegen Könnte.
Für jegliche Tipps bin ich dankbar.
Viele Grüße
Maximilian

int in1 = 11;
int in2 = 10;
void setup() {
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  // put your setup code here, to run once:
}

void loop() {
  analogWrite(in1, 250);
  digitalWrite(in2, LOW);  // put your main code here, to run repeatedly:
  delay(2000);

  digitalWrite(in1, LOW);
  analogWrite(in2, 125);  // put your main code here, to run repeatedly:
  delay(3000);
}

(Im Schaltplan wird ein Arduino UNO gezeigt. Ich nutze jedoch einen Arduino Uno R3, bei dem aber die Anschlüsse identisch sind soweit ich das sehen kann)

Bau mal in setup() was ein, an dem du ein Reset erkennen kannst.

Vermutlich stürzt der UNO ab. Hast du einen Entstörkondensator am Motor?

Wie möchtest Du die Geschwindigkeit kontrollieren?

Der läuft mit 5V praktisch garnicht richtig. Nimm einen neueren MOSFET Treiber und einen Drehzahlmesser und versuche es nochmal.

Bei bidirektionalen Motortreibern dort schon eingebaut.

@max400 (Kernkraft400?!?)

du sollst Serial Ausgaben ergänzen damit du sehen kannst, was dein Sketch im laufenden Betrieb wirklich macht, oder ob es z.B. ungwollte Neustarts gibt.

Außerdem sieht es in deinem "Schaltplan" danach aus, als würdest du den Motortreiber vom Arduino aus mit Strom versorgen. Das klappt nicht, weil der Arduino nicht genug Strom für einen Motor zur Verfügung stellen kann. Du musst ein externes Netzteil verwenden und die Massen verbinden.

Vielen Dank für die Antworten!

Als erstes habe ich Codezeilen hinzugefügt, die mir im Serial Monitor anzeigen sollen, ob der Arduino abgestürzt ist bzw. neu gestartet hat.
Wenn die KI mir die richtigen Befehlszeilen gegeben hat und ich das richtig eingefügt habe, sieht das jetzt so aus:

int in1 = 11;
int in2 = 10;
int resetCounter = 0;
void setup() {
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  Serial.begin(9600);
  resetCounter++;
  Serial.print("Reset Counter: ");
  Serial.println(resetCounter);
  // put your setup code here, to run once:
}

void loop() {
  analogWrite(in1, 250);
  digitalWrite(in2, LOW);  // put your main code here, to run repeatedly:
  delay(2000);

  digitalWrite(in1, LOW);
  analogWrite(in2, 125);  // put your main code here, to run repeatedly:
  delay(3000);
}

Beim Probedurchlauf blieb der Resetzähler immer bei 1 stehen, selbst nach mehrmaligem Auftreten des Fehlers.

Also wenn ich das richtig interpretiere hat sich der Arduino nicht aufgehängt/keinen Reset gemacht.

Na ja, die Geschwindigkeit kontrolliere ich über das PWM-Signal der digitalen Pins indem ich analog.write benutze und bestimme mit welcher Geschwindigkeit der Motor von 0 bis höchster Geschwindigkeit laufen soll.

Sollte es an den 5V Volt liegen, könnte es dann nicht helfen einfach ein Netzteil zu verwenden wie es @noiasca vorgeschlagen hat?

Das funktioniert leider nicht so wie Du meinst :frowning:

Der Counter bleibt auch beim reset stehen, da der beim reboot die Variable neu definiert und initialisiert und damit ist der vorherige Wert weg.

Wird Dir jedes Mal der Text "Reset Counter" angezeigt, ist das ein Neustart, da setup() hier nur nach einem Neustart einmalig aufgerufen wird.

Hast Du den Motor.Treiber von den 5V vom UNO getrennt und versorgst den jetzt mit eigenen 12V?

Ok, ich habe versucht festzustellen ob der Arduino ungeplant Resets macht, wie beschrieben, aber wenn ich die serial Ausgaben richtig verwendet habe, scheint er es nicht zu tun.
Ich bin dabei mich reinzufinden was es für weitere Möglichkeiten gibt zu kontrollieren was der Sketch im Betrieb macht.

Ja, der Motortreiber wird vom Arduino aus mit Strom versorgt.
Ich werde mal versuchen ein externes Netzteil zu verwenden und sehen ob es dann besser funktioniert.

Der Text "Reset Counter" wurde nur einmal angezeigt auch nach mehrmaligem Auftreten des Fehlers.

Noch nicht, aber habe ich vor.

das wird spannend :slight_smile:
Ich hab Dir mal im setup() noch ne Pause eingebaut.

const byte in1 = 11;
const byte in2 = 10;
//int resetCounter = 0;
void setup()
{
  Serial.begin(9600);
  delay(500);
  Serial.print("Neustart: ");
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
}

void loop()
{
  analogWrite(in1, 250);
  digitalWrite(in2, LOW);
  delay(2000);
  digitalWrite(in1, LOW);
  analogWrite(in2, 125);
  delay(3000);
}

Und dann mal schaun, was passiert wenn der Treiber fremd versorgt ist.
Bitte beachte!
Die Verbindung GND Motortreiber und GND Arduino muss bestehen bleiben! Sonst fehlt Dir das Bezugspotential für die Steuerspannungen.

Der L298 braucht 2 Versorgungsspannungen. Eine für die Logik (meist nimmt man da 5V ) und eine zweite für den Motor. Das Datenblatt sagt, daß die Motorspannung mindestens 2V über der Logikspannung sein muß. Also bei 5V Logikspannung mindestens 7V.

Nimm einen besseren Motortreiber wie zB einen DRV8837 bzw DRV8838 oder den DRV3385 für 2 Motoren. Die kannst Du mit 5V Motorspannung verwenden und bringen bis zu 1,5A.

Grüße Uwe

Aber nicht vom Arduino aus gespeist. Das muss dazu gesagt werden. Vor allem, weil bereits jetzt schon der Weg genommen wurde.

Da nirgens das Model des Motors genannt wurde und ich kaum glaube, daß es der TT Getriebemotor mit Übersetzung 1:60 wie in der Zeichnung ist, bin ich auf die Dimensionierung des Netzteils nicht eingegangen.
Grüße Uwe

Hallo,

mit dem Code wird brutal die Drehrichtung umgeschalten ohne kurze Wartepause zwischendurch, womit der Motor kurz still stehen könnte. Die Folgen solcher Späße sollten klar sein. Vom Arduinoboard aus versorgt man auch keinen Motor/Treiber. Das ist schon mit kleinen Servos kritisch.

Ein doppelter Kurzschluß. Oder anders gesagt der doppelte Anlaufstrom.
Grüße Uwe

Jedes C++ Buch würde dir sagen, dass das so keiner werden kann.
Diese Variable überlebt keinen Reset!

Darum bleibt sie auch auf 1, egal wie oft ein Reset stattfindet.
Damit sie Resets zählen kann muss sie in der noinit Section verankert sein.

Wenn die KI mir die richtigen Befehlszeilen gegeben hat

Dumm dümmer, am ......
Versuche besser im Schritttempo zu denken, als solche Gehirnprothesen zu verwenden.

1 Like

Sorry, aber so lernst du nie, wie man es richtig macht.
Merke:
Wir sind nicht das Repair Cafe einer KI.
Die soll die Fehler selbst rausfinden. Einfach so lange nachfragen, bis es bei dir funktioniert. :wink: