Moin,
ich bin Anfänger was den Arduino betrifft und arbeite mich gerade erst in das Thema ein. Habe schon viel gegoogelt und auf Youtube geguckt, komme aber gerade nicht wirklich weiter. Aktuell mache ich gerade eine Ausbildung zum Mechatroniker, in dessen Rahmen ich dieses Projekt auch mache.
Ich möchte gerne eine Schrittkette/Ablaufsteuerung mit dem Arduino programmieren (kenne bislang nur SPS, daher würde ich mich gerne daran orientieren), bin dabei schon auf die Schlagworte FSM, Nachtwächter und so weiter gestoßen, aber so ganz habe ich trotz Suche die Syntax dahinter noch nicht verstanden.
Bei dem Projekt möchte ich mehrere Pneumatikzylinder in bestimmter Reihenfolge und in Abhängigkeit von Reedkontakten steuern.
Ein Sensor erkennt ob ein Bauteil vorhanden ist, ist dies nicht der Fall soll die Schrittkette beginnen. Sobald der erste Zylinder ausgefahren ist, erkennt dies der entsprechende Reedkontakt und es soll in den nächsten Schritt gehen (Reedkontakte sind die Transitionen) und der nächste Zylinder soll ausfahren. Am Ende soll die Grundstellung wieder erreicht sein.
Habe schon versucht was zu programmieren und zu testen. Dafür habe ich einfach die Zylinder mit LEDs auf einem Breadboard ersetzt und die Reedkontakte indem ich die entsprechenden Pins mit Strom versorge.
Hier einmal mein bisheriger Code:
// falls Not Aus rein, millis einfügen, delay raus
int pin1B1 = 0; // kapazitiver Sensor
int pin2B1 = 1; // Magazin oben/unten
int pin3B1 = 2; //Reed "Klemmen" eingefahren
int pin3B2 = 3; //Reed "Klemmen" ausgefahren
int pin1A1 = 4; // Zylinder "Klemmen"
int pin2A1 = 5; // Zylinder "Sperren"
int pin3A1 = 6; // Zylinder "Schieben"
int pin4A2 = 7; // Zylinder "Sichern"
int pin4B1 = 8; // Reed "Sperren" eingefahren
int pin4B2 = 9; // Reed "Sperren" ausgefahren
int pin5B1 = 10; // Reed "Schieben" eingefahren
int pin5B2 = 11; // Reed "Schieben" ausgefahren
int pin6B1 = 12; // Reed "Sichern" eingefahren
int pin6B2 = 13; // Reed "Sichern" susgefahren
int pinS1 = A0; // Schalter EIN/AUS, noch nicht eingefügt, evtl später
enum States {
stateRuhestellung, stateSperren, stateKlemmen, stateSichernWeg, stateSchieben, stateSchiebenRein, stateSichernHoch, stateKlemmenWeg, stateSperrenWeg
}; // die einzelnen Schritte
//mState = machine State
States mState = stateRuhestellung; //der Startpunkt der Schrittkette?
void setup() {
Serial.begin(9600);
pinMode(pin1A1, OUTPUT);
pinMode(pin2A1, OUTPUT);
pinMode(pin3A1, OUTPUT);
pinMode(pin4A2, OUTPUT);
pinMode(pin1B1, INPUT);
pinMode(pin2B1, INPUT);
pinMode(pin3B1, INPUT);
pinMode(pin3B2, INPUT);
pinMode(pin4B1, INPUT);
pinMode(pin4B2, INPUT);
pinMode(pin5B1, INPUT);
pinMode(pin5B2, INPUT);
pinMode(pin6B1, INPUT);
pinMode(pin6B2, INPUT);
digitalWrite(pin1A1, LOW); // bei Neustart Grundstellung
digitalWrite(pin2A1, LOW);
digitalWrite(pin3A1, LOW);
digitalWrite(pin4A2, HIGH);
}
void loop() {
// mit "when" Schalter abfragen? Switch case nur solange Schalter Ein?
Serial.println(F("Start"));
switch (mState)
{
case stateRuhestellung:
{
if (pin1B1 == HIGH && pin2B1 == HIGH)
{
Serial.println(F("Ruhestellung"));
//delay (3000);
mState = stateSperren; // der nächste Schritt
}
break;
case stateSperren:
{
if (pin1B1 == LOW && pin2B1 == HIGH) //Bedingung um den Zylinder in diesem Schritt auszufahren
{
digitalWrite (pin2A1, HIGH); // Zylinder soll ausfahren
Serial.println(F("Sperren"));
//delay (3000);
mState = stateKlemmen;
}
}
break; // diesen Schritt verlassen
case stateKlemmen:
{
if (pin4B2 == HIGH)
{
digitalWrite (pin1A1, HIGH);
Serial.println(F("Klemmen"));
//delay (3000);
mState = stateSichernWeg;
}
}
break;
case stateSichernWeg:
{
if (pin3B2 == HIGH)
{
digitalWrite (pin4A2, LOW);
Serial.println(F("SichernWeg"));
//delay (3000);
mState = stateSchieben;
}
}
break;
case stateSchieben:
{
if (pin6B1 == HIGH)
{
digitalWrite (pin3A1, HIGH);
Serial.println(F("Schieben"));
//delay (3000);
mState = stateSchiebenRein; //advance to the next state
}
}
break;
case stateSchiebenRein:
{
if (pin5B2 == HIGH)
{
digitalWrite (pin3A1, LOW);
Serial.println(F("SchiebenRein"));
//delay (3000);
mState = stateSichernHoch; //advance to the next state
}
}
break;
case stateSichernHoch:
{
if (pin5B1 == HIGH)
{
digitalWrite (pin4A2, HIGH);
Serial.println(F("SichernHoch"));
//delay (3000);
mState = stateKlemmenWeg;
}
}
break;
case stateKlemmenWeg:
{
if (pin6B2 == HIGH)
{
digitalWrite (pin1A1, LOW);
Serial.println(F("KlemmenWeg"));
//delay (3000);
mState = stateSperrenWeg;
}
}
break;
case stateSperrenWeg:
{
if (pin3B1 == HIGH)
{
digitalWrite (pin2A1, LOW);
Serial.println(F("SperrenWeg"));
//delay (3000);
mState = stateRuhestellung;
}
}
break;
}
}
}
Habe es so verstanden, dass switch immer die einzelnen case aktiviert. Ich wähle oben den ersten case für den Start aus und dann gehe ich von einem case in den nächsten. Der jeweilige case ist dann aktiv, wird aber erst ausgeführt wenn die entsprechende if Bedingung im Inneren erfüllt ist. Also so lange dann in dem case bleibt.
Oder muss ich das break dann noch noch in die if Schleife packen?
Habe auch mal auf die schnelle versucht mir den aktuellen Schritt auf dem seriellen Monitor anzeigen zu lassen, aber hat auch nicht so ganz funktioniert, habe mich damit allerdings auch noch nicht beschäftigt.
Ich hoffe ihr könnt mir weiter helfen, falls ihr mehr Infos braucht einfach melden