Schrittmotor mit Fernsteuerung bedienen

Hallo an alle Arduino Fans.

Mir liegt schon jahrelang ein Projekt am Herzen, und konnte nun endlich die mechanischen Teile fertigstellen.
Jetzt müsste ich eigentlich nur noch die Steuerung eines Schrittmotors in den Griff bekommen, welche ich versuche mit Eurer Hilfe, mit Arduino zu bewerkstelligen.

Ich bin Anfänger und komme aus dem Maschinenbau. Ich habe also wenig Elektronikkenntnisse, ich konnte aber schon ein ähnliches Arduino Projekt, allerdings mit Servomotor, 1zu1 nachbauen und hoffe, dass mich jemand bei meinem neuen ambitionierten Vorhaben unterstützt.

Vorhaben des Projektes:
Einen verbauten Schrittmotor (Nema 11 Bipolar, 0,67A, 3,8V, 1,8°, 7Ncm) mit einer Kabelgebundenen Fernbedienung steuern. In dieser Fernsteuerung, nicht viel größer als eine TV Fernbedienung, ist die komplette Elektronik und Stromversorgung verbaut:
-Arduino Nano
-Stromversorgung (Akku 7,2V 800mAh)
-Schrittmotor Treiber (derzeit vorhanden
sind Easydriver A3967 oder TMC 2208 v2.0)

  • Display 0.96 inch TFT LCD ST7735 IPS display module 80x160
  • 2Taster und 1 Drehpotti oder Dreh Encoder und ca. 6 LEDs und Ein/Aus Hauptschalter

Soweit so gut.

Gewünschte Funktionsweise:

-Ein/Aus Schalter
-Schrittanzahl-Multiplikator (mittels Drehpoti oder Dreh Encoder) vorwählen
-1x Druck auf Taster1 = 1Schritt/Microschritt (oder Multiplikator) Drehrichtung links
-1x Druck auf Taster2 = 1Schritt/Microschritt (oder Multiplikator) Drehrichtung rechts

Sollte Richtungswechsel sein, dann programmiertes Spiel (zBsp 8 Schritte) dazu addieren.

Wenn kein Tastendruck innerhalb von ca. 3 Sekunden, seit letzten Tastendruck erfolgt ist, dann Schrittmotor Spannungsfrei schalten.

-6 LEDs sollen Multiplikator anzeigen

-Im Display sollen die Schritte angezeigt werden von 0 bis programmiertes Schrittlimit (ca. 15 Umdrehungen) bzw. bei Rechtsdrehung, und 0 bis Minus programmiertes Schrittlimit bei Linksdrehung.

Nicht zwingend notwendig aber wünschenswert, weil ja LEDs vorhanden sind: der Multiplikator-Wert (1×, 10×, 20×, 50×, 100x, 200x)

Weil ich keinen Platz für Endschalter habe sollte sich Arduino den letzten Wert/Position bzw die gefahrene Schritte (Position) merken nach dem Aus-Schalten.

Ein Limit der maximalen Schritte in beiden Richtungen muss auch eingehalten werden, weil eben keine Endschalter sind.

Microschritte wären sehr wünschenswert.

Die Drehgeschwindigkeit, oder Lärm, sind nebensächlich.

Mechanische Prinzip des Projektes:
Es wird eine Gewindespindel über ein Zahnrad mit dem Schrittmotor gedreht, welche dann eine Hubbewegung bis ca. 10mm macht. Die Hubgenauigkeit liegt theoretisch bei ca. max 0,01mm bei einem Tastendruck je nach Schritte bzw Microschritte)
Der Einsatz bzw die Betriebszeit ist nur sehr kurzzeitig, ca 1-5 Minuten.

Ich hoffe ich habe Euer Interesse geweckt mir bei diesem aufwändigen Projekt zu helfen.

Vorrangig wäre natürlich eine Abschätzung ob meine vorhandene Hardware dafür überhaupt geeignet ist, oder nur Wunschdenken eines Anfängers?

Also wäre meine

  1. Frage:
    Sind der Schrittmotor, Arduino, Treiber überhaupt geeignet (kompatibel) um mit einem Akku 7,2V / 800mAh betrieben zu werden?

  2. Frage
    Welchen meiner Treiber wäre für mich Anfänger einfacher zu verkabeln und einzustellen? (Welcher wäre Fehler verzeihbarer?)

  3. Frage
    Gibt es ansatzweise ein ähnliches Projekt, welches nur angepasst werden müsste?

Die nächsten Fragen meinerseits werden wohl folgen???

LG Roland

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden.
Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Zu

  1. Ganz grob geschätzt 10 Minuten. Schrittmotoren benötigen relativ viel Strom und das auch im Stillstand, auch wenn man diesen über den Treiber zeitverzögert ausschalten kann.
  2. Ich kenne beide nicht, tendiere aber zum Easydriver A3967, weil der kleiner ist.
  3. Mir nicht bekannt.

Meine Empfehlung ist die Bibliothek MobaTools mit vielen Beispielen und einer guten Doku. Damit könntest Du starten und ein Gefühl für die Betriebszeit bekommen, denn damit steht oder fällt m. E. Dein Projekt.

Schon mal vielen Dank für deine Antwort.

Wie erwähnt bin ich Anfänger und mir fehlt der grobe Überblick und die Zusammenhänge bzw die Fachbegriffe. Aber ich bin bereit dazu zu lernen.
Ich werde aber jedes noch so kleine Informations"Körnchen" aufpicken, um schlussendlich ans Ziel zu kommen.

Ich werde mir also mal deine vorgeschlagene Bibliothek anschauen.

Bezüglich Hardware bin ich flexibel und auch bereit Geld zu investieren, falls ein anderer Treiber 100% aus eigener Erfahrung geeigneter ist.

LG Roland

Sorry mein Fehler, Anfängerproblem. Ich hab den Überblick übers Forum noch nicht im Kopf.
LG und schönes Wochenende
Roland

1 Like

Da hätte ich mal was zum Einstieg, um zu probieren, wie lange der Akku hält, denn das ist aus meiner Sicht das KO-Kriterium für Dein Projekt.

Mein Display hängt an einem ESP32, die Abweichungen habe ich durch bedingte Compilierung kenntlich gemacht.

Die MobaTools kümmern sich um Stepper und Tastenentprellung, die Adafruit-Bibliothek um das Display. Mein Treiber (DRV8825) ist auf 1/4 Microstep eingestellt, womit man auf 4 * 200 = 800 Schritte je Umdrehung kommt.

Programm
////////// Example 3 for MoToStepper - attaching a bipolar stepper with step/dir and enable ////////////

/*  Example for the control of a bipolar stepper with 4 buttons and a potentiometer ( for the speed ).
    In this example, besides the stepper class (MoToStepper), the classes MoToButtons and MoToTimebase
    are also used.
    The stepper current is switched off, if the stepper is not moving.
    The buttons must switch to Gnd, no resistors are needed.
    Button1: Rotates right as long as the button is pressed and held
    Button2: Rotates left as long as the button is pressed and held
    Button3: One turn to the right
    Button4: One turn to the left
*/

/*  Beispiel für die Ansteuerung eines bipolaren Steppers über 4 Taster und
    ein Poti ( für die Geschwindigkeit )
    In diesem Beispiel werden neben der Stepperklasse (MoToStepper), auch die MoToButtons
    und der MoToTimebase genutzt.
    Der Spulenstrom wird abgeschaltet, wenn der Stepper nicht läuft.
    Die Taster müssen gegen Gnd schalten, es sind keine Widerstände notwendig
    Button1:  Dreht rechts, solange Taster gedrückt
    Button2:  Dreht links, solange Taster gedrückt
    Button3:  1 Umdrehung rechts
    Button4:  1 Umdrehung links
*/

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735
#include <SPI.h>
#define MAX8BUTTONS // spart Speicher, da nur 4 Taster benötigt werden (saves RAM)
#include <MobaTools.h>

#if defined ARDUINO_ARCH_ESP32
const byte TFT_CS       =  5;
const byte TFT_RST      = 14;  // Or set to -1 and connect to Arduino RESET pin
const byte TFT_DC       =  2;

const byte dirPin       = 32;
const byte stepPin      = 33;
const byte enaPin       = 25;
const byte button1Pin   = 26;
const byte button2Pin   = 27;
const byte button3Pin   = 21;
const byte button4Pin   = 22;
const byte potPin       = 35;   // must be an analog input
#else
const byte TFT_CS       = 10;
const byte TFT_RST      =  9;  // Or set to -1 and connect to Arduino RESET pin
const byte TFT_DC       =  8;

const byte dirPin       =  5;
const byte stepPin      =  6;
const byte enaPin       =  7;
const byte button1Pin   = A1;
const byte button2Pin   = A2;
const byte button3Pin   = A3;
const byte button4Pin   = A4;
const byte potPin       = A0;   // must be an analog input
#endif

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

const int STEPS_REVOLUTION = 800;
//Stepper einrichten ( 800 Schritte / Umdrehung - 1/4 Microstep )
MoToStepper myStepper( STEPS_REVOLUTION, STEPDIR );  // 800 Steps/ Umdrehung

// Taster einrichten
enum { Button1 = 0, Button2, Button3, Button4 } ; // Den Tasternamen die Indizes 0...3 zuordnen
const byte buttonPins[] = { button1Pin, button2Pin, button3Pin, button4Pin };    // muss als byte definiert sein, damit ein enfaches sizeof funktioniert
MoToButtons button( buttonPins, sizeof(buttonPins), 20, 500 );

MoToTimebase speedIntervall;    // Zeitinterval zum Auslesen des Speedpotentiometers
// the speed pot ist read only every 'speedintervall' ms

int vspeed = 0;                 //Steppergeschwindigkeit in U/min*10

void setup()
{
  tft.initR(INITR_BLACKTAB);  // Init ST7735S chip, black tab
  tft.setRotation(1);
  tft.fillScreen(ST77XX_BLACK);
  tft.setTextColor(ST77XX_YELLOW);

  myStepper.attach( stepPin, dirPin );
  myStepper.attachEnable( enaPin, 10, LOW );        // Enable Pin aktivieren ( LOW=aktiv )
  myStepper.setSpeed( 200 );
  myStepper.setRampLen( 30 );                       // Rampenlänge
  myStepper.setZero( );
  speedIntervall.setBasetime( 100 );                // 100ms Tickerzeit
}

void loop() {
  button.processButtons();          // Taster einlesen und bearbeiten

  // Speed alle 100ms neu einlesen und setzen
  if ( speedIntervall.tick() ) {
    // wird alle 100ms aufgerufen ( Tickerzeit = 100ms im setup() )
    vspeed = map((analogRead(potPin)), 0, 1023, 20, 1800);  //Poti mappen auf 2 ... 180 Umdr/Min
    //min speed =2 and max speed =180 rpm
    myStepper.setSpeed( vspeed );
    tft.fillScreen(ST77XX_BLACK);
    tft.setCursor(0, 20); tft.print("Geschwindigkeit "); tft.print(vspeed);
    tft.setCursor(0, 40); tft.print("       Schritte "); tft.print(myStepper.readSteps());
  }

  // Drehen rechtsrum
  if (button.pressed(Button1) ) {
    //Taster1 gedrückt
    myStepper.rotate( 1 );          // Stepper dreht vorwärts
  }
  if ( button.released(Button1) ) {
    //Taster1 losgelassen
    myStepper.rotate(0);             // Stepper stoppt
  }

  //Drehen linksrum
  if (button.pressed(Button2) ) {
    //Taster2 gedrückt
    myStepper.rotate( -1 );         // Stepper dreht rückwärts
  }
  if ( button.released(Button2) ) {
    //Taster2 losgelassen
    myStepper.rotate(0);            // Stepper stoppt
  }

  // 1 Umdrehung rechts {
  if (button.pressed(Button3) ) {
    //Taster3 wurde gedrückt
    myStepper.doSteps(STEPS_REVOLUTION);
  }

  // 1 Umdrehung links
  if (button.pressed(Button4) ) {
    //Taster4 wurde gedrückt
    myStepper.doSteps(-STEPS_REVOLUTION);
  }
}

Die Anzeige flimmert, aber für einen ersten Test sollte es genügen.

Viel Erfolg, ich freue mich auf eine Rückmeldung :slightly_smiling_face:

Das freut mich jetzt, denn das wäre genau mein nächster,erster, Schritt gewesen um die Umsetzung des Projektes zu testen.
Eine größere Akkukappazität wäre zwar meinerseits nicht gewünscht, weil schwerer, aber wenn das dann die Lösung wäre, wäre es in gewissem Maße tollerierbar.
Ich hoffe ich komme bald zum testen weil die Wochenenden sind für Familie reserviert.
Lg Roland

Nochmals Hallo.
Verstehe ich es richtig, dass dieses Programm für einen ESP32 ist und für mein Arduino Nano "umgebaut" werden müsste?

Eigentlich gefällt mir dein Projekt sehr gut und würde sogar 1zu 1 auf mich zugeschnitten sein und ich würde mir sehr viel Zeitaufwand damit sparen. 4 Taster und ein Drehzahldreher, eigentlich optimal. Auf die LEDs kann ich gut verzichten.

Wenn dem so ist würde ich mir lieber einen ESP 32 kaufen, denn mit Programmieren bin ich alles andere als fit.

LG Roland

Mein Programm ist für ESP32 UND Nano, das "Umbauen" macht die bedingte Compilierung und die Auswahl des Boards in der IDE:

#if defined ARDUINO_ARCH_ESP32
  // hier für ESP32
#else
  // hier für alle anderen, also auch Nano
#endif

In Deinem Projekt gibt es ein paar Fragezeichen und die flimmernde Anzeige ist auch nicht schön. Aber zunächst ist das größte Fragezeichen die Akkuhaltbarkeit. Also mein Programm auf Deinen Nano und dann den Motor drehen lassen :slightly_smiling_face:

Wie lange hält der Akku und ist das für Dich akzeptabel?

Danke für die Antwort.
Soweit ist alles klar, denke ich, und werde versuchen es Montags umzusetzen.
LG Roland

Beim DRV8825 muß der maximale Strom, der durch den Motor fließen soll, mittels einer Spannung am Poti voreingestellt werden. Eventuell muß das auch bei Deinen Treibern gemacht werden.

Danke für die Info, ich habs mal gelesen wegen der Einstellung, hätte es aber tatsächlich wieder vergessen gehabt.

Muss ich da keine Wiederstände oder Kondensatoren einbauen? Weil du ja geschrieben hast dass durch die Bibliothek keine nötig ist?

Wenn es dir nicht zuviel Arbeit bereitet, wäre natürlich ein Schaltplan äußerst hilfreich. Oder eventuell ein Link.? Ich bin eben kein Elektroniker und da fehlt mir natürlich viel an Basiswissen. Hilfe schadet da nie. Wäre ja schade wenn mein Projekt an einen falschen Wiederstand scheitern würde.

LG Roland

Oder habe ich da was falsch im Kopf? Du hast ja geschrieben, dass die Moba Bibliothek sich ums Prellen kümmert. Da kam mir dann sofort der Anfängergedanke, dass ich dann wohl keine Wiederstände brauche.
LG Roland

Zwei kleine Bitten:

  1. Wenn Du mir auf meinen Beitrag antwortest, sehe ich das schneller in meinem Avatar rechts oben.
  2. Den Widerstand bitte nur mit "i" schreiben, sonst gewöhne ich mir das falsch an.

Die Bibliothek entprellt und verwendet die internen PullUp-Widerstände, weshalb normalerweise keine weiteren Bauteile benötigt werden. Taster schalten dann gegen GND.

Einen Schaltplan kannst Du erstellen, ich schaue da gerne drauf. Papier, Bleistift und Radiergummi genügen.

1 Like

Widerstand, Widerstand, Widerstand.
Ich hoffe ich kanns mir jetzt merken. Rechtschreibfehler mag ich auch nicht, aber ich schreibe nicht oft und nicht viel und Schlampigkeitsfehler/Tipfehler am Handy sind schon lästig genug aber kaum vermeidbar wenn man sich die Zeit zum erneuten Durchlesen nicht nimmt.
LG Roland

Achso, hier muss ich Drücken, damit ich Dir antworte. Bin nicht allzuviel in Foren unterwegs.
LG Roland

Hast Du gut gemacht, bekommst eine Belobigung
:christmas_tree:

Bin gespannt auf Deinen Schaltplan :slightly_smiling_face:

Das ist mein erster Schaltplan der natürlich ans Programm angepasst (Pin Belegung) werden muss. Dazu habe ich aber noch keine Zeit gefunden.
Freue mich auf dein Feedback.
LG Roland

  1. Der Servomotor ist hoffentlich ein Schrittmotor!
  2. Akku an VIN und Motor an 5V vom Nano geht nicht, weil der Längsregler vom Nano dann vermutlich kocht. Wärme = (VAkku - 5 V) * Strom
    Halte den Finger auf den Längsregler. Hat der Finger eine Brandblase, wird er zu heiß. Empfindliche Menschen nutzen ein IR-Thermometer.
    Außerdem ist das nicht effektiv, wertvolle Energie in Wärme zu wandeln. Verwende daher einen StepDown mit Verbindung zum 5V-Pin.
  3. D11 und D12 sind von Hardware-SPI belegt, auch wenn D12 vom Display nicht verwendet wird. D10 sollte CS sein.
  4. Der mittlere Anschluß vom Poti ist am Schleifer, außen 5 V und GND
  5. MS1 und MS2 brauchen noch eine Beschaltung, wenn Du Microschritt verwenden möchtest.

Abgesehen von diesen Kleinigkeiten sieht das doch schon ganz gut aus :slightly_smiling_face: