Het programmeren van een PLC om uw actuator te besturen, kan een van de moeilijkere projecten zijn om uit te voeren. Het vereist vallen en opstaan, testen en een hoop geduld; Hoewel de resultaten ongelooflijk functioneel en lonend kunnen zijn.
Deze code is voor een functioneel Seriële responsieve actuator. Dit is een klantgebouwde code van Nicola Buccoliero, een 24-jarige Italiaanse ingenieur van Universtà Campus Bio-Medico in Rome en werkt aan hun proefschrift met Upenn.
De seriële feed is een bewerkingsgeleider die een Arduino neemt, met extra gegevens die in of uit de Arduino -eenheid worden verzonden als geprogrammeerd. Met deze code zal het typen van een nummer in de seriële monitor uw Arduino vertellen waar u wilt dat uw actuator verhuist.
Dit is wat de code doet:
-
Initialisatie (ingesteld):
- Het stelt de verbindingen op naar de motor en de feedbacksensor van de actuator.
-
Kijkend naar de seriële monitor voor instructies:
- De Arduino is op zoek om een nummer in te voeren. Wanneer een nummer in de seriële feed wordt ingevoerd, begint het de motor te bewegen.
-
De motor verplaatsen:
- Wanneer de doelpositie is ingesteld, begint de Arduino de actuator naar het doel te verplaatsen. Het houdt de sensor in de gaten om te weten wanneer hij dat punt bereikt.
-
Stoppen op locatie:
- Terwijl het beweegt, blijft het de sensor controleren. Zodra de sensor zegt dat het op de juiste plek is, stopt het systeem de motor.
-
Wacht op de volgende instructie:
- Het systeem wacht op verdere instructie. Wanneer het een nieuw bericht hoort, begint het opnieuw te bewegen, na hetzelfde proces.
Deze code helpt een motor te regelen om naar een specifieke plaats te gaan, daar te stoppen en klaar te zijn om het helemaal opnieuw te doen wanneer het wordt verteld.
Deze code is bedoeld om te beginnen met een volledig ingetrokken actuator, wat betekent dat de "0" -positie het volledig ingetrokken einde van de slag is. Deze code zal echter werken als de actuator wordt geïnitialiseerd terwijl u wordt uitgebreid - u moet een negatieve gehele waarde invoeren om de actuator achteruit te verplaatsen (ex: -1200)
Nicola's code// 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