Программирование ПЛК для управления вашим приводом может быть одним из наиболее сложных проектов. Это требует проб и ошибок, тестирования и кучи терпения; Хотя результаты могут быть невероятно функциональными и полезными.
Этот код для функционального Серийный реагирующий приводПолем Это код, созданный клиентом из Никола Буккольеро24-летний итальянский инженер из кампуса Univestà Bio-Medico в Риме, работая над своей диссертацией с Upenn.
Серийный канал - это более широкий уровень операций, которые делает Arduino, с дополнительными данными, отправляемыми в единицу Arduino, в соответствии с программами. С помощью этого кода ввод номера в серийный монитор сообщит вашему Arduino, где вы хотите, чтобы ваш привод перешел.
Вот что делает код:
-
Инициализация (настроенная):
- Он устанавливает соединения с двигателем и датчиком обратной связи привода.
-
Смотрю серийный монитор для инструкций:
- Arduino ищет вас, чтобы ввести число. Когда он видит число, введенное в серийную подачу, он начинает перемещать двигатель.
-
Перемещение мотора:
- Когда целевая позиция установлена, Arduino начнет перемещать привод к цели. Он следит за датчиком, чтобы знать, когда он достигает этой точки.
-
Остановка в месте:
- Когда он движется, он продолжает проверять датчик. Как только датчик говорит, что он находится в правильном месте, система останавливает двигатель.
-
Подождите следующую инструкцию:
- Система будет ждать дальнейшей инструкции. Когда он слышит новое сообщение, оно снова начинает двигаться, следуя тому же процессу.
Этот код помогает контролировать двигатель, чтобы перейти в определенное место, остановиться там и быть готовым сделать это снова и снова, когда сказано.
Этот код предназначен для начала с Полностью втянутый привод, то есть положение «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