Forum Navigation
Please or Register to create posts and topics.

Circuito de persianas para actuador lineal DC

Muy buenas.

En mi casa en lugar de persianas tengo unas lamas de aluminio en la parte exterior de las ventanas que son las que hacen la función de rejas y de paso de la luz.

La idea es la de utilizar un actuador dlineal de corriente contínua de 24v para mover las lamas y que queden automatizadas para siempre (además de poderlas controlar con pulsadores manualmente) y por supuesto integradas en Excontrol.

Sabiendo que el cambio de sentido del motor de corriente continua implica simplemente el cambiar la polaridad del mismo tendría sufiente con dos relés que haciéndolos actuar individualmwente aplicarían tensión en un polo o en otro del motor consiguiendo los movimientos de subida o bajada del pistón (una activación simultánea de los dós relés no provocarían un cortocircuito, sólo igualaría la tensión en los dos polos y por tanto no funcionaría el motor).

La idea era hacerlos funcionar como persianas para poder aprovechar las funciones existentes de tiempo y demás pero probando los circuitos de persianads del configurador de excontrol no consigo que funcionen ya que, supongo, estas están preparadas para lo stípicos motores de persianas que llevan los tres cables, siendo en este caso un relé para controlar el sentido del motor y el otro la activación.

Al final he configurado dos ciruitos sencillos  de alumbrado con sus respectivos interruptores pero quería comentarlo en el foro por si alguien ha conseguido mover estos motores DC con circuitos de persianas preexistentes.

Os dejo foto del montajer provisional. Si algún día consigo que funciones en las ventanas lo pondré también para que lo veáis funcionando.

Foto Montaje

Uploaded files:
  • 20201125_191135.jpg

Puedes tomar esto  como ejemplo, céntrate en la función outcontrol.

 

 

Uploaded files:

Muchas gracias Roberto. A ver si tengo un rato y lo pruebo.

Hola Roberto.

void OutControl(){

/*************************************************************/
//USER SETTING

 

byte EstadoPersiana=0;

if (circuits[0].Out1_Value == true){EstadoPersiana=1;}
if (circuits[0].Out2_Value == true){EstadoPersiana++;}
#ifdef EXC_DEBUG_MODE
// Serial.print("Estado persiana "); Serial.println(EstadoPersiana);
#endif

switch (EstadoPersiana){
case 1:{//Movimiento 1
SetRelay(PinOutput[0],true);
SetRelay(PinOutput[1],false);
break;
}
case 2:{//Movimiento 2
SetRelay(PinOutput[0],false);
SetRelay(PinOutput[1],true);
break;
}
default:{//Parado
SetRelay(PinOutput[0],false);
SetRelay(PinOutput[1],false);
break;
}
}

Sobre este tema, no se si será la forma correcta, pero se puede poner este código en algún otro punto del programa para evitar que si activamos movimiento 2 se active el relé del movimiento 1 durante algún milisegundo.

Tenemos alguna variable para poder saber exactamente el % del movimiento de ese circuito persiana?

Posiblemente veas una pregunta muy extraña, pero ya me conoces.

Además del control de dirección me gustaría añadirle un circuito control de velocidad.

Estoy trabajando con un motor de DC y me gustaría iniciar y finalizar el movimiento de una forma suave y entre medias alcance el máximo de revoluciones.

Muchas gracias.

De esta forma no pueden entrar nunca los dos a la vez y metera 100msg de espera tras cambio de sentido de maniora.

byte EstadoPersiana=0;
if (circuits[0].Out1_Value == false){
//Parado
SetRelay(PinOutput[0],false);
SetRelay(PinOutput[1],false);
break;
}
else{
if (circuits[0].Out2_Value == true){EstadoPersiana=2;}
else{EstadoPersiana=1;}
}

#ifdef EXC_DEBUG_MODE
// Serial.print("Estado persiana "); Serial.println(EstadoPersiana);
#endif

switch (EstadoPersiana){
case 1:{//Movimiento 1
SetRelay(PinOutput[0],true);
SetRelay(PinOutput[1],false);
break;
}
case 2:{//Movimiento 2
SetRelay(PinOutput[0],false);
SetRelay(PinOutput[1],true);
break;
}

}

No creo que puedas modificar la velocidad y seguir teniendo una posición correcta de la persiana, si arrancas y paras muchas veces va a cambiar la distancia recorrida segun la velocidad y vas a perder la posición.

La situación actual de la persiana se guarda en PosicionPersiana[NPersiana]

Hay se controla la posición actual, una vez alcanza la posición del circuito para.

Roberto.

Con el código que adjuntas perfecto.

Con el que he puesto yo del ejemplo, no es que se pongan los dos relés a la vez, lo que notaba es que en movimiento 1 lo hacia perfecto pero si activaba movimiento 2, me activa relé 1 por algún milisegundo, desactiva y activa relé 2 seguidamente.

Lo estaba probando en una pcb para pruebas con relés y led con lo que lo observo y no se el comportamiento del motor.

Sobre el tema de velocidad, si el valor del % lo obtenemos una vez para, lo descarto.

Si la velocidad que obtengo con 24V es alta, bajare la tensión para ajustar la velocidad que me interese.

Normalmente serán ciclos de subida o bajada completos y la idea era que de 0 a 25%  y de 75 a 100% tuviera una velocidad inferior y del 26 al 74% al máximo del motor, pero por el tiempo que tardara en el recorrido entre 10", 15"  con 19V tampoco me voy a complicar.

Muchas gracias.

Ok.. pues deseando ver como queda entonces 🙂

Hola Roberto.

El tema de velocidad perfecto, controlado cuando son ciclos completos, de lo contrario usare velocidad mínima.

Consigna velocidad mínima, consigna % incremento velocidad cada 100ms

Incremento o disminución velocidad según valor circuito persianas.

Parte del codigo.

 

void LoopNew100MillisSg(){//This event occurs every 100Millis Sg.

int i;
int ValorAnterior = ValorCircuito;
// Capta el valor del circuito.
if (circuits[0].Out1_Value){i=1;}else{i=0;}
if (i!=circuits[0].OldValue){ if ( circuits[0].Out1_Value){ValorCircuito=PosicionPersiana[0];}}

// Capta si es ciclo completo y activa control de velocidad
if ((ValorCircuito == 100)&&(ValorAnterior >= ValorCircuito)){ControlVelocidad = 1;}
if ((ValorCircuito == 0)&&(ValorAnterior <= ValorCircuito)){ControlVelocidad = 1;}

// Comprueba si se esta moviendo y
if ((circuits[0].Out1_Value == true)||(circuits[0].Out1_Value == true)){
if (ControlVelocidad==1){
if (Direccion=="Bajando"){
if ((ValorCircuito < 75)&&(ValorCircuito > 25)){
VelocidadPlataforma = VelocidadPlataforma + Consignas[1];
if(VelocidadPlataforma >= 100){VelocidadPlataforma = 100;}
}
if (ValorCircuito < 25){
VelocidadPlataforma = VelocidadPlataforma - Consignas[1];
if(VelocidadPlataforma <= Consignas[0]){VelocidadPlataforma = Consignas[0];}
}
}
if (Direccion=="Subiendo"){
if ((ValorCircuito > 15)&&(ValorCircuito < 85)){
VelocidadPlataforma = VelocidadPlataforma + Consignas[1];
if(VelocidadPlataforma >= 100){VelocidadPlataforma = 100;}
}
if (ValorCircuito > 85){
VelocidadPlataforma = VelocidadPlataforma - Consignas[1];
if(VelocidadPlataforma <= Consignas[0]){VelocidadPlataforma = Consignas[0];}
}
}
#ifdef EXC_DEBUG_MODE
Serial.print(Direccion);
Serial.print(". Velocidad: ");Serial.println(VelocidadPlataforma);
#endif
}
}

 

void OutControl(){

byte EstadoPersiana=0;

if (circuits[0].Out1_Value == false){
//Parado
SetRelay(PinOutput[0],false);
SetRelay(PinOutput[1],false);
analogWrite(PinOutput[2],0); // Velocidad
ControlVelocidad = 0;
VelocidadPlataforma = Consignas[0];
Direccion = "Parado";
noTono();
}
else{
if (circuits[0].Out2_Value == true){EstadoPersiana=2;}
else{EstadoPersiana=1;}
}

#ifdef EXC_DEBUG_MODE
// Serial.print("Estado persiana "); Serial.println(EstadoPersiana);
#endif

switch (EstadoPersiana){
case 1:{//Movimiento 1
analogWrite(PinOutput[2], VelocidadPlataforma*2.55);
SetRelay(PinOutput[0],true);
SetRelay(PinOutput[1],false);
Direccion = "Subiendo";
Tono(440,1000);
break;
}
case 2:{//Movimiento 2
analogWrite(PinOutput[2],VelocidadPlataforma*2.55);
SetRelay(PinOutput[0],false);
SetRelay(PinOutput[1],true);
Direccion = "Bajando";
Tono(440,1000);
break;
}
}

 

 

R0BERT0 has reacted to this post.
R0BERT0

D lujo!!!  Como gestionas la desviación de la posición?  Restas una constante en cada movimiento?