Arduino를 사용한 위치 입력 액추에이터 제어

액추에이터를 제어하기 위해 PLC를 프로그래밍하는 것은 수행하기 어려운 프로젝트 중 하나 일 수 있습니다. 시행 착오, 테스트 및 인내심이 필요합니다. 결과는 엄청나게 기능적이고 보람이 될 수 있습니다.

Arduino로 선형 액추에이터를 어떻게 제어합니까?

이 코드는 기능을위한 것입니다 일련의 반응 형 액추에이터. 이것은 고객이 제작 한 코드입니다 Nicola Buccoliero, 로마의 Universtà 캠퍼스 바이오-메디코 출신의 24 세의 이탈리아 엔지니어는 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: