التحكم في مشغل الموضع والإدخال باستخدام Arduino

يمكن أن تكون برمجة PLC للتحكم في المشغل الخاص بك أحد المشاريع الأكثر صعوبة التي يجب القيام بها. إنه يتطلب التجربة والخطأ، والاختبار وكومة من الصبر؛ على الرغم من أن النتائج يمكن أن تكون وظيفية ومجزية بشكل لا يصدق.

كيف يمكنك التحكم في المحرك الخطي باستخدام الاردوينو؟

هذا الكود خاص بالوظيفة المحرك المستجيب التسلسلي. هذا رمز تم إنشاؤه بواسطة العميل من نيكولا بوكولييرو، وهو مهندس إيطالي يبلغ من العمر 24 عامًا من Universtà Campus Bio-Medico في روما، ويعمل على أطروحته مع UPenn.

التغذية التسلسلية عبارة عن مجموعة من العمليات التي يقوم بها Arduino، مع إرسال بيانات إضافية داخل أو خارج وحدة Arduino كما هو مبرمج. باستخدام هذا الرمز، فإن كتابة رقم في الشاشة التسلسلية سيخبر Arduino الخاص بك بالمكان الذي تريد أن يتحرك فيه المشغل الخاص بك.

إليك ما يفعله الكود:

  1. التهيئة (الإعداد):
    • يقوم بإعداد التوصيلات للمحرك ومستشعر ردود فعل المحرك.
  2. مشاهدة الشاشة التسلسلية للحصول على التعليمات:
    • يبحث Arduino عنك لإدخال رقم. عندما يرى رقمًا تم إدخاله في التغذية التسلسلية، يبدأ في تحريك المحرك.
  3. تحريك المحرك:
    • عندما يتم ضبط موضع الهدف، سيبدأ Arduino في تحريك المشغل نحو الهدف. يراقب المستشعر لمعرفة متى يصل إلى هذه النقطة.
  4. التوقف في المكان:
    • أثناء تحركه، يستمر في فحص المستشعر. بمجرد أن يقول المستشعر أنه في المكان الصحيح، يقوم النظام بإيقاف المحرك.
  5. انتظر التعليمات التالية:
    • سينتظر النظام لمزيد من التعليمات. وعندما يسمع رسالة جديدة، يبدأ في التحرك مرة أخرى، متبعًا نفس العملية.

يساعد هذا الرمز في التحكم في المحرك للذهاب إلى مكان معين، والتوقف هناك، والاستعداد للقيام بذلك مرة أخرى عندما يُطلب منك ذلك.

يهدف هذا الرمز إلى البدء بـ a المحرك تراجع بالكامل، مما يعني أن الموضع "0" هو نهاية الحد المتراجعة بالكامل. ومع ذلك، سيعمل هذا الرمز إذا تمت تهيئة المشغل أثناء تمديده - ستحتاج إلى إدخال قيمة عددية سالبة لتحريك المشغل إلى الخلف (على سبيل المثال: -1200)

كود نيكولا
// Input / Output Pins
const int motorPin1 = 10; // Pin to control the motor forward
const int motorPin2 = 11; // Pin to control the motor backward
const int sensorPin = 3;  // Pin to read the sensor

// Variables
int speed = 255; // Adjust to change actuator speed (0-255)

int sensorValue = 0;
int previousSensorValue = 0;
int motorChangeCount = 0;
int lastStoppedCount = 0;
int targetNumber = 0;
bool motorEnabled = false;
bool waitForCommand = true;

void setup() {
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(sensorPin, INPUT);
  Serial.begin(115200);
}

void loop() {
  if (!motorEnabled && Serial.available() > 0) {
    targetNumber = Serial.parseInt();
    if (targetNumber != 0) {
      Serial.print("Target number: ");
      Serial.println(targetNumber);
      motorEnabled = true;
      analogWrite(motorPin1, speed); // Move forward
      analogWrite(motorPin2, 0);   // Stop
     
      // Set the counter to the stopped value, considering the difference between targetNumber and lastStoppedCount
      if (targetNumber > lastStoppedCount) {
        motorChangeCount = lastStoppedCount + 1; // Start from +1
      } else if (targetNumber < lastStoppedCount) {
        motorChangeCount = lastStoppedCount - 1; // Start from -1
      } else {
        motorChangeCount = lastStoppedCount; // Keep the same value
      }
     
      waitForCommand = true;    // Wait for a new input from the serial
    }
  }

  if (motorEnabled) {
    sensorValue = digitalRead(sensorPin);
    if (sensorValue == 1 && previousSensorValue == 0) {
      if (motorChangeCount < targetNumber) {
        motorChangeCount++;
      } else if (motorChangeCount > targetNumber) {
        motorChangeCount--;
      }

      Serial.print("Change from 0 to 1: ");
      Serial.print(motorChangeCount);
      Serial.print(" - Target number: ");
      Serial.println(targetNumber);
    }
    previousSensorValue = sensorValue;

    if (motorChangeCount < targetNumber) {
      analogWrite(motorPin1, speed); // Move forward
      analogWrite(motorPin2, 0);
    } else if (motorChangeCount > targetNumber) {
      analogWrite(motorPin1, 0);
      analogWrite(motorPin2, speed); // Move backward
    } else {
      analogWrite(motorPin1, 0); // Stop the motor when the motor count corresponds to the target number
      analogWrite(motorPin2, 0);
      motorEnabled = false;
      Serial.println("Motor stopped. Awaiting a new number.");
      lastStoppedCount = motorChangeCount; // Store the value of motorChangeCount when the motor stops
      waitForCommand = true; // Wait for new instructions
    }
  }
}
// Code by Nicola Buccoliero 
Share This Article
Tags: