Commande de plusieurs moteurs ( 12 volts) ,montage et commande

Bonjour,
Ayant achevé de construire un programme,avec des millis()( Merci à JML) ,
j'aimerai passer au 2ème stade de mon projet:commander une série de moteurs comme suit :

Digital pin n°2 : actionne moteur 1 dans 1 sens 6 secondes

Digital pin n°3 : actionne moteur 1 dans sens inverse 6 secondes

Digital pin n°6 : actionne moteur 2 dans 1 sens 8 secondes

Digital pin n°7 : actionne moteur 2 dans sens inverse 8 secondes

Digital pin n°8 : actionne moteur 3 dans 1 sens 20 secondes

Digital pin n°9 : actionne moteur 4 dans 1 sens 30 secondes

Digital pin n°10 : actionne moteur 5 dans 1 sens 10 secondes

Digital pin n°12 : actionne moteur 5 dans sens inverse 10 secondes

LES ACTIONS A FAIRE:

Lorsque la pin 11 allume une led =>

L’ordre des déclenchements est : ( j’indique les numéros des pins )
6-2-10-9-7-3_6-12-7-8

  1. 6 et 2 se déclenchent en même temps

  2. puis 10 et 9 se déclenchent en même temps dés la fin des 8 secondes

après 10 secondes ( le 10 a fini ) le 7 est actionné

lorsque le 9 s’arrête (soit 30 secondes / ou = 20 secondes après déclenchement du 7 /ou = 12 secondes après arrêt du 7 ) le 3 et le 6 est actionné en mème temps

quand le 6 s’arrête le 12 se déclenche ( sans s’occuper où en est le délai du 3 )

quand le 12 s’arrête le 7 se déclenche

puis le 8 se déclenche

puis plus d’action jusqu’à ce que la pin 11 se rallume où le cycle recommence.

Aussi,j'ai grandement besoin de votre aide, soutenue, pour y arriver.

/* Partie déclaration "états" */
enum : byte {LED_ETEINTE, LED_ALLUMEE} etat;

/* Partie "LED" */
const byte pinLED = 11;
boolean LedAllumee;

/* Partie temporisation */
const unsigned long temporisationLED_ON = 5000ul;
const unsigned long temporisationLED_OFF = 10000ul;
unsigned long  topChronoLED_ON ;
unsigned long topChronoLED_OFF;

/* Partie "capteur ULTRASON"  */
const byte trigPin = 4;
const byte echoPin = 5;
const int distanceCritique = 11; // en cm

/* Partie " fonctions " */
int lireDistance()
{
  static unsigned long topChronoMesure = 4294967154;
  const unsigned long tempoMesure = 100ul;
  static int cm;

  unsigned long topMoinsTempo;
  topMoinsTempo = millis() - topChronoMesure;
  if (millis() - topChronoMesure > tempoMesure) {
    // on a attendu assez longtemps, faire la mesure
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    cm = pulseIn(echoPin, HIGH) / 58;
  }
  Serial.print("millis() : ");
  Serial.println( millis());
  Serial.print("topChronoMesure : ");
  Serial.println( topChronoMesure);

  Serial.print("topMoinsTempo : ");
  Serial.println( topMoinsTempo);

  Serial.print("Distance cm : ");
  Serial.println( cm);
  topChronoMesure = millis(); 
  return cm;
  lireDistance();

}

void allumerLED()
{
  static boolean premiereFois = true; // au premier allumage les 10 secondes de temporisation ne sont pas valides

  if (premiereFois || (millis() - topChronoLED_OFF >= temporisationLED_OFF)) {
    digitalWrite(pinLED , HIGH);  // allumer la LED
    topChronoLED_ON = millis();
    LedAllumee = true;
    etat = LED_ALLUMEE;
    premiereFois = false;
  }
}

void eteindreLED()
{
  digitalWrite(pinLED , LOW);  // éteindre la LED
  LedAllumee = false;
  topChronoLED_OFF = millis();
  etat = LED_ETEINTE;
}

void setup()
{
  Serial.begin(115200); // à enlever si vous ne mettez pas de trace sur la console série
  pinMode(pinLED, OUTPUT);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  digitalWrite(trigPin, LOW);
  delay (20);
  eteindreLED(); // état initial
}

void loop() {

  int distance = lireDistance();
  //Serial.println( distance);
  switch (etat)
  {
    case LED_ETEINTE:
      if (distance < distanceCritique) allumerLED();
      break;

    case LED_ALLUMEE:
      if (millis() - topChronoLED_ON >= temporisationLED_ON) eteindreLED();
      break;
  }
}

En me basant sur ce programme ( en le modifiant ,bien sûr, pour l'adapter à mon projet ).
Et j'ai aussi besoin d’être guider dans le choix du matériel pour la protection de la carte uno, (motorshield ?, mosfet?, transistor ? pont en H ? ....) j'ai déjà la carte uno et mega, 2 capteurs HC-SR04 , des relais"songle",
Aussi,j'ai grandement besoin de votre aide , soutenue, pour y arriver.

Merci d'avance de l'aide que vous m'apporterez afinr que ce 2ème sujet puisse arriver à son terme ,aussi bien que le 1er.
Amitié à tous
Frida

Bonjour,

FRIDA24:
topChronoMesure = millis();
return cm;
lireDistance();

"lireDistance();" ne sert à rien.

Cordialement,
bidouillelec

En résumé
Les moteurs 1, 2 et 5 doivent être commandés suivant 2 sens de rotation
Les moteurs 3 et 4 doivent être commandés en marche/arrêt

Question :
Ton système doit-il prévoir également l'arrêt des moteurs 1, 2 et 5 (en plus de la commande en sens de rotation) ?

Quelle sont les tensions et intensité de tes moteurs ?

Pour la commande des motreurs tu peu utiliser un module de ce genre Module L298N
J'ai bien dit de ce genre et pas forcement celui-ci. Il faut d'abord vérifier les compatibilités en tension et intensité

à bidouilleelec,

lireDistance();
je l' enlève , merci

bidouilleelec:
Bonjour,
"lireDistance();" ne sert à rien.

Cordialement,
bidouillelec

C'est peut être mieux de dire cette ligne est ignorée du fait qu'elle se trouve après un return xxx ce qui fait quitter la fonction int lireDistance() et, en plus, cette ligne appelai la fonction dans laquelle elle était :o

Cordialement
jpbbricole

à Alain46,

Ton système doit-il prévoir également l'arrêt des moteurs 1, 2 et 5 (en plus de la commande en sens de rotation) ?
je pense que oui, car entre les actions , ils seront à l’arrêt , donc je pense qu'il faut que je les arrête ... mais ce sont des moteurs de vérin électriques donc si il n'y a plus de courant , je pense qu'ils resteront tel quel . ce ne sont pas des moteurs entrainant un axe ( ou serait fixé une roue et qui continueraient de tourner de part l'inertie ) .

Quelle sont les tensions et intensité de tes moteurs ? tension : 12 volts ,intensité :
moteur 1 = 4 ampères
moteur 1 = 4 ampères
moteur 3 = 1 ampère
moteur 4 = ? c'est une électrovanne : faible ampérage je sais pas exactement combien, par contre ,elle doit s’arrêter au bout des 30 secondes.
moteur 5 = 1 ampère

Il faut d'abord vérifier les compatibilités en tension et intensité : comment procéder ?

La batterie que je pense utiliser, sera une Batterie agricole 12 volts 135 ampères, 1000 ampères au démarrage

Merci de votre aide

Bonsoir,
Que pensez vous de :
Module de commande de moteur BTS7960B de conducteur de semi-conducteur 43A H Bridge PWM pour Arduino
(image en attachment)
pour la commande des moteurs ?
Merci de votre aide

Il faut d'abord vérifier les compatibilités en tension et intensité : comment procéder ?

Avec les données techniques du moteur à alimenter et les données techniques du module de commande
D'après tes informations et pour le moteur 1
12V 4 ampères, dans ce cas, le module L298N ne peut pas convenir (2A maximum)

En ce qui concerne le module que tu propose, je me permet amicalement une remarque.
Un lien est beaucoup plus utile qu'une copie d'écran et nous évite des recherches sur le net

Une autre remarque technique sur ce module

Bien que la description mentionne 43A, je doute que ce module puisse piloter 43A. Le bornier va fondre avant d'atteindre cette intensité et le radiateur me semble sous-dimensionné.
Par contre il peut convenir dans ton cas jusqu'à 4A

Digital pin n°2 : actionne moteur 1 dans 1 sens 6 secondes

Digital pin n°3 : actionne moteur 1 dans sens inverse 6 secondes

Ce module nécessite 4 signaux de commande
R_EN (Right Enable), L_EN (Left Enable), RPWM (Right PWM) et LPWM (Left PWM)
Je ne sais pas s'il est equipé d'une protection hardware
De toute façon il faut ABSOLUMENT éviter d'activer R_EN et L_EN en même temps, ce qui produirait un court-circuit (destruction du module, risque d'incendie, risque d'explosion de la batterie, ...)

Bonjour,
Merci pour tous ces renseignements.

Quelques précisions :
Sur le module, je vois "R-IS et L_IS ", qu'est ce que cela signifie ?

Je pense que MCU correspond à l'arduino ?

Ce module nécessite 4 signaux de commande
R_EN (Right Enable), L_EN (Left Enable), RPWM (Right PWM) et LPWM (Left PWM) : il me faudra donc utiliser 4 pins (2" digital" et 2" analogiques" pour 1 moteur ?

pour les "RPWM (Right PWM) et LPWM (Left PWM)", suis-je obligé de les utiliser,ou pas ? car ce qui intéresse c'est que les moteurs tournent à plein régime, ( pour étendre le vérin électrique le plus vite possible, je n'est donc pas besoin de réguler la vitesse de rotation avec PWM ), mon raisonnement est-il erroné ?

Merci pour le temps que tu prendras pour me répondre;
Bonne journée
Frida

Voici 2 shields que j'ai trouvé ,pour lesquels votre avis me serait précieux .

https://www.gotronic.fr/art-shield-megamoto-gt-35a-26230.htm

Ce qui m'interpelle, c'est qu' ils chauffent, et qu'il sont à mettre ( le 2ème en tout cas , il me semble que c'est sûr ) sur la carte arduino, cela ne va -t'il pas l'abimer ?

Sachant pouvoir compter sur la communauté Arduino.
Merci d'avance de vous interresser à mon problème

Sur le module, je vois "R-IS et L_IS ", qu'est ce que cela signifie ?

R_IS et L_IS sont des retours d'information du module vers la carte Arduino
Je n'ai pas lu la datasheet du circuit de commande mais il semblerait que ce soit l'intensité de chacune des sorties. Ce retour d'information devrait être connecté à une entrée analogique de la carte Arduino. On utilise cette information pour vérifier s'il y a une surintensité sur une sortie, blocage d'un mécanisme par exemple. Tu n'es pas obligé d'exploiter ces informations. Donc tu n'es pas obligé de connecter ces broches du module

Je pense que MCU correspond à l'arduino ?

Exact

Ce module nécessite 4 signaux de commande
R_EN (Right Enable), L_EN (Left Enable), RPWM (Right PWM) et LPWM (Left PWM) : il me faudra donc utiliser 4 pins (2" digital" et 2" analogiques" pour 1 moteur ?

4 pins digital

pour les "RPWM (Right PWM) et LPWM (Left PWM)", suis-je obligé de les utiliser,ou pas ? car ce qui intéresse c'est que les moteurs tournent à plein régime, ( pour étendre le vérin électrique le plus vite possible, je n'est donc pas besoin de réguler la vitesse de rotation avec PWM ), mon raisonnement est-il erroné ?

Effectivement tu n'es pas obligé d'utiliser du PWM. Tu peu faire une commande en tout ou rien avec la fonction digitalWrite().
A noter que d'un point de vue du signal électrique en sortie de l'Arduino digitalWrite(pin, HIGH) est équivalent à analogWrite(pin, 255)

Ce qui m'interpelle, c'est qu' ils chauffent, et qu'il sont à mettre ( le 2ème en tout cas , il me semble que c'est sûr ) sur la carte arduino, cela ne va -t'il pas l'abimer ?

Normalement un shield est conçu pour être monté sur la carte Arduino il est censé ne pas l'endommager. Je n'ai pas d'expérience avec ces shields

On ne peut pas empiler plusieurs shields sur une carte Arduino. Tu ne pourra pas piloter plus de 2 moteurs, alors que ton projet en comporte 5
C'est pourquoi je t'avais initialement orienté vers des modules
Un module est une carte indépendante à monter à coté de la carte Arduino.
Avec cette approche le nombre de modules n'est limité que par le nombre de pins de la carte Arduino
L'inconvénient est que l'utilisation nécessite un cablage entre le module et la carte Arduino (risque d'erreur de cablage ou de faux contact)
Il est possible d'utiliser un shield bornier pour le cablage (Arduino Screw Shield) Version Uno Version Mega en kit Version Mega prete a utiliser

En ce qui concerne les moteurs 3 et 4 qui sont commandés en marche/arret avec 1 seul sens de rotation, il est aussi possible d'utiliser un module relai 2 voies

Bonsoir,
Merci pour ta réponse qui m'a bien éclairé.. :slight_smile:

une question qui me trotte dans la tête : quelle est la différence entre un module relai 2 voies,comme celui que tu m'as mis le lien ( 5 V 2 Canal 2 Route Module de Relais avec Optocoupleur Isolement Soutient Haut et Bas Niveau de Déclenchement ) et un module de commande de moteur comme celui que j'avais trouvé ( le Module de commande de moteur BTS7960B de conducteur de semi-conducteur 43A H Bridge PWM pour Arduino) pour ce qui est de la protection de la carte arduino contre les courants de retour vers l'arduino ( à l’arrêt ou au freinage du moteur ) ?

La protection par Optocoupleur est elle suffisante , ou faut-il envisager un système en plus entre l'arduino et le moteur ? et si oui, lequel ?
Amicalement
Frida

pour ce qui est de la protection de la carte arduino contre les courants de retour vers l'arduino ( à l'arrêt ou au freinage du moteur )

Il y a deux parties bien distinctes dans tout module de pilotage de moteur

  • La partie commande (en 5V dans ce cas). On y retrouve une alimentation pour l'électronique du module et les signaux de commande. La consommation est très faible et cette alimentation peut-être fournie par la carte Arduino
  • La partie puissance. La carte Arduino est totalement incapable de fournir du 12V sou splisuers ampères. Il ta faut une alimentation séparée. Dans ton cas, le 12V de la batterie
    Il n'y a pas de courant (de la partie puissance en retour vers l'Arduino)

La protection par Optocoupleur est elle suffisante , ou faut-il envisager un système en plus entre l'arduino et le moteur ? et si oui, lequel ?

C'est un peu le même principe qu'avec le module électronique à part que la commutation de puissance est mécanique

  • La partie commande est isolée par un optocoupleur. De ce fait la bobine du relais est totalement isolée. Ce qui représente une première isolation. En général les modules relais sont équipés d'une diode de roue libre permettant la protection de la partie commande
  • La partie puissance (le contact du relai) est totalement isolée de la partie commande. Ce qui représente une seconde isolation.
    Nota : Totalement isolé n'est pas le terme exact si tu as une masse commune

La différence entre le module électronique et le module electromécanique est le prix.

Certains peuvent uniformiser le projet en pilotant tous les moteurs avec la même référence de module électronique. Ce qui permet de n'avoir qu'une référence en pièce détachée pour la maintenance

Voilà des explications claires , je suis donc rassuré.
Merci à toi