INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Schrittmotor bewegt sich nicht
30.11.2020, 22:15 (Dieser Beitrag wurde zuletzt bearbeitet: 30.11.2020 22:17 von MicroBahner.)
Beitrag #65
RE: Schrittmotor bewegt sich nicht
(30.11.2020 21:55)DerMaschbaustudent schrieb:  da ich ja keine Zustände nacheinander durchlaufen lasse
Dann denke mal an die Abläufe an deiner Maschine - erstmal noch ganz unabhängig vom Programmieren:
- Maschine ist in Ruhe und steht. ( ist ein Zustand )
--> Es wird ein knopf gedrückt
- Motor läuft vorwärts ( ist ein Zustand )
--> Motor hat Ziel erreicht
--> Sensor meldet hohen Druck ??
- Motor läuft zurück ( ist ein Zustand )
.....

Da ich nicht weis, was da alles in welcher Reihenfolge und aufgrund welcher Ereignisse ablaufen soll kann ich das nicht im Detail aufschreiben, dass musst Du schon machen. Aber deine Maschine ist definitv eine FSM - und diese Abläufe musst Du erstmal genau definieren. Und dann muss/kann sich das auch in der Software wiederspiegeln.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.11.2020, 22:22
Beitrag #66
RE: Schrittmotor bewegt sich nicht
(30.11.2020 22:15)MicroBahner schrieb:  
(30.11.2020 21:55)DerMaschbaustudent schrieb:  da ich ja keine Zustände nacheinander durchlaufen lasse
Dann denke mal an die Abläufe an deiner Maschine - erstmal noch ganz unabhängig vom Programmieren:
- Maschine ist in Ruhe und steht.
--> Es wird ein knopf gedrückt
- Motor läuft vorwärts
--> Motor hat Ziel erreicht
--> Sensor meldet hohen Druck ??
- Motor läuft zurück
.....

Da ich nicht weis, was da alles in welcher Reihenfolge und aufgrund welcher Ereignisse ablaufen soll kann ich das nicht im Detail aufschreiben, dass musst Du schon machen. Aber deine Maschine ist definitv eine FSM - und diese Abläufe musst Du erstmal genau definieren. Und dann muss/kann sich das auch in der Software wiederspiegeln.

Ah okay

Der allererste Part des Programmablaufs ist die Kalibrierung der Waage. Das befindet sich aber nicht im eigentlichen Loop.

Der Zustand soll sein, dass der Sensor nur Werte ausgibt, während der Motor in Bwegung ist. Der ganze Zustand soll durch den Knoopfdruck gesartet werden.


Also
1. Knopfdruck
2. Motor verfährt nach unten bis zum tiefsten Punkt und währenddessen zeichnet Sensor Werte auf.
3. Motor verfährt nach oben bis zum höchsten Punkt undwährenddessen zeichnet Sensor Werte auf.
4. Sobald Motor wieder in Ausgangslage soll die Ausgabe der Sensorwerte beendet werden.


Mit freundlichen Grüßen,

Maxi
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.12.2020, 10:58
Beitrag #67
RE: Schrittmotor bewegt sich nicht
Hallo Maxi,
mal ein grobes Gerüst für deine FSM:

Code:
#include <MobaTools.h>

const byte dirPin1    = 5;
const byte stepPin1   = 6;
const byte enaPin1    = 7;
const byte dirPin2    = 8;
const byte stepPin2   = 9;
const byte enaPin2    = 12;

const byte  taster           = A0;
boolean tasterstatus     = false;
                           ;
MoToStepper myStepper1 (3200, STEPDIR);
MoToStepper myStepper2 (3200, STEPDIR);
MoToTimer sensTime;     // Zeit um Sensor auszulessen
const int SENSINTERVALL = 100;  // alle 100ms

enum states_t : byte { WARTEN, VORWAERTS, RUECKWAERTS };
states_t zustand;

void readSensor() {
  // Sensor auslesen und aufzeichnen
  // Dummy-Funktion
  static int sensIx;
  if ( !sensTime.running() ) {
    // es ist Zeit,dem Sensor auszulesen
    sensTime.setTime( SENSINTERVALL );
    Serial.print("readSensor: "); Serial.println(sensIx++);
  }
}
void setup() {  // put your setup code here, to run once:
  Serial.begin(115200);
  while(!Serial);       // nötig für Micro/Leonardo
  myStepper1.attach (stepPin1, dirPin1);
  myStepper2.attach (stepPin2, dirPin2);
  myStepper1.setSpeed (20);
  myStepper2.setSpeed (20);
  pinMode (enaPin1, OUTPUT);
  pinMode (enaPin2, OUTPUT);
  pinMode (taster,  INPUT_PULLUP);
  digitalWrite( enaPin1 , LOW);
  digitalWrite( enaPin2 , LOW);
  Serial.println("Starten...");
}


void loop() {
  tasterstatus = !digitalRead(taster);
  switch ( zustand ) {
    case WARTEN:        // Warten auf den Tastendruck zum Starten
      if (tasterstatus == HIGH) {
        Serial.println("Taste gedrückt -> Vorwärts");
        myStepper1.write (-90);
        myStepper2.write (-90);
        zustand = VORWAERTS;
      }
      break;
    case VORWAERTS:     // Motore laufen vorwärts, Sensor auslesen
      readSensor();
      if ( !myStepper1.moving() && !myStepper2.moving() ) {
        // Beide Stepper haben Endpunkt erreicht, zurück
        Serial.println("Endpunkt erreicht -> zurück");
        myStepper1.write (0);
        myStepper2.write (0);
        zustand = RUECKWAERTS;
      }
      break;
    case RUECKWAERTS:
      readSensor();
      if ( !myStepper1.moving() && !myStepper2.moving() ) {
        // Beide Stepper haben Startpunkt wieder erreicht, Ende
        Serial.println("Fertig, wieder auf Taste warten");
        myStepper1.write (0);
        myStepper2.write (0);
        zustand = WARTEN;
      }
      break;

  }
}
(Die Pins habe ich auf meine HW angepasst, und der Taster schaltet bei mir nach Gnd )

Sollen immer beide Motore parallel laufen, oder werden die Abläufe später noch erweitert?

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.12.2020, 12:13 (Dieser Beitrag wurde zuletzt bearbeitet: 01.12.2020 12:18 von DerMaschbaustudent.)
Beitrag #68
RE: Schrittmotor bewegt sich nicht
(01.12.2020 10:58)MicroBahner schrieb:  Hallo Maxi,
mal ein grobes Gerüst für deine FSM:

Code:
#include <MobaTools.h>

const byte dirPin1    = 5;
const byte stepPin1   = 6;
const byte enaPin1    = 7;
const byte dirPin2    = 8;
const byte stepPin2   = 9;
const byte enaPin2    = 12;

const byte  taster           = A0;
boolean tasterstatus     = false;
                           ;
MoToStepper myStepper1 (3200, STEPDIR);
MoToStepper myStepper2 (3200, STEPDIR);
MoToTimer sensTime;     // Zeit um Sensor auszulessen
const int SENSINTERVALL = 100;  // alle 100ms

enum states_t : byte { WARTEN, VORWAERTS, RUECKWAERTS };
states_t zustand;

void readSensor() {
  // Sensor auslesen und aufzeichnen
  // Dummy-Funktion
  static int sensIx;
  if ( !sensTime.running() ) {
    // es ist Zeit,dem Sensor auszulesen
    sensTime.setTime( SENSINTERVALL );
    Serial.print("readSensor: "); Serial.println(sensIx++);
  }
}
void setup() {  // put your setup code here, to run once:
  Serial.begin(115200);
  while(!Serial);       // nötig für Micro/Leonardo
  myStepper1.attach (stepPin1, dirPin1);
  myStepper2.attach (stepPin2, dirPin2);
  myStepper1.setSpeed (20);
  myStepper2.setSpeed (20);
  pinMode (enaPin1, OUTPUT);
  pinMode (enaPin2, OUTPUT);
  pinMode (taster,  INPUT_PULLUP);
  digitalWrite( enaPin1 , LOW);
  digitalWrite( enaPin2 , LOW);
  Serial.println("Starten...");
}


void loop() {
  tasterstatus = !digitalRead(taster);
  switch ( zustand ) {
    case WARTEN:        // Warten auf den Tastendruck zum Starten
      if (tasterstatus == HIGH) {
        Serial.println("Taste gedrückt -> Vorwärts");
        myStepper1.write (-90);
        myStepper2.write (-90);
        zustand = VORWAERTS;
      }
      break;
    case VORWAERTS:     // Motore laufen vorwärts, Sensor auslesen
      readSensor();
      if ( !myStepper1.moving() && !myStepper2.moving() ) {
        // Beide Stepper haben Endpunkt erreicht, zurück
        Serial.println("Endpunkt erreicht -> zurück");
        myStepper1.write (0);
        myStepper2.write (0);
        zustand = RUECKWAERTS;
      }
      break;
    case RUECKWAERTS:
      readSensor();
      if ( !myStepper1.moving() && !myStepper2.moving() ) {
        // Beide Stepper haben Startpunkt wieder erreicht, Ende
        Serial.println("Fertig, wieder auf Taste warten");
        myStepper1.write (0);
        myStepper2.write (0);
        zustand = WARTEN;
      }
      break;

  }
}
(Die Pins habe ich auf meine HW angepasst, und der Taster schaltet bei mir nach Gnd )

Sollen immer beide Motore parallel laufen, oder werden die Abläufe später noch erweitert?


Danke sehr für deine Hilfe Microbahner. Kann ich meine Wägezelle und das HX711-Modul so dort eiinbinden oder muss ich noch die Einlesen, auf was der readSensor() zugreifen soll?

Die Motoren sollen immer parallel laufen und es wiird auch nichts erweiitert.

Mit freundlichen Grüßen,

Maxi


Edit:

Wenn ich deine FSM so übernehme (Pinbelegung natürlich geändert) starten die Motoren sofort durch und fange an zu zappeln. Bei Druck auf dem Knopf ändert sich nichts.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.12.2020, 12:30
Beitrag #69
RE: Schrittmotor bewegt sich nicht
(01.12.2020 12:13)DerMaschbaustudent schrieb:  Kann ich meine Wägezelle und das HX711-Modul so dort eiinbinden oder muss ich noch die Einlesen, auf was der readSensor() zugreifen soll?
Das readSensor ist ja erstmal nur ein Dummy ( ich habe auch keinen HX711 ). Da müsstest Du das Auslesen noch einbauen.
Ob Du meinen Sketch als Vorlage nimmst, und deinen entsprechend umbaust, oder ob du die ganze für den HX711 notwendige Funktion in meinen Sketch einbaust ist deine Entscheidung. Was Dir halt einfacher erscheint.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.12.2020, 13:24 (Dieser Beitrag wurde zuletzt bearbeitet: 01.12.2020 13:25 von MicroBahner.)
Beitrag #70
RE: Schrittmotor bewegt sich nicht
(01.12.2020 12:13)DerMaschbaustudent schrieb:  Wenn ich deine FSM so übernehme (Pinbelegung natürlich geändert) starten die Motoren sofort durch und fange an zu zappeln. Bei Druck auf dem Knopf ändert sich nichts.
Hast Du berücksichtigt, dass bei mir der Taster 'andersrum' funktioniert? Also gegen Gnd schaltet? Im seriellen Monitor siehst Du ja auch, wie er durch die Zustände schaltet.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.12.2020, 15:25
Beitrag #71
RE: Schrittmotor bewegt sich nicht
(01.12.2020 13:24)MicroBahner schrieb:  
(01.12.2020 12:13)DerMaschbaustudent schrieb:  Wenn ich deine FSM so übernehme (Pinbelegung natürlich geändert) starten die Motoren sofort durch und fange an zu zappeln. Bei Druck auf dem Knopf ändert sich nichts.
Hast Du berücksichtigt, dass bei mir der Taster 'andersrum' funktioniert? Also gegen Gnd schaltet? Im seriellen Monitor siehst Du ja auch, wie er durch die Zustände schaltet.

Den Code habe ich jetzt auf meine Bedürfnisse angepasst.

Code:
#include <MobaTools.h>

const byte dirPin1    = 1;
const byte stepPin1   = 2;
const byte enaPin1    = 6;
const byte MS11       = 5;
const byte MS12       = 4;
const byte MS13       = 3;
const byte dirPin2    = 8;
const byte stepPin2   = 9;
const byte enaPin2    =10;
const byte MS21       =13;
const byte MS22       =12;
const byte MS32       =11;
long angle;
int taster           =30;
boolean tasterstatus = false;
int rpm10;
byte mode;
                          
MoToStepper myStepper1 (3200, STEPDIR);
MoToStepper myStepper2 (3200, STEPDIR);
enum states_t : byte { WARTEN, VORWAERTS, RUECKWAERTS };
states_t zustand;
void setup() {
  Serial.begin(115200);
  myStepper1.attach (stepPin1, dirPin1);
  myStepper2.attach (stepPin2, dirPin2);
  pinMode (enaPin1, OUTPUT);  
  pinMode (enaPin2, OUTPUT);
  pinMode (MS11,    OUTPUT);
  pinMode (MS12,    OUTPUT);
  pinMode (MS13,    OUTPUT);
  pinMode (MS21,    OUTPUT);
  pinMode (MS22,    OUTPUT);
  pinMode (MS32,    OUTPUT);
  pinMode (taster,  INPUT);
  digitalWrite( enaPin1 ,LOW);
  digitalWrite( enaPin2 ,LOW);
  digitalWrite( MS11    ,HIGH);
  digitalWrite( MS12    ,HIGH);
  digitalWrite( MS13    ,HIGH);
  digitalWrite( MS21    ,HIGH);
  digitalWrite( MS22    ,HIGH);
  digitalWrite( MS32    ,HIGH);
  

  Serial.print("Taster drücken zum Starten des Steuerkreises.");
}


void loop() {
  tasterstatus = !digitalRead(taster);
  
  switch ( zustand ) {
    case WARTEN:        // Warten auf den Tastendruck zum Starten
      if (tasterstatus == LOW) {
        Serial.println("Taste gedrückt -> Vorwärts");
        myStepper1.setSpeed (10);
        myStepper2.setSpeed (10);
        myStepper1.write (-100);
        myStepper2.write (-100);
        zustand = VORWAERTS;
      }
      break;
    case VORWAERTS:     // Motore laufen vorwärts, Sensor auslesen
      if ( !myStepper1.moving() && !myStepper2.moving() ) {
        // Beide Stepper haben Endpunkt erreicht, zurück
        Serial.println("Endpunkt erreicht -> zurück");
        myStepper1.setSpeed (10);
        myStepper2.setSpeed (10);
        myStepper1.write (0);
        myStepper2.write (0);
        zustand = RUECKWAERTS;
      }
      break;
    case RUECKWAERTS:
      if ( !myStepper1.moving() && !myStepper2.moving() ) {
        // Beide Stepper haben Startpunkt wieder erreicht, Ende
        Serial.println("Fertig, wieder auf Taste warten");
        myStepper1.setSpeed (10);
        myStepper2.setSpeed (10);
        myStepper1.write (0);
        myStepper2.write (0);
        zustand = WARTEN;
      }
      break;

  }


Leider wird der zweite Zustand nicht sauber gefahren. Die Motoren überspringen, bzw. verfahrenerst garnicht.
Der Rückzug des Prüfstempels klappt hingegen ohne Problem.




Mit der vorher von mir vorgestellten If-Bedingungslösung bewegt sich der Motor astrein.

Als Anhang habe ich mal meine Verschaltung mit reingebracht. Vielleicht wird es darüber ja ersichtlicher.    


Mit freundlichen Grüßen,

Maxi
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.12.2020, 16:44 (Dieser Beitrag wurde zuletzt bearbeitet: 01.12.2020 16:51 von MicroBahner.)
Beitrag #72
RE: Schrittmotor bewegt sich nicht
Das kann ich jetzt nicht nachvollziehen ( mit meiner Pinbelegung ).
Mir sind aber noch ein paar Dinge aufgefallen:
Code:
const byte dirPin1    = 1;
Die Pins 0 und 1 gehören zur seriellen Schnittstelle zum PC (Serial) - die solltest Du auf keinen Fall für etwas anderes verwenden. Das gibt sonst Konflikte.

Code:
myStepper1.setSpeed (10);
        myStepper2.setSpeed (10);
Du setzt immer wieder die Geschwindigkeit neu, obwohl Du sie gar nicht veränderst. Das ist unnötig. Wenn Du eine feste Geschwindigkeit hast, reicht es die einmal im setup einzustellen und gut ist.

Code:
case RUECKWAERTS:
      if ( !myStepper1.moving() && !myStepper2.moving() ) {
        // Beide Stepper haben Startpunkt wieder erreicht, Ende
        Serial.println("Fertig, wieder auf Taste warten");
        myStepper1.setSpeed (10);
        myStepper2.setSpeed (10);
        myStepper1.write (0);
        myStepper2.write (0);
        zustand = WARTEN;
      }
Wenn der Startpunkt wieder erreicht ist, sollen die Stepper da doch einfach stehen bleiben. Da brauchte es keinerlei Aufrufe von myStepper1/2 mehr. Die sind überflüssig.

Das wichtigste ist aber definitv, dass Du den Pin 1 nicht verwendest. Da kann alles mögliche passieren.


P.S. ich würde auch zur Anpassung des Tasters nicht die Abfrage von 'tasterstatus' ändern. Da sollte HIGH immer einen aktiv gedrückten Taster bedeuten. Besser ist es, die (einmalige) Abfrage des Pin zu ändern. Also statt:
Code:
tasterstatus = !digitalRead(taster);
wie bei mir, machst Du dann:
Code:
tasterstatus = digitalRead(taster);
ohne das Ausrufezeichen zur Invertierung.

Edit: Ist das Drehmoment, dass die Motore aufbringen müssen, in beiden Richtungen gleich?

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Schrittmotor mit Endschalter MättyEifel 11 762 13.04.2021 13:46
Letzter Beitrag: MicroBahner
  Arduino Mega wird nicht erkannt Gian-Luca 44 10.159 08.04.2021 17:47
Letzter Beitrag: Geisterjäger
  MKR1200 läuft nicht bei Batteriebetrieb kpc 24 2.386 05.04.2021 22:59
Letzter Beitrag: kpc
  Einfaches Projekt funktioniert am USB Anschluss, aber nicht mit Akkus PurpleLightning 3 347 05.04.2021 12:07
Letzter Beitrag: hotsystems
  Sketche lassen sich aus IDE nicht mehr hochladen Steinspiel 9 1.397 19.03.2021 19:11
Letzter Beitrag: Chopp
  Sketches lassen sich nicht mehr hochladen. Was kann ich noch tun? Tonio 3 612 19.03.2021 15:32
Letzter Beitrag: Tommy56
  Servo funktioniert nicht richtig an Arduino Nano Maxcruiser 25 3.215 14.03.2021 17:11
Letzter Beitrag: hotsystems
  Erster Versuch Schrittmotor tomger22 2 714 09.03.2021 17:34
Letzter Beitrag: Bitklopfer
  2 I2C-Devices nicht zusammen wonk 36 4.750 04.03.2021 00:08
Letzter Beitrag: hotsystems
  Schieberegister funktioniert nicht richtig flint74 9 1.279 21.02.2021 13:35
Letzter Beitrag: flint74

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste