[RESOLU] Aide technique : Motorisation volets roulants, Problème avec les relais

Bonjour bonjour,

Cela fait quelques semaines que je bosse sur la motorisation de mes deux volets roulants.
Le code marche, mais au bout de quelques aller-retour, cela tue 2 des 4 relais utilisés, et cela systématiquement ...
Je me demande bien d'où peut venir le problème...

J'explique mon code : un bouton sur la télécommande infrarouge permet d'inverser l'état des volet, donc les fermer s'il sont montés et inversement.
J'ai aussi pour chaque volet : un bouton permettant de le decendre, un pour le monter et un pour le stopper.

Les moteurs sont des moteurs tubulaires courts de diametre 35mm filaire de 10Nm. (Avosdim)

Le fonctionnement des relais :
Lorsque que l'on envoie une commande "HIGH", cela les désactive et le courant ne passe pas.
J'ai donc pour chaque volet, un relais qui permet de l'alimenter ou non ( fonctionne comme un interrupteur ) , et un relais qui permet de chosir entre la direction Haute ou la direction Basse.

Le volet obeit a mes injonctions quelques aller-retour puis tue systématiquement les relais qui controlent la direction. ( fils en rouge sur la photo plus bas)
J'ai pas pu faire asser de test pour préciser davantage, j'avais 8 relais, il ne m'en reste plus que 2, impossible pour l'instant de refaire fontionner mon système ...

Voici les relais utilisés :

http://www.ebay.fr/itm/5V-4-Channel-Relay-Shield-Module-optocoupler-For-PIC-AVR-DSP-ARM-Arduino-TE180-/262072607142?hash=item3d04bea1a6
Ce sont des relais "SRD-05VDC-SL-C"
Il peuvent théoriquement sortir 10A ce qui devrait être suffisant pour des moteurs de Volets.
Je précise que j'alimente les Vin avec le 5 V de l'arduino nano, et les In1 , In2 , ... avec les Pin digitales.
Le fait de ne pas utiliser d'alimentation externe pourrait griller les relais ?

Voici le code utilisé :

#include <IRremoteInt.h>
#include <IRremote.h>

//TEMPS
#define TEMPSMONTEEG 30000
#define TEMPSDESCENTEG 30000
#define TEMPSMONTEED 30000
#define TEMPSDESCENTED 30000

//PIN
int IR_PIN = 10;
IRrecv irrecv(IR_PIN);
int ALIMMOTG_PIN = 2;
int DIRMOTG_PIN = 3;
int ALIMMOTD_PIN = 4;
int DIRMOTD_PIN = 5;

//VARIABLES
int etatMotG = 0; // bas
int etatMotD = 0; // bas
int dirMotG = 0; // haut
int dirMotD = 0; // haut
unsigned long timeSavedG = 0;
unsigned long timeSavedD = 0;
decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  pinMode(ALIMMOTG_PIN, OUTPUT);
  pinMode(DIRMOTG_PIN, OUTPUT);
  pinMode(ALIMMOTD_PIN, OUTPUT);
  pinMode(DIRMOTD_PIN, OUTPUT);
  digitalWrite(ALIMMOTG_PIN, HIGH);
  digitalWrite(DIRMOTG_PIN, HIGH);
  digitalWrite(ALIMMOTD_PIN, HIGH);
  digitalWrite(DIRMOTD_PIN, HIGH);
  
}

void loop()
{
    if(etatMotG == 1 && dirMotG == 0 && ((millis() - timeSavedG) > TEMPSMONTEEG)) //Volet Gauche en transition et direction vers le haut
    {
       etatMotG = 2; // Volet gauche en haut
       digitalWrite(ALIMMOTG_PIN, HIGH);
       digitalWrite(DIRMOTG_PIN, HIGH);
    }
    if(etatMotG == 1 && dirMotG == 1 && ((millis() - timeSavedG) > TEMPSDESCENTEG))//Volet Gauche en transition et direction vers le bas
    {
       etatMotG = 0;  // Volet gauche en bas
       digitalWrite(ALIMMOTG_PIN, HIGH);
       digitalWrite(DIRMOTG_PIN, HIGH);
    }    
    if(etatMotD == 1 && dirMotD == 0 && ((millis() - timeSavedD) > TEMPSMONTEED))//Volet Droit en transition et direction vers le haut
    {
       etatMotD = 2;   // Volet droit en haut
       digitalWrite(ALIMMOTD_PIN, HIGH);
       digitalWrite(DIRMOTD_PIN, HIGH);
    }
    if(etatMotD == 1 && dirMotD == 1 && ((millis() - timeSavedD) > TEMPSDESCENTED))//Volet Droit en transition et direction vers le bas
    {
       etatMotD = 0;   // Volet droit en bas
       digitalWrite(ALIMMOTD_PIN, HIGH);
       digitalWrite(DIRMOTD_PIN, HIGH);
    }

  if (irrecv.decode(&results))
    {
     Serial.println(results.value);
     switch (results.value) {
       case 2060 :   //Bouton inverser tous les volets.
       case 12 :
         if (etatMotG == 0)    //Si volet gauche en bas
         {
           etatMotG = 1;
           digitalWrite(DIRMOTG_PIN, LOW);
           dirMotG = 0;
           delay(100);
           timeSavedG = millis();
           digitalWrite(ALIMMOTG_PIN, LOW);
           delay(50);
         }
         if (etatMotG == 2)  //Si volet gauche en haut
         {
           etatMotG = 1;
           digitalWrite(DIRMOTG_PIN, HIGH);
           dirMotG = 1;
           delay(100);
           timeSavedG = millis();
           digitalWrite(ALIMMOTG_PIN, LOW);
           delay(50);
         }
         if (etatMotD == 0)   //Si volet droit en bas
         {
           etatMotD = 1;
           digitalWrite(DIRMOTD_PIN, LOW);
           dirMotD = 0;
           delay(100);
           timeSavedD = millis();
           digitalWrite(ALIMMOTD_PIN, LOW);
           delay(50);
         }
         if (etatMotD == 2)   //Si volet droit en haut
         {
           etatMotD = 1;
           digitalWrite(DIRMOTD_PIN, HIGH);
           dirMotD = 1;
           delay(100);
           timeSavedD = millis();
           digitalWrite(ALIMMOTD_PIN, LOW);
           delay(50);
         }
         break;
       case 2080 :              //Bouton montée moteur gauche
       case 32 :
         if (etatMotG == 0 || etatMotG == 1) // Si Volet gauche en bas ou en transition
         {
           etatMotG = 1;
           digitalWrite(DIRMOTG_PIN, LOW);
           dirMotG = 0;
           delay(100);
           timeSavedG = millis();
           digitalWrite(ALIMMOTG_PIN, LOW);
           delay(50);
         }
         break;
       case 2081 :            //Bouton descente moteur gauche
       case 33 :
         if (etatMotG == 2 || etatMotG == 1)  // Si Volet gauche en haut ou en transition
         {
           etatMotG = 1;
           digitalWrite(DIRMOTG_PIN, HIGH);
           dirMotG = 1;
           delay(100);
           timeSavedG = millis();
           digitalWrite(ALIMMOTG_PIN, LOW);
           delay(50);
         }
         break;
       case 2061 :           //Bouton STOP moteur gauche
       case 13 :
             digitalWrite(ALIMMOTG_PIN, HIGH);
             digitalWrite(DIRMOTG_PIN, HIGH);
         break;
       case 2065 :          //Bouton Montée moteur droit
       case 17 :
         if (etatMotD == 0 || etatMotD == 1)   // Si Volet droit en bas ou en transition
         {
           etatMotD = 1;
           digitalWrite(DIRMOTD_PIN, LOW);
           dirMotD = 0;
           delay(100);
           timeSavedD = millis();
           digitalWrite(ALIMMOTD_PIN, LOW);
           delay(50);
         }
         break;
       case 2064 :           //Bouton Descente moteur droit
       case 16 :
         if (etatMotD == 2 || etatMotD == 1)  // Si Volet droit en haut ou en transition
         {
           etatMotD = 1;
           digitalWrite(DIRMOTD_PIN, HIGH);
           dirMotD = 1;
           delay(100);
           timeSavedD = millis();
           digitalWrite(ALIMMOTD_PIN, LOW);
           delay(50);
         }
         break;
       case 2059 :          //Bouton STOP moteur droit
       case 11 :
           digitalWrite(ALIMMOTD_PIN, HIGH);
           digitalWrite(DIRMOTD_PIN, HIGH);
       break;
     }
     irrecv.resume(); // Receive the next value
    }
    delay(50);
}

J'ai vraiment besoin d'aide, j'en ai marre d'être dans le noir ... ^^

Merci d'avance.

Quentin

Bonjour,

Je serais toi j'arrêterai systématiquement le volet avant changement de la direction avec attente que le volet soit arrêté

      digitalWrite(ALIMMOTD_PIN, HIGH);
       delay(50);
       digitalWrite(DIRMOTD_PIN, HIGH);   // ou LOW

Par exemple quand tu fait

      case 2059 :          //Bouton STOP moteur droit
       case 11 :
           digitalWrite(ALIMMOTD_PIN, HIGH);
           digitalWrite(DIRMOTD_PIN, HIGH);

Tu n'est pas du tout sur que le relais marche commute avant le relais direction (temps de commutation du relais qq ms, temps d'éxécution de l'instruction qq µs).

D’ailleurs pour clarifier les choses et être sur de ne pas oublier des cas, j'aurais fait une fonction CommandeMoteur() avec comme paramètre arrêt/haut/bas

C'est effectivement ce que je me suis dit lorsque j'active les relais, afin de démarrer les moteur, pour être sur que la direction est bonne.
Lors de l'arrêt, je peut toujours essayer mais je ne pense pas que cela ait une grande incidence ...
En quoi cela reglerais mon problème de décès de relais ?

Je te l'accorde, le code est un peu moche ^^

Il faudrait avoir le schema détaillé, mais si tu commutes la direction avant que le moteur soit effectivement arrêté, ça fait peut être une surintensité dans les contacts du relais.

oui donne le schéma de câblage, car je ne pige pas un truc sur des volets roulant standard il n'y à que deux fils de commande monté ou descente +le neutre et la terre,

  • pourquoi tu as une commande marche moteur ? car si tu n'as pas de monté ou de descente le volet n'est pas aimanté et si il est ouvert ou fermé à fond se sont les microswitch du volet qui coupe...

La surintensité est effectivement bien probable.
Au vu de la datasheet; il y a 10ms de communation max, j'essayerait avec 50 ms entre les commandes des deux relais.

@fifi 82 , j'ai pas tout compris , mais voici le schéma du montage pour un volet :

Il n'y a rien de bien sorcier.
Il y a moyen de faire plus secure ?

en fait les inter de volet roulant envoient le courant soit sur direction 1 soit sur direction 2, donc je trouvais plus logique d'avoir un relais pour direction 1 et un autre pour direction 2 c'est plus simple à gérer avec l'arduino surtout si tu branche un inter de volet sur la carte. c'est ma vision des choses.

mais ton montage fonctionne aussi, la programmation sera un poil différente

par contre pour tes relais qui crame les fin de course du volet sont bien réglé j'espère si non le moteur reste sous tension et c'est peut être ça qui te grille les relais

C'est vraiment le relai qui crame ? (autopsie requise, car la bobine peut cramer, où les contacts mobiles) ou l'optocoupleur qui commande le relai ?

Il est sûr que mettre un délai entre le basculement du relai montée/descente doit être fait un certain temps avant le relai d'alimentation ... Ça permet d'envoyer le jus dans le bon tuyau et aussi d'étaler les pics d'appel de courant des bobines des relais ...

B83s:
C'est vraiment le relai qui crame ? (autopsie requise) ou l'optocoupleur qui commande le relai ?

bonsoir
+1
et si c'est le relais qui "crame" il crame où ?
sur la bobine ?
sur les contacts ?

Je précise que je considère qu'un relais est mort quand je n'entend plus de "clac", ( et donc qu'il ne commute plus , en effet , le volet ne fait plus que descendre que j'appui sur le bouton "haut" ou "bas") lorsque j'applique directement une différence de Potentiel de 5V à ces bornes, donc en passant outre l'opto-coupleur , etc ...

Pas de soucis pour les fin de course, j'ai passé du temps a régler ça au poil.

Au niveau du montage, ma première idée était justement de mettre un relais avec la direction 1 et un avec la direction 2, mais j'ai peur qu'une erreur quelconque active les deux en même temps, ce qui serait tout sauf bon pour le moteur.

Voici donc l'autopsie du relais et des GROSSES surprises !

Je démonte dans un premier temps un relais qui ne marche plus , a priori rien de cramé, tout est bien relié :

J'applique une ddp de 5V , il commute bien !!!!!

Je regarde un autre qui ne marche plus, en vérifiant 10 000 fois pour être sur, il ne commute pas.

Je démonte juste un coté puis je réessaye d'appliquer une ddp de 5V, il commute ! Oo

Je me dit que le contacteur doit rester bloqué , alors je tape tous les relais sur la table, ils remarchent tous ...

Qu'est ce que je peut faire ...

HELP ME :frowning:

Bonjour.

tes contacts ont "collé" . je n'ai pas eu le temps de décortiquer ton programme mais cela doit provenir du fait de l'inversion du contact " a la volée"

Je n'ai pas trouvé les caractéristiques du moteur, mais il ne faut pas oublié que la surintensité au démarrage d'un moteur à courant alternatif peut atteindre entre 5 et 10 fois l'intensité nominale de ce moteur.

la sur-intensité importante provoqué par l'inversion de sens de rotation du moteur "soude" tes contacts entre eux.

DE plus, je possède des "cartes" à relais chinoises à priori identiques à la tienne et je n'oserai pas commander des charges selfiques importantes (moteurs , grosses bobines ...) avec.

Quand on compare ces relais chinois "donnés" pour 10A à des produits utilisés dans l'industrie ayant des caracteristiques identiques chez des constructeurs sérieux ( SCHRAK , OMRON ...),on comprend rapidement la différence de coût...

Pierre

Oui , effectivement.
J'ai laissé la possibilité de stopper les moteurs alors que ceux-ci sont en marche et pas encore arrêtés sur la butée.

Je vais essayer de trouver des relais un peu plus sérieux du coup :slight_smile:

Merci beaucoup.

Je passe le sujet en résolu mais si jamais quelqu'un a une adresse pour les relais, je suis preneur :wink:

EDIT : J'ai trouvé ce genre de chose : http://fr.farnell.com/omron-electronic-components/g4a1ape5dc/relais-20a-pcb-5v/dp/2213775

Je cherche des cartes toutes faites avec optocoupleur mais je n'arrive pas a trouver.
C'est vraiment nécessaire pour protéger mon arduino ?
Si oui, vous savez ou je peux trouver comment fabriquer tout cela ?

Étrange. ... J'ai un ami chez qui j'ai arduinisé des volets depuis plus de 2 ans, sur le même principe (un relai sélectionne la direction, un relai envoie l'alimentation) et il n'a aucun souci avec ses relais qui sont aussi des low cost ...

As tu mis un délai entre la commutation des deux relais ?

Au début c'était à se claquer la tête contre les murs ^^

Seulement au démarrage, pour être sur de démarrer dans la bonne direction mais je m'était dit que ce n'était pas forcément nécessaire à l'arrêt, il faudra que j'essaye.

De toute façon, j'ai déjà racheté d’autres relais similaires, et si ça fait pareil, à court ou a long terme, je passerai sur du plus haut de gamme.

bonjour,

le mieux serait d'utiliser les relais connecté à l'arduino pour alimenter d'autres relais "style omron" mais avec 2 contacts car tu n'est jamais certain à 100 % que le relais va fonctionner correctement.

2 relais - relais descendre volet (D)

  • relais monter volet (M)

un contact NO et un NF pour chaque relais.

pour descendre le volet, le contact NO du relais "D" alimentera le volet pour la descente et coupera l'alimentation pour la monter du volet

J'ai simplement repris mes anciens relais qui étaient restés collés et changé mon code afin de mettre quelques Delay entre switch de relais différents.

ça marche Nickel. :smiley:

Merci à vous.

[RESOLU]