Atuador Linear de Feedback do Potenciômetro com Arduino

Neste exemplo, demonstraremos como usar um Arduino para ler o sinal do Atuador de Rod de Feedback da Firgelli e convertê-lo em uma medição de distância de quão longe a haste foi estendida. Este tutorial se baseia nos princípios discutidos no tutorial “Controle de velocidade do driver do motor com um Arduino”, Aconselhamos revisar esse tutorial antes de continuar.

Nota: Este tutorial pressupõe conhecimento prévio com princípios eletrônicos básicos, hardware e software Arduino. Se esta é a primeira vez que usa o Arduino, sugerimos aprender o básico de um dos muitos excelentes tutoriais para iniciantes disponíveis nas pesquisas do Google e do YouTube. Esteja ciente de que não temos os recursos para fornecer suporte técnico para aplicativos personalizados e não depuraremos, editaremos, forneceremos código ou diagramas de fiação fora desses tutoriais disponíveis publicamente.

Componentes

Fiação

Atuador Linear de Feedback do Potenciômetro com Arduino

Visão geral de hardware e software para leitura de posição

Monte o circuito como acima e carregue o código abaixo. Você precisará modificar a linha 16 do código para seu comprimento de curso específico, atualmente definido para um atuador de haste de feedback de 6 polegadas.

Este programa irá inicialmente estender e retrair totalmente o atuador para encontrar a leitura mínima e máxima do sensor analógico do potenciômetro (linha 27 e 28 do código). Isso é necessário porque apesar da faixa de leituras do potenciômetro ser [0, 1023], na prática essa faixa pode ser reduzida devido à relação de engrenagem dentro do atuador, impedindo o potenciômetro de girar totalmente até seu limite.

Seguindo esta sequência de calibração inicial, o atuador estenderá e retrairá continuamente a saída de um fluxo de dados exibindo o comprimento estendido atual do atuador linear (em unidades de polegadas).

Código

https://gist.github.com/Will-Firgelli/8c78092ca850aa8a50ae36842b97150f
COPY
/* Firgelli Automations
 * Limited or no support: we do not have the resources for Arduino code support
 * 
 * Program enables momentary direction control of actuator using push button
 */
 
#include <elapsedMillis.h>
elapsedMillis timeElapsed;

int RPWM = 10;   
int LPWM = 11;
int sensorPin = A0;

int sensorVal;
int Speed=255;
float strokeLength = 6.0;                           //customize to your specific stroke length
float extensionLength;

int maxAnalogReading;
int minAnalogReading;

void setup() {
  pinMode(RPWM, OUTPUT);
  pinMode(LPWM, OUTPUT);
  pinMode(sensorPin, INPUT);
  Serial.begin(9600);
  maxAnalogReading = moveToLimit(1);
  minAnalogReading = moveToLimit(-1);
}

void loop(){
  Serial.println("Extending...");
  sensorVal = analogRead(sensorPin);
  while(sensorVal < maxAnalogReading){
    driveActuator(1, Speed);
    displayOutput();  
    delay(20);
  }
  driveActuator(0, Speed);
  delay(1000);
  
  Serial.println("Retracting...");
  sensorVal = analogRead(sensorPin);
  while(sensorVal > minAnalogReading){
    driveActuator(-1, Speed);
    displayOutput();  
    delay(20);
  }
  driveActuator(0, Speed);
  delay(1000);
}

int moveToLimit(int Direction){
  int prevReading=0;
  int currReading=0;
  do{
    prevReading = currReading;
    driveActuator(Direction, Speed);
    timeElapsed = 0;
    while(timeElapsed < 200){ delay(1);}           //keep moving until analog reading remains the same for 200ms
    currReading = analogRead(sensorPin);
  }while(prevReading != currReading);
  return currReading;
}

float mapfloat(float x, float inputMin, float inputMax, float outputMin, float outputMax){
 return (x-inputMin)*(outputMax - outputMin)/(inputMax - inputMin)+outputMin;
}

void displayOutput(){
  sensorVal = analogRead(sensorPin);
    extensionLength = mapfloat(sensorVal, float(minAnalogReading), float(maxAnalogReading), 0.0, strokeLength);
    Serial.print("Analog Reading: ");
    Serial.print(sensorVal);
    Serial.print("\tActuator extension length: ");
    Serial.print(extensionLength);
    Serial.println(" inches");  
}

void driveActuator(int Direction, int Speed){
  switch(Direction){
    case 1:       //extension
      analogWrite(RPWM, Speed);
      analogWrite(LPWM, 0);
      break;
   
    case 0:       //stopping
      analogWrite(RPWM, 0);
      analogWrite(LPWM, 0);
      break;

    case -1:      //retraction
      analogWrite(RPWM, 0);
      analogWrite(LPWM, Speed);
      break;
  }
}

Usando um potenciômetro externo para controlar a posição

O exemplo acima demonstrou como as leituras podem ser obtidas do atuador da haste de feedback, mas digamos que desejemos mover o atuador para uma posição específica, como fazemos isso? A seção a seguir aborda essa situação usando um potenciômetro externo como a entrada do usuário para a posição desejada do ponto de ajuste do atuador. Na prática, você pode modificar este exemplo para obter a entrada do usuário de qualquer forma que desejar.

Fiação

Atuador Linear com Arduino

Visão geral de hardware e software para controle de posição

A fiação é quase a mesma da primeira parte deste tutorial, só que agora um potenciômetro externo foi conectado ao pino analógico A1.

O programa, a seguir, se move para a posição definida por um usuário por meio do potenciômetro externo. Na linha 18 do código, uma variável de buffer é definida, esta é utilizada mais tarde nas linhas 36 e 39. A variável de buffer fornece uma faixa em torno da posição de ponto de ajuste desejada onde o atuador irá parar de se mover, isto é necessário porque os dois potenciômetros têm um tendência a fluir em +/- 2 unidades. Como tal, se o buffer não fosse incluído, os atuadores vibrariam violentamente em torno da posição do ponto de ajuste. Para ver isso em ação, defina o buffer na linha 18 para zero (não deixe os atuadores vibrarem por muito tempo, pois isso pode causar danos).

Código

https://gist.github.com/Will-Firgelli/41ec87433f0aaa1abc33e79168076b3b
COPY
/* Firgelli Automations
 * Limited or no support: we do not have the resources for Arduino code support
 * 
 * Program enables momentary direction control of actuator using push button
 */
 
#include <elapsedMillis.h>
elapsedMillis timeElapsed;

int RPWM = 10;   
int LPWM = 11;
int sensorPin = A0;
int potPin = A1;
int potVal;

int sensorVal;
int Speed = 255;
int Buffer = 4;

int maxAnalogReading;
int minAnalogReading;

void setup() {
  pinMode(RPWM, OUTPUT);
  pinMode(LPWM, OUTPUT);
  pinMode(sensorPin, INPUT);
  pinMode(potPin, INPUT);
  Serial.begin(9600);
  maxAnalogReading = moveToLimit(1);
  minAnalogReading = moveToLimit(-1);
}

void loop(){
  potVal = map(analogRead(potPin), 0, 1023, minAnalogReading, maxAnalogReading);
  sensorVal = analogRead(sensorPin);
  if(potVal > (sensorVal+Buffer)){               //addition gives buffer to prevent actuator from rapidly vibrating due to noisy data inputs
    driveActuator(1, Speed);
  }
  else if(potVal < (sensorVal-Buffer)){             
    driveActuator(-1, Speed);
  }
  else{
    driveActuator(0, Speed);
  }
  Serial.print("Potentiometer Reading: ");
  Serial.print(potVal);
  Serial.print("\tActuator reading: ");
  Serial.println(sensorVal);
  delay(10);
}

int moveToLimit(int Direction){
  int prevReading=0;
  int currReading=0;
  do{
    prevReading = currReading;
    driveActuator(Direction, Speed);
    timeElapsed = 0;
    while(timeElapsed < 200){ delay(1);}           //keep moving until analog reading remains the same for 200ms
    currReading = analogRead(sensorPin);
  }while(prevReading != currReading);
  return currReading;
}

void driveActuator(int Direction, int Speed){
  switch(Direction){
    case 1:       //extension
      analogWrite(RPWM, Speed);
      analogWrite(LPWM, 0);
      break;
   
    case 0:       //stopping
      analogWrite(RPWM, 0);
      analogWrite(LPWM, 0);
      break;

    case -1:      //retraction
      analogWrite(RPWM, 0);
      analogWrite(LPWM, Speed);
      break;
  }
}

Share This Article
Tags: