Probleme mit dem Schrittmotor

Ich versuche einen Schrittmotor mit einem HC-05 über eine App (mit App inventor) zu steuern. Ich kann mich zwar mit dem BT-Modul verbinden. Drücke ich jedoch auf ON damit sich der Motor dreht ändert sich nur die Position der blinkenden LEDs D1 bis D4 auf dem Motortreiber. Was ist mein Fehler?

image
image
image

Hallo philipp1, Herzlich willkommen im Arduino-Forum, bitte poste deinen sketch in code-Tags und nicht als Bild, denn ich kann kein Bild in meine Arduino reinladen um den Code zu testen und abtippen aus einem foto, auf dem ich kaum was erkennen kann ist mir nun echt zu mühsam, sorry., Du lädtst Deinen Code ja auch nicht als Handyfoto in deinen Arduino rein.. dann sage uns auch noch welche Hardware, also welches Board und welchen Stepper du benutzt, bitte mache auch ein scharfes Foto von Deinem Aufbau, also eines, auf dem auch was zu erkennen ist, ohne dass ich mein Mikroskop an den Bildschirm montieren muss. Wenn Dein Fotovom Aufbau scharf genug ist, können wir vlt. auch erkennen , wo das Problem liegt.

Okay danke für den Hinweis ^^
<#include <SoftwareSerial.h>
#include <Stepper.h>

// Definieren der Pins für die Verbindung zum Bluetooth-Modul
#define BT_RX_PIN 1
#define BT_TX_PIN 0

// Definiere die Anschlüsse des Schrittmotors
#define IN1 11
#define IN2 10
#define IN3 9
#define IN4 8

// Erstellen eines SoftwareSerial-Objekts für die Kommunikation mit dem Bluetooth-Modul
SoftwareSerial bluetooth(BT_RX_PIN, BT_TX_PIN);

// Konfiguriere den Schrittmotor
const int stepsPerRevolution = 2048; // Schritte pro Umdrehung des Motors
Stepper myStepper(stepsPerRevolution, IN1, IN2, IN3, IN4);

void setup() {
// Öffnen der seriellen Verbindung für die Kommunikation mit dem Computer
Serial.begin(9600);

// Öffnen der seriellen Verbindung für die Kommunikation mit dem Bluetooth-Modul
bluetooth.begin(9600);

// Setze die Geschwindigkeit des Schrittmotors in Umdrehungen pro Minute (UPM)
myStepper.setSpeed(30); // Experimentiere mit verschiedenen Werten für die Geschwindigkeit
myStepper.step(0);

// Warten, bis das Bluetooth-Modul initialisiert ist
delay(1000);
}

void loop() {
// Überprüfen, ob Daten von der seriellen Verbindung des Computers empfangen wurden
if (Serial.available()) {
// Lesen der empfangenen Daten von der seriellen Schnittstelle des Computers
char dataToSend = Serial.read();

Serial.println(dataToSend);

// Senden der Daten an das Bluetooth-Modul
bluetooth.write(dataToSend);

}

// Überprüfen, ob Daten vom Bluetooth-Modul empfangen wurden
if (bluetooth.available()) {
// Lesen der empfangenen Daten vom Bluetooth-Modul
char command = bluetooth.read();

// Wenn der Befehl '1' ist, schalte den Motor ein
if (command == '1') {
  // Drehe den Motor um 360 Grad im Uhrzeigersinn
  myStepper.step(2048);
  delay(5); // Warte für 1 Sekunde
}

// Wenn der Befehl '0' ist, schalte den Motor aus
else if (command == '0') {
  // Setze den Motor auf Ruhezustand
  myStepper.step(0);
  delay(5); // Warte für 1 Sekunde
}

}

}/>



Hoffe das mit der Verkabelung ist grob erkennbar. Der Motortreiber ist ein ULN2003 und das BT-Modul ein HC-05

Das kann so nicht funktionieren. Du definierst für BT den RX_PIN 1 und den TX_PIN 0, Aber: Pin 0 und Pin 1 sind auf dem Uno (unt auch auf dem Nano sowie ich glaub auch auf dem Mega für SERIAL im gebrauch. Du darfst diese 2 Pins nicht für softserial, also dein BlueTooth Serial benutzen. Du kannst dein HC05 auf die Pins 2 und 3 anschliessen und diese 2 Pins als BT_RX_PIN und BT_TX_PIN definieren. das must Du zuallererst machen. den rest deines Skeches schaue ich mir an, um zu schauen, ob es noch andere Probleme gibt. Ich baue Deine Steppersteuerung nach und teste es.

Edit: hier mal eine korrigierte version Deines Skeches, Probiere es so mal aus. Ich habe Dir die geänderten Stellen komentiert. die Pins für das HC05 habe ich Dir auch schon geändert statt 0 und 1 hab ich 2 und 3 genommen. musst natürlich das Modul noch umstecken.

hier Dein korrigierter Sketch:


```cpp
#include <SoftwareSerial.h>
#include <Stepper.h>

// Definieren der Pins für die Verbindung zum Bluetooth-Modul
// Hier habe ich dier die PINs für das Bluetooth Modul angepasst, du musst
// natürlich auch dein Modul an diese Pins anschliessen.
#define BT_RX_PIN 3
#define BT_TX_PIN 2

// Definiere die Anschlüsse des Schrittmotors
// hier musste ich die zuweisungen ändern. sonst hat der Motor keine Kraft. 
// sollte jetzt Dein motor falsch herum drehen, dann wähle folgende Reihenfolge:
// IN1 auf 11 , IN2 auf 9 , IN3 auf 10 , IN4 auf 8
#define IN1 8
#define IN2 10
#define IN3 9
#define IN4 11

// Erstellen eines SoftwareSerial-Objekts für die Kommunikation mit dem Bluetooth-Modul
SoftwareSerial bluetooth(BT_RX_PIN, BT_TX_PIN);

// Konfiguriere den Schrittmotor
const int stepsPerRevolution = 2048;  // Schritte pro Umdrehung des Motors
Stepper myStepper(stepsPerRevolution, IN1, IN2, IN3, IN4);
char command = '1';
void setup() {
  // Öffnen der seriellen Verbindung für die Kommunikation mit dem Computer
  Serial.begin(9600);
  // Öffnen der seriellen Verbindung für die Kommunikation mit dem Bluetooth-Modul
  bluetooth.begin(9600);

  // Setze die Geschwindigkeit des Schrittmotors in Umdrehungen pro Minute (UPM)
  myStepper.setSpeed(16);  // Experimentiere mit verschiedenen Werten für die Geschwindigkeit
  // Hier war Dein Fehler, dass der Wert von 30 zu hoch ist für Deinen Motor, 
  // da kann er nicht mehr anlaufen und bleibt einfach stehen 
  // 16 ist das maximum dass dieser motor bei 5 Volt zum anlaufen schafft ohne schritte
  // zu verlieren.
  myStepper.step(0);

  // Warten, bis das Bluetooth-Modul initialisiert ist
  delay(1000);
}

void loop() {
  // Überprüfen, ob Daten von der seriellen Verbindung des Computers empfangen wurden
  if (Serial.available()) {
    // Lesen der empfangenen Daten von der seriellen Schnittstelle des Computers
    char dataToSend = Serial.read();

    Serial.println(dataToSend);

    // Senden der Daten an das Bluetooth-Modul
    bluetooth.write(dataToSend);
  }

  // Überprüfen, ob Daten vom Bluetooth-Modul empfangen wurden
  if (bluetooth.available()) {
    // Lesen der empfangenen Daten vom Bluetooth-Modul
    char command = bluetooth.read();

    // Wenn der Befehl '1' ist, schalte den Motor ein
    if (command == '1') {
      // Drehe den Motor um 360 Grad im Uhrzeigersinn
      myStepper.step(2048);
      delay(5);  // Warte für 1 Sekunde
    }

    // Wenn der Befehl '0' ist, schalte den Motor aus
    else if (command == '0') {
      // Setze den Motor auf Ruhezustand
      myStepper.step(0);
      delay(5);  // Warte für 1 Sekunde
    }
  }
}

den Bluetooth teil kann ich so grad nicht real testen, da mein Handydisplay zurzeit defekt ist und ich erst morgen oder am Mitwoch das neue Display bekomme. ich bin mir auch nicht ganz sicher, ob ich noch ein funktionierendes HC05 da habe.
Nachtrag: der Motor läuft jedoch in dieser geänderten Konfiguration, das konnte ich testen.
LG Stefan

Also ich habe es so abgeändert wie du, nur leider leuchtet noch nicht mal mehr der Motortreiber. Wahrscheinlich liegt das Problem noch woanders.

OK , lass mal alles so angeschlossen, wie es ist, falls Du das wirklich nach meinem Sketch angeschlossen hast. Ich hänge Dir hier einen Test-Sketch an, bei dem nur der Motor eine Umdrehung macht, stoppt. 3 sekunden wartet und wieder eine Umdrehung macht.Wenn du alles so wie ichs dir im vorherigen Sketch beschrieben habe angeschlossen hast, MUSS der treiber die LEDs leuchten lassen und der Motor muss drehen, sonst hast Du etwas falsch angeschlossen oder ein Kabel steckt nicht korrekt.

// Definiere die Anschlüsse des Schrittmotors
// hier musste ich die zuweisungen ändern. sonst hat der Motor keine Kraft. 
// sollte jetzt Dein motor falsch herum drehen, dann wähle folgende Reihenfolge:
// IN1 auf 11 , IN2 auf 9 , IN3 auf 10 , IN4 auf 8
#define IN1 8
#define IN2 10
#define IN3 9
#define IN4 11

// Erstellen eines SoftwareSerial-Objekts für die Kommunikation mit dem Bluetooth-Modul
SoftwareSerial bluetooth(BT_RX_PIN, BT_TX_PIN);

// Konfiguriere den Schrittmotor
const int stepsPerRevolution = 2048;  // Schritte pro Umdrehung des Motors
Stepper myStepper(stepsPerRevolution, IN1, IN2, IN3, IN4);
char command = '1';
void setup() {
  // Öffnen der seriellen Verbindung für die Kommunikation mit dem Computer
  Serial.begin(9600);
  // Öffnen der seriellen Verbindung für die Kommunikation mit dem Bluetooth-Modul
  bluetooth.begin(9600);

  // Setze die Geschwindigkeit des Schrittmotors in Umdrehungen pro Minute (UPM)
  myStepper.setSpeed(16);  // Experimentiere mit verschiedenen Werten für die Geschwindigkeit
  // Hier war Dein Fehler, dass der Wert von 30 zu hoch ist für Deinen Motor, 
  // da kann er nicht mehr anlaufen und bleibt einfach stehen 
  // 16 ist das maximum dass dieser motor bei 5 Volt zum anlaufen schafft ohne schritte
  // zu verlieren.
  myStepper.step(0);

  // Warten, bis das Bluetooth-Modul initialisiert ist
  delay(1000);
}

void loop() {
  // Überprüfen, ob Daten von der seriellen Verbindung des Computers empfangen wurden
  /*if (Serial.available()) {
    // Lesen der empfangenen Daten von der seriellen Schnittstelle des Computers
    char dataToSend = Serial.read();

    Serial.println(dataToSend);

    // Senden der Daten an das Bluetooth-Modul
    bluetooth.write(dataToSend);
  }
*/
  // Überprüfen, ob Daten vom Bluetooth-Modul empfangen wurden
  //if (bluetooth.available()) {
    // Lesen der empfangenen Daten vom Bluetooth-Modul
    // char command = bluetooth.read();

    // Wenn der Befehl '1' ist, schalte den Motor ein
    if (command == '1') {
      // Drehe den Motor um 360 Grad im Uhrzeigersinn
      myStepper.step(2048);
      delay(3000);  // Warte für 3 Sekunden
    }

    // Wenn der Befehl '0' ist, schalte den Motor aus
    else if (command == '0') {
      // Setze den Motor auf Ruhezustand
      myStepper.step(0);
      delay(5);  // Warte für 1 Sekunde
    }
  //}
}

Es ist der gleiche sketch wie vorhin, nur habe ich die Bluetooth auswertung gesperrt und gebe dem Motor einfach direkt den Startbefehl. Teste das, so muss der Motor laufen, sonst stimmt etwas an deiner verkabelung nicht. evt. ein kabel rausgerutscht. Wenn am treiber gar keine LED leuchtet, ist evt. das GND oder VCC (5V) nicht korrekt angeschlossen.

Jetzt leuchtet der Treiber, jedoch brummt der Motor nur anstatt sich zu bewegen. Verkabelung müsste eigentlich passen. Hab auch geschaut das alles feststeckt.


Nachtrag: TX und RX waren auch in 2 und 3 eingesteckt, ist nur auf dem Bild falsch

Ok Tausche mal die 2 Kabel am Treiber an IN2 und IN3 gegeneinander, Also das Kabel an IN2 kommt an IN3 und das Kabel an IN3 kommt an IN2 und gib mir Bescheid, ob dein Motor jetzt läuft.

Tatsächlich jetzt funktioniert er, aber warum? IN2 wurde ja für 10 und IN3 für 9 definiert. Warum sollte ich sie tauschen jetzt ist IN2 in 9 und IN3 in 10, also anders als definiert. Wieso klappt es jetzt?

Das kommt darauf an, wie die Spulen in Dinem motor auf den Stecker herausgeführt sind. wenn die da beim Konfektionieren des Kabels 2 drähte vertauscht haben (es gibt da ja 2 orangene Drähte) dann wird der Motor fals angesteuert und es tut sich entweder gar nichts, oder er brummt und läuft eben nicht. dass er Brummt bedeutet, das er zwar strom bekommt, aber die Schrittfolge nicht stimmt. Die motorspulen arbeiten dann im Prinzip gegeneinander, die Eine will den Rotor linksherum bewegen , und die Andere rechtsherum, dann Brummt der Motor eben nur noch, eil er sich ja nicht in 2 verschiedene Richtungen gleichzeitig drehen kann. Bei Steppermotoren gibt es das immer wieder mal, dass einer falsch oder eben anders auf dem Anschlussstecker angeordnet ist. Dann muss man entweder in der Software die Pinzuordnung ändern, oder eben am Motor, oder auch wie heir am Treiber 2 Phasen tauschen. Meine 3 Motoren die ich da habe, drehen alle korrekt mit der Reihenfolge di ich dir empfohlen habe, ich habe aber auch einen im Einsatz der läuft mit dieser Konfiguration nicht so wie Deiner.

Nachdem nun Dein Motor läuft, kannst du Den ja so gesteckt lassen, und den anderen Sketch wieder aufspielen, dann schauen wir uns noch die Buetooth Geschichte zusammen an.

Vielen Dank für die Hilfe. Ich hab es bereits mit dem bluetooth sketch kombiniert. Der Motor hat sich allerdings erst gedreht als ich die Pins 0 und 1 statt 2 und 3 verwendet habe. Jedenfalls wenn ich den ON-Button in der App drücke dreht sich der Motor um 360 Grad. Das einzige Problem was ich jetzt noch habe ist, dass wenn ich den OFF-Button drücke der Motor sich dennoch weiterdreht anstatt anzuhalten. Über den OFF-Button soll ja eine 0 gesendet werden.

<#include <SoftwareSerial.h>
#include <Stepper.h>

// Definieren der Pins für die Verbindung zum Bluetooth-Modul
#define BT_RX_PIN 1
#define BT_TX_PIN 0

// Definiere die Anschlüsse des Schrittmotors
#define IN1 8
#define IN2 10
#define IN3 9
#define IN4 11

// Erstellen eines SoftwareSerial-Objekts für die Kommunikation mit dem Bluetooth-Modul
SoftwareSerial bluetooth(BT_RX_PIN, BT_TX_PIN);

// Konfiguriere den Schrittmotor
const int stepsPerRevolution = 2048; // Schritte pro Umdrehung des Motors
Stepper myStepper(stepsPerRevolution, IN1, IN2, IN3, IN4);

void setup() {
// Öffnen der seriellen Verbindung für die Kommunikation mit dem Computer
Serial.begin(9600);

// Öffnen der seriellen Verbindung für die Kommunikation mit dem Bluetooth-Modul
bluetooth.begin(9600);

// Setze die Geschwindigkeit des Schrittmotors in Umdrehungen pro Minute (UPM)
myStepper.setSpeed(16); // Experimentiere mit verschiedenen Werten für die Geschwindigkeit
myStepper.step(0);

char command = '1';

// Warten, bis das Bluetooth-Modul initialisiert ist
delay(1000);
}

void loop() {
// Überprüfen, ob Daten von der seriellen Verbindung des Computers empfangen wurden
if (Serial.available()) {
// Lesen der empfangenen Daten von der seriellen Schnittstelle des Computers
char dataToSend = Serial.read();

Serial.println(dataToSend);

// Senden der Daten an das Bluetooth-Modul
bluetooth.write(dataToSend);

}

// Überprüfen, ob Daten vom Bluetooth-Modul empfangen wurden
if (bluetooth.available()) {
// Lesen der empfangenen Daten vom Bluetooth-Modul
char command = bluetooth.read();

// Wenn der Befehl '1' ist, schalte den Motor ein
if (command == '1') {
  // Drehe den Motor um 360 Grad im Uhrzeigersinn
  myStepper.step(2048);
  delay(5); // Warte für 1 Sekunde
}

// Wenn der Befehl '0' ist, schalte den Motor aus
else if (command == '0') {
  // Setze den Motor auf Ruhezustand
  myStepper.step(0);
  delay(5); // Warte für 1 Sekunde
}

}

}
/>

Dann hast Du noch etwas anderes falsch gemacht. Auf einem UNO darfst Du die Pins 0/1 nicht für SoftwareSerial verwenden.

Bitte denke beim posten von Code an die Code-Tags, wie schon von @Deltaflyer in Post #2 angemerkt. Nicht nur dass man ihn dann besser lesen kann. Ohne die Codetags kann der Code auch verstümmelt werden, weil die Forumssoftware dann Codeteile als Formatierungszeichen missinterpretiert.
Du solltes auch dieses lesen:

Hattest Du das Bluetooth modul richtig an Pin 3 und 2 angeschlossen? also den RX vom HC05 an Pin 2 vom Uno und den TX vom HC05 an Pin 3 vom Uno? Und hast Du auch den Spannungsteiler 1Kohm/2Kohm am RX-Eingang vom HC05? diser Eingang verträgt nämlic nut 3.3V Signalspannung steht in der Regel auch hinten auf dem Modul drauf. Ich hab solche Module schon verbaut, die laufen auch auf anderen pins. wie gesagt, Pin 0 und Pin 1 vom uno sollst du nicht für Software-Serial nutzen, besonders nicht weiin du gleichzeitig die Hardware Serial aktiviert hast.
wegen dem Motor ist ganz klat, warum der nicht stoppt: du gibst ihm die Anweisung, wenn eine '1' über Bluetooth kommt, soll er 2048 schritte ausführen, und das macht der Motor auch komplett, wenn Du ihn gestartet hast. erst danach stoppt er oder ist bereit , eine andere Anweisung auszuführen. Wenn Du den Motor durch senden von '0' jederzeit stoppen willst, must Du die Anweisung 'eine Umdrehung ausführen' umschreiben, sodass der Motor, wenn aktiviert, in jedem Loopdurchgang nur einen schritt macht, und dies mitzählt. und sobald 2048 schritte erreicht sind, ODER eine '0' gesendet wird, den motor stoppen und den schrittzähler wieder auf 0 setzen.
Kannst Du das alleine oder soll ich dir das schreiben?

Es wäre nett wenn du mir das schreiben könntest. Bin Neuling und daher hätte ich jetzt keine Ahnung wie ich da rangehen soll.

Die stepper.h ist eine sehr einfache Stepper-Lib, mit der das, was Du vorhast nur schlecht zu realisieren ist. Ein Alternative wäre meine MobaTools lib. Da werden die Stepimpulse 'im HIntergrund' erzeugt, und Du kannst im loop() während der Motor läuft anderes machen, und auch den Motor jederzeit anhalten. Die Lib enthält auch einige Beispiele für die Ansteuerung dieses kleinen Steppers.

Ok ich mach Dir das Heute noch fertig mit der korekten steuerung des Motors. Du musst mir aber bis abends zeit geben, bin grad noch mit was anderem beschäftigt, das ich erst fertig machen muss. ich mach dir das aber dfinitv, sofern nicht bis am abend jemans anders das schon gemacht hat. Ich hab Deinen Sketch noch in der IDE offen.
LG Stefan

Ja, und Deine MoBaTools sind wirklich mächtig. ich will philipp aber auch gerne den Weg zu Fuss , also mit der Stepper lib, mit der er begonnen hat, aufzeigen. In der Hoffnung, dass er lernen kann, wie sowas geht, ohne fertige lib die alle Funktionen schon fix und fertig anbietet.

Hallo phillip, was soll geschehen, wenn der Motor 1 Umdrehung gemacht hat, und Du nicht auf 'OFF' drückst? soll dann der Motor weiterlaufen , oder soll er stoppen?

Wenn man OFF nicht drückt soll er weiter laufen