アクチュエータを制御するためのPLCのプログラミングは、実施するのがより困難なプロジェクトの1つです。試行錯誤、テスト、忍耐力が必要です。結果は非常に機能的でやりがいがありますが。
このコードは機能用です シリアルレスポンシブアクチュエータ。これは、顧客が構築したコードです ニコラ・ブッコリーロ、ローマのユニバータキャンパスバイオメディコの24歳のイタリアのエンジニア、Upennとの論文に取り組んでいます。
シリアルフィードは、Arduinoが取る操作のレガーであり、プログラムされたArduinoユニットの内外で追加のデータが送信されます。このコードを使用すると、シリアルモニターに数字を入力すると、Arduinoにアクチュエータが移動する場所を伝えます。
コードが行うことは次のとおりです。
-
初期化(セットアップ):
- モーターとアクチュエータフィードバックセンサーへの接続をセットアップします。
-
指示のためにシリアルモニターを見る:
- Arduinoは、番号を入力するためにあなたを探しています。シリアルフィードに入力された数が表示されると、モーターの移動が開始されます。
-
モーターの移動:
- ターゲット位置が設定されると、Arduinoはアクチュエータをターゲットに向けて移動し始めます。センサーがいつその点に到達するかを知るために、センサーに目を光らせています。
-
場所で停止する:
- 動くと、センサーをチェックし続けます。センサーが正しい場所にあると言うと、システムはモーターを停止します。
-
次の指示を待つ:
- システムはさらなる指示を待ちます。新しいメッセージが聞こえると、同じプロセスに従って再び動き始めます。
このコードは、モーターを制御して、特定の場所に移動し、そこに停止し、伝えられたときにもう一度やり直す準備ができています。
このコードは、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