automatiser rotation moteur cc

Bonsoir,

Pour un projet d’étude je dois faire une maquette avec 2 moteurs CC tournant dans le même sens mais changeant de sens de rotation de manière périodique (toutes les 5 secondes par exemple)

J’ai utilisé le kit de démarrage arduino pour ça, mais avec 2 moteurs que j’ai acheté (j’ai mis la doc en pièce jointe), donc avec le pont en H l2930ne

J’ai utilisé ce code pour faire tourner le moteur fourni, 2 boutons poussoirs qui contrôlaient le sens et la marche/arrêt et un potentiomètre qui contrôlait la vitesse de rotation

const int controlPin1 = 2;
const int controlPin2 = 3;
const int enablePin = 9;
const int direction SwitchPin = 4;
const int onOffSwitchStatePin = 5;
const int potPin = A0;

int onOffSwitchState = 0;
int previousOnOffSwitchState=0;
int directionSwitchState=0;
int previousDirectionSwitchState=0;

int motorEnabled =0;
int motorSpeed=0;
int motorDirection=1;


void setup() {
  pinMode(directionSwitchPin, INPUT);
  pinMode(onOffSwitchStateSwitchPin, INPUT);
  pinMode(controlPin1, OUTPUT);
  pinMode(controlPin2, OUTPUT);
  pinMode(enablePin, OUTPUT);

digitalWrite(enablePin, LOW);
}

void loop() {
  onOffSwitchState=
    digitalRead(onOffSwitchStateSwitchPin);
   delay(1);
   directionSwitchState=
    digitalRead(directionSwitchPin);
   motorSpeed=analogRead(potPin)/4;
   if(onOffSwitchState!=previousOnOffSwitchState){
    if(onOffSwitchState== HIGH){
      motorEnabled = !motorEnabled;
    }
   }
   if (motorDirection == 1){
    digitalWrite(controlPin1, LOW);
    digitalWrite(controlPin2, LOW); 
   }
   else {
    digitalWrite(controlPin1, LOW);
    digitalWrite(controlPin2, HIGH);
   }
   if (motorEnabled ==1){
    analogWrite(enablePin, motorSpeed);
   }
   else {
    analogWrite(enablePin, 0);
   }
   previousDirectionSwitchState =
    directionSwitchState;
   previousOnOffSwitchState = onOffSwitchState;
}

J’ai 2 problèmes : comment puis-je automatiser le changement de sens de rotation sans passer par un bouton poussoir (je dois faire des relevés pendant quelques heures), et est ce qu’en branchant les 2 moteurs en série j’aurai un courant et une tension suffisante sans pour autant griller mon pont en H ?

J’ai également un L298N (juste le pont), mais il n’a pas la même disposition et je n’ose pas refaire mon montage pour celui-ci si ce n’est pas nécessaire

J’ai cru comprendre que la tension max du L2930ne était 600 mA, et un moteur même en forçant ne demandait pas plus de 250 mA, il me semblait que c’était compatible

Merci à vous, bonne soirée

PS : j’ai appris à coder avec le langage arduino uniquement avec ce projet, je ne connais pas forcément toutes les fonctions de base

doc moteur.png

L’Arduino dispose de fonctions pour mesurer le temps, notamment la fonction millis() qui renvoie le nombre de millisecondes depuis que l’Arduino est allumé (ou un truc comme ça). L’important c’est que cette fonction s’incrémente à chaque milliseconde ce qui permet de faire un chrono.

Tu trouveras un bon tuto ici, peut-être un peu complexe pour un débutant mais qui te donnera toutes les infos dont tu as besoin pour ton projet.

Ensuite pour ton programme, ce n’est pas très compliqué : tu initialises ton chrono dans le setup.
Dans la loop tu lis ton chrono et si le temps a dépassé une certaine valeur (tes 5 secondes par exemple) :

  • tu remets le chrono à 0
  • tu changes le sens des moteurs
    Et c’est tout. L’Arduino le fera comme ça jusqu’à l’infini (et au delà) !

J’ai cru comprendre que la tension max du L2930ne était 600 mA,

Une tension mesurée en mA je n’avais encore jamais vu :grin:

Attention à ne pas tout mélanger.
Une tension ( de son vrai nom : différence de potentiel électrique) se mesure avec des volts.
Un courant (sous entendu d’électrons) se mesure en ampères.

C’est la différence de potentiel électrique qui provoque la circulation d’un courant d’électrons.
Tout comme c’est la différence de hauteur qui provoque la circulation de l’eau.

Note bien l’analogie :
différence de hauteur <-> différence de potentiel électrique
courant de gouttes d’eau <-> courant d’électrons.

comment puis-je automatiser le changement de sens de rotation sans passer par un bouton poussoir

Comme le suggèere lesept, tu peu utiliser une temporisation
Mais il faudra gérer une temporisation supplémentaire avant d’inverser le sens de rotation.
L’inversion du sens de rotation est obtenu en inversant la polarité
Le moteur alimenté et tournant à la vitesse V a une certaine intertie.
Si l’alimentation est coupée par le pont en H, le moteur va continuer de tourner sur son inertie et se comportger comme une génératrice, donc générer une tension
Il faut laisser le temps au moteur de passer de la vitesse V à la vitesse 0 avant d’inverser la polarité

est ce qu’en branchant les 2 moteurs en série j’aurai un courant et une tension suffisante sans pour autant griller mon pont en H ?

Si tu branches tes 2 moteurs en série, chaque moteur nécessitant 12V, il faut alimenter en 24V

et un moteur même en forçant ne demandait pas plus de 250 mA

Ton extrait de doc mentionne 2.1A
250mA c’est un courant que tu as mesuré ?

68tjs:
Une tension mesurée en mA je n’avais encore jamais vu :grin:

Attention à ne pas tout mélanger.
Une tension ( de son vrai nom : différence de potentiel électrique) se mesure avec des volts.
Un courant (sous entendu d’électrons) se mesure en ampères.

C’est la différence de potentiel électrique qui provoque la circulation d’un courant d’électrons.
Tout comme c’est la différence de hauteur qui provoque la circulation de l’eau.

Note bien l’analogie :
différence de hauteur <-> différence de potentiel électrique
courant de gouttes d’eau <-> courant d’électrons.

Oui pardon j’ai juste été un peu vite, le courant se mesure en A, je parlais de courant :slight_smile:

Concernant l'inversion du sens de rotation les ponts en H "intelligents" ont une fonction freinage.
En fonctionnement normal les transistors sont rendus passant en diagonale.
Pour le freinage les transistors du bas (ou du haut) sont rendus passant simultanément. Le moteur n'étant plus alimenté se transforme en génératrice l'énergie cinétique du moteur est transformée en énergie électrique.
Le moteur/génératrice est freiné brutalement en débitant sur un court-circuit.

Selon les circuits intégrés pont en H cette phase peut être automatique ou commandée.

68tjs:
Concernant l'inversion du sens de rotation les ponts en H "intelligents" ont une fonction freinage.
En fonctionnement normal les transistors sont rendus passant en diagonale.
Pour le freinage les transistors du bas (ou du haut) sont rendus passant simultanément. Le moteur n'étant plus alimenté se transforme en génératrice l'énergie cinétique du moteur est transformée en énergie électrique.
Le moteur/génératrice est freiné brutalement en débitant sur un court-circuit.

Selon les circuits intégrés pont en H cette phase peut être automatique ou commandée.

68tjs:
Concernant l'inversion du sens de rotation les ponts en H "intelligents" ont une fonction freinage.
En fonctionnement normal les transistors sont rendus passant en diagonale.
Pour le freinage les transistors du bas (ou du haut) sont rendus passant simultanément. Le moteur n'étant plus alimenté se transforme en génératrice l'énergie cinétique du moteur est transformée en énergie électrique.
Le moteur/génératrice est freiné brutalement en débitant sur un court-circuit.

Selon les circuits intégrés pont en H cette phase peut être automatique ou commandée.

Mais est ce que c'est possible avec mon modèle ?

Il faut lire la datasheet du L293one. C’est un projet d’études, je veux bien donner les informations que je possède mais c’est ton sujet.
C’est la première fois que j’entends parler de cette référence, L293 oui, mais L293One non, → c’est la référence du CI ou celle d’un module ?

jl_rvr:
J’ai cru comprendre que la tension max du L2930ne était 600 mA, et un moteur même en forçant ne demandait pas plus de 250 mA, il me semblait que c’était compatible

A¨ie mes yeux!
Si c’est comme le D, l’intensité max en sortie est bien de 600mA
2x250=500 500<600 alors oui ^^

S’il y a un petit conseil que je peux te donner, c’est de COMMENTER ton programme.
Les drivers se commandent avec En1, I1, I2 etc, que tu gardes ou non ces noms de pins, indique qui est qui dans les commentaires. je suis un habitué des galères avec le L293, mais j’ai aussi la flemme de déchiffrer du code…

Alain46:
Si l'alimentation est coupée par le pont en H, le moteur va continuer de tourner sur son inertie et se comportger comme une génératrice, donc générer une tension
Il faut laisser le temps au moteur de passer de la vitesse V à la vitesse 0 avant d'inverser la polarité
Si tu branches tes 2 moteurs en série, chaque moteur nécessitant 12V, il faut alimenter en 24V

Il me semble que l'électronique des drivers évite justement ça, et aussi d'avoir à souder des trucs aux bornes des moteurs...

Il me semble que l'électronique des drivers évite justement ça, et aussi d'avoir à souder des trucs aux bornes des moteurs...

L'électronique des ampli pour pont en H protège contre les courts-circuits au moment du changement de sens.

Quand on inverse le sens du passage du courant les transistors ne s'ouvrent ni ne se ferment instantanément : il faut un certain temps ce qui fait que les transistors du haut et ceux du bas se retrouvent simultanément passants pendant un court instant, d'où la situation de court-circuit.
C'est la raison pour laquelle les concepteurs de circuits intégrés introduisent une "Dead zone" : ils imposent un temps mort entre l'ordre de fermeture des transistors passants et l'ordre d'ouverture des transistors bloqués.

D'un autre coté il faudrait s'interroger sur le rôle des diodes de protection (externes avec le L293, internes avec le L293D quand on coupe le courant dans le moteur.

Pardon je me rends compte que le code uniquement ne suffit pas

Voici le montage que j’ai fait (je ne l’ai pas fait seul j’ai déjà suivi quelques tutos : je comprends à quoi correspondent les bornes de la carte mais je ne sais pas par quoi remplacer le code rattaché au bouton poussoir ni comment le remplacer sur le circuit pour pouvoir automatiser la rotation du moteur)

le potentiomètre me sert à contrôler la vitesse de rotation du moteur, je pense en changeant le ration HIGH/LOW pour la PWM ?

De plus je viens de vérifier la doc du pont en H (L293DNE en fait, j'ai mal lu la réf sur le composant)

Supply voltage, VCC1
(2) 36 V
Output supply voltage, VCC2 36 V
Input voltage, VI 7 V
Output voltage, VO –3 VCC2 + 3 V
Peak output current, IO (nonrepetitive, t ≤ 5 ms): L293 –2 2 A
Peak output current, IO (nonrepetitive, t ≤ 100 µs): L293D –1.2 1.2 A
Continuous output current, IO: L293 –1 1 A
Continuous output current, IO: L293D –600 600 mA

Je pense que les 2 lignes en gras sont celles qui m'intéressent, donc mettre 26 V avec une intensité max à 400-500 mA est cohérent ? (il s'agit bien de continu avec mes moteurs à courant continu ?)

Merci infiniment d'avoir déjà pris le temps de me répondre

PS n°2 : quand je parle de projet d'étude, c'est moi qui ait choisi de commander mes moteurs par arduino, mais je n'ai pas d'enseignant surveillant pour répondre à mes questions du côté de l'arduino...

PS n°2 : quand je parle de projet d'étude, c'est moi qui ait choisi de commander mes moteurs par arduino, mais je n'ai pas d'enseignant surveillant pour répondre à mes questions du côté de l'arduino...

C'est prudent de le préciser.

Dans la doc des moteurs (message #1) je lis : courant en charge max = 2,1 A
Le L293DNE est donné pour un courant "peak" max = 1,2 A
Le courant max d'un moteur est celui du démarrage où seule la résistance du bobinage est active : comme la doc des moteurs est incomplète tu calculera toi même le courant max.
Ce courant de démarrage est bref dès que le moteur commence à tourner il diminue fortement.

Si les moteurs tournent à vide et que tu es sûr des 250 mA max le L293DNE devrait convenir hors courant de démarrage.

Pour le démarrage c'est un problème de thermique en régime transitoire : donc c'est le bor*el.
Il ne faut pas que le silicium soit trop chaud sinon il fond.
Il y a aussi les bonding ces petits fils d'aluminium de quelques dizaines de micron qui relient la puce au pins de sorties du boîtier : au delà d'un certain courant ils fondent --> cette info est prise en compte dans le courant max de la datasheet.

Ce que je peux ajouter en plus de te dire d'essayer c'est qu'il est préférable que le L293DNE soit monté dans un boîtier de puissance et que s'il est monté dans un boîtier DIP il est prudent de lui placer un radiateur.

D'accord, je vais tester ça alors

En attendant j'ai essayé de retravailler sur mon code : j'ai fait le montage en virant le bouton poussoir correspondant au changement de sens de rotation, et j'ai écrit ça à la place

const int controlPin1 = 2;
const int controlPin2 = 3;
const int enablePin = 9;
const int directionSwitchPin = 4;
const int onOffSwitchStateSwitchPin = 5;
const int potPin = A0;

int onOffSwitchState = 0;
int previousOnOffSwitchState=0;
int directionSwitchState=0;
int previousDirectionSwitchState=0;

int motorEnabled =0;
int motorSpeed=0;
int motorDirection=1;

void setup() {
  pinMode(directionSwitchPin, INPUT);
  pinMode(onOffSwitchStateSwitchPin, INPUT);
  pinMode(controlPin1, OUTPUT);
  pinMode(controlPin2, OUTPUT);
  pinMode(enablePin, OUTPUT);
  
  digitalWrite(enablePin, LOW);
}

void loop() {
  onOffSwitchState=
    digitalRead(onOffSwitchStateSwitchPin);
   delay(1);
   directionSwitchState=
    digitalRead(directionSwitchPin);
   motorSpeed=analogRead(potPin)/4;
   if(onOffSwitchState!=previousOnOffSwitchState){
    if(onOffSwitchState== HIGH){
      motorEnabled = !motorEnabled;
    }
   }
   
 [b] digitalWrite(controlPin1, LOW);
  digitalWrite(controlPin2, LOW); 
  delay(750);

  digitalWrite(controlPin1, LOW);
  digitalWrite(controlPin2, HIGH);
  delay(2500);[/b]

   if (motorEnabled ==1){
    analogWrite(enablePin, motorSpeed);
   }
   else {
    analogWrite(enablePin, 0);
   }
   previousDirectionSwitchState =
    directionSwitchState;
   previousOnOffSwitchState = onOffSwitchState;

}

Au début dans mon code j'avais enlevé tout ce qui était lié au "directionSwitchState" mais mon potentiomètre et mon bouton marche/arrêt marchaient plus du coup, et le moteur tournait dans un sens 2,5 s, s'arrêtait 0,75 s mais repartait dans le même sens (pourtant je pensais qu'en mettant le controlPin2 sur HIGH ça l'aurait fait tourner dans l'autre sens comme quand j'avais le bouton)
En faisant juste sortir les instructions en gras (dans le quoi) du if{} comme là, ça n'a rien changé c'est toujours pareil...

J'ai un peu nettoyé ton code sans réellement le changer :

const int controlPin1 = 2;
const int controlPin2 = 3;
const int enablePin = 9;
const int directionSwitchPin = 4;
const int onOffSwitchPin = 5;
const int potPin = A0;

int onOffSwitchState = 0;
int previousOnOffSwitchState = 0;
int directionSwitchState = 0;
int previousDirectionSwitchState = 0;

int motorEnabled = 0;
int motorSpeed = 0;
int motorDirection = 1;

void setup() {
  pinMode(directionSwitchPin, INPUT);
  pinMode(onOffSwitchPin, INPUT);
  pinMode(controlPin1, OUTPUT);
  pinMode(controlPin2, OUTPUT);
  pinMode(enablePin, OUTPUT);
  digitalWrite(enablePin, LOW);
}

void loop() {
  onOffSwitchState = digitalRead(onOffSwitchPin);
  delay(1);
  directionSwitchState = digitalRead(directionSwitchPin);
  motorSpeed = analogRead(potPin) / 4;
  
  if (onOffSwitchState != previousOnOffSwitchState && onOffSwitchState == HIGH)
    motorEnabled = !motorEnabled;

  digitalWrite(controlPin1, LOW);
  digitalWrite(controlPin2, LOW);
  delay(750);
  digitalWrite(controlPin2, HIGH);
  delay(2500);

  if (motorEnabled == 1) analogWrite(enablePin, motorSpeed);
  else analogWrite(enablePin, 0);
  previousDirectionSwitchState = directionSwitchState;
  previousOnOffSwitchState = onOffSwitchState;
}

Tu n'utilises jamais l'information de direction, ce doit être là ton erreur. Il faut peut-être changer :

 if (onOffSwitchState != previousOnOffSwitchState && onOffSwitchState == HIGH)
    motorEnabled = !motorEnabled;

en

 if (directionSwitchState != previousdirectionSwitchState && onOffSwitchState == HIGH)
    motorEnabled = !motorEnabled;

lesept:
J'ai un peu nettoyé ton code sans réellement le changer :

const int controlPin1 = 2;

const int controlPin2 = 3;
const int enablePin = 9;
const int directionSwitchPin = 4;
const int onOffSwitchPin = 5;
const int potPin = A0;

int onOffSwitchState = 0;
int previousOnOffSwitchState = 0;
int directionSwitchState = 0;
int previousDirectionSwitchState = 0;

int motorEnabled = 0;
int motorSpeed = 0;
int motorDirection = 1;

void setup() {
 pinMode(directionSwitchPin, INPUT);
 pinMode(onOffSwitchPin, INPUT);
 pinMode(controlPin1, OUTPUT);
 pinMode(controlPin2, OUTPUT);
 pinMode(enablePin, OUTPUT);
 digitalWrite(enablePin, LOW);
}

void loop() {
 onOffSwitchState = digitalRead(onOffSwitchPin);
 delay(1);
 directionSwitchState = digitalRead(directionSwitchPin);
 motorSpeed = analogRead(potPin) / 4;
 
 if (onOffSwitchState != previousOnOffSwitchState && onOffSwitchState == HIGH)
   motorEnabled = !motorEnabled;

digitalWrite(controlPin1, LOW);
 digitalWrite(controlPin2, LOW);
 delay(750);
 digitalWrite(controlPin2, HIGH);
 delay(2500);

if (motorEnabled == 1) analogWrite(enablePin, motorSpeed);
 else analogWrite(enablePin, 0);
 previousDirectionSwitchState = directionSwitchState;
 previousOnOffSwitchState = onOffSwitchState;
}



Tu n'utilises jamais l'information de direction, ce doit être là ton erreur. Il faut peut-être changer :


if (onOffSwitchState != previousOnOffSwitchState && onOffSwitchState == HIGH)
   motorEnabled = !motorEnabled;



en


if (directionSwitchState != previousdirectionSwitchState && onOffSwitchState == HIGH)
   motorEnabled = !motorEnabled;

Du coup ils me renvoient un message d'erreur, "a function-definition is not allowed here before '{' token"

Puis ça change rien, j'ai toujours mon moteur qui tourne dans un seul sens :frowning: ...

Il est indiqué un numéro de ligne dans le message d'erreur, ce serait bien e l'indiquer.
Sinon tu peux reprendre ton programme et faire uniquement le changement que je t'ai indiqué.

C:\Users\Jean-Laurent\Desktop\Projet_10\Projet_10.ino: In function 'void loop()':

Projet_10:32: error: 'previousdirectionSwitchState' was not declared in this scope

if (directionSwitchState != previousdirectionSwitchState && onOffSwitchState == HIGH)

^

exit status 1
'previousdirectionSwitchState' was not declared in this scope