Aktüatörünüzü kontrol etmek için bir PLC programlamak, üstlenecek daha zor projelerden biri olabilir. Deneme yanılma, test ve sabır yığını gerektirir; Her ne kadar sonuçlar inanılmaz işlevsel ve ödüllendirici olabilir.
Bu kod işlevsel bir Seri duyarlı aktüatör. Bu, müşteri tarafından yapılmış bir koddur Nicola Buccoliero, Roma'daki Universtà Kampüsü Bio-Medico'dan 24 yaşındaki İtalyan bir mühendis, Tezleri Upenn ile birlikte çalışıyor.
Seri besleme, bir Arduino'nun aldığı bir operasyon leger'dir, ek veriler programlandığı gibi Arduino birimine gönderilir. Bu kodla, seri monitöre bir numara yazmak, Arduino'ya aktüatörünüzün nerede hareket etmesini istediğinizi söyleyecektir.
Kodun yaptığı:
-
Başlatma (kurulum):
- Motor ve aktüatör geri bildirim sensörüne bağlantıları kurar.
-
Talimatlar için seri monitörü izlemek:
- Arduino bir sayı girmenizi arıyor. Seri beslemeye girilen bir sayı gördüğünde, motoru hareket ettirmeye başlar.
-
Motoru hareket ettirme:
- Hedef konum ayarlandığında, Arduino aktüatörü hedefe doğru hareket ettirmeye başlayacaktır. Bu noktaya ne zaman ulaştığını bilmek için sensöre göz kulak olur.
-
Konumda Durma:
- Hareket ederken, sensörü kontrol etmeye devam eder. Sensör doğru noktada olduğunu söyledikten sonra, sistem motoru durdurur.
-
Bir sonraki talimatı bekleyin:
- Sistem daha fazla talimat bekleyecektir. Yeni bir mesaj duyduğunda, aynı süreci takip ederek tekrar hareket etmeye başlar.
Bu kod, bir motorun belirli bir yere gitmesi, orada durması ve söylendiğinde tekrar tekrar yapmaya hazır olmasına yardımcı olur.
Bu kod bir tamamen geri çekilmiş aktüatör, yani "0" konumu, inmenin tamamen geri çekilmiş ucudur. Ancak, aktüatör genişletilirken başlatılırsa bu kod çalışır - aktüatörü geriye doğru hareket ettirmek için negatif bir tamsayı değeri girmeniz gerekir (Örn: -1200)
Nicola'nın kodu// 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