Schrittmotor mit Taster steuern und Nullposition einbauen

Hallo liebe Leute,

ich bin ziemlich neu was das programmieren betrifft. und hätte eine Problemstellung die ich hoffentlich mit eurer Hilfe lösen kann.
Ich hab den Schrittmotor so weit programmiert das er wenn ich einmal auf die Taste drücke sich nach rechts dreht und stehen bleibt. Bei nochmaligen drücken des Tasters dreht sich der Schrittmotor nach links.
Es ist gedacht das durch ein Zahnrad und eine Schiene ein Kragen aus- und eingefahren wird.
Problem ist das ich möchte das dem Motor eine Ausgangsstellung zugewiesen wird. Falls während dem ausfahren ein Stromausfall ist und der Motor in der halben Bewegung stecken bleibt das er dann bei Stromzufuhr in die Ausgangsposition fährt. Ist das überhaupt möglich zu programmieren????

vielen dank, lg

taster.ino (538 Bytes)

Hi

Wenn man Das Referenz-Fahrt nennt: Ja, macht jede CNC-Maschine (ohne Absolut-Encoder) - Die muß ja wissen, wo die Achsen stehen.
Dafür brauchst Du einen Taster, Der auf einer Seite des Verfahrweg knapp vor dem Ende liegt, mechanisch überfahrbar, elektrisch aber bis zum Wellenende nicht wieder öffnend.
So kannst Du, je nach Status dieses Taster, die Ref-Position anfahren (wenn Taster schon gedrückt, dann vom Ende weg fahren, sonst hinfahren).
Selber fahre ich dann noch 1x (langsam) zum Ref-Punkt, bis der Taster wieder schließt, dann ebenfalls langsam, bis der Taster wieder öffnet - Punkt gefunden.
Ab hier ist dem Sketch bekannt, wie weit Es bis zu welchem Ende ist, der Sketch kann den Motor passend abbremsen, daß man nicht auf Block fährt.

MfG

PS: 'Stromausfall', oder wenn - durch egal was - die Position verloren ging

jasko85:
Ist das überhaupt möglich zu programmieren????

Du brauchst halt zwingend eine Möglichkeit, die Startposition sicherzustellen. Durch Programmieren geht das nur, wenn Du den Schrittmotor nach dem Start des Arduino zunächst in die „Heim“-Position fährst, und zwar für die Zeit (oder Schritte ...), die er aus der „ausgefahren“-Position braucht. Da Schrittmotore eher Schwächlinge sind, „verliert“ er am Start-Anschlag dann halt ein paar Schritte.

Wirklich sauber bekommst Du das nur mit Endschalter hin.

Gruß

Gregor

Hallo Gregor,

danke für deine rasche Antwort. Dein Ansatz wäre eigentlich meine Wunschlösung das der Schrittmotor beim starten immer zuerste die Heimposition ansteuert.
Hast du eine Idee wie ich das in menem Code einbaue, mit welchen Befehlen oder Zeilen

vielen dank

jasko85:
Hast du eine Idee wie ich das in menem Code einbaue, mit welchen Befehlen oder Zeilen

Ich kenne die AccelStepper-Bibliothek nicht. Aber wie ich das verstehe, „sagst“ Du dem Schrittmotor in setup() mit

...setCurrentPosition(position);

dass er sich an „Position 450“ befindet. In loop() pendelst Du dann quasi zwischen -450 und 450. D. h. der Gesamte Weg umfasst etwa 900 Schritte. Wenn es einen Befehl „bewege(Anzahl Schritte)“ gibt, dann benutze ihn mit 910 oder -910 als Parameter. Ob es diesen Befehl gibt, steht in der Doku zur Bibliothek, ob Du -910 oder 910 eingeben musst, musst Du wissen (Du hast das ja gebaut).
Den Befehl gibst Du dann als vorletzten Befehl in setup() an und setzt dann die aktuelle Position auf den passenden Startwert (-450 oder 450).

Ich hoffe, das stimmt so.

Gruß

Gregor

Hallo,

hab mal in meiner Bastelkiste gewühlt. Sollte fast passen für Dich.

Heinz

/*Versuch zum Steppermotor 28BYJ-48
   Referenzpunkt anfahren in minus Richtung bis Endschalter
   da ist die Null Position. Taster Start fährt auf Pos1
   nach zeit wird auf pos2 gefahren.
   Hardware UNO , Schalter gegen 0V schaltend
   Anzeige auf Plotter möglich
   März2019
*/


#include <AccelStepper.h>

const byte butonRev = 8;
const byte butonStart = 9;
const byte led = 13;

bool rev_Pos, startbtn; // status Taster
bool rev_OK;    // status rev erfolgt

unsigned long altzeit, altwzeit;

long aktpos; // aktuelle Position
const long setpos1 = 2068;    // Sollposition 1&2
const long setpos2 = 200;

// Define a stepper and the pins it will use
// die  beiden mittleren gedreht mittels Software
AccelStepper stepper(AccelStepper::FULL4WIRE, 2, 4, 3, 5);

void setup()
{
  pinMode(butonRev, INPUT_PULLUP);
  pinMode(butonStart, INPUT_PULLUP);
  pinMode(led, OUTPUT);
  Serial.begin(115200);
  stepper.setAcceleration(300);
  stepper.setMaxSpeed(300);
}

void loop()
{
  // Taster und aktuelle Position einlesen
  rev_Pos = !digitalRead(butonRev);
  startbtn = !digitalRead(butonStart);
  aktpos = stepper.currentPosition();

  if (rev_OK == false) {  // Rev noch nicht angefahren
    rev_OK =  revfahren();
  }

  // --- auf Pos 1 fahren
  if ( rev_OK && startbtn) {    // Start gedückt
    stepper.moveTo(setpos1);    // auf Pos fahren
  }
  // -----auf Pos 2 fahren
  if (rev_OK && aktpos == setpos1) {    // Pos 1 erreicht
    if (millis() - altwzeit >= 3000) {  // Wartezeit
      stepper.moveTo(setpos2);          // Position 2 anfahren
    }
  }
  else altwzeit = millis();

  // ----------- Ausgaben
  digitalWrite(led, rev_OK);  // Satus LED 
  stepper.run();              // Pulse ausgeben
  // ------------Anzeige
  if (millis() - altzeit >= 200) {
    altzeit = millis();
    //Serial.print("aktual Position ");
    Serial.println(aktpos);
  }
}// ---------- loop ende

bool revfahren() {
  stepper.setSpeed(-100);  // langsam  minus fahren
  stepper.move(2000);      // zuück fahren

  if (rev_Pos) {          // wenn schalter angefahren
    stepper.stop();

    stepper.setSpeed(300);   // normale Geschw.
    stepper.setCurrentPosition(0); // auf pos o setzten
    // stepper.moveTo(0);   // auf o fahren um stop abzuschliessen
    return 1;
  }
  return 0;
}

Hi

In setup() wird die Funktion gohome(); aufgerufen - Die geht nach Home.
Danach ist klar, wo der Stepper steht.
Entweder fährt gohome(); stur >100% der Steps in eine Richtung (um auf Block zu fahren), oder mit Ref-Schalter, bis Dieser getastet, gelöst, getastet wurde.

Danach kann in loop() wild mit Positionen um sich geworfen werden - man muß 'nur' innerhalb der Achsenlänge bleiben.

MfG