Pilotage simple vanne 3 voies 220v

Bonjour a tous,

Je débute dans le monde de l'arduino.
Voici mon projet :
J'ai une vannes 3 voies ( eau chaude eau froide et eau mélanger)
Cette vanne et contrôlée par un servomoteur 220v avec 3 fils : le neutre, un fils pour pivoté a gauche et un fil pour pivoté a droite. Si aucun des 2 fils et alimenté la vanne reste en position.
Je voudrais pouvoir piloté plus ou moins l'ouverture et la fermeture avec un potentiomètre.
Cela et il possible ? Si oui peux t'on m'aider pour le code?

Sinon J'avais pensé à la piloté avec 2 bouton poussoir qui commanderai un servo de modélisme via un Arduino pour connaître la position de la vanne. Mais si on redémarre la carte le servo reviens en position initiale. Et je n'arrive pas a faire en sorte qu'il reste en place si la carte redémarre.

Pour info la vanne basculer de 90° en 120 secondes.

Merci pour votre aide.
En espérant avoir été claire dans mes explications.

Sam

Pour ton servos, à ma connaissance, il ne renvoi pas sa position, donc au redémarrage de ton microcontrôleur tu n'aura pas connaissance de la position de celui-ci.
Il faudrait sauver l'information à chaque changement et voir si une librairie permet de donner la position du servo à l'initialisation de la librairie.

Tel que décrit, la vanne est contrôlée par deux moteurs un peu comme des volets roulants. Il ne s'agit pas d'un servomoteur.

Je ne vois pas bien la fonction du deuxième servomoteur.

En tout cas pour gérer la vanne, il est très utile de disposer de sa position avec un capteur qui est absent. Il faut mesurer l'angle d'une façon ou d'une autre. Il est possible d'utiliser un potentiomètre (mesure analogique) comme dans les servos. La mémorisation de la position est faite mécaniquement, on lit la valeur du potentiomètre.

Sinon il est aussi possible de calculer la position de la vanne avec les informations direction et temps. Il faut alors faire le zéro à chaque initialisation de la carte. A la mise sous tension, on bascule pendant 120s du côté froid, puis on se met en position. Par exemple si on veut une eau 50%/50% on enclenche le moteur "vers eau chaude" pendant 120s/2.
La mémorisation de la position peut se faire avec l'EEprom.

Un servo ordinaire de modélisme a trois fils (masse, alimentation et commande). On peut en le démontant récupérer la tension sur le potentiomètre interne ce qui fait un servo 4 fils. Ainsi on a l'information de la positon

Bonjour,
De mémoire :
read(pin)
de la librairie servo.h donne la position du servo

*Tel que décrit, la vanne est contrôlée par deux moteurs un peu comme des volets roulants. Il ne s'agit pas d'un servomoteur. *

En faite c'est le même moteur qui tourne dans un sens ou dans l'autre suivant le fils d'alimentation.

Le servo de modélisme c'était une idée pour avoir une info de la position de la vanne. Avec un schéma de la vanne fixer sur le servo et réglé de façon qu'il fonctionne a la même vitesse que la vanne

Bonjour

Puisqu'il s'agit d'une production d'eau chaude par mélange une solution serait de mesurer la température du mélange en sortie de la vanne et de comparer celle-ci avec une consigne de température introduite par un potentiometre.
Faire donc un asservissement de température, pas de position angulaire.

les écarts entre température de consigne et température mesurée serviraient à commander un mouvement de la vanne dans un sens ou dans l'autre par alimentation le temps du bon fil pendant le temps nécessaire.

La position angulaire de la vanne étant le moyen pour atteindre l'objectif (température du mélange) et non l'objectif.

1 Like

Bonjour sirra117

Tu pourrais transformer ta vanne motorisée en "vrai" servo en lui adjoignant un capteur de position qui pourrait être un simple potentiomètre (max. 270°) ainsi tu aurai la position de ta vanne. Même le programme arrêté et redémarré, c'est mémorisé.
J'ai fait ça, en un peu plus "sophistiqué".

Cordialement
jpbbricole

Désolé pour la redite @jpbbricole , j'ai répondu avant que tu ajoutes ta vidéo !

Il me semble qu'on est dans un cas ou l'utisation de ce type de capteur angulaire magnétique numérique s'impose :wink:

Si la solution avec capteur de position angulaire est retenue , un capteur du genre des AS5600 remplacerait avanageusement un potentiometre pour l'inévitable usure de ce dernier par frottement.
image

Il suffit de positionner sur l'axe de la vanne l'aimant qui va bien, livré bien souvent avec le capteur :

Sur les petits système pour ma part j'écris les positions dans l'eeprom après chaque mouvement. Comme l'eeprom a une durée de vie de 100 000 Cycles environ, pour des programmation plus lourde j'utilise une carte SD.. Etant dans un univers "Amateur" mon code vaut ce qu'il vaut mais fonctionne, c'est juste pour donner des idées.

J'ai laissé tous les "Serial.print" mais évidemment dans le code définitif il n'y sont pas.

void EepromWrite()
{
Serial.println("Entre en Ecriture");

  for (int ForEw =0; ForEw<3 ;ForEw++ )
  {
if (ForEw==0){Base = PosX;Ind = ForEw;}
if (ForEw==1){Base = PosY;Ind = ForEw+4;}
if (ForEw==2){Base = PosZ;Ind = ForEw+8;}

EEP[Ind+1] = (Base/10000) ;
EEP[Ind+2] = (Base-(EEP[Ind+1]*10000))/1000;
EEP[Ind+3]= (Base-(EEP[Ind+1]* 10000 + EEP[Ind+2] *1000 ))/100;
EEP[Ind+4]= (Base-(EEP[Ind+1] * 10000 + EEP[Ind+2] *1000 + EEP[Ind+3]*100))/10;
EEP[Ind+5]= (Base-(EEP[Ind+1] * 10000 + EEP[Ind+2] *1000 + EEP[Ind+3]*100+ EEP[Ind+4]*10));  
  }
 for (int ForEw=1; ForEw < 16; ForEw++){EEPROM.write(ForEw,EEP[ForEw]);Serial.print("Emplacement  ForEw :"); Serial.print(ForEw); Serial.print("  Ecrit EEP :"); Serial.println(EEP[ForEw]);  }
 //EEPROM.write(ForEw,EEP[ForEw])

return;
}
void EepromRaz()
{
Serial.println("Efface eeprom");
Base =0;
  for (int ForEw =0; ForEw<3 ;ForEw++ )
  {
if (ForEw==0){Base = PosX;Ind = ForEw;}
if (ForEw==1){Base = PosY;Ind = ForEw+4;}
if (ForEw==2){Base = PosZ;Ind = ForEw+8;}

EEP[Ind+1] = (0) ;
EEP[Ind+2] = (0) ;
EEP[Ind+3]= (0) ;
EEP[Ind+4]= (0) ;
EEP[Ind+5]= (0) ;
  }
 
 for (int ForEw=1; ForEw < 16; ForEw++){EEPROM.write(ForEw,EEP[ForEw]);Serial.print("Emplacement  ForEw :"); Serial.print(ForEw); Serial.print("  Ecrit EEP :"); Serial.println(EEP[ForEw]);  }
 //EEPROM.write(ForEw,EEP[ForEw])

return;
}
void EepromRead(){
  for (int i=1; i < 16; i++){ EEP[i] =EEPROM.read(i);
    Serial.print("Lit Emplacement :"); Serial.print(i); Serial.print("  Lecture EEP :"); Serial.println(EEP[i]);
  }
  PosX=EEP[1]*10000 + EEP[2]*1000 + EEP[3]*100 + EEP[4]*10+EEP[5];
  PosY=EEP[6]*10000 + EEP[7]*1000 + EEP[8]*100 + EEP[9]*10+EEP[10];
  PosZ=EEP[11]*10000 + EEP[12]*1000 + EEP[13]*100 + EEP[14]*10+EEP[15];
  //Serial.print("EEP :"); Serial.print(EEP[i]); Serial.print("i :"); Serial.print(i);        
  Serial.print("PosX :"); Serial.println(PosX);
  Serial.print("Posy :"); Serial.println(PosY);
  Serial.print("PosZ :"); Serial.println(PosZ);
  StepperX.setCurrentPosition(PosX);
  StepperY.setCurrentPosition(PosY);
  StepperZ.setCurrentPosition(PosZ);
  return;
  }

Bonsoir Shodan47

Un petit truc, pour économiser un peu plus les cycles d'écriture est d'utiliser, à la place de EEPROM.write(address, value) la méthode EEPROM.update(address, value) qui n'écrit seulement que s'il y a changement de la valeur à sauver.

Pour beaucoup d'écriture en EEPROM, il y a les mémoires FRAM.

Je n'ai pas le reste de ton programme, mais à voir, tu gagnerai à t'intéresser aux structures, elles permettent de sauver en EEPROM, des données complexes d'une seule écriture, EEPROM.put(address, data) et relues par EEPROM.get(address, data)

Bonne soirée.
Cordialement
jpbbricole

oui j'ai aussi un void pour EEPROM.update.
j'utilise davantage les cartes SD l'eeprom c'est pour le petits programmes

Bonjour, j’y ai penser aussi mais j'ai penser que ce sera plus compliqué. De plus je n'ai pas envie que la vanne vive çà vie toute seul de peur quelle se ferme complétement ce qui me poserais de gros problème puisque c'est une chaudière bois qui doit être refroidi en permanence.

Il faudrait que j’essaie. je n'ai pas encore la vanne donc a voir comment et fait l’intérieur et comment je peut brancher un capteur dessus.

Merci a tous pour vos retour ça fait plaisir :grinning:

J'ai abandonner l'idée du potentiomètre pour parti avec mon idée "d'indicateur servo" ce qui ma donner l'idée de piloter la vanne avec un servo de modélisme ( a voir ce que je trouve comme servo avec un couple de mini 5 N.m)

Voici le code que j'ai pondu avec l'aide de Chat GPT:

#include <Servo.h>
#include <EEPROM.h>

Servo monServo;
int posServo;

int btn1 = 2;
int btn2 = 3;

void setup() {
  monServo.attach(9);
  pinMode(btn1, INPUT_PULLUP);
  pinMode(btn2, INPUT_PULLUP);
  posServo = EEPROM.read(0);
  monServo.write(posServo);
}

void loop() {
  int btn1State = digitalRead(btn1);
  int btn2State = digitalRead(btn2);

  if (btn1State == LOW) {
    posServo++;
    monServo.write(posServo);
  }
  else if (btn2State == LOW) {
    posServo--;
    monServo.write(posServo);
  }

  EEPROM.write(0, posServo);

}

Un appui très court mettra le servo en butée. Il faut par exemple mettre une temporisation quelque part.

Oui, il faut que je règle la vitesse de rotation du servo.

Bonjour sirra117

Une bibliothèque qui va bien pour ça, VarSpeedServo.h, tu peux même créer des séquences.

Cordialement
jpbbricole

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.