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
  Bootloader will sich nicht auf Mini Pro installieren lassen Foto-Ralf 27 3.166 09.06.2021 07:15
Letzter Beitrag: SpaghettiCode
  Tisch der sich selbst ins Wasser bringt ludino 28 4.204 28.05.2021 21:29
Letzter Beitrag: Franz54
  Arduino Mega wird nicht erkannt Gian-Luca 61 17.945 27.05.2021 23:21
Letzter Beitrag: Hurz
  SchrittMotor Nema 17- HANPOSE HPV2 Linear Guide 3D Drücker Salvo1969 1 629 13.05.2021 11:05
Letzter Beitrag: GuaAck
  Arduino startet nicht kpc 14 2.374 27.04.2021 22:24
Letzter Beitrag: hotsystems
  Schrittmotor mit Endschalter MättyEifel 11 2.095 13.04.2021 13:46
Letzter Beitrag: MicroBahner
  MKR1200 läuft nicht bei Batteriebetrieb kpc 24 4.792 05.04.2021 22:59
Letzter Beitrag: kpc
  Einfaches Projekt funktioniert am USB Anschluss, aber nicht mit Akkus PurpleLightning 3 863 05.04.2021 12:07
Letzter Beitrag: hotsystems
  Sketche lassen sich aus IDE nicht mehr hochladen Steinspiel 9 2.167 19.03.2021 19:11
Letzter Beitrag: Chopp
  Sketches lassen sich nicht mehr hochladen. Was kann ich noch tun? Tonio 3 1.046 19.03.2021 15:32
Letzter Beitrag: Tommy56

Gehe zu:


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