I have implemented your recommended changes, however I have another Problem. After Motor1 has completed 5 20 Step cycles, I want it to return to its original starting position, making 100 steps in the opposite direction. But the Motor doesn't stop after 100 steps and I don't know how to fix it.
Another thing I have noticed:
When the PEB is activated while Motor1 is doing its 20 Steps, Motor2 doesn't move its 9 steps after Motor1 is finished with its 20. Can I store the information of the PEB getting activated and read it at a later time?
#include <Stepper.h>
#include <LiquidCrystal.h>
// Sortiersystem je 9 Schritte pro Fach (200 Schritte = 360°, 120° = 66 Schritte, 66/7 = 9,
// also 9*1,8°= 16,2° -- so weit dreht sich der Motor für jedes Fach
// Die Nockenwelle besteht aus 7 Nocken, verteilt auf 180°: 180/7 = 25,7°, 25,2° entspricht 14 Schritten
// mit je 1,8° --> Das Ausrdrücken einer Tablette dreht den Motor um 14 Schritte
// OBACHT: In der Realität sollte der Motor nicht von Peak to Peak laufen, sondern genau dazwischen.
// Das bedeutet, dass der Motor zuerst 21 Schritte macht, um im Zwischenraum der beiden Nocken zu landen,
// und ab dann jeweils 14 Schritte macht um wieder in die Zwischenräume zu gelangen
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
const int spu = 200; // Steps per revolution Motor
const int start = 2; // Start des ganzen Ausdrückvorgangs
const int M1_stepPin = 3;
const int M1_dirPin = 4;
const int M2_stepPin = 5;
const int M2_dirPin = 6;
const int lsPin = 7; // Lichschranke
const int steps_nw = 14; // Laufvariable der einzelnen Schritte Nockenwelle
const int steps_ss = 9; // Laufvariable der einzelnen Schritte Sortiersystem
int nos_nw = 0; // Laufvariable der Schrittpakete Nockenwelle (number of steps)
int nos_ss = 0; // Laufvariable der Schirrpaketen Sortiersystem
int reverse_nw = -1 * nos_nw * steps_nw; // Laufvariable Rückbewegung Nockenwelle
int reverse_ss = -1 * nos_ss * steps_ss; // Laufvariable Rückbewegung Sortiersystem
void setup() {
// Initialisierung der Arduino I/O Pins
pinMode(start, INPUT_PULLUP);
pinMode(M1_stepPin, OUTPUT);
pinMode(M1_dirPin, OUTPUT);
pinMode(M2_stepPin, OUTPUT);
pinMode(M2_dirPin, OUTPUT);
pinMode(lsPin, INPUT_PULLUP);
lcd.begin(16,2);
// Bewegung des Motors in die Startposition: halber Schritt, um mit einem ganzen Schritt
// in die Zwischenräume der einzelnen Nocken zu kommen
for (int x=0; x < 10; x++) {
digitalWrite(M1_stepPin, HIGH);
delay(50);
digitalWrite(M1_stepPin, LOW);
delay(50);
}
// UI: gibt auf Display aktuellen Stand aus
lcd.print("Motor ist in");
lcd.setCursor(0,1);
lcd.print("Startposition");
}
void loop() {
if (digitalRead(start) == LOW) {
Serial.print("Start Pin status: ");
Serial.println(start);
for (int x1=0; x1<20; x1++){
digitalWrite(M1_stepPin, HIGH);
delay(10);
digitalWrite(M1_stepPin, LOW);
delay(10);
}
}
while (digitalRead(lsPin) == LOW) {
// Serial.print("lsPin status: ");
// Serial.println(lsPin);
for(int x3=0; x3<9; x3++) {
digitalWrite(M2_stepPin, HIGH);
delay(10);
digitalWrite(M2_stepPin, LOW);
delay(10);
}
for (int x4=0; x4<20; x4++) {
digitalWrite(M1_stepPin, HIGH);
delay(10);
digitalWrite(M1_stepPin, LOW);
delay(10);
}
nos_nw++;
}
if (nos_nw == 4) {
for (int x5=0; x5<100; x5++) {
digitalWrite(M1_dirPin, HIGH);
digitalWrite(M1_stepPin, HIGH);
delay(10);
digitalWrite(M1_stepPin, LOW);
delay(10);
}
nos_nw == 0;
//Motor dreht zwar zurück, aber hört nicht auf zu drehen, macht mehr als 80 Schritte
}
}
My next problem will be the following: I also need Motor1 to do 20 steps if the PEB is not activated as a result of there not being a pill to deispense out of its packaging. I need the programm to realise, that no pill was ejected, so the camshaft needs to do another 20 steps to eject the next pill (if its there). If that package is empty again, do another 20 Steps until the total number of 100 steps were made, than turn back again.