Hallo Agmue,
naja mit nicht lesen wollen (falls Du deine Agmue Anleitung meinst) hat das nicht viel zu tun…
Wie soll denn ein Anfänger so ein wirres Zeug verstehen ?? (Auszug aus dem Beispiel mit dem Kohlekran)
if (MicroVerzoegerung(zeit)) {
bitfolge = schrittfolge[schritt];
for (byte j = 0; j < sizeof(pinMotor); j++) {
digitalWrite(pinMotor[j], (bitfolge >> j) & 1);
}
if (abs(sollSchritte) - schrittZaehler < beschleunigungSchritte && beschleunigungSchritte > 0) {
zeit -= beschleunigungIntervall;
}
if (schrittZaehler < verzoegerungSchritte) {
zeit += verzoegerungIntervall;
}
if (schrittZaehler > 0) {
schrittZaehler--;
}
if (sollSchritte > 0) {
schritt--;
}
if (sollSchritte < 0) {
schritt++;
}
if (schritt < 0) {
schritt = sizeof(schrittfolge);
} else {
schritt = schritt % sizeof(schrittfolge);
}
}
if (schrittZaehler == 0) {
for (byte i = 0; i < sizeof(pinMotor); i++) {
digitalWrite(pinMotor[i], LOW);
}
return true;
}
return false;
oder Auszug aus deiner Verlinkung ein “Automat ohne delay”
if(millis()-millisMem < d[0]+d[1]+d[2]+d[3])
ich kann Dir nur sagen das ist für einen Anfänger NICHT geeignet.
Mir ist schon klar, dass das für Dich als “alten Hasen” so leicht zu verstehen ist wie 1+1 zusammenzählen,
für mich als Anfänger ist das aber Raketentechnologie, und somit nicht so einfach zu verstehen.
Da anscheinend viele Wege (auch bei einem Zustandsautomaten) nach Rom führen, wollte ich mich nach einer wirklich einfachen Variante erkundigen, wie ich von case 1: nach case 2: hüpfen kann.
Mein Beispiel was ich hier Anfangen wollte, könnte meiner Meinung nach wirklich als Anfängerbeispiel durchgehen, inwelchem es nur 2 Zustände gibt.
Diese hätte mir helfen sollen in die Thematik mit dem Zustandsautomaten reinzuwachsen.
Ich hätte gerne an meinem Schleifautomaten weitergearbeitet, welchen wir schon einmal hier
“https://forum.arduino.cc/index.php?topic=695136.45” besprochen hatten.
Das conclusio dieser Besprechung war, ohne Schrittkette wird das nicht funktionieren.
Zwischenzeitlich habe ich schon mit der Programmierung begonnen, und bin dort hängengeblieben wo ich mit dem Schrittmotor S1 von der Klinge wegfahren möchte um das Sensor Signal zu unterbrechen, sodass S1 wieder selbstsändig zur nächsten Klinge weiterfahren kann.
Hierfür hätte ich zwar eine Lösung mit delay() wobei dies halt nicht sehr sauber ist.
Funktionieren würde es bis jetzt schon mal, ich werde die Zustände allerdings noch etwas optimieren.
Bei meinem Code muss ich noch den S2 ergänzen, sowie S4 und S5, was theoretisch auch wieder mit einfachen if abfragen funktionieren sollte.
Die Schrittkette hätte denn bisherigen Programmablauf etwas aufhübschen / vereinfachen sollen, sodass nicht alles in einer Wurst geschrieben ist.
#define MAX8BUTTONS
#include <MobaTools.h>
const int sensorpin = 22; //Kapazitiver Näherungssensor
MoToStepper S1(1600, STEPDIR); //bipolarer Schrittmotor Längsschlitten => Verfahrweg: 0m bis 3m, stoppt ca. alle 10cm bei Klinge durch Kap. Sensor
MoToStepper S3(1600, STEPDIR); //bipolarer Schrittmotor Vertikalschlitten
enum { Taster1, Taster2, Taster3, Taster4} ; //4x Endschalter
const byte tasterPins[] = { 44, 45, 46, 47 };
MoToButtons taster( tasterPins, sizeof(tasterPins), 20, 500 );
int Z_Taster1; // Zustand Taster1 (HIGH, LOW)
int Z_Taster2;
int Z_Taster3;
int Z_Taster4;
String Z_Schlitten;
void setup()
{
Serial.begin (115200);
pinMode(sensorpin, INPUT);
S1.attach( 53, 51 ); // STEPpin, DIRpin
S1.setSpeed( 300 ); // = 80 U/Min (motorspezifisch)
S1.setRampLen( 10 ); // Beschleunigung (motorspezifisch)
S3.attach( 52, 50 ); // STEPpin, DIRpin
S3.setSpeed( 300 ); // = 80 U/Min (motorspezifisch)
S3.setRampLen( 0 ); // Beschleunigung (motorspezifisch)
Z_Taster1 = LOW;
Z_Taster2 = LOW;
Z_Taster3 = LOW;
Z_Taster4 = LOW;
Z_Schlitten = "oben";
}
void loop()
{
//**************************Einlesen der Taster und Sensoren sowie vorvereitung des Seriellen Monitors *****************************
taster.processButtons(); // Taster einlesen und bearbeiten
int sensorstate = digitalRead(sensorpin);
Serial.print("Zustand Taster 1= ");
Serial.println(Z_Taster1);
Serial.print("Zustand Taster 2= ");
Serial.println(Z_Taster2);
Serial.print("Zustand Taster 3= ");
Serial.println(Z_Taster3);
Serial.print("Zustand Taster 4= ");
Serial.println(Z_Taster4);
Serial.print("Zustand Schlitten= ");
Serial.println(Z_Schlitten);
delay(200);
/*
if (sensorstate == 1)
{
Serial.println("Klinge nicht erkannt = 1"); // Klinge nicht erkannt
}
else
{
Serial.println(Z_Taster1);
}
delay(500);
Serial.print("Zustand Taster 1= ");
Serial.println(Z_Taster1);
/* if (taster.state(Taster1) == HIGH)
{
Serial.println("Taster1 gedrückt"); // Klinge nicht erkannt
}
if (taster.state(Taster1) == LOW)
{
Serial.println("Taster1 nicht gedrückt"); // Klinge nicht erkannt
}
delay(100);
*/
//**************************Programablauf *****************************
if (taster.pressed(Taster1)) {
if (Z_Taster1 == LOW) Z_Taster1 = HIGH; else Z_Taster1 = LOW;
}
if (taster.pressed(Taster2)) {
if (Z_Taster2 == LOW) Z_Taster2 = HIGH; else Z_Taster2 = LOW;
}
if (taster.pressed(Taster3)) {
if (Z_Taster3 == LOW) Z_Taster3 = HIGH; else Z_Taster3 = LOW;
}
if (taster.pressed(Taster4)) {
if (Z_Taster4 == LOW) Z_Taster4 = HIGH; else Z_Taster4 = LOW;
}
if ( sensorstate == 1 && Z_Taster1 == LOW && Z_Taster2 == LOW) // S1 fährt zu nächswter Klinge
{
S1.rotate(1);
S3.rotate(0);
} else {
S1.rotate(0);
S3.rotate(0);
}
if ( sensorstate == 0 && Z_Taster4 == LOW && Z_Schlitten == "oben") // S1 stoppt bei Klinge, S3 beginnt nach unten zu drehen
{
S1.rotate(0);
S3.rotate(1);
}
if ( sensorstate == 0 && Z_Taster4 == HIGH && Z_Schlitten == "oben") // S3 fährt gegen Endschalter unten und pausiert dort für 3 Sek
{
S1.rotate(0);
S3.rotate(0);
delay(3000);
Z_Schlitten = "unten";
}
if ( sensorstate == 0 && Z_Schlitten == "unten") // S3 fährt nach oben
{
S1.rotate(0);
S3.rotate(-1);
}
if ( sensorstate == 0 && Z_Taster3 == HIGH) // S3 fährt gegen Endschalter oben und stoppt
{
S1.rotate(0);
S3.rotate(0);
Z_Schlitten = "oben_angekommen";
}
if ( sensorstate == 0 && Z_Schlitten == "oben_angekommen") // S1 fährt im Uhrzeigersinn weiter um aus dem Sensorsignal zu kommen
{
S1.doSteps(800);
S3.rotate(0);
delay(3000);
Z_Schlitten = "oben";
Z_Taster3 = LOW;
Z_Taster4 = LOW;
}
}
LG
Christian