Die programmering van 'n PLC om u aktuator te beheer, kan een van die moeiliker projekte wees om te onderneem. Dit verg proef en foute, toetsing en 'n hoop geduld; Alhoewel die resultate ongelooflik funksioneel en lonend kan wees.
Hierdie kode is vir 'n funksionele Seriële reageer aktuator. Dit is 'n klantgeboude kode van Nicola Buccoliero, 'n 24-jarige Italiaanse ingenieur van die Universtà-kampus Bio-Medico in Rome en werk aan hul proefskrif saam met Upenn.
Die seriële voer is 'n leger van bedrywighede wat 'n Arduino neem, met addisionele gegewens wat in of uit die Arduino -eenheid gestuur word soos geprogrammeer. Met hierdie kode, sal u 'n nommer in die seriële monitor tik aan u Arduino waar u wil hê dat u aktuator moet beweeg.
Hier is wat die kode doen:
-
Inisialisering (opgestel):
- Dit stel die verbindings op die motor en die aktuator -terugvoersensor op.
-
Kyk na die reeksmonitor vir instruksies:
- Die Arduino is op soek na u om 'n nommer in te voer. As dit 'n nommer in die seriële voer sien, begin dit die motor beweeg.
-
Die motor beweeg:
- As die teikenposisie gestel word, sal die Arduino die aktuator na die teiken begin beweeg. Dit hou die sensor dop om te weet wanneer dit daardie punt bereik.
-
Stop by die plek:
- As dit beweeg, hou dit die sensor aan. Sodra die sensor gesê het dat dit op die regte plek is, stop die stelsel die motor.
-
Wag vir die volgende instruksie:
- Die stelsel sal wag vir verdere onderrig. As dit 'n nuwe boodskap hoor, begin dit weer na dieselfde proses beweeg.
Hierdie kode help om 'n motor te beheer om na 'n spesifieke plek te gaan, stop daar en wees gereed om dit weer te doen as dit vertel word.
Hierdie kode is bedoel om met 'n Volledig teruggetrekte aktuator, wat beteken dat die "0" -posisie die volledig teruggetrekte einde van die beroerte is. Hierdie kode sal egter werk as die aktuator geïnitialiseer word terwyl dit uitgebrei word - u moet 'n negatiewe heelgetalwaarde invoer om die aktuator agteruit te skuif (byvoorbeeld: -1200)
Nicola se kode// 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