Asservir une grue pour qu'elle effectue son travail en boucle

Bonjour, je m'appelle Paul et je suis un élève de PSI.
Mon TIPE consiste à asservir une grue suivant le modèle de Energy Vault en simplifiant grandement. Je dispose d'un banc réalisant un mouvement de translation horizontal, piloté par une carte Arduino UNO.
Ensuite, j'ai utilisé le montage suivant pour le mouvement de levage d'un poids fictif ( Source : Pilotez un moteur CC avec Arduino • AranaCorp ).

Mais en voulant piloter les 2 moteurs en même temps, je rencontre un problème de montage.

Je dispose du code suivant :

// C++ code
//
// Constantes
const int enableBridge1 = 8;
const int MotorForward1 = 10;
const int MotorReverse1 = 12;
const int enableBridge2 = 2;
const int MotorForward2 = 3;
const int MotorReverse2 = 5;

// Variables
int Power = 100; //Motor velocity between 0 and 255

void setup(){
  pinMode(MotorForward1,OUTPUT);
  pinMode(MotorReverse1,OUTPUT);
  pinMode(enableBridge1,OUTPUT);
  pinMode(MotorForward2,OUTPUT);
  pinMode(MotorReverse2,OUTPUT);
  pinMode(enableBridge2,OUTPUT);
}

void loop(){
  digitalWrite(enableBridge1,HIGH); // Active pont en H
  digitalWrite(enableBridge2,HIGH); // Active pont en H

  // Fait tourner le moteur 1 dans le sens direct pendant 5 secondes
  analogWrite(MotorForward1,Power);
  analogWrite(MotorReverse1,0);
  delay(5000);
  
    //Arrête le moteur 1 pendant 3 secondes
  analogWrite(MotorForward1,0);
  analogWrite(MotorReverse1,0);
  digitalWrite(enableBridge1,LOW); 
  delay(3000);
  
  // Fait tourner le moteur 2 dans le sens direct pendant 5 secondes
  analogWrite(MotorForward2,0);
  analogWrite(MotorReverse2,Power);
  delay(5000);
  
  //Arrête le moteur pendant 2 secondes
  analogWrite(MotorForward2,0);
  analogWrite(MotorReverse2,0);
  digitalWrite(enableBridge2,LOW); 
  delay(2000);
  
    // Fait tourner le moteur 2 dans le sens indirect pendant 5 secondes
  analogWrite(MotorForward2,0);
  analogWrite(MotorReverse2,Power);
  delay(4000);
  
    //Arrête le moteur pendant 2 secondes
  analogWrite(MotorForward2,0);
  analogWrite(MotorReverse2,0);
  digitalWrite(enableBridge2,LOW); 
  delay(2000);
  
    // Fait tourner le moteur 1 dans le sens indirect pendant 5 secondes
  analogWrite(MotorForward1,0);
  analogWrite(MotorReverse1,Power);
  delay(4000);
  
  //Arrête le moteur pendant 2 secondes
  analogWrite(MotorForward2,0);
  analogWrite(MotorReverse2,0);
  digitalWrite(enableBridge2,LOW); 
  delay(2000);
  
  // Fait tourner le moteur 2 dans le sens direct pendant 5 secondes
  analogWrite(MotorForward2,0);
  analogWrite(MotorReverse2,Power);
  delay(5000);
  
  //Arrête le moteur pendant 2 secondes
  analogWrite(MotorForward2,0);
  analogWrite(MotorReverse2,0);
  digitalWrite(enableBridge2,LOW); 
  delay(2000);
  
    // Fait tourner le moteur 2 dans le sens indirect pendant 5 secondes
  analogWrite(MotorForward2,0);
  analogWrite(MotorReverse2,Power);
  delay(4000);
  
    //Arrête le moteur 2 pendant 2 secondes
  analogWrite(MotorForward2,0);
  analogWrite(MotorReverse2,0);
  digitalWrite(enableBridge2,LOW); 
  delay(2000);
  
}

Mon but est de répéter ce mouvement ( ou de faire l'inverse) :
image

J'ai fait des recherches sur comment commander 2 moteurs simultanément et j'ai trouvé qu'il fallait un pont L298N, que j'ai acheté ( ainsi que des platines d'essai ).

J'ai pensé à l'utilisation de capteurs dans le montage mais ça serait rajouter des difficultés supplémentaires vu l'état des choses, ou même de boucle for/while.

Comment est-ce-que je pourrais réaliser un bon montage avec le pont L298N ?
(Et corriger le programme s'il n'est pas bon)

Je retourne au labo du lycée mardi et mercredi.

PS : Je n'ai pas pu insérer le lien menant au site d'Energy Vault car je suis un nouvel utilisateur

Pour bien comprendre les moteurs (et pour bien débuter avec l'arduino), c'est bien de lire Le mouvement grâce aux moteurs - les tutos d'eskimon. (commencez par la partie Le moteur à courant continu)

c'est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

PS: j'ai rajouté un lien vers le modèle de Energy Vault dans votre post, en espérant ne m'être pas trompé

Bonjour Paul

En temps qu'ancien grutier, le sujet m'intéresse!
Oui, le L298 est idéal pour ça, mais l'absence de capteur me fais dire que ce sera une répétition de mouvement, sans référence de position, donc, uniquement répétition.
Pour faire ce genre de "mécanique", j'inventerai un langage, genre G-Code pour la CNC mais adapté à une grue, dans le genre
CH12, CR-20, TI120,CR20,CH-12
C'est à dire, chariot avant 12m, crochet bas 20m, attente 120 sec., crochet haut 20m, chariot arrière 20m.
Ces ordres seraient introduits depuis la ligne de commandes du moniteur de l'IDE arduino ou tout autre émulateur de terminal.

Cordialement
jpbbricole

Sans capteurs de position, c'est possible, mais il faut aller en butée (et forcer un peu dessus), comme par exemple mon portail. Dans le cas contraire, un mouvement aller / retour ne revient pas à la même position avec des moteurs CC non asservis. Et au bout d'un moment tout se décale.

Le L298 est un pont DOUBLE. il est capable de piloter 2 moteurs CC. Il n'y a besoin que d'un seul circuit.

Le pont est un composant à mettre sur une plaque à trous ou c'est un composant monté sur un circuit avec borniers?

Bonsoir, merci pour vos réponses.

J'ai bien lu les tutoriels en entier et j'ai mon montage terminé et des programmes qui fonctionnent.

Dans le tutoriel d'eskimon, il y a une partie sur les ponts L293D et L298. Le L293D est plus simple à utiliser mais délivre un courant plus faible que le L298. Dans mon cas, où seulement un seul moteur est utilisé par cycle, le L293D est suffisant normalement. Mais quelle est la différence entre ce pont et ceux-là ?

Par la suite, si tout fonctionne correctement lors du test de mardi, j'aimerais ajouter des capteurs pour effectuer des mouvements plus 'précis' comme l'a souligné @vileroi. Je sais qu'il y a des capteurs à ultrasons au labo et peut-être des capteurs inductifs (pour une mesure de position sur le mouvement horizontal)

@J-M-L Le lien est bon, mais je pensais plutôt à être redirigé directement vers le site de la société CDU | Energy Vault, je ne suis pas abonné au journal Les Echos.

@jpbbricole Merci de votre réponse. Dans ma situation, je ne peux que faire des systèmes miniatures mais je vais me renseigner sur le langage G-Code.

@vileroi J'ai pour le moment ceci et 3 plaques à trous.

Bonsoir gruthk

Je citais G-Code à titre d'exemple, pour une grue, il faudrait recréer un nouveau "pseudo language".

Cordialement
jpbbricole

Etant donné que le pont est utilisé pour un moteur, il faut des diodes de roues libres. Le L298 n'en a pas, il faut un L293D. Le L298 convoient si il est monté sur un circuit comme le lien donné.

Si il faut choisir un circuit, un L293D suffit, mais si tu as déjà un L298, autant l'utiliser.

C'est le même circuit, mais l'un est nu, il pose des problème de connexion pour une réalisation finale. L'autre est plus simple à utiliser avec les borniers. La plaque à trous passe pour des essais, mais c'est source de faux contacts.

Par rapport à l'article, il y aura du mal à soulever 30 tonnes pour faire une réserve d'énergie :grin:

Pour les capteurs de fin ce course, un simple contact suffit en principe amplement. Cela peut même se faire avec un fil qui est mis à la masse par le chariot quand il arrive au bout. Pour ne pas que l'ensemble se décale, on peut faire l'économie d'un capteur, par exemple, on descend 3s et on remonte jusqu'au capteur.

Cela va donner une usine à gaz qui ne semble pas correspondre au cahier des charges. Au vu des questions posées, je ne pense pas que tu puisse faire cela pour l'instant.

@vileroi D'accord merci pour la réponse. Je vais vérifier mardi si le labo dispose d'un capteur de fin de course, des diodes de roues libres devraient être disponibles.
Si la plaque à trous est effectivement source de problème, par quoi je pourrais la remplacer ? J'ai vu dans ma classe des projets Arduino sans plaque.

Sinon deux fils dont un est relié à la masse. Quand ils se touchent, cela fait le contact nécessaire.

Si tu utilises le L2998 monté sur le circuit, il y en a déjà sur le circuit, et le L293D en possède. Il n'y en a pas besoin à priori.

Avec ceci , il n'y en a pas besoin.
Maintenant le plaque à trous est plus un problème à la longue qu'au début. Quand on fait le montage, cela nettoie les contacts. Les problèmes apparaissent ensuite. C'est pour cela que cela reste un très bon moyen pour tester.

D'accord merci beaucoup.
Pour le contact entre les deux fils, il faut de quoi les guider pour qu'ils se touchent bien ?

Si le chariot est métalique et mis à la masse, il suffit pour l'autre fil qu'il soit comme une butée isolée. Sinon Quelque chose comme une grosse graphe et un ressort ou une tige souple:
image

Il faut qu'il y ait contact, mais il n'a pas besoin d'être parfait, si cela bouhe pas bien, il y a un moment ou il y a contact et la programmation le verra.

Un vrai fin de course c'est peut être plus pro, mais moins discret dans une maquette qu'un clou.

Bonjour vileroi

Une "poignée" de lignes supplémentaires

??? La demande, c'est la répétivité

et ma proposition entre dans cette optique, avec le grand avantage, qu'il sera possible de changer de cycle de mouvements, sans devoir modifier, recompiler et télécharger le programme. Un simple commande, introduite depuis la ligne de commande du moniteur de l'IDE Arduino.

Cordialement
jpbbricole

Re-bonjour,
Le labo du lycée n'avait pas de diodes de roues libres alors j'ai commandé hier un pont L293D au cas où.
J'ai reproduit le montage suivant en respectant les couleurs des fils :



J'ai récupéré au labo du lycée ce moteur cc de 6V avec codeur incrémental :

Cependant, je n'arrive pas à faire rentrer les fils dans les trous d'alimentation de la broche puisque je n'utilise pas pour le moment les autres pins. Faut-il forcer ?

J'ai aussi pensé à acheter ces moteurs ou ceux-là pour avoir à ma disposition assez de matériel. Je ne vois aucun fil sur ces moteurs, il faut utiliser les miens je suppose.

Tous les moteurs de récup que j'ai on des connecteurs qui ne sont pas au format Arduino. Il faut quasiment souder les fils sur le moteur pour les changer.

C'est pareil pour les moteurs que l'on achète, en général il n'ont pas de fils. c'est à nous de les souder.


Attention, il n'est pas possible de faire tourner les moteurs avec une pile 9V car elle ne peut pas délivrer suffisamment de courant. La tension s'effondre, et le micro se réinitialise. Voir ce post

D'accord.
J'ai vu des secteurs dans les tiroirs du labo, je vais en récupérer un demain. Je vais aussi commander des moteurs en plus, je ne peux pas abîmer ou détruire le matériel du lycée.

dites leur que R&D ça veut dire "Recherche et Destruction"... (bien souvent) :wink:

Je vais m'arranger avec le technicien du lycée :grinning_face_with_smiling_eyes:



Le banc ci-dessus réalise un mouvement de translation. Il est piloté par un moteur pas-à-pas.

J'ai un autre pont h, le pmodHB5 auquel se rattache directement un moteur cc avec encodeur.


Il y a assez de place sur la carte pour connecter le pont mais où connecter les pin GND et VCC de la broche J1 ? La borne 5V est occupé par le fil du bouton jaune (si je comprends bien le montage). Il reste le 3.3V.

Rassurez moi - quand vous parlez de 3.3 ou 5V ce n’est pas pour alimenter le moteur ?

Rien ne vous empêche de brancher plusieurs fils en parallèle dans la broche GND ou 5V du moment que vous ne tirez pas plus de courant que la carte / régulateur peut fournir.