Ctrl Electroválvula Proporcional Hidraulica
Fecha de publicación: Dec 13, 2021 12:51:55 AM
En el siguiente proyecto veremos como hacer una sencilla interface para el control proporcional hidráulico de una electroválvula de dos direcciones. Pensé controlarla de varias maneras a esta solenoide de apertura proporcional, pero entre el control con un pwm mas un MOSFET no era eficiente y la otra manera, los DAC que hay en mercado, no me servían por que esta válvula 3-1 es de 24v 30w (1amp y moneda marca el multímetro) y los shield apenas te dan unos 500mA.
Es ahí cuando se me ocurrió hacer una mini fuente de tensión variable microcontrolada, trabajando con un LM350 o su hermanito menor, el LM317.
En este caso particular, lo armé con un filtro (0-5v) a la salida del PWM generado con el microcontrolador, que lo controla un eje de un joystick (Al medio cancela el pwm y apaga relay direccionales, y a los extremos acciona los relay direccionales más el pwm proporcional al Angulo), un LM358 (configurado en ganancia x4 y pico) y dada la corriente que requería la electroválvula, opte por implementar el LM317. Ambos alimentados a 24vcc.
El sketch lo replique en un Arduino NANO y se puede pulir y mejorar para sacar mas jugo a todo. Para lo que yo lo necesitaba, me pareció perfecto... Intente trabajarlo en un NodeMCU ESP8266 Lolin v3, y no me funciono, es muy susceptible al ruido de la DC-DC que tenia en el circuito y en la salida del PWM, no puedo tener con el filtro 0-5v por que son puertos de 3.3v)... Podría haberle puesto un driver y lograrlo, pero me pareció mas practico usar el Arduino NANO y guardar el ESP8266 para otro proyecto
Código:
/* - ETI - https://sites.google.com/a/educ.ar/eti/home - * PROYECTO: "Ctrl valvula proporcional hidraulica con regulador lineal lm317 por medio de una señal pwm" * DISEÑADO POR: prof.martintorres@educ.ar */ #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); int Valvula1 = 11; int dirPin1 = 4; int dirPin2 = 7 ; int yPin = A1; int yVal; int APERTURA; int compAPERTURA; int APERTURA2; int dt = 100; int dt2 = 5000; void setup() { Serial.begin(9600); pinMode(Valvula1, OUTPUT); pinMode(dirPin1, OUTPUT); pinMode(dirPin2, OUTPUT); pinMode(yPin, INPUT); digitalWrite(dirPin1, 1); digitalWrite(dirPin2, 1); lcd.init(); lcd.backlight(); lcd.setCursor(0,0); lcd.print ("Ctrl Proporcional"); lcd.setCursor(0,1); lcd.print ("-beta 1.3-"); delay (1500); lcd.clear(); } void loop() { yVal = analogRead(yPin); Serial.println( "Lectura PUERTO: " ); Serial.println(yVal); lcd.setCursor(0,0); lcd.print ("POSICION L:"); lcd.print (yVal); lcd.setCursor(0,1); if (yVal > 421 & yVal <430) { APERTURA2 = map(yVal,0,0,0,0); lcd.print ("-SIN GIRO- "); lcd.print (APERTURA2); } if (yVal < 420) { APERTURA2 = map(yVal,1023,420,0,255); lcd.print ("GIRO DER.: "); lcd.print (APERTURA2); delay (150); lcd.clear(); } if (yVal > 431) { APERTURA2 = map(yVal,431,1023,0,-255); lcd.print ("GIRO IZQ.: "); lcd.print (APERTURA2); delay (150); lcd.clear(); } compAPERTURA = APERTURA; if (compAPERTURA <= 10) { digitalWrite(dirPin1, 1); digitalWrite(dirPin2, 1); } if (yVal > 410 & yVal <460) { //if (yVal > 320 & yVal <380) // if (yVal > 508 & yVal <512) digitalWrite(dirPin1, 1); digitalWrite(dirPin2, 1); APERTURA = map(yVal,500,0,0,0); analogWrite(Valvula1, APERTURA); } if (yVal > 460) { APERTURA = map(yVal,460,1023,0,255); //APERTURA = map(yVal,380,1023,0,255); digitalWrite(dirPin1, 0); digitalWrite(dirPin2, 1); analogWrite(Valvula1, APERTURA); } else { digitalWrite(dirPin2, 0); } if (yVal <= 410 ) { APERTURA = map(yVal,410,0,0,255); digitalWrite(dirPin1, 1); digitalWrite(dirPin2, 0); analogWrite(Valvula1, APERTURA); }else { digitalWrite(dirPin1, 0); } }
El diagrama de circuito:
, el diseño del PCB:
Algunas imágenes de la interface funcionando:
Acá un video cortito funcionando en la etapa beta: