MobaTools: Stepper via SPI abschalten

Hallo Gemeinde,

ich habe erst kürzlich mit Arduino begonnen und viel mit Steppern experimentiert. Die MobaTools finde ich große klasse. Da ich für mein zukünftiges Projekt vier Motoren ansteuern muss bin ich gestern von direkter Ansteuerung über die Ausgänge des Arduinos zu Schieberegistern umgeschwenkt. Erster Test mit drei Motoren und Ansteuerung via SPI klappt ausgezeichnet.

Zwischendurch möchte ich Motoren stromlos machen. Das habe ich vorher mit einem
StepperX.detach()
gemacht. Wenn ich das via SPI versuche bleiben die Bits in den Schieberegistern aber an (ich hätte gedacht die werden mit Nullen überschrieben).

Hat jemand eine Idee ob das die MobaTools so gar nicht vorsehen oder ich was falsch mache/übersehen habe?

Herzlichen Dank schonmal
Marco

1x Arduino Uno SMD Rev3
2x 74HC595
3x 28BYJ-48 mit ULN2003

Testsketch:

#include <MobaTools.h>
const int FULLROT1 = 4096;
MoToStepper Step1(FULLROT1);
MoToStepper Step2(FULLROT1);
MoToStepper Step3(FULLROT1);

void setup() {
    Step1.attach( SPI_1 );
    Step2.attach( SPI_2 );
    Step3.attach( SPI_3 );
    
    Step1.setSpeed( 100 );
    Step1.setRampLen( FULLROT1/4 );
    Step2.setSpeed( 100 );
    Step2.setRampLen( FULLROT1/4 );
    Step3.setSpeed( 100 );
    Step3.setRampLen( FULLROT1/4 );

    Step1.setZero();
    Step2.setZero();
    Step3.setZero();
    
    Step1.write(360);
    Step2.write(360);
    Step3.write(360);
    
    while( Step1.moving() );
    while( Step2.moving() );
    while( Step3.moving() );

    Step1.detach(); 
    Step2.detach(); 
    Step3.detach(); 
}

void loop() {
}

Hallo Marco,

Ja das ist ( leider) so. Bisher ist das 'Stromlosmachen' über SPI noch nicht vorgesehen.
Du kannst das aber evtl. über den /OE Eingang des 74HC595 auch selbst im Programm machen. Du schaltest damit die Ausgänge ab, ohne den internen Schieberegisterzustand zu ändern. Du musst es aber dann auch immer wieder selbst einschalten, bevor Du die Schrittmotoren wieder bewegen lässt.

Gruß
Franz-Peter

1 Like

Hallo Franz-Peter,

danke für Deine schnelle Antwort!
Problem dabei ist natürlich, dass man mit /OE direkt beide an das Register angeschlossene Stepper Stromlos macht. Vielleicht gehts ja auch wenn ich kurzzeitig einen Master-Reset am 74HC595 auslöse ... da ich nicht davon ausgehe, dass Du schnell mal eben Deine Klasse änderst um das per SPI zu ermöglichen :wink: spiele ich da mal ein bisschen rum.

Herzliche Grüße,
Marco

Da hast Du natürlich recht ....

Da ist was dran - vor allem bei 'schnell' :wink: . Nachdem ich aus privaten Gründen schon seit längerer Zeit nicht mehr zur Weiterentwicklung der MobaTools gekommen bin, haben sich inzwischen schon einige Punkte auf der ToDo Liste angesammelt, und auch dieser Punkt steht da drauf - wobei echte Fehler natürlich Vorrang vor Funktionserweiterungen haben.
Inzwischen beruhigt sich das private Umfeld wieder etwas, und so hoffe ich bald auch an den MobaTools weiterentwickeln zu können.

Vollstes Verständniss. Bei mir geht es von so einer wilden gerade in eine etwas ruhigere Phase.
Leben seufts basteln ist viel schöner :wink:

Von all dem mal abgesehen habe ich gerade bei meinen letzten Test's festgestellt, dass meine Idee so vielleicht gar nicht realisierbar ist.

Ich habe jetzt wie gesagt drei Motoren an zwei Schieberegistern. Solange ich die Stepper SPI_1 bis 3 mit genau der gleichen Geschwindigkeit fahre ist alles in Ordnung. Sobald ich verschiedene Geschwindigkeiten fahre scheint irgendwas überhaupt nicht hinterher zu kommen und die Ansteuerung wird total wild (besser kann ich es noch nicht beschreiben - bin grad noch im "Was passiert denn hier blos"-Modus)

Hallo,

ich weiß zwar nicht was das für Stepper sind aber an Hand der Beschreibung eher Kleine wo die Spulensignale von Schieberegister über ein Leistungs-IC ULN2003 zum Stepper gehen. Ein Schaltplan wäre nicht schlecht gewesen.
Du könntest zwischen 74HC595 und ULN2003 AND/NAND Gatter setzen um gezielt Signale "freizugeben" oder eben auch nicht. Je Steppermotor 1 zusätzliches Signal. Wenn am Schieberegister noch was frei ist auch über dieses möglich. Dann muss nicht das gesamte Schieberegister beeinflusst werden.
Es gibt noch analoge Umschalter bspw. SN74CBT3257 die man verwenden könnte, aber ich denke das brauchst du wohl eher nicht. Würde Sinn machen wenn zwischen 2 Motoren umgeschaltet werden soll inkl. Leitungen einsparen.

1 Like

Hallo,

laut deinem letzten Beitrag benötigst du für jeden Motor einen extra Treiber/Controller. Dann gehen vom Arduino nur noch Takt und Richtungssignal zum Treiber. Den gesamten Rest macht der Treiber.

1 Like

Moin Doc_Arduino

Ja mir scheint auch langsam, dass mein Plan mit den Schieberegistern problematisch ist.
Ich hab grad ein Video von dem seltsamen Verhalten gemacht und poste alles zusammen mit ordentlicher Beschreibung und Schaltplan (muss ich noch zusammenschustern).

Mit den Treibern habe ich mich auch (kurz) befasst (speziell dieses weit verbreitete CNC Shield) und dachte, dass es für meine Anwendung oversized ist.
Kannst du mir vielleicht etwas empfehlen bevor ich noch mehr Geld unnütz ausgebe (zumindest ist alles was ich bisher gekauft habe zum experimentieren super :wink:

Mein Plan:
Drei kleine Schrittmotoren sollen unabhängig voneinander arbeiten in Geschwindigkeit, Richtung und Weg. Sie treiben die Zeiger und Drehpendel einer Uhr an, also auch kaum Kraft.
Der vierte soll ein größeres Uhrengetriebe bewegen, also langsam aber vielleicht mehr Kraft nötig. Ich hoffe bislang dass ich alles mit den 28BYJ-48 + ULN2003 machen kann (davon sind auch schon drei in der Uhr verbaut).
Desweiteren brauche ich noch mindestens vier Eingänge (Taster) (das werde ich wohl über einen Analogen Eingang und verschiedenen Wiederständen vor den Tastern machen (klappte im Versuchsaufbau gut (ich liebe Klammern))) und weitere Ausgänge, mindestens für zwei Relais und vielleicht später noch ein paar LEDs. Ach ja und einen DFPlayer mini muss ich auch noch ansteuern.
Alles einzeln klappt super aber nun kommt langsam alles zusammen und die Probleme beginnen :wink:

Ergänzung:
Schaltplan ist für diesen Test an sich der selbe wie in der Doku von den MobaTools nur mit zwei 74HC595 und (noch) ohne SPI_4
SP

Hier ein Video von dem merkwürdigen Verhalten. Erste Umdrehung aller drei Stepper mit der selben Geschwindigkeit, die Drehung zurück mit unterschiedlichen Geschwindigkeiten.
Video Versuchsaufbau

Testsketch

#include <MobaTools.h>
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

const int FULLROT = 4096;
MoToStepper Minuten(FULLROT);
MoToStepper Stunden(FULLROT, FULLSTEP);
MoToStepper Pendel(FULLROT);

/* Oh mist, das ist natürlich ein Problem...
 *  Muss ich später rausschmeißen und mal ohne testen, 
 *  war noch von den vorherigen Test's mit dem Player drin.
 */
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;

void setup() {
  mySoftwareSerial.begin(9600);

    Minuten.attach( SPI_1 );
    Stunden.attach( SPI_2 );
    Pendel.attach( SPI_3 );

    Minuten.setZero();
    Stunden.setZero();
    Pendel.setZero();

    Minuten.setSpeed( 90 );          // 30 - 190   100
    Stunden.setSpeed( 90 );          // 27 - 130    80
     Pendel.setSpeed( 90 );          // 27 - 130
    Minuten.setRampLen( FULLROT/24 );
    Stunden.setRampLen( FULLROT/24 );
    Pendel.setRampLen( FULLROT/24 );

    Minuten.write(360);
    Stunden.write(360);
    Pendel.write(360);
    while( Minuten.moving() ); while( Stunden.moving() ); while( Pendel.moving() ); 
    Minuten.setSpeed( 90 );
    Stunden.setSpeed( 80 );
     Pendel.setSpeed( 70 );
    Minuten.write(0);
    Stunden.write(0);
    Pendel.write(0);

    
  if (!myDFPlayer.begin(mySoftwareSerial)) {  /* Fehler Player */ }
}

Hallo,

Steppertreiber A4988 oder andere hat Pololu viele im Angebot. Es gibt auch Treiber von Trinamic, der Mercedes unter den Treibern, bspw. TMC2130 oder TMC2208. Sind nur Bsp. zum Suchen. Dafür wird mehr Betriebsspannung benötigt und dafür muss der max. Strom für den Motor eingestellt werden. Müßtest du schauen ob man den Strom für deine kleinen Motor soweit runter eingestellt bekommt.
Behebt aber noch nicht das nächste Problem wenn du nun bis zu 4 Motoren unabhängig betreiben möchtest. Die Treiber wollen ja alle einen Takt Eingang der vom Arduino für alle Motoren unabhängig kommen soll. Da wird es mit dem UNO knapp. Du bräuchtest 4 einzelne Timer. Hat der Uno nicht. Müßte mindestens ein Mega2560 her. 3D Drucker stehen vor dem gleichen Problem. Die haben laut meines Wissens noch eine extra Controllerkarte, worauf die Treiber sitzen, die mit dem Arduino kommuniziert. Da müßtest du dich mal schlau machen wenn sonst niemand hier mit anderen Hinweisen kommt.

Zusätzliche Pins für Taster und Leds sind das Geringste Problem. Kann man mit I/O Expander machen.

Du müßtest nochmal Zeit in die Planung stecken was wie am Besten ist.

PS:
Die große fette Schrift machste bitte wieder weg. Das kommt nicht gut an. Gibt auch keinen Grund dafür.

Nachdem ich dein Video gesehen habe sieht die Sache wieder anders. Ich dachte an eine große Pendeluhr. Du steuerst alles über Motoren. Wenn du alle Motoren immer nacheinander ansteuerst hast du nur eine minimale Verzögerung drin die man gar nicht sieht. Das heißt einen Grund für den Aufwand einer unabhängigen Taktung aller Motoren sehe ich hier nicht.

Edit:
Diese 3 Zeilen arbeiten zum Bsp. blockierend. Müßte alles "aufgerollt" werden um mehr Fluss reinzubringen.

while( Minuten.moving() );
while( Stunden.moving() );
while( Pendel.moving()  ); 
1 Like

Erstmal danke für die schnelle und ausführliche Antwort.
Die riesen Schrift hat mich selbst erschreckt, ist irgendwie beim Nachtrag einfügen passiert. Sobald ich schnalle wie ich das weg mache passiert das auch 8-/ ... ich hatte den Nachtrag mit einer Reihe Bindestrichen getrennt, die haben das Forum irgendwie veranlasst den Absatz so groß zu machen.

Die Zeiger und das Pendel sollejn sich tatsächlich gleichzeitig bewegen in bestimmten Situationen.

Ich räume das mal alles auf und teste nochmal, war heute auch alles ein schnellschuss und hier viel schneller und viel ausführlicher geantwortet als ich erwartet hätte :slight_smile: <3

Das muss ich mir mal anschauen - sollte eigentlich nicht sein. Vielleicht ist da noch ein Bug für die ToDo Liste drin ...

Die verwendete Stepper sind unipolare Stepper mit 5 Anschlüssen. Die kann man ( ohne internen Umbau ) nicht mit den Standard Step/Dir Treibern ansteuern.
Eigentlich sollte das unabhängige Ansteuern auch über die Schieberegister funktionieren. Die Idee mit UND-Gattern zwischen Schieberegister und ULN-Treiber die Motoren einzeln abschaltbar zu machen, sollte aber realisierbar sein. Weniger IC's dürfte eine Variante mit 74HC244 sein. Das ist ein 8-fach Buffer, dessen Ausgänge sich in zwei unabhängigen 4er Gruppen abschalten lassen. Also eigentlich ideal für diesen Zweck.

1 Like

Ich denke mein Ursprungsproblem mit dem Abschalten verliert an Relevanz. Ich wollte das tun weil mir die Spannung zusammengebrochen ist wenn ein Stepper länger stand und die Spulen weiter 'befeuert' wurden. Ich schließe die 5V für die Motoren jetzt separat an eine stärkere 5V Versorgung an.
Für das neue Phänomen - wenn es nicht an dem SoftwareSerial liegt (teste ich später) und bestehen bleibt: Wie handhabt Ihr das hier? Bleibe ich damit in diesem Thread obwohl das Topic dann nicht mehr passt oder mache ich lieber ein neues auf?

Okay, hatte ich nicht beachtet. Ich denke wenn es nicht blockierend programmiert wird funktioniert das auch mit Schieberegistern.

Ich empfehle bleibe in diesem deinen Thread, dann bleibt jeder Zusammenhang erhalten. Das Projekt bleibt ja gleich.

Wegen Motorversorgung. Treiber würden die Haltespannung und damit dem Strom im Stillstand reduzieren. Habe aber gerade keine Idee wie man das bei dir am Dümmsten machen könnte ohne Treiber. Ich meine "Heizwiderstände" zuschalten ist nun auch nicht gerade optimal.

Nein, definitiv nicht! Der Fehler lag nicht an Deinen Tools sondern zwischen Bildschirm und meinem Hinterkopf :wink: Wenn man seinen Sketch für verschiedene Tests benutzt und zwischendurch die Hardware massiv ändert muss man eben doppelt aufpassen.
Es lag tatsächlich daran dass ich auf den Pins 10 & 11 einen SoftwareSerial aufgemacht hatte. Ist ja auch irgendwie vorstellbar, daß das alles durcheinander bringt.

Hach, ärgerlich, dass grad heute zehn Stück 74HC595 auf Platine (https://amzn.eu/d/iYYtaLW) angekommen sind. Aber Deine 74HC244 und der Vorschlag mit dem AND Gatter von @Doc_Arduino sind klasse Ideen! Ich stell das mal als "Akku-schonen-Schönheits-Modifikation" in die Zukunft. Mit der Einzelversorgung der ULN-Treiber habe ich jetzt auch keine Spannungseinbrüche.

:thinking: ich glaube damit sind die ersten zwei Rückschläge die ich jetzt hatte seit ich mit dem Arduino arbeite auch erstmal vom Tisch.

PS: Ich dachte schon der Arduino macht verdammt viel Spaß aber dieses Forum macht ja fast schon spaßer :wink: Vielen Dank nochmal.

OK, das erklärt einiges. Wieder Arbeit gespart :grinning:

Na ja, die HC595 brauchst Du ja auf jeden Fall. Der HC244 würde nur die AND-Gatter zwischen HC595 und ULN2003 ersetzen, und etwas Platz und Verdrahtungsaufwand sparen. Und die Gesamtkonfiguration fertig auf Platine wirst Du eh nicht finden.

1 Like

Hi @verrueckteruhrmacher
was macht dein Projekt?
Ich habe gerade angefangen, die MobaTools Version 2.5 zu erstellen. Der erste Punkt war, das Abschalten für unipolare Stepper einzubringen - also nicht mit einem extra enable-Pin, sondern indem alle 4 Ausgänge abgeschaltet werden.
Wenn Du die MobaTools-Entwicklung unterstützen möchtest, könntest Du das in deinem Projekt testen. Die aktuelle 2.5 Entwicklerversion liegt auf GitHub. Du sparst dann zusätzliche Gatter zwischen HC595 und ULN2003.

Beim initialisieren der Stepper musst Du dann nur
Step1.attachEnable( 100 );
einfügen ( natürlich auch für den 2. Stepper ).
Der Parameter ist die Verzögerungszeit ( in ms ) zwischen dem (wieder) Einschalten der Ausgänge und dem 1. Step, bzw. zwischen dem letzten Step und dem Abschalten.

1 Like

Moin Franz-Peter!

Oh man das ist ja großartig!! Vielen Dank :smiley:

Das werde ich in jedem Fall tun! Da ich grad auf dem Weg in einen Kurzurlaub bin wird das leider nicht's vor dem Wochenende aber sobald ich getestet habe gebe ich selbstverständlich sehr gerne Feedback.

Mein Probeaufbau ist jetzt (bis auf die Ansteuerung & Stromversorgung der Nixi-Uhr) vollständig und ich kann mich ganz der Programmierung widmen. Von Daher, sahnemäßiges Timeing :slight_smile:


Video vom Probeaufbau: https://youtu.be/J2w7hI-hYdk

Hi Marco,

Das ist überhaupt kein Problem. Ich habe ja auch gerade erst angefangen, und ich bin nicht der schnellste bei solchen Projekten ... :innocent: . Dazu gibt's einfach zu viele schöne Hobbies - und Urlaub kommt auch ab und zu dazwischen :wink: . Bis da was fertig und freigegeben ist wird's noch dauern, und auch noch viel Testerei benötigen.

Jetzt wünsche ich dir erstmal einen schönen Kurzurlaub.
Franz-Peter

1 Like

Moin Franz-Peter,

ich bin jetzt zum ausprobieren kommen und bin begeistert.
Genau gesagt habe ich nur die Dev-Version installiert und die

hinzugefügt und dann alle Situationen durchgespielt. Und es funktioniert exakt wie erwartet ohne Nebeneffekte. Ich bin begeistert!! :smiley:

PS: Ich sollte noch erwähnen, dass ich beigeistert bin!! :wink: :smiling_face_with_three_hearts:

1 Like

Hi Marco,
Das freut mich natürlich sehr, dass es für dich funktioniert. Und vielen Dank für's testen :+1: :+1: Z.Z bin ich jetzt in Urlaub, deshalb die späte Antwort. Danach geht's dann mit der Dev-Version weiter. Bis die als freigegebene Release zur Verfügung steht, wird's aber noch etwas dauern ...
Gruß Franz-Peter

2 Likes