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: