Управление приводом в положении с помощью Arduino

Программирование ПЛК для управления вашим приводом может быть одним из наиболее сложных проектов. Это требует проб и ошибок, тестирования и кучи терпения; Хотя результаты могут быть невероятно функциональными и полезными.

Как управлять линейным приводом с помощью Arduino?

Этот код для функционального Серийный реагирующий приводПолем Это код, созданный клиентом из Никола Буккольеро24-летний итальянский инженер из кампуса Univestà 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: