Fiabilisation systeme lors de l'utilisation de carte relais

Bonjour

Lorsque j’utilise des cartes relais avec Arduino, j’ai toujours des problèmes complètement aléatoires, contact boutons qui deviennent instables, programme qui se gèle, vidage de variable etc…

J’ai bien compris que le problème venait de la stabilité de l’alim, qu’il fallait découpler, ou mettre des condensateurs en parallèle, des ponts de diode ou autre chose compliqué pour le non électronicien.

N’y a t il pas un moyen simple en achetant une alim régulée, ou filtrée pour l’arduino? Le but n’étant pas économique mais de trouver une fiabilité lorsqu’on utilise des relais.

Merci de votre aide

Donne plus de précisions : quelle est la charge commutée par le relais ?

  • moteurs ou - charge résistive ?
  • 12V ou 230V ?
  • etc.

Dans ma premiere tentative c’etait une carte 16 relais pour des moteurs Nema (mais je crois que tu avais répondu sur le sujet). J’ai finalement abandonné la carte relais car je ne suis jamais arrivé a avoir un fonctionnement stable.

La c’est une carte a 4 relais. Le premier qui commande le fonctionnement d’une lampe, un autre relais pour l’alim des drivers, afin de l’arreter quand les moteurs ne sont pas utilisés.
Rien de bien extraordinaire, mais les contacts de mon joystick passent par des états aléatoires malgré l’utilisation des pullup.

Finalement j’ai viré les relais et mis des interrupteurs manuels, c’est débile mais je trouve vraiment dommage que l’utilisation des relais perturbent autant les arduinos. J’ai lu pas mal de topic, chacun y va de sa science mais je trouve que pour un produit de vulgarisation comme l’arduino, avoir de tel problème en utilisant de simples relais c’est bizzare.

Condition 1
Précaution, non IMPOSITION, il faut absolument qu'une diode de roue libre soit placée en parallèle sur la bobines du relai.
C'est non négociable.

Remarque 1 : Généralement si tu achètes les relais déjà montés sur circuit imprimé la diode est présente ainsi que l'interface de puissance qui permet de connecter directement une sortie de microcontroleur.

Condition 2
Ne jamais alimenter un relai à partir du 5 V de la carte microcontrôleur. La commutation de bobinage (c'est général pour tous les bobinages) génère de fortes perturbations sur l'alimentation.

Condition 2bis :
Ne jamais connecter directement une bobine sur un sortie de microcontrôleur. C'est un coup à la tuer ou a déclencher des sécurités.
D'une manière générale bien se renseigner sur la capacité du microcontrôleur à fournir du courant.
Cela veux dire ne pas croire le vendeur de la carte mais le fabricant du micro. Et dans la documentation fournisseur (datasheet) bien faire la différence entre les valeurs qui sont dans la partie "Absolute Maximum Rating" qui sont les limites extrêmes et momentanées, des valeur de la partie "service permanent" qui sont les seules à prendre en compte pour la conception.

Le plus sûr est d'avoir une alimentation 9V qui te permet d'alimenter la carte microcontrôleur en utilisant son régulateur interne. On en trouve facilement format chargeur de téléphone qui délivrent 9V sous 1A ou 2A.
Pour les relais soit tu trouves des bobines 9V, cela existe mais tu tombera probablement dans du matériel professionnel donc cher, soit tu approvisionnes un convertisseur de tension pour ramener le 9V à 5V relais.
J'ai bien parler de "convertisseur" et non pas de régulateur.
Les convertisseurs se trouvent tout fait pour 1 à 2 € en Sud est asiatique.

J'utilise beaucoup de relais, par exemple ici :

A part la diode de roue libre, aucune précaution particulière. Comme tu utilises des cartes à relais, je suppose qu'elles sont équipées de cette diode.

Projets N° 1 et 2 : relais 5V et ARDUINO PRO MINI 3.3V.
Ici c'est facile, le régulateur 3.3V isole forcément l'ARDUINO des perturbations sur le 5V.

Projets N° 3 : relais 5V et ARDUINO NANO 5V sur la même alimentation.
Seul ce projet est équipé de protections anti-parasites (cellule RC) en parallèle sur la charge commutée par le relais, car il s'agit d'une vanne motorisée, donc d'une charge inductive.

Ce sont des relais qui fonctionnent tous les jours, qu'il s'agisse de relais nus ou de modules tout faits.

Tu remarqueras aussi que j'utilise des alimentations à découpage de qualité (MEANWELL IRM-05-5 ou IRM-03-5), pas n'importe quel bloc secteur 5V chinois.

Rien de bien extraordinaire, mais les contacts de mon joystick passent par des états aléatoires malgré l'utilisation des pullup.

Faut-il mettre en cause le joystick ? Pas impossible.

J'avais répondu ICI en janvier :

Les informations arrivent au compte-goutte :

  • driver : de quoi s'agit-il ?
  • 48V
    J'aurais tendance à dire que pour l'instant je préfère attendre une description (schéma) précise.
    Sans informations de ta part, je ne réagis plus.

Et maintenant on ajoute au compte-goutte : un joystick.
Je confirme : tu n'en dis pas assez. Pas de schéma, pas de liste de matériel :confused:

Ce ne sont pas des problèmes qui vont se résoudre tous seuls avec le temps ou par magie.
C'est à toi qu'il appartient de fournir les infos, et toutes les infos.
Depuis plus d'un mois tu dois avoir eu le temps de faire un schéma.

68tjs:
Ne jamais alimenter un relai à partir du 5 V de la carte microcontrôleur.

Si la diode de roue libre est absente : clairement OUI :

Si la diode de roue libre est présente : à l’oscilloscope on observe généralement une légère chute de tension lorsque le relais colle mais plus de surtension :

EDIT ### : ces mesures ont été faites avec une carte ARDUINO NANO et un module relais alimentés par 5V USB uniquement.

Juste pour rire exécute ce code sur un ARDUINO avec une carte relais sur la broche 4.
Tu n’as jamais entendu un relais jouer la marseillaise ?
C’est le moment d’essayer.

#define RELAY_OUT               4
// diviseur = 1 pour un HP, 15 pour un relais
#define DIVISEUR                15
#define TEMPO                   ALLEGRO

// Liste des notes
#define SIL                     0
#define DON                     65
#define DOD                     69
#define REN                     74
#define RED                     78
#define MIN                     83
#define FAN                     87
#define FAD                     93
#define SON                     98
#define SOD                     104
#define LAN                     110
#define LAD                     117
#define SIB                     117
#define SIN                     123
#define FIN                     255

// liste des rythmes
#define QUINTUPLECROCHE         1
#define QUADRUPLECROCHE         2
#define TRIPLECROCHE            4
#define DOUBLECROCHE            8
#define CROCHE                  16
#define CROCHEPOINTEE           24
#define NOIRE                   32
#define NOIREPOINTEE            48
#define BLANCHE                 64
#define BLANCHEPOINTEE          96
#define RONDE                   128

// liste des rythmiques de silences
#define TRENTEDEUXIEMEDESOUPIR  1
#define SEIZIEMEDESOUPIR        2
#define HUITIEMEDESOUPIR        4
#define QUARDESOUPIR            8
#define DEMISOUPIR              16
#define SOUPIR                  32
#define DEMIPAUSE               64
#define PAUSE                   128

// Tempo
#define LENTO                   60
#define ANDANTE                 80
#define MODERATO                100
#define ALLEGRO                 120
#define PRESTO                  150
#define PRESTISSIMO             200


void setup() {
  pinMode(RELAY_OUT, OUTPUT);
  Serial.begin(115200);
}

void buzz(int freq, int length) 
{
  unsigned long t = millis();
  while (millis() < t + length) {
    digitalWrite(RELAY_OUT, HIGH);
    delay(1000/freq/2);
    digitalWrite(RELAY_OUT, LOW);
    delay(1000/freq/2);
  }
}

struct note
{
  uint8_t base;
  uint8_t tempo;
  uint8_t octave;
};

const struct note marseillaise[] = {
  {REN, DOUBLECROCHE, 3}, {REN, CROCHEPOINTEE, 3}, {REN, DOUBLECROCHE, 3}, {SON, NOIRE, 3}, {SON, NOIRE, 3},
  {LAN, NOIRE, 3},  {LAN, NOIRE, 3}, {REN, NOIREPOINTEE, 4}, {SIN, CROCHE, 3}, {SON, CROCHEPOINTEE, 3},
  {SON, DOUBLECROCHE, 3}, {SIN, CROCHEPOINTEE, 3}, {SON, DOUBLECROCHE, 3},

  {MIN, NOIRE, 3}, {DON, BLANCHE, 4}, {LAN, CROCHEPOINTEE, 3}, {FAD, DOUBLECROCHE, 3}, {SON, BLANCHE, 3}, {SIL, SOUPIR, 3},
  {SON, CROCHEPOINTEE, 3}, {LAN, DOUBLECROCHE, 3}, {SIN, NOIRE, 3}, {SIN, NOIRE, 3},   {SIN, NOIRE, 3},
  {DON, CROCHEPOINTEE, 4}, {SIN, DOUBLECROCHE, 3},

  {SIN, NOIRE, 3}, {LAN, NOIRE, 3}, {SIL, SOUPIR, 3}, {LAN, CROCHEPOINTEE, 3}, {SIN, DOUBLECROCHE, 3}, {DON, NOIRE, 4},
  {DON, NOIRE, 4}, {DON, NOIRE, 4}, {REN, CROCHEPOINTEE, 4}, {DON, DOUBLECROCHE, 4}, {SIN, BLANCHE, 3}, {SIL, SOUPIR, 3},
  {REN, CROCHEPOINTEE, 4}, {REN, DOUBLECROCHE, 4},

  {REN, NOIRE, 4}, {SIN, CROCHEPOINTEE, 3}, {SON, DOUBLECROCHE, 3}, {REN, NOIRE, 4}, {SIN, CROCHEPOINTEE, 3},
  {SON, DOUBLECROCHE, 3}, {REN, BLANCHE, 3}, {SIL, DEMISOUPIR, 3}, {REN, DOUBLECROCHE, 3},
  {REN, CROCHEPOINTEE, 3}, {FAD, DOUBLECROCHE, 3}, {LAN, BLANCHE, 3}, {DON, NOIRE, 4}, {LAN, CROCHEPOINTEE, 3},
  {FAD, DOUBLECROCHE, 3},

  {LAN, NOIRE, 3}, {SON, NOIRE, 3}, {FAN, BLANCHE, 3}, {MIN, NOIRE, 3}, {SON, CROCHEPOINTEE, 3}, {SON, DOUBLECROCHE, 3},
  {SON, NOIRE, 3}, {FAD, CROCHEPOINTEE, 3}, {SON, DOUBLECROCHE, 3}, {LAN, BLANCHEPOINTEE, 3}, {SIL, DEMISOUPIR, 3}, {LAN, CROCHE, 3},
  {SIB, NOIREPOINTEE, 3}, {SIB, CROCHE, 3}, {SIB, CROCHE, 3}, {SIB, CROCHE, 3}, {DON, CROCHE, 4}, {REN, CROCHE, 4},

  {LAN, BLANCHEPOINTEE, 3}, {SIB, CROCHE, 3}, {LAN, CROCHE, 3}, {SON, NOIREPOINTEE, 3}, {SON, CROCHE, 3}, {SON, CROCHE, 3},
  {SIB, CROCHE, 3}, {LAN, CROCHE, 3}, {SON, CROCHE, 3}, {SON, NOIRE, 3}, {FAD, CROCHE, 3}, {SIL, DEMIPAUSE, 3},
  {REN, DOUBLECROCHE, 4},

  {REN, BLANCHE+CROCHEPOINTEE, 4}, {REN, DOUBLECROCHE, 4}, {SIN, CROCHEPOINTEE, 3},
  {SON, DOUBLECROCHE, 3}, {LAN, BLANCHEPOINTEE, 3}, {SIL, DEMISOUPIR, 4}, {REN, DOUBLECROCHE, 4},
  {REN, BLANCHE+CROCHEPOINTEE, 4}, {REN, DOUBLECROCHE, 4}, {SIN, CROCHEPOINTEE, 3}, {SON, DOUBLECROCHE, 3}, {LAN, BLANCHEPOINTEE, 3},
  {REN, NOIRE, 3}, {SON, BLANCHEPOINTEE, 3}, {LAN, NOIRE, 3},

  {SIN, RONDE, 3}, {DON, BLANCHE, 4}, {REN, NOIRE, 4}, {MIN, NOIRE, 4}, {LAN, BLANCHEPOINTEE, 3}, {MIN, NOIRE, 4}, {REN, BLANCHE, 4},
  {REN, CROCHEPOINTEE, 4}, {SIN, DOUBLECROCHE, 3}, {DON, CROCHEPOINTEE, 4}, {LAN, DOUBLECROCHE, 3}, {SON, RONDE, 3},

  FIN
};

int getFrequency(int frequency, int octave) {
  return frequency * pow(2, octave);
}

void loop()
{
  float ftempo = 0;
  ftempo = (1000.0 * 60.0) / float(TEMPO);

  for (int n = 0; marseillaise[n].base != FIN; n++) { // boucle de lecture du tableau
    char note = marseillaise[n].base; // on récupère la fréquence de base dans le tableau
    char octave = marseillaise[n].octave; // on récupère l'octave
    int frequence;
    if (note != SIL) {
      frequence = getFrequency(note, octave) / DIVISEUR; //on calcule la bonne fréquence
    }
    //    Serial.println(frequence);
    float duree = ftempo * marseillaise[n].tempo / 32; // on multiplie la duree de base par la valeur de duree du tableau
    //    Serial.println(duree);
    if (note != SIL) {
      tone (RELAY_OUT, frequence); //on joue la note
    }
    delay(duree);
    if (note != SIL) {
      noTone(RELAY_OUT);//on arrete la note
    }
    delay(10);// petite attente pour avoir l'impression d'attaquer la note
  }
  delay(2000);
}

Merci pour vos diverses interventions.

Il y a des sujets sur lesquels j'avance pas vite....

Dans un autre post je viens de résoudre le problème de mon robot de cave (résistance Pull-UP externe a la place des internes) , problème que j'avais attribué peut être trop vite a la carte relais.

Pour la gestion des trois axes de la fraiseuse, j'ai encore régulièrement des plantages, mais je dois encore virer la carte relais mais pour d'autre raison. (maintien des moteurs PAP et ajout alim et driver supplémentaires)