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
01.12.2020, 17:09
Beitrag #73
RE: Schrittmotor bewegt sich nicht
(01.12.2020 16:44)MicroBahner schrieb:  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.

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

Das Vermeiden von der Nutzung der serielllen Schnittstellenpins 0 und 1 hat Abhilfe geschaffen.

Das Höchstdrehmoment muss nur in Niederfahrrichtung am Höchsten sein.
Das Hochgfahren ist unbelastet und könnte mit höheren Umdrehungszahlen geschehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.12.2020, 17:27
Beitrag #74
RE: Schrittmotor bewegt sich nicht
(01.12.2020 17:09)DerMaschbaustudent schrieb:  Das Hochgfahren ist unbelastet und könnte mit höheren Umdrehungszahlen geschehen.
Dann würden die setSpeed Aufrufe an den entsprechenden Stellen natürlich wieder Sinn machen. Vielleicht wäre dann aber auch eine kleine Rampe sinnvoll.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.12.2020, 17:47 (Dieser Beitrag wurde zuletzt bearbeitet: 01.12.2020 17:50 von DerMaschbaustudent.)
Beitrag #75
RE: Schrittmotor bewegt sich nicht
Hallo Microbahner,

ich habe jetzt
Code:
tasterstatus = !digitalRead(taster);
zu
Code:
tasterstatus = digitalRead(taster);
geändert.
für meine Motoren stellt das auch kein Problem dar und es hat den Vorteil, dass durch erneutes Drücken der Prüfstempel nicht weiter verfahren wird.
Jedoch kann ich so meinen Sensor nicht miteinbinden, da er dan nur einen Wert aufzeichnet, wenn der Taster gedrückt wird Huh
Kann ich das prograammtechnisch umgehen?

Mit freundlichen Grüßen,

Maxi

Code:
void loop() {
  tasterstatus = digitalRead(taster);
  LoadCell.update();
  switch ( zustand ) {
    case WARTEN:        // Warten auf den Tastendruck zum Starten
      if (tasterstatus == HIGH) {
      if (millis() > t + 100) {
    float i = LoadCell.getData();
    Serial.print("Load_cell output val: ");
    Serial.println(i);
    t = millis();}
        Serial.println("Taste gedrückt -> Vorwärts");
        myStepper1.setSpeed (10);
        myStepper2.setSpeed (10);
        myStepper1.write (-130);
        myStepper2.write (-130);
        
        zustand = VORWAERTS;
      }
      break;



Die Ausgabe im seriellen Monitor schaut momentan so aus:

Taster drücken zum Starten des Steuerkreises.

Load_cell output val: -0.02
Taste gedrückt -> Vorwärts
Endpunkt erreicht -> zurück
Fertig, wieder auf Taste warten

Load_cell output val: 0.24
Taste gedrückt -> Vorwärts
Endpunkt erreicht -> zurück
Fertig, wieder auf Taste warten

Load_cell output val: 0.32
Taste gedrückt -> Vorwärts
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.12.2020, 17:55 (Dieser Beitrag wurde zuletzt bearbeitet: 01.12.2020 17:58 von MicroBahner.)
Beitrag #76
RE: Schrittmotor bewegt sich nicht
Warum machst Du das nicht so wie in meinem Beispiel, und baust das in die Funktion readSensor ein? Da ist doch schon alles vorbereitet.

Und wenn Du es selbst machen willst, gehört das natürlich nicht in das Ereignis hinein, das von WARTEN nach VORWAERTS schaltet, sondern in die Zustände VORWAERTS und RUCKWAERTS ( da wo in meinem Beispiel readSensor aufgerufen wird ). Denn während diese Zustände aktiv sind, willst Du ja deine Sensor auslesen.

P.S. und Du solltest ab und zu mal ctrl-T drücken Wink

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.12.2020, 18:47
Beitrag #77
RE: Schrittmotor bewegt sich nicht
(01.12.2020 17:55)MicroBahner schrieb:  Warum machst Du das nicht so wie in meinem Beispiel, und baust das in die Funktion readSensor ein? Da ist doch schon alles vorbereitet.

Und wenn Du es selbst machen willst, gehört das natürlich nicht in das Ereignis hinein, das von WARTEN nach VORWAERTS schaltet, sondern in die Zustände VORWAERTS und RUCKWAERTS ( da wo in meinem Beispiel readSensor aufgerufen wird ). Denn während diese Zustände aktiv sind, willst Du ja deine Sensor auslesen.

P.S. und Du solltest ab und zu mal ctrl-T drücken Wink

Die Funktion readsensor exestiert für Wägezellen nicht, bzw. ich kann eine Implimentierung nirgends finden.
Eine Wägezelle gleich im Loop eigentlich immer wieder die aktuelle Dehnung des DMS mit der Kalibirierungsdehnung ab.
Das auslesen des Wertes muss solange stattfinden. solang der Prüfstempel zumindest runterfährt. Währenddessen brauche ich eine Aufzeichnung jede 100ms oder besser sogar noch weniger.



Mit freundlichen Grüßen

Maxi

Ich überlegt vielleicht zu dem Problem mal einen neuen Thread aufzumachen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.12.2020, 19:32 (Dieser Beitrag wurde zuletzt bearbeitet: 01.12.2020 19:33 von MicroBahner.)
Beitrag #78
RE: Schrittmotor bewegt sich nicht
(01.12.2020 18:47)DerMaschbaustudent schrieb:  Die Funktion readsensor exestiert für Wägezellen nicht, bzw. ich kann eine Implimentierung nirgends finden.
Natürlich nicht. Du solltest das ja in die Funktion readsensor() aus meinem Beispiel selbst einbauen. D.h das LoadCell.getdata() baust du da an der Stelle ein, wo derzeit nur ein Serial.print steht. Die Zeitsteuerung ist da ja schon drin.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.12.2020, 21:13
Beitrag #79
RE: Schrittmotor bewegt sich nicht
Ich habe es jetzt endlich geschafft Smile
Ich möchte dir 1000-fach danken @MicroBahner Smile
Du hast mich mit meinen marginalen Programmierkenntnissen dadurch geleitet und mir extem dadurch geholfen. Danke dafür und für deine Zeit. Ich habe dich ja fast 3 Wochen beansprucht XD Smile
Die Prüfeinrichtung funktioniert jetzt genau so, wie sie soll.


Mein Code sieht jetzt momentan so aus:

Code:
#include <MobaTools.h>

const byte dirPin1    = 2;
const byte stepPin1   = 3;
const byte enaPin1    = 7;
const byte MS11       = 6;
const byte MS12       = 5;
const byte MS13       = 4;
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 i;
int taster           =30;
int tasterstatus     = 0;
                          
MoToStepper myStepper1 (3200, STEPDIR);
MoToStepper myStepper2 (3200, STEPDIR);
MoToTimer sensTime;     // Zeit um Sensor auszulessen
const int SENSINTERVALL = 50;  // alle 50ms
enum states_t : byte { WARTEN, VORWAERTS, RUECKWAERTS };
states_t zustand;

#include <HX711_ADC.h>
#include <EEPROM.h>
//HX711 constructor (dout pin, sck pin):
HX711_ADC LoadCell(39,41);
int eepromAdress = 12;
unsigned long t = 0;

void calibrate() {
  Serial.println("**********************************************************************");
  Serial.println("Kalibrierungsstart:");
  Serial.println("1. Kalibrierung bitte unbelastet starten!");
  Serial.println("2. Bekannte Masse auf Wägezelle auflegen.");
  Serial.println("3. Danach das Gewicht in Gramm in den seriellen Monitor eintragen.");
  float m = 0;
  boolean f = 0;
  while (f == 0) {
    LoadCell.update();
    if (Serial.available() > 0) {
      m = Serial.parseFloat();
      if (m != 0) {
        Serial.print("Bekannte Masse in Gramm: ");
        Serial.println(m);
        f = 1;
      }
      else {
        Serial.println("Ungültiger Wert");
      }
    }
  }
  float c = LoadCell.getData() / m;
  LoadCell.setCalFactor(c);
  Serial.print("Kalibrierungswert: ");
  Serial.print(c);
  f = 0;
  Serial.print(" Wert in EEPROM ");
  Serial.print(eepromAdress);
  Serial.print(" zwischenspeichern?");
  Serial.println(" y/n");
  while (f == 0) {
    if (Serial.available() > 0) {
      char inByte = Serial.read();
      if (inByte == 'y') {
        #if defined(ESP8266)
        EEPROM.begin(512);
        #endif
        EEPROM.put(eepromAdress, c);
        #if defined(ESP8266)
        EEPROM.commit();
        #endif
        EEPROM.get(eepromAdress, c);
        Serial.print("Wert ");
        Serial.print(c);
        Serial.print(" in EEPROM ");
        Serial.print(eepromAdress);
        Serial.print(" gespeichert.");
        f = 1;
      }
      else if (inByte == 'n') {
        Serial.println("Wert nicht in EEPROM gespeichert");
        f = 1;
      }
    }
  }
  Serial.println("Kalibrierung beendet");
  Serial.println("Für manuelle Abänderung 'c' eingeben.");
  Serial.println("***************************************************************************");
}

void changeSavedCalFactor() {
  float c = LoadCell.getCalFactor();
  boolean f = 0;
  Serial.println("***");
  Serial.print("Aktueller Wert: ");
  Serial.println(c);
  Serial.println("Neues Gewicht eingeben in der Form [gggg.00]");
  while (f == 0) {
    if (Serial.available() > 0) {
      c = Serial.parseFloat();
      if (c != 0) {
        Serial.print("Neuer Kalibrierungswert: ");
        Serial.println(c);
        LoadCell.setCalFactor(c);
        f = 1;
      }
      else {
        Serial.println("Ungültiger Wert, beenden");
        return;
      }
    }
  }
  f = 0;
  Serial.print("Wert in EEPROM ");
  Serial.print(eepromAdress);
  Serial.print(" speichern?");
  Serial.println("y/n");
  while (f == 0) {
    if (Serial.available() > 0) {
      char inByte = Serial.read();
      if (inByte == 'y') {
        #if defined(ESP8266)
        EEPROM.begin(512);
        #endif
        EEPROM.put(eepromAdress, c);
        #if defined(ESP8266)
        EEPROM.commit();
        #endif
        EEPROM.get(eepromAdress, c);
        Serial.print("Wert ");
        Serial.print(c);
        Serial.print(" gespeichert in EEPROM: ");
        Serial.println(eepromAdress);
        f = 1;
      }
      else if (inByte == 'n') {
        Serial.println("Wert nicht in EEPROM gespeichert");
        f = 1;
      }
    }
  }
  Serial.println("Kalibrierungsgewicht ändern ");
  Serial.println("***");
}

void setup() {
  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_PULLUP);
  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.begin(9600);
  Serial.println("Start. Bitte Probenhalter noch nicht belasten!");
  LoadCell.begin();
  long stabilisingtime = 2000; // tare preciscion can be improved by adding a few seconds of stabilising time
  LoadCell.start(stabilisingtime);
  if (LoadCell.getTareTimeoutFlag()) {
    Serial.println("TIMEOUT!! Verkabelung und Anschlüsse prüfen.");
  }
  else {
    LoadCell.setCalFactor(1.0); // user set calibration value (float)
    Serial.println("Startup und Tara abgeschlossen");
  }
  while (!LoadCell.update());
  calibrate();
  
  

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

void readSensor(){
  LoadCell.update();  
  if ( !sensTime.running() ) {
    // es ist Zeit,dem Sensor auszulesen
    sensTime.setTime( SENSINTERVALL );
    LoadCell.getData();
    float i = LoadCell.getData ();
    Serial.print(i);
    Serial.print(" Gramm = ");
    Serial.print(i*0.001); //Umrechnung Gramm in Kilogramm
    Serial.print(" Kilogramm = ");
    Serial.print(i*0.00981);
    Serial.println(" Newton");
    }}
    
void loop() {
  tasterstatus = digitalRead(taster);
  switch ( zustand ) {
    case WARTEN:        // Warten auf den Tastendruck zum Starten
      if (tasterstatus == HIGH) {
  //get smoothed value from the data set

        Serial.println("Taste gedrückt -> Vorwärts");
        myStepper1.setSpeed (8);
        myStepper2.setSpeed (8);
        myStepper1.write (-45);
        myStepper2.write (-45);
        
        zustand = VORWAERTS;
      }
      break;
    case VORWAERTS:
    readSensor();    // Motore laufen vorwärts, Sensor auslesen
      if ( !myStepper1.moving() && !myStepper2.moving() ) {
        Serial.println("Endpunkt erreicht -> zurück");
        myStepper1.setSpeed (60);
        myStepper2.setSpeed (60);
        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 (60);
        myStepper2.setSpeed (60);
        myStepper1.write (0);
        myStepper2.write (0);
        zustand = WARTEN;
      }
      break;

  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.12.2020, 22:08
Beitrag #80
RE: Schrittmotor bewegt sich nicht
Na also - geht doch SmileCool.
Freut mich, wenn ich dir helfen konnte.

P.S. Aber die myStepper-Aufrufe im case RUECKWAERTS kannst Du ersatzlos streichen - die bewirken nichts.

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
  2 I2C-Devices nicht zusammen wonk 36 1.748 04.03.2021 00:08
Letzter Beitrag: hotsystems
  Erster Versuch Schrittmotor tomger22 0 145 03.03.2021 13:37
Letzter Beitrag: tomger22
  Schieberegister funktioniert nicht richtig flint74 9 749 21.02.2021 13:35
Letzter Beitrag: flint74
  Stromversorgung: Schrittmotor + Arduino nano e69-fan 12 1.816 07.02.2021 11:26
Letzter Beitrag: Franz54
  Warum sind mehrere Attiny´s nicht Synchron ? Chris_Arduino 6 2.166 02.02.2021 11:46
Letzter Beitrag: Harry
  Arduino Uno will nicht mehr wonk 35 5.881 21.01.2021 17:33
Letzter Beitrag: Tommy56
  RFID keine Daten / wird nicht erkannt Wochenendprogrammierer 79 7.345 27.12.2020 19:20
Letzter Beitrag: Wochenendprogrammierer
  Ausgabe LCD-Display funktioniert nicht wonk 6 1.120 23.12.2020 21:15
Letzter Beitrag: hotsystems
  Neopixel - LEDS leuchten obwohl sie es nicht sollten Mauser 72 7.314 01.12.2020 10:00
Letzter Beitrag: hotsystems
  Seltsames Zackenmuster, wenn Poti nicht bewegt wird. . Guekard 9 2.203 26.11.2020 08:40
Letzter Beitrag: hotsystems

Gehe zu:


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