En este ejemplo, demostraremos cómo usar un Arduino para leer la señal del actuador de barra de retroalimentación de Firgelli y convertir esto en una medida de distancia de cuánto se ha extendido la barra. Este tutorial se basa en los principios discutidos en el tutorial "Control de velocidad del controlador del motor con un Arduino”, Le recomendamos que revise ese tutorial antes de continuar.
Nota: Este tutorial asume conocimientos previos con principios electrónicos básicos, hardware y software Arduino. Si es la primera vez que usa Arduino, le sugerimos que aprenda los conceptos básicos de uno de los muchos excelentes tutoriales para principiantes disponibles a través de las búsquedas de Google y YouTube. Tenga en cuenta que no tenemos los recursos para proporcionar soporte técnico para aplicaciones personalizadas y no depuraremos, editaremos, proporcionaremos código o diagramas de cableado fuera de estos tutoriales disponibles públicamente.
Componentes
- Actuador lineal de varilla de retroalimentación
- Fuente de alimentación 12V
- Arduino
- Controlador de motor
- Potenciómetro externo (para la segunda parte de este tutorial)
- Cables eléctricos para hacer conexiones y herramienta de crimpado o soldador
Alambrado
Resumen de hardware y software para la posición de lectura
Ensamble el circuito como se indica arriba y cargue el código a continuación. Deberá modificar la línea 16 del código a su longitud de carrera específica, actualmente está configurada para un actuador de varilla de retroalimentación de 6 pulgadas.
Este programa inicialmente extenderá y retraerá completamente el actuador para encontrar la lectura mínima y máxima del sensor analógico del potenciómetro (líneas 27 y 28 del código). Esto es necesario porque a pesar de que el rango de lecturas del potenciómetro es [0, 1023], en la práctica este rango puede reducirse debido a que la relación de engranajes dentro del actuador evita que el potenciómetro gire completamente hasta su límite.
Después de esta secuencia de calibración inicial, el actuador se extenderá y retraerá continuamente, dando salida a un flujo de datos que muestra la longitud extendida actual del actuador lineal (en unidades de pulgadas).
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 un potenciómetro externo para controlar la posición
El ejemplo anterior ha demostrado cómo se pueden tomar lecturas del actuador de varilla de retroalimentación, pero digamos que queremos mover el actuador a una posición específica, ¿cómo lo hacemos? La siguiente sección repasa dicha situación utilizando un potenciómetro externo como entrada del usuario para la posición deseada del punto de ajuste del actuador. En la práctica, puede modificar este ejemplo para tomar la entrada del usuario de cualquier forma que desee.
Alambrado
Resumen de hardware y software para el control de posición
El cableado es casi exactamente el mismo que en la primera parte de este tutorial, solo que ahora se ha conectado un potenciómetro externo al pin analógico A1.
El programa, a continuación, se mueve a la posición establecida por un usuario a través del potenciómetro externo. En la línea 18 del código se establece una variable de búfer, que se utiliza más adelante en las líneas 36 y 39. El valor de búfer da un rango alrededor de la posición del punto de ajuste deseado donde el actuador dejará de moverse, esto se requiere ya que los dos potenciómetros tienen un tendencia a fluatar en +/- 2 unidades. Como tal, si no se incluye el búfer, los actuadores vibrarían violentamente alrededor de la posición del punto de ajuste. Para ver esto en acción, ponga el amortiguador en la línea 18 a cero (no permita que los actuadores vibren durante mucho tiempo ya que puede causar daños).
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;
}
}