Schrittmotor per BT ansteuern

Hallo,

versuche einen Schrittmotor per BlueTooth anzusteuern.
BT Sketch und Schrittmotor Sketch klappen, packe ich das zusammen,
klappt es leidern nicht. Bin ratlos

BT Sketch:

#include <SoftwareSerial.h>
 
SoftwareSerial BT(5, 6); 
char a;
 
void setup()  
{
  BT.begin(9600);                    
  BT.println("Hello from Arduino");  
}
 
void loop() 
{
  // if text arrived in from BT serial...
  if (BT.available()){
    a=(BT.read());             
    if (a=='1'){               
      BT.println("send 1");
    } else if (a=='2'){
      BT.println("send 2");
    } else {   
      BT.println("Send '1' or '2'");
    }   
  }
}

Schrittmotor Sketch:

// https://github.com/laurb9/StepperDriver

// stepper 
#include <Arduino.h>
#include "DRV8825.h"
#define MOTOR_STEPS 200
#define DIR 8
#define STEP 9
#define MS1 10
#define MS2 11
#define MS3 12
DRV8825 stepper(MOTOR_STEPS, DIR, STEP, MS1, MS2, MS3);


// -----------------------------------------------------

void setup() {
    stepper.begin(20, 32);
      
}

void loop() 
{
  stepper.rotate(360); 

}

Finales BT / Schrittmotor Sketch:

// https://github.com/laurb9/StepperDriver

// stepper 
#include <Arduino.h>
#include "DRV8825.h"
#define MOTOR_STEPS 200
#define DIR 8
#define STEP 9
#define MS1 10
#define MS2 11
#define MS3 12
DRV8825 stepper(MOTOR_STEPS, DIR, STEP, MS1, MS2, MS3);

// bluetooth hc05
#include <SoftwareSerial.h>
SoftwareSerial BT(5, 6); 
char a; 

// -----------------------------------------------------

int speed_helix=0;

void setup() {
    stepper.begin(speed_helix, 32);
    
    BT.begin(9600);                    
    BT.println("Hello from Arduino");  
}

void loop() 
{
  stepper.rotate(360); 

  if (BT.available()){
    a=(BT.read());             
    if (a=='1'){               
      BT.println("send 1");
      stepper.begin(10, 32); 
    } else if (a=='2'){        
      BT.println("send 2");
      stepper.begin(20, 32);  
    } else {                  
      BT.println("Send '1' or '2'");
      stepper.begin(0, 32);
    }   
  }
}

BT Sketch und Schrittmotor Sketch klappen, packe ich das zusammen,
klappt es leidern nicht.

Was heißt "klapp nicht"
Bitte beschreibe den Fehler genauer.
Grüße Uwe

Hi

stepper-begin brauchst Du 1x ... in setup();
Dann wird die Lib wohl blockierend sein - also der Stepper wird sich 360° drehen, dann vll. kurz hörbar 'knarzen' und sich weiter drehen.

Umschreibe, Was Du willst.
Du möchtest nämlich, daß der Stepper UNABHÄNGIG von der BT-Geschichte läuft - und: Du hast Es erraten: Das geht so nicht.

Du musst sowohl BT wie auch den Stepper IMMER abarbeiten - etwas einfacher wird's mit den MoBaTools, da dort der Stepper 'abgelöst' vom Arduino bearbeitet wird.

MfG

Die Mobs Lib sieht gut aus. Ob die am Ende hilft, weiß ich noch nicht. Am Ende muss ich

1 Schrittmotor
2 Brushless
3 Servo
Und evtl 2 DC Motoren

per BT steuern. Möchte da Schritt für Schritt ran.
Anfangen mit BT und dem Stepper.

Wie bekomme ich es hin bei meinem Sketch, das beide ihre Jobs abarbeiten?

Hi

Ein Stepper sind 2 DigitalOUT (geht auch mit 4), ein Servo oder BLDC je ein PWM.
Die DC-Motoren können von einem bis drei DigitalOut benötigen.

Was Du vorhast, hast Du immer noch nicht beschrieben - also eine Antwort in der Qualität Deines Beitrag:
Mach's richtig.
Vermeide Blockaden
Du musst IMMER ALLES abarbeiten - wenn dort halt Nichts zu tun ist, dann eben nicht - aber nachgeschaut musst Du haben.

Sofern Du die Geheimhaltungsstufe Deines Projekt, nur für mich, lockern kannst, könnten die Hilfen auch zielführender werden.

MfG

ist nix geheim :slight_smile:
anbei eine skizze. soll eine ballauswurf-maschine werden (irgendwann mal)

stepper hängt an einem DRV8825. Mit den MoBa Tools komm ich leider nicht klar. Motor
dreht zwar, aber macht richtig krach.
evtl wird auch der DRV8825 nicht untersützt

#include <MobaTools.h>
byte pinStep = 9;
byte pinDir = 8;

//DRV8825
//#define DIR 8
//#define STEP 9
//#define MS1 10
//#define MS2 11
//#define MS3 12

Stepper4 Nema17(200, A4988);        


void setup() {
  Serial.begin(9600);
  Nema17.attach(pinStep, pinDir);
  Nema17.setSpeed(600);       //  (x)= U/Min
}

void loop() {
 Nema17.rotate(1);
 }

arduino_ttr.png

nochmal ein versuch mit microstepping

funktiniert soweit, aber die angabe der drehzahl erscheint mir nicht plausibel

#include <MobaTools.h>
#include <SoftwareSerial.h>

Stepper4 myStepper(200, A4988);

SoftwareSerial BT(5, 6); 
char a;

void setup()
{
  BT.begin(9600);                    
  BT.println("Hello from Arduino");

  pinMode(10, OUTPUT);
  digitalWrite(10, HIGH);
  pinMode(11, OUTPUT);
  digitalWrite(11, HIGH);
  pinMode(12, OUTPUT);
  digitalWrite(12, HIGH);
  
  myStepper.attach( 9,8 );    // Step und Dir-Pin
  myStepper.setSpeedSteps( 0);
}

void loop()
{
myStepper.rotate(1);
  if (BT.available()){
    a=(BT.read());             
    if (a=='1'){               
      BT.println("send 1");
      myStepper.setSpeedSteps( 10000 );
    } else if (a=='2'){
      BT.println("send 2");
      myStepper.setSpeedSteps( 20000 );
    } else {   
      BT.println("Send '1' or '2'");
      myStepper.setSpeedSteps( 0 );
    }   
  }  
}

und bei
myStepper.setSpeedSteps( 50000 );
scheint schluss zu sein, obwohl der vom gewühlt her, erst bei ca 1-2 Umdr/sek ist.

#include <MobaTools.h>
#include <SoftwareSerial.h>

Stepper4 myStepper(200, A4988); //DRV8825 an Nema17

SoftwareSerial BT(5, 6); 
char a;


void setup()
{

// Bluetooth --------------------------------  
  BT.begin(9600);                    
  BT.println("Hello from Arduino");
// ------------------------------------------

// Microstepping ----------------------------
//  Low   Low   Low   Full step
//  High  Low   Low   Half step
//  Low   High  Low   1/4 step
//  High  High  Low   1/8 step
//  Low   Low   High  1/16 step
//  High  Low   High  1/32 step
//  Low   High  High  1/32 step
//  High  High  High  1/32 step

  pinMode(10, OUTPUT);
  digitalWrite(10, HIGH);
  pinMode(11, OUTPUT);
  digitalWrite(11, HIGH);
  pinMode(12, OUTPUT);
  digitalWrite(12, HIGH);
// ------------------------------------------

// Schrittmotor / MoBa Tool -----------------
  myStepper.attach( 9,8 );    // Step, Dir-Pin
  myStepper.setSpeedSteps( 0 );
// ------------------------------------------

}

void loop()
{
myStepper.rotate(1);
  if (BT.available()){
    a=(BT.read());             
    if (a=='1'){               
      BT.println("send 1");
      myStepper.setSpeedSteps( 5000 );
    } else if (a=='2'){
      BT.println("send 2");
      myStepper.setSpeedSteps( 10000 );
    } else if (a=='3'){
      BT.println("send 3");
      myStepper.setSpeedSteps( 20000 );
    } else if (a=='4'){
      BT.println("send 4");
      myStepper.setSpeedSteps( 30000 ); 
    } else if (a=='5'){
      BT.println("send 5");
      myStepper.setSpeedSteps( 40000 ); 
    } else if (a=='6'){
      BT.println("send 6");
      myStepper.setSpeedSteps( 50000 ); 
    } else if (a=='7'){
      BT.println("send 7");
      myStepper.setSpeedSteps( 60000 ); 
    } else if (a=='8'){
      BT.println("send 8");
      myStepper.setSpeedSteps( 70000 );                              
    } else {   
      BT.println("Send '1' to '8'");
      myStepper.setSpeedSteps( 0 );
    }   
  }  
}

Hallo,
vielleicht mal ein paar Bemerkungen zu den MobaTools, damit man besser versteht wie sie arbeiten. Dann kann man auch die Methoden sinnvoller einsetzen :wink: .

Steppermotore sind ja eigentlich nicht so sehr zum endlosen Drehen gedacht. sondern eher zum Positionieren. Man gibt also an, wohin sich der Motor bewegen soll, und dort bleibt er dann von alleine stehen. Das ist auch die Grundidee der Stepper4-Klasse. Die eigentlich Bewegung des Motors wird im Hintergrund per Timerinterrupts gesteuert, da muss man sich im loop() nicht drum kümmern. Den Startbefehl für einen Bewegung löst man also nur 1x aus, dann bewegt sich der Motor, ohne dass im Sketch weiter etwas gemacht werden muss.

Der Motor hält an, wenn er sein Ziel erreicht hat. Stoppen, indem die Geschwindigkeit auf 0 gesetzt wird ist nicht vorgesehen. Mit rotate(1) hat man allerdings kein Ziel vorgegeben ( bzw es in weite Ferne gerückt ) ). Wenn man ihn nun stoppen will, muss das Ziel wieder 'herangeholt' werden. Das geht z.B. mit rotate(0). Damit wird das Ziel so gesetzt, dass er das mit der momentan aktiven Rampe genau erreicht - der Bremsvorgang wird also unmittelbar mit diesem Befehl ausgelöst ( ohne Rampe bleibt er sofort stehen ).
Die eingestellte Geschwindigkeit muss dazu nicht verändert werden. Soll der Motor wieder drehen gibt man ein neues Ziel vor - dann läuft er wieder mit der eingestellten Geschwindigkeit.

All diese Aufrufe sollten im loop nicht ständig wiederholt werden, sondern nur jeweilig einmal zur Änderung des Motorzustands.
Edit: bei Dir also z.B. nur wenn ein BT-Befehl empfangen wurde.
Im setup() kannst Du eine 'Startgeschwindigkeit' einstellen. Aber bevor Du einen Ziel-Befehl ( also z.B. auch das rotate(1) ) eingibst, bewegt sich Motor nicht. setSpeedSteps(0) ist grundsätzlich sinnlos ( wird intern zu setSpeedSteps(1) gewandelt ). Soll sich der Motor beim Start sofort drehen, gehört das rotate(1) ins setup().

Zur Geschwindigkeit: Wenn man mit setSpeed die Umdrehungsgeschwindigkeit einstellt, funktioniert das nur, wenn bei der Instanziierung auch die richtige Zahl von Steps/Umdrehung angegeben wurde - und zwar unter Berücksichtigung der am Treiber eingestellten Microsteps. Bei z.B. 1/8 Microsteps wären das hier z.B. 1600 Steps/Umdr. Außerdem ist zu beachten, dass da ein Faktor 10 im Aufurf steckt. wird '600' übergeben, bedeutet das 60,0 Umdr/Min.
Bei Verwendung von setSpeedSteps ist das natürlich irrelevant, da hier direkt die Steprate gesetzt wird.

Zur maximalen Geschwindigkeit: Stepper sind in der Regel nicht als Schnellläufer vorgesehen. Auch ist der AVR im Arduino kein Hochleistungsprozessor. Die maximale Steprate beträgt in der aktuellen MobaToolsversion 2500 Step/sec ( = setSpeedSteps( 25000 ); ). Die MobaTools können ja auch mehrere Stepper mit diesem Tempo gleichzeitig ansteuern, und wenn man dann auch noch gleichzeitig Servos ansteuert, ist der Prozessor da schon gut ausgelastet ( er soll ja evtl. auch noch was anderes machen … ).
Man kann das gegebenenfalls durch Ändern eines #defines in der .h-Datei bis zu 5000Steps/sec tunen, wenn man nur wenig Motore ansteuert. Dann ist aber Ende der Fahnenstange.

Ich hoffe damit etwas Licht ins Dunkel gebracht zu haben. Bei weiteren Unklarheiten - einfach fragen.

Nochmal Edit: Welchen Stepper setzt du denn ein? Bei hohen Stepraten solltest Du an Rampen denken. Sonst haben da viele Stepper Probleme.

Danke für dein Feedback, hat etwas Licht ins Dunkle gebracht.
Ich teste noch etwas rum, es ist im übrigen ein Nema17
mit Drv8825

Hi

Nema17 sagt ungefähr so viel wie 'Fiat'.
Nema17 ist das Lochbild - ok, wird schmächtiger als ein Nema23 sein, aber ob 1,2A oder 1,8A ... ob strom- oder spannungsgesteuert - auch hier ist Beides möglich - Ersteres ist normal vorzuziehen.

MfG

Wie der postmaster schon schreibt - Nema17 sagt nur was über die mechanischen Abmessungen.

Etwas genauere Daten über die elektrischen Eigenschaften wäre schon gut - am Besten natürlich ein Link zum Datenblatt. Hast Du die Stromeinstellung am DRV8825 auch entsprechend gemacht? Das ist auch entscheidend für die Laufeigenschaften.

Moin
Es sind diese hier

MVPOWER Schrittmotor 5 PCs Stepper Motor 1.5A 2 Phase-4 Draht Stepping Motor für 3D Drucker Printer 1.8 ° https://www.amazon.de/dp/B07CZHLKTC/ref=cm_sw_r_cp_apa_i_eT8TDbHB699AQ

Treiber sind eingestellt, 0.65V

Gruß