Arduinoを使用したポジション入力アクチュエータ制御

アクチュエータを制御するためのPLCのプログラミングは、実施するのがより困難なプロジェクトの1つです。試行錯誤、テスト、忍耐力が必要です。結果は非常に機能的でやりがいがありますが。

Arduinoで線形アクチュエータをどのように制御しますか?

このコードは機能用です シリアルレスポンシブアクチュエータ。これは、顧客が構築したコードです ニコラ・ブッコリーロ、ローマのユニバータキャンパスバイオメディコの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: