Controle do atuador da entrada de posição com um Arduino

Programando um PLC para controlar seu atuador pode ser um dos projetos mais difíceis de realizar. Requer tentativa e erro, testes e um monte de paciência; Embora os resultados possam ser incrivelmente funcionais e gratificantes.

Como você controla um atuador linear com um Arduino?

Este código é para um funcional Atuador responsivo em série. Este é um código construído pelo cliente de Nicola Buccoliero, um engenheiro italiano de 24 anos da Universtà Bio-Medico em Roma, trabalhando em sua tese com UPenn.

O feed serial é uma lâmina de operações que um Arduino toma, com dados adicionais enviados ou fora da unidade Arduino como programado. Com este código, digitar um número no monitor serial dirá ao seu Arduino onde você deseja que seu atuador se mova.

Aqui está o que o código faz:

  1. Inicialização (configurada):
    • Ele configura as conexões para o motor e o sensor de feedback do atuador.
  2. Assistindo ao monitor serial para obter instruções:
    • O Arduino está procurando por você para inserir um número. Quando vê um número entrado na alimentação serial, ele começa a mover o motor.
  3. Movendo o motor:
    • Quando a posição alvo é definida, o Arduino começará a mover o atuador em direção ao alvo. Ele fica de olho no sensor saber quando chega a esse ponto.
  4. Parando no local:
    • À medida que se move, continua verificando o sensor. Depois que o sensor diz que está no local certo, o sistema interrompe o motor.
  5. Aguarde a próxima instrução:
    • O sistema aguardará mais instruções. Quando ouve uma nova mensagem, começa a se mover novamente, seguindo o mesmo processo.

Esse código ajuda a controlar um motor para ir a um local específico, parar por aí e estar pronto para fazer tudo de novo quando informado.

Este código pretende começar com um atuador totalmente retraído, o que significa que a posição "0" é a extremidade totalmente retraída do golpe. No entanto, esse código funcionará se o atuador for inicializado enquanto estendido - você precisará inserir um valor inteiro negativo para mover o atuador para trás (ex: -1200)

Código de 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 
Share This Article
Tags: