Lập trình PLC để kiểm soát bộ truyền động của bạn có thể là một trong những dự án khó thực hiện hơn. Nó yêu cầu thử nghiệm và lỗi, thử nghiệm và một đống kiên nhẫn; Mặc dù kết quả có thể vô cùng chức năng và bổ ích.
Mã này dành cho một chức năng Bộ truyền động đáp ứng nối tiếp. Đây là mã được xây dựng bởi khách hàng từ Nicola Buccoliero, một kỹ sư người Ý 24 tuổi từ Universtà Bio-Medico ở Rome, làm việc với luận án của họ với Upenn.
Nguồn cấp dữ liệu nối tiếp là một sự tìm kiếm các hoạt động mà Arduino thực hiện, với dữ liệu bổ sung được gửi vào hoặc ra khỏi đơn vị Arduino như được lập trình. Với mã này, việc gõ một số vào màn hình nối tiếp sẽ cho Arduino của bạn biết bạn muốn bộ truyền động của bạn di chuyển.
Đây là những gì mã làm:
-
Khởi tạo (thiết lập):
- Nó thiết lập các kết nối với động cơ và cảm biến phản hồi của bộ truyền động.
-
Xem màn hình nối tiếp cho hướng dẫn:
- Arduino đang tìm kiếm bạn để nhập một số. Khi nó nhìn thấy một số được nhập vào nguồn cấp dữ liệu nối tiếp, nó bắt đầu di chuyển động cơ.
-
Di chuyển động cơ:
- Khi vị trí mục tiêu được đặt, Arduino sẽ bắt đầu di chuyển bộ truyền động về phía mục tiêu. Nó để mắt đến cảm biến để biết khi nào nó đạt đến điểm đó.
-
Dừng tại địa điểm:
- Khi nó di chuyển, nó tiếp tục kiểm tra cảm biến. Khi cảm biến nói rằng nó ở đúng vị trí, hệ thống dừng động cơ.
-
Chờ hướng dẫn tiếp theo:
- Hệ thống sẽ chờ được hướng dẫn thêm. Khi nghe một tin nhắn mới, nó bắt đầu di chuyển trở lại, theo cùng một quá trình.
Mã này giúp điều khiển một động cơ đi đến một nơi cụ thể, dừng lại ở đó và sẵn sàng làm lại từ đầu khi được nói.
Mã này được dự định để bắt đầu với một Bộ truyền động rút lại hoàn toàn, có nghĩa là vị trí "0" là kết thúc bị rút lại hoàn toàn của đột quỵ. Tuy nhiên, mã này sẽ hoạt động nếu bộ truyền động được khởi tạo trong khi mở rộng - bạn sẽ cần nhập giá trị số nguyên âm để di chuyển bộ truyền động ngược (Xh: -1200)
Mã của Nicola// 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