MoBa Tools startet Stepper Motor unaufgefordert nach Laden des sketch

Hallo zusammen,
mache meine ersten Veruche mit den Moba Tools und steuere meine Stepper über einen TB6600 Treiber an. Die IDE (2.3.4) kompiliert meinen sketch (für den Arduino UNO) fehlerfrei. Sofort nach dem Hochladen startet der Motor für ca. 1 sec. , bleibt dann stehen und startet erneut das geladene sketch. Betätige ich den Reset am Arduino läuft "nur" das Programm so wie es soll, ohne die anfängliche Drehbewegung. Woran kann das liegen?

#include <MobaTools.h>

const byte stepPin = 5;
const byte dirPin = 4;
const int stepsPerRev = 6400;    

MoToStepper stepper1( stepsPerRev, STEPDIR );

void setup() 
{
  stepper1.attach( stepPin, dirPin );
  stepper1.setSpeed( 100 );
  stepper1.setRampLen( 50);
  stepper1.rotate(-1);         
}

void loop() 
{
}

Bitte verwenden Sie in den englischen Bereichen des Forums die englische Sprache. Ihr Thema wurde in den deutschen Bereich des Forums verschoben.

So ist es programmiert

Das sollte nicht so sein - der Motor sollte dauerhaft laufen. Woran erkennst Du, dass der Sketch neu gestartet wird?

Wie soll es denn sein? Die Drehbewegung sofort nach dem Start ist ja so programmiert.

Das ganze sieht mir eher nach einem HW-Problem aus. Zeig mal einen Schaltplan und ein Bild von deinem Aufbau. Vor allem auch wie Du das mit Strom versorgst, und was das für ein Stepper ist.

das ist nix "unaufgefordert".

Du hast den Befehl rotate() ins Programm geschrieben. Und der macht nun mal endlos rotieren.

Wenn das nicht so sein soll, dann musste andere Befehle verwenden und die in die function loop() reinschreiben.

Hi @ulli_th ,

ich habe Deinen Sketch bei Wokwi eingestellt:

https://wokwi.com/projects/421813068337570817

Wie man sieht, beginnt der Motor mit Start des Programms zu rotieren. Entspricht das dem, was Du mit

Betätige ich den Reset am Arduino läuft "nur" das Programm so wie es soll, ohne die anfängliche Drehbewegung.

meinst?

Hey StefanL38,
Du hast Recht, ich will, dass der Motor sich dreht, so steht es in meinem sketch. Es ist nur unschön, dass der Motor sich schon für kurze Zeit dreht direkt nach dem Hochladen, dann stehenbleibt, und dann erst das tut, was im sketch steht. Dieses anfänliche Drehen (nur für kurze Zeit) stört mich. Wie gesagt, der sketch läuft problemlos nach einem Hardware-Reset.

Das hört sich nach Reset durch Spannungseinbruch an.
Wie wird der Schrittmotor mit Spannung versorgt?

Um herauszufinden ob das wirklich ein Reset ist lade mal diesen Sketch hoch
Wenn alles funktioniert wie es programmiert ist dann passiert folgendes

Arduino startet

  1. noch bevor der sich der Schrittmotor zu drehen anfängt blinkt die onboardLED 5x mittelschnell
  2. Dann fängt der Motor an zu drehen und die LED blinkt 20x sehr schnell
    dabei dreht der Motor die ganze Zeit.
    3.nach dem 20x schnell blinken
    blinkt die LED koninuierlich. Der Schrittmotor dreht sich ohne Unterbrechnung
    3x schnell
    3x langsam
    3x schnell
    2 Sekunden Pause
#include <MobaTools.h>

const byte stepPin = 5;
const byte dirPin = 4;
const byte ledPin = 13;

const int stepsPerRev = 6400;

MoToStepper stepper1( stepsPerRev, STEPDIR );

void setup()  {
  pinMode(ledPin, OUTPUT);
  blinkLed(5, 300); // 5x mittelschnell blinken
  stepper1.attach( stepPin, dirPin );
  stepper1.setSpeed( 100 );
  stepper1.setRampLen( 50);
  stepper1.rotate(-1);
  blinkLed(20, 50); // 20x sehr schnell blinken
}


void blinkLed(byte NrOfBlinks, unsigned long dTime) {
  for (byte i = 0; i < NrOfBlinks; i++) {
    digitalWrite(ledPin, HIGH);
    delay(dTime);
    digitalWrite(ledPin, LOW);
    delay(dTime);
  }
}

void blinkSOS() {
  blinkLed(3, 200);  // 3x schnell blinken
  blinkLed(3, 1000); // 3x langsam blinken  
  blinkLed(3, 200);  // 3x schnell blinken
}

void loop()  {
  blinkSOS();
  delay(2000);
}

Wenn du etwas abweichendes beobachtest dann macht der Arduino einen Reset

Hallo StefanL38,
dein sketch funktioniert bei mir genau so wie Du ihn beschrieben hast. Wenn Du aber folgende Änderung machst, tritt der von mir beschiebene Effekt auch ein:

  blinkLed(1, 300); // 1x mittelschnell blinken

Also, nur 1 mal mittelschnell Blinken reicht nicht als Verzögerung vor der ersten Drehbewegung aus. Nach jedem reset läuft mein und dein sketch fehlerfrei.

Hallo MicroBahner,
anbei mein Schaltplan, an dem eigentlich nicht viel falsch zu machen ist und mein Stepper ist vom Typ 17HS4401.


Ich bin mir noch nicht sicher was du damit genau sagen willst.

Heißt das:
wenn mein Sketch mit dem Geblinke von

geändert wird auf

Dann beobachtet man:

LED macht einmal 0,3 Sekunden aufleuchten Schrittmotor fängt an zu drehen.
Schrittmotor stoppt.

Schrittmotor dreht kontinuierlich.

Ist das so?

Wenn ja
Interessant ! @MicroBahner kannst du erklären woher das kommt?

Richtig! Ab 2 x Blinken ist genug Zeitverzögerung, dass der Effekt nicht auftritt.

Vermutung:
Enable ist nicht nicht verwendet, dadurch könnte die Ansteuerung einen Moment undefiniert sein.

Nein. Auf meiner Test-HW passiert das auch nicht. Und auch in der WOKWI-Simulation von @ec2021 passiert es ja nicht. Es muss also mit der HW zusammenhängen - denn die ist der einzige Unterschied.

Naja, da sind meine Erfahrungen anders - nichts ist so einfach, dass man nicht was falsch machen könnte :joy:. Was ist das für ein Netzteil, und wie ist es eingestellt. Wie sind die Dip-Schalter des Treibers gesetzt?
Und hast Du einen Link zu deinem Motor, aus dem auch der Anschluß hervorgeht? Da gibt es durchaus Unterschiede.

Ein Bild von DEINEM Aufbau, auf dem alle Kabelverbindungen ersichtlich sind, wäre nicht schlecht.

Tritt das Phänomen

  • nur jeweils einmal "nach dem Hochladen" auf, wenn also gerade ein Sketch hochgeladen wurde

oder

  • auch nach einem "harten" Reset des Controllers (sprich Spannungsversorgung des Controllers aus/anschalten) ?

Hallo ec2021,
genau wie Du sagst tritt das Phänomen NUR nach dem Hochladen auf, danach nie wieder. Der sketch ist ja geladen und ich kann den UNO spannungslos machen oder resetten, spielt alles keine Rolle - es läuft!

Hallo herbk,
ob mit oder ohne ENABLE, das Phänomen bleibt das selbe.

Das heißt, dass Du das Problem nur bei einem Firmware-Update hast ...

Falls kein akademisches Interesse an der Ursachenfindung besteht, wäre es das einfachste,
die Spannungsversorgung zum Stepper bei einem Umprogrammieren zu unterbrechen.

Alternativ ein delay() anstelle der ersten Blinkroutine einsetzen, das kostet nur nach einem Neustart etwas Zeit. Die erforderliche Verzögerungszeit müsste man durch Testen herausfinden.

Viel Erfolg!
ec2021

Besten Dank für deine Antwort. Den Versuch mit der Spannungsversorgung habe ich schon erfolglos hinter mir. Dein 2. Tip, mit dem delay(), brachte eine Verzögerung von 1 sec. Ich möchte aber nicht, dass dieses delay() immer mitläuft, wenn ich die Anlage normal betreibe.

Die Verzögerung läuft nur genau einmal nach einem Einschalten bzw. Reset.

Kommt das im Betrieb tatsächlich häufig vor?

Hallo MicroBahner,
ich schätze deine Antworten sehr. Ein Satz von dir: "Auf meiner Test-HW passiert das nicht" hat mich zum Nachdenken gebracht. Also habe ich meinen Fundus an HW durchforstet und noch einige ander UNO-Boards gefunden. Für meinen Test hatte ich das Original (Made in Italy) benutzt, bei dem das o.g. Phänomen auftrat. Ein anderes Board (Made in China) angeschlossen, und siehe da, der Effekt war weg! Als nächstes habe ich die Prozessoren getauscht und der Fehler wanderte mit. Ergebnis: der ATMEGA 328 hat offensichtlich einen Knacks. Werde noch mal ein paar ander Klone (alles Chinaware) ausprobieren und danach hoffentlich Erfolg melden können.