کنترل محرک موقعیت موقعیت با یک آردوینو

برنامه نویسی یک PLC برای کنترل محرک شما می تواند یکی از پروژه های دشوارتر برای انجام آن باشد. نیاز به آزمایش و خطا ، آزمایش و پشته صبر دارد. اگرچه نتایج می توانند فوق العاده کاربردی و با ارزش باشند.

چگونه یک محرک خطی را با یک آردوینو کنترل می کنید؟

این کد برای عملکردی است محرک پاسخگو سریالبشر این یک کد ساخته شده از مشتری است نیکولا بوچولیو، یک مهندس 24 ساله ایتالیایی از دانشگاه Universtà Bio-Medico در رم ، که روی پایان نامه خود با Upenn کار می کند.

فید سریال از عملیاتی است که Arduino انجام می دهد ، با داده های اضافی که به صورت برنامه ریزی شده از واحد Arduino ارسال شده یا خارج می شود. با استفاده از این کد ، تایپ کردن یک شماره در مانیتور سریال ، Arduino شما را به کجا می خواهید محرک شما حرکت کند.

این همان کاری است که کد انجام می دهد:

  1. اولیه سازی (تنظیم):
    • این اتصالات را به موتور و سنسور بازخورد محرک تنظیم می کند.
  2. تماشای مانیتور سریال برای دستورالعمل ها:
    • Arduino به دنبال شما است که یک شماره را وارد کنید. هنگامی که می بیند یک عدد وارد شده به فید سریال ، شروع به حرکت موتور می کند.
  3. حرکت موتور:
    • هنگامی که موقعیت هدف تنظیم شود ، Arduino شروع به حرکت محرک به سمت هدف خواهد کرد. این به سنسور توجه می کند تا بداند چه موقع به آن نقطه می رسد.
  4. توقف در مکان:
    • همانطور که حرکت می کند ، سنسور را چک می کند. هنگامی که سنسور می گوید در جای مناسب قرار دارد ، سیستم موتور را متوقف می کند.
  5. منتظر دستورالعمل بعدی باشید:
    • سیستم منتظر آموزش بیشتر خواهد بود. وقتی پیام جدیدی را می شنود ، با دنبال کردن همان روند ، دوباره شروع به حرکت می کند.

این کد به کنترل یک موتور کمک می کند تا به یک مکان خاص برود ، در آنجا متوقف شود و در صورت گفته شدن دوباره این کار را انجام دهید.

این کد برای شروع با یک محرک کاملاً جمع شده، به این معنی که موقعیت "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: