// تعريف دبابيس التوصيل لـ Nema 1
const int StepN1 = 3;
const int DirN1 = 4;
// تعريف دبابيس التوصيل لـ Nema 2
const int StepN2 = 7;
const int DirN2 = 8;
// تعريف دبابيس التوصيل لـ Stepper 3
const int StepN3 = 9;
const int DirN3 = 10;
// تعريف دبابيس التوصيل لـ Nema 4
const int StepN4 = 12;
const int DirN4 = 13;
// تعريف دبابيس التوصيل لأزرار التحديد
const int LS1 = 2;
const int LS2 = 6;
const int LS3 = 11;
// عدد الخطوات اللازمة لتحريك Nema 2 ربع دورة
const int stepsPerQuarterTurn = 50;
// تعريف عدد الدورات وحساب الخطوات لـ Nema 4 و Stepper 3 و Nema 1
const int numTurnsNema4 = 2;
const int numTurnsStepper3 = 1;
const int numTurnsNema1 = 1;
const int stepsPerRevolution = 200; // باعتبار أن كل خطوة تساوي 1.8 درجة لـ Nema 17
int sequenceCounter = 0; // عداد لتتبع عدد مرات تشغيل التسلسل
void setup() {
// إعداد الدبابيس كمخرجات أو مداخل لـ Nema 1
pinMode(StepN1, OUTPUT);
pinMode(DirN1, OUTPUT);
// إعداد الدبابيس كمخرجات أو مداخل لـ Nema 2
pinMode(StepN2, OUTPUT);
pinMode(DirN2, OUTPUT);
// إعداد الدبابيس كمخرجات أو مداخل لـ Stepper 3
pinMode(StepN3, OUTPUT);
pinMode(DirN3, OUTPUT);
// إعداد الدبابيس كمخرجات أو مداخل لـ Nema 4
pinMode(StepN4, OUTPUT);
pinMode(DirN4, OUTPUT);
// إعداد الدبابيس كمدخلات مع مقاومات سحب داخلية لأزرار التحديد
pinMode(LS1, INPUT_PULLUP);
pinMode(LS2, INPUT_PULLUP);
pinMode(LS3, INPUT_PULLUP);
// تعيين الاتجاهات الأولية لجميع المحركات
digitalWrite(DirN1, HIGH);
digitalWrite(DirN2, HIGH); // الاتجاه مع عقارب الساعة لـ Nema 2
digitalWrite(DirN3, HIGH); // الاتجاه مع عقارب الساعة لـ Stepper 3
digitalWrite(DirN4, HIGH); // الاتجاه مع عقارب الساعة لـ Nema 4
}
// دالة لتحريك أي محرك بناءً على الدبوس، الاتجاه، عدد الخطوات، زمن التأخير، واتجاه الدوران
void moveMotor(int stepPin, int dirPin, int steps, int delayTime, bool clockwise) {
digitalWrite(dirPin, clockwise ? HIGH : LOW);
for (int i = 0; i < steps; i++) {
digitalWrite(stepPin, HIGH);
delayMicroseconds(delayTime);
digitalWrite(stepPin, LOW);
delayMicroseconds(delayTime);
}
}
void loop() {
// إذا كان العداد قد وصل إلى 3، توقف عن العمل حتى يتم إعادة ضبط Arduino
if (sequenceCounter >= 3) {
return;
}
// انتظار حتى يتم الضغط على الزر LS1
while (digitalRead(LS1) == HIGH) {
// لا تفعل شيئًا، انتظر الضغط على الزر LS1
}
// بدء التسلسل عند الضغط على LS1
while (digitalRead(LS1) == LOW) {
// قراءة حالة أزرار التحديد
bool LS1state = digitalRead(LS1);
bool LS2state = digitalRead(LS2);
bool LS3state = digitalRead(LS3);
if (LS1state == LOW && LS2state == LOW) {
// إذا كان كلا الزرين LS1 و LS2 مضغوطين
digitalWrite(StepN1, LOW); // إيقاف Nema 1
// تحريك Nema 2 لربع دورة
moveMotor(StepN2, DirN2, stepsPerQuarterTurn, 800, true);
// بدء Stepper 3 حتى يتم الضغط على LS3
while (digitalRead(LS3) == HIGH) {
digitalWrite(StepN3, HIGH);
delayMicroseconds(800);
digitalWrite(StepN3, LOW);
delayMicroseconds(800);
}
// التأكد من توقف Stepper 3 بعد الضغط على LS3
digitalWrite(StepN3, LOW);
// تحريك Nema 4 لعدد محدد من الدورات
moveMotor(StepN4, DirN4, numTurnsNema4 * stepsPerRevolution, 800, true);
// تحريك Stepper 3 عكس اتجاه عقارب الساعة لعدد محدد من الدورات
moveMotor(StepN3, DirN3, numTurnsStepper3 * stepsPerRevolution, 800, false);
// إعادة Nema 4 إلى الموضع الأولي (اتجاه عقارب الساعة)
moveMotor(StepN4, DirN4, numTurnsNema4 * stepsPerRevolution, 800, false);
// إعادة Stepper 3 إلى الموضع الأولي (عكس اتجاه عقارب الساعة)
moveMotor(StepN3, DirN3, numTurnsStepper3 * stepsPerRevolution, 800, false);
// إعادة Nema 2 إلى الموضع الأولي (عكس اتجاه عقارب الساعة)
moveMotor(StepN2, DirN2, stepsPerQuarterTurn, 800, false);
// تحريك Nema 1 عكس اتجاه عقارب الساعة لعدد محدد من الدورات
moveMotor(StepN1, DirN1, numTurnsNema1 * stepsPerRevolution, 800, false);
// تحريك Stepper 3 في اتجاه عقارب الساعة لعدد محدد من الدورات
moveMotor(StepN3, DirN3, numTurnsStepper3 * stepsPerRevolution, 800, true);
// تحريك Nema 4 في اتجاه عقارب الساعة لعدد محدد من الدورات
moveMotor(StepN4, DirN4, numTurnsNema4 * stepsPerRevolution, 800, true);
// تحريك Stepper 3 مرة أخرى في اتجاه عقارب الساعة لعدد محدد من الدورات
moveMotor(StepN3, DirN3, numTurnsStepper3 * stepsPerRevolution, 800, true);
// إعادة Nema 4 إلى الموضع الأولي (عكس اتجاه عقارب الساعة)
moveMotor(StepN4, DirN4, numTurnsNema4 * stepsPerRevolution, 800, false);
// زيادة العداد بعد إكمال التسلسل
sequenceCounter++;
// الانتظار حتى يتم تحرير الأزرار LS1 أو LS2
while (digitalRead(LS1) == LOW || digitalRead(LS2) == LOW) {
delay(10); // تأخير صغير لمنع الاستخدام المفرط لوحدة المعالجة المركزية
}
} else {
// إذا كان LS1 فقط مضغوط
if (LS1state == LOW) {
// تحريك Nema 1
digitalWrite(StepN1, HIGH);
delayMicroseconds(800); // ضبط التأخير لسرعة المحرك
digitalWrite(StepN1, LOW);
delayMicroseconds(800); // ضبط التأخير لسرعة المحرك
} else {
// إيقاف Nema 1
digitalWrite(StepN1, LOW);
}
// إيقاف Nema 2
digitalWrite(StepN2, LOW);
// إيقاف Stepper 3
digitalWrite(StepN3, LOW);
// إيقاف Nema 4
digitalWrite(StepN4, LOW);
}
}
}