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
- Atuador Linear da Barra de Feedback
- Fonte de alimentação 12V
- Arduino
- Motorista
- Potenciômetro externo (para a segunda parte deste tutorial)
- Fios elétricos para fazer conexões e ferramenta de crimpagem ou ferro de solda
Fiação
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/* 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
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/* 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;
}
}