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
Arduino mit Schrittmotor und Lichtschranken
28.01.2021, 19:54
Beitrag #33
RE: Arduino mit Schrittmotor und Lichtschranken
Hallo zusammen,

vielen Dank für die Anregungen. Vorerst würde ich gerne die möglichen Zustände in einen funktionierenden Code umsetzen. Ob Lichtschranke oder Nährungsschalter kann ja später noch entschieden werden...
Ich habe jetzt versucht, die 5 Zustände in einer switch-case-Funktion abzubilden:
Code:
#define MAX8BUTTONS
#include <MobaTools.h>

#define STEPS 200                          // Anzahl der Schritte des Motor´s ( 28BYJ-48 )
const unsigned int endschalterPin = 12;             // Zur Feststellung der Endposition. der Schalter verbindet den Pin mit Gnd, wenn der Aufzug dort angekommen ist.
const unsigned int startPin = 7;                     // Zum Starten des Aufzugs

const unsigned int pinStep = 5;
const unsigned int pinDir = 6;
unsigned int aufzugZustand;



bool myButtons.pressed( uint8_t startTaster );

const long obererEndpunkt = 100;           // Zahl der Stepperschritte zwischen 'unten' und 'oben'

MoToStepper stepper(STEPS, STEPDIR);       // Einrichten des Steppers

void setup() {
  pinMode( pinStep, OUTPUT );
  pinMode( pinDir, OUTPUT);
  pinMode( endschalterPin, INPUT_PULLUP );  // Endschalter schaltet nach Gnd
  pinMode( startPin, INPUT_PULLUP );        // Endschalter schaltet nach Gnd
  stepper.attach ( pinStep, pinDir );         // Nr. der Pins für den Stepper
  stepper.setSpeed(20);                     // Geschwindigkeit in RPM*10
  stepper.rotate(-1);                       // Die Drehrichtung muss hin zum Schalter sein!
  while ( digitalRead( endschalterPin ) == HIGH );   // Warten bis der Endschalter anspricht
  stepper.stop();                           // anhalten
  delay(500);
  stepper.setZero();                        // Momentane Position als 'Startpunkt' einrichten.
  stepper.setSpeed(60);                     //Geschwindigkeit in Rpm * 10 im Aufzugbetrieb
  stepper.setRampLen( 100 );                // Sanftes Anfahren und Anhalten

  aufzugZustand =  1;

  aufzugAktualisieren();                    //Aufzug aktualisieren


}
void loop() {
  myButtons.processButtons();
  if ( myButtons.pressed( uint8_t startTaster ) == LOW);           //Frägt den Taster ab
  aufzugWeiter();
  aufzugAktualisieren();
  delay(500);

}
void aufzugWeiter() {
  if (aufzugZustand < 5) {                      //Wenn aufzugZustand kleiner 5 ist
    aufzugZustand++;                            //Wert in Variable aufzugZustand um 1 erhöhen
  }
}

}
void aufzugAktualisieren() {
  switch ( aufzugZustand ) {                      //Zustand 1: Aufzug in Ruhes
    case 1:
      stepper.stop();
      break;

    case 2:                                       //Zustand 2: Aufzug fährt nach oben
      stepper.writeSteps(obererEndpunkt);         // zum oberen Endpunkt bewegen
      while ( stepper.moving() );                 // Warten bis Aufzug oben angekommen ist
      break;

    case 3:                                       //Zustand 3: Wartezeit oben
      stepper.stop();
      break;

    case 4:                                      //Zustand 4: Aufzug fährt nach unten
      stepper.writeSteps(0);                     // zum unteren Endpunkt bewegen
      while ( stepper.moving() );                // Warten bis Aufzug unten angekommen ist
      break;

    case 5:                                     //Zustand 5: Wartezeit unten
      stepper.stop();
      break;
  }

Folgende Fragen dazu: Der Kompiler meckert bei
Code:
bool myButtons.pressed( uint8_t startTaster );
Ich kapier nicht ganz, wie ich den Taster "instanzieren" soll:
Code:
MoToButtons myButtons( const uint8_t pinNumbers[], const uint8_t pinCnt,
uint8_t debTime, uint16_t pressTime );
hab ich in der Doku gefunden...Muss das rein und welche Parameter soll ich dort einsetzen?
Und die zweite Frage: Ich möchte ja, dass der Aufzug hochfährt, dann in Ruhe verbleibt, dann mit Tastendruck nach unten fährt und dort in Ruhe verbleibt. Immer solange, bis der Taster gedrückt wird.
Wäre das nicht in 4 Zuständen besser vorstellbar? Oder braucht es die "Wartezeit"?
Der Befehl stepper.stop() ist ja eher für Notstop gedacht. Aber in Kombination mit switch könnte das doch gehen, oder? Ich verlasse die cases sowieso mit break.
Habe das aber noch nicht abgeändert, weil ich zuerst euch mal fragen wollte...

LG und Danke, Markus
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.01.2021, 21:42 (Dieser Beitrag wurde zuletzt bearbeitet: 28.01.2021 21:44 von MicroBahner.)
Beitrag #34
RE: Arduino mit Schrittmotor und Lichtschranken
Hallo Markus,
ich denke, Du hast noch ein Verständnisproblem mit dem 'endlchen Automaten' und der switch-Anweisung. Du musst dich von deiner bisherigen Denkweise der blockierenden Programmierung lösen. Die Zustände werden nicht einfach von aussen druchgeschaltet.
Wenn sich dein Aufzug in einem bestimmten Zustand befindet, läuft der loop ständig durch den entsprechenden case-Block des switch. Da wird nicht angehalten ( kein while ). Es wird nur auf Ereignisse geprüft, die einen Zustandswechsel bewirken.

Als Pseudocode:
Code:
switch ( aufzugZustand ) {                      //Zustand 1: Aufzug in Ruhes
    case RUHE:
      // Zustand des Starttaster prüfen
      if ( Starttaster gedrückt ) {
        stepper.writeSteps(obererEndpunkt);         // zum oberen Endpunkt bewegen
        aufzugZustand = FAEHRT_HOCH;
      }
      break;

    case FAEHRT_HOCH:                             //Zustand 2: Aufzug fährt nach oben
      // Prüfen, ob der Aufzug oben angekommen ist
      if ( !stepper.moving() ) {                 // Aufzug ist oben angekommen
        Wartezeit starten;
        aufzugZustand = WARTEN_OBEN;
      }
      break;

    case WARTEN_OBEN:                           //Zustand 3: Wartezeit oben
      // prüfen, ob Wartezeit abgelaufen ist
      if ( wartezeit abgelaufen ) {
        stepper.writeSteps(0);                     // zum unteren Endpunkt bewegen
        aufzugZustand = FAEHRT_RUNTER;
      }
      break;

    case FAEHRT_RUNTER:                          //Zustand 4: Aufzug fährt nach unten
      // Prüfen, ob der Aufzug unten angekommen ist
      if ( !stepper.moving() ) {                // Aufzug ist unten angekommen
        aufzugZustand = RUHE;
      }
      break;
  }
Und dieser switch-Block muss bei jedem loop-Durchlauf aufgerufen werden. Für das Verwalten der Wartezeiten kannst Du den MoToTimer benutzen.

Zu den MoToButtos schaust Du dir am Besten mal das Beispiel 'PrintStates2' der MobaTools an. Da ist gezeigt, wie man die MoToButtons einrichtet.

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 Geschwindigkeit steuern!!!! Rumpl-X 11 954 26.12.2020 15:02
Letzter Beitrag: Nichtraucher
  Accelstepper libary und Schrittmotor Lothileinchen 11 3.196 22.01.2020 21:30
Letzter Beitrag: Lothileinchen
  Wert von einem Arduino zu einem zweiten Arduino senden Thorsten_S 9 3.602 14.10.2019 14:48
Letzter Beitrag: Thorsten_S
  Wegbegrenzung für Schrittmotor Scouter 62 10.893 10.02.2019 13:48
Letzter Beitrag: Scouter
  Projekt Portionierer mit Schrittmotor, Bluetooth hilfe Flieger 3 2.103 09.08.2018 13:02
Letzter Beitrag: Hilgi
  Endschalter für Schrittmotor clemens5555 10 6.500 18.04.2018 14:37
Letzter Beitrag: Tommy56
  Schrittmotor mit Puls/Richtung Steuern Günni 6 4.759 19.01.2018 10:30
Letzter Beitrag: Tommy56
  Schrittmotor Geschwindigkeit mit Wägezelle + HX711 Modul steuern Schrittmotor 10 6.805 30.08.2017 23:45
Letzter Beitrag: hotsystems
  Firmata (Daten senden an den Arduino und empfangen vom Arduino) comfan 6 6.340 29.04.2017 14:29
Letzter Beitrag: hotsystems
  Schrittmotor mit l298n Sequenz huber5093 10 5.882 26.04.2017 15:06
Letzter Beitrag: huber5093

Gehe zu:


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