Moteur 6 fils, Stepper et motor shield (L298)

Il devrait y avoir 2 leds allumées en même temps, genre:
L1 L2 L3 L4
1 0 1 0
0 1 1 0
0 1 0 1
1 0 0 1
et cela recommence.

On devrait avoir 10W. Quand on voudra arrêter le moteur, on le pourra avec les broches break.

L'alimentation du shield est bien en 12V?

As-tu un voltmètre pour remplacer le testeur?

Le programme:

// Rotation sur une journée 15°/H sur 12h puis retour en arrière 

// Include the Stepper library:
#include <Stepper.h>

// Define number of steps per revolution:
const int stepsPerRevolution = 60;

// Give the motor control pins names:
#define pwmA 3
#define pwmB 11
#define dirA 12
#define dirB 13

// Initialize the stepper library on the motor shield:
Stepper myStepper = Stepper(stepsPerRevolution, dirA, dirB);

void setup() {
  pinMode(pwmA, OUTPUT);
  pinMode(pwmB, OUTPUT);
  digitalWrite(pwmA, HIGH);
  digitalWrite(pwmB, HIGH);

  // Set the motor speed (RPMs):
  myStepper.setSpeed(1);
}

void loop() {
  // Pour les tests
  delay(6000);
  myStepper.step(60);
}

Autre test à faire, normalement le moteur devrait être en mode 2 phases à la fois., on peut déconnecter une des phases en mettant breakB à GND en rajoutent les lignes (au bon endroit):

#define brakeB 8
...
  pinMode(brakeB, OUTPUT);
  digitalWrite(brakeB, HIGH);

Le moteur devrait changer de place toutes les 2 secondes et avoir toujours du couple. Il peut aller dans un sens ou dans l'autre, cela n'a pas d'importance. Puissance consommée? 2 leds sur la carte devraient s'alterner.

Faire pareil avec l'autre enroulement en remplaçant les B par des A.

Les lignes que j'ai barrées sont fausses, suite au schéma que j'ai eu. Je ne les corrige pas sinon le fil ne serait plus compréhensible.

J'ai exactement ça :+1:
Mais pas 10W :frowning:
Je ne comprend pas non plus, Il y a deux enroulements alimentés et effectivement allumés sur le Shield en simultanée qui utilise 0.42A par enroulement d'après la doc tech = 0.86A sur 12v = 10W, pourquoi je mesure 5W comme si il divisait les 0.42A par 2
EDIT: non c'est écrit Current/phase 0.42a A+ et A- Sont la même phase ?

Oui 12v=> 12.27v mesuré au voltmètre exactement entre VIN et GND

Téléversé et j'ai toujours deux LED qui s'affiche comme cité au dessus.
5W consommé en permanence

Non, j'ai
L1 L2 L3 L4
1 0 0 0
0 1 0 0
0 1 1 1
1 0 1 1
Le moteur ne tourne pas

J'ai 10w quand je branche les deux "COM" au GND sinon jamais
Demain je vais essayé le programme accelstepper voir si le couple parait plus grand

Je suis en train de dire une bêtise.
Il faut bien n'utiliser qu'un seul enroulement

  • sur B- du shield mettre le fil bleu du moteur
  • sur B+ du shield mettre le fil blanc du moteur (commun)
  • sur A- du shield mettre le fil vert du moteur
  • sur A+ du shield mettre le fil jaune du moteur (commun)
  • fils noir er rouge non branchés.

Les lettres A et B peuvent être inversées, ainsi que pour une lettre les + et les -, les fils noir avec vert et les fils rouge et bleu. Suivant les inversions, cela inversera le sens de rotation.

[edit] Il y a un truc qui m'échappe, je me pose des questions pour une ou deux bobines [/edit]

Le couple ne dépend pas de la bibliothèque utilisée.

D'accord, j'ai lu que certains programme utilisaient le Mode Wave = 1 bobine et d'autre le Full Step = 2 bobine alimentés, on dirais que notre programme est déjà en mode 2 bobines.

Je testes tes branchements demain avec le même programme qui fonctionne bien post #32 & 41 , merci encore et bonne soirée :slight_smile:

On est effectivement en 2 bobines alimentées. En fait on pourrait travailler avec une seule bobine alimenté et avec un moteur 12V, on pourait alors l'alimenter en 12√2 V (environ 17V). On aurait la même puissance dissipée, le même échauffement et le même couple.

Désolé de t'avoir fait perdre du temps. L'intérêt du forum c'est normalement que quand l'un dit une bêtise, il y en a au moins un qui corrige.

Ba non le but est le partage d'idée qui ne sont pas toujours bonne et pas adapté mais il faut bien tester pour savoir :slight_smile:

je teste dans la journée le câblage 2 et te fait un retour
Retour du test :
Le moteur tourne / Conso = 10w cette fois si
Niveau couple, je me demande si c'est pas identique au branchement sans les COM
Je suis sensé en avoir plus ?

Ce que je vais faire cette AM, c'est installer la vis sans fin en position sur le plateau rotatif et voir si cela entraine correctement l'engrenage du plateau supérieur à vide en testant les deux cablages.
Si cela marche, je rajouterais un pack de 6 cristalline dessus = 9kg = poids du panneau

Puis 2

Merci

C'est justement! J'ai l'impression que l'on consomme deux fois plus mais que l'on doit trouver le même couple. J'ai ouvert un autre post juste sur ce point.

Heu... C'est clair comme de l'eau de roche! :rofl:

En faisant les essais j'ai le même couple! Sans les com c'est donc à priori mieux.

Bon alors ça tourne et ça pousse à vide, pas encore essayé à 9kg (Câblage 1 du Post 3)

Je dois régler un soucis car l'impression 3D à légèrement dévié et m'a créé une rotation pas parfaitement ronde qui se bloque dans la base de rotation du bout.
Il faut que je surélève l'ensemble.

Dés que j'ai résolu cela ou réimprimé la pièce, j'ajoute la charge.

  1. Retour des tests
    J'ai toujours mon soucis de rotation de ma vis qui tourne pas rond, décalage de couches d'impressions. Je relance l'impression avec des améliorations et une autre orientation pour combler ce souci.

Niveau Poids :
A vide : AR Nickel
9Kg : AR Nickel
18kg : Aller quelques ratés mais ça tourne, retour plus difficile avec des secousses du moteur
(Surement due à la mauvaise rotation de ma vis)
Il n'est pas revenue au points de départ avec ces ratés, il faut donc ajouter un contacteur en fin de course de l'engrenage au lieu d'un nombre de tour pour être sur de retrouvé toujours ma position de départ tout les matin. Un bouton poussoir devrais faire l'affaire. Reste plus qu'a trouvé et injecté le code dans mon programme.

  1. Test de déplacement du plateau contre la vis, rien ne bouge, ça c'est top.

  2. Reste à régler le soucis de la consommation pendant les "delay", consommé 5w pendant le déplacement [Normal] mais pendant qu'il fait rien c'est dommage, comment ne pas alimenter les A+B- ?
    Il faut que je re-teste avec les COM branchés, il me semble qu'a ce moment là, j'avais 0w pendant les "delay" et 10w pendant la rotation, pas grave de consommé 10w sur 1 minutes /1h que consommé 5w toute l'heure.

En principe on met toujours un fin de course quelque part. Si il y a une coupure de courant, à l'allumage, on ne peut pas savoir ou on est. On le fait même si on ne perd jamais de pas.

Si le moteur ne consomme pas c'est qu'il n'est plus sous tension. Ce que l'on peut faire logiciellement en mettant brakeA et brakeB à HIGH. Et si on veut moduler la puissance (par exemple 5W quand on est en rotation et 0,5W à l'arrêt, il suffit de mettre du PWM à 10% sur les deux brake (la broche 9 l'accepte, et on met alors la broche 8 en entrée pour avoir une haute impédance et on ponte 8 et 9).

Capture d'écran 2023-06-13 105525
Un bouton (1NO) comme ça IP67 devrait faire l'affaire.
Il faudra faire ralentir le moteur sur la fin pour ne pas l'abimer ou faire une sorte de petit triangle qui vient monter le bouton sans que ça force dessus.

Merci, comment puis je traduire cela en code ?

Code actuel

// Rotation sur une journée 15°/H sur 12h puis retour en arriére 

// Include the Stepper library:
#include <Stepper.h>

// Define number of steps per revolution:
const int stepsPerRevolution = 200;

// Give the motor control pins names:
#define pwmA 3
#define pwmB 11
#define dirA 12
#define dirB 13
#define brakeA 9 
#define brakeB 8

// Initialize the stepper library on the motor shield:
Stepper myStepper = Stepper(stepsPerRevolution, dirA, dirB);

void setup() {
  // Set the PWM and brake pins so that the direction pins can be used to control the motor:
  pinMode(pwmA, OUTPUT);
  pinMode(pwmB, OUTPUT);
  pinMode(brakeA, OUTPUT);
  pinMode(brakeB, OUTPUT);

  digitalWrite(pwmA, HIGH);
  digitalWrite(pwmB, HIGH);
  digitalWrite(brakeA, LOW);
  digitalWrite(brakeB, LOW);
  
  // Set the motor speed (RPMs):
  myStepper.setSpeed(40);
}

void loop() {
  // Début 8h 
  // Delai en Ms 1s = 1000ms 1m = 6000ms 1h = 3600000ms 12h = 4320000ms
  delay(6000);
  // Révolution 1
  myStepper.step(400);
  delay(6000);
  // Révolution 2
  myStepper.step(400);
  delay(6000);
  // Révolution 3
  myStepper.step(400);
  delay(6000);
  // Révolution 4
  myStepper.step(400);
  delay(6000);
  // Révolution 5
  myStepper.step(400);
  delay(6000);
  // Révolution 6
  myStepper.step(400);
  delay(6000);
  // Révolution 7
  myStepper.step(400);
  delay(6000);
  // Révolution 8
  myStepper.step(400);
  delay(6000);
  // Révolution 9
  myStepper.step(400);
  delay(6000);
  // Révolution 10
  myStepper.step(400);
  delay(6000);
  // Révolution 11
  myStepper.step(400);
  delay(6000);
  // Révolution 12
  myStepper.step(400);
  delay(12000);
  //Retour 
  myStepper.step(-4800);
  delay(60000);

}

Sauf que si tu as perdu des pas, où que la position est indéterminées (suite à coupure de courant) tu ne peut pas ralentir puisque tu ne sais pas où tu es... Un dispositif suffisamment élastique (support de l'interrupteur ou partie mobile qui appuie dessus) me parait nécessaire.

C'est ce que je pensait, une sorte de pente en face du bouton qui va venir appuyer progressivement peu importe la vitesse d'arrivée.

De plus, je pense que je n'ai pas d'intérêt à faire tourner le moteur trop lentement car il y aura plus d'inertie, si il intervient un petit blocage, l'inertie aidera, je me trompe ?

Comme on n'est pas en survitesse, quand on arrête d'envoyer des pas, il s'arrête immédiatement. Avec le jeu, on peut avoir un léger déplacement ce qui est accepté par tous les boutons. Il y a dans le bouton une course entre le moment ou le bouton bascule et la fin du déplacement possible. Pas d'inquiétudes.

Sans faire de fonction supplémentaire:

// Rotation sur une journée 15°/H sur 12h puis retour en arriére 

// Include the Stepper library:
#include <Stepper.h>

// Define number of steps per revolution:
const int stepsPerRevolution = 200;

// Give the motor control pins names:
#define pwmA 3
#define pwmB 11
#define dirA 12
#define dirB 13
#define brakeA 9 
#define brakeB 8

// Initialize the stepper library on the motor shield:
Stepper myStepper = Stepper(stepsPerRevolution, dirA, dirB);

void setup() {
  // Set the PWM and brake pins so that the direction pins can be used to control the motor:
  pinMode(pwmA, OUTPUT);
  pinMode(pwmB, OUTPUT);
  pinMode(brakeA, OUTPUT);
  pinMode(brakeB, OUTPUT);

  digitalWrite(pwmA, HIGH);
  digitalWrite(pwmB, HIGH);
  digitalWrite(brakeA, HIGH); // Coupure du courant dans le moteur
  digitalWrite(brakeB, HIGH);
  
  // Set the motor speed (RPMs):
  myStepper.setSpeed(40);
}

void loop() {
  // Début 8h 
  // Delai en Ms 1s = 1000ms 1m = 6000ms 1h = 3600000ms 12h = 4320000ms
  delay(6000);
  // Révolution 1
  digitalWrite(brakeA, LOW); // Remise en puissance du moteur
  digitalWrite(brakeB, LOW);
  myStepper.step(400);
  digitalWrite(brakeA, HIGH); // Coupure du courant dans le moteur
  digitalWrite(brakeB, HIGH);
  delay(6000);
  // Révolution 2
  digitalWrite(brakeA, LOW); // Remise en puissance du moteur
  digitalWrite(brakeB, LOW);
  myStepper.step(400);
  digitalWrite(brakeA, HIGH); // Coupure du courant dans le moteur
  digitalWrite(brakeB, HIGH);
  delay(6000);
  // Révolution 3
  digitalWrite(brakeA, LOW); // Remise en puissance du moteur
  digitalWrite(brakeB, LOW);
  myStepper.step(400);
  digitalWrite(brakeA, HIGH); // Coupure du courant dans le moteur
  digitalWrite(brakeB, HIGH);
  delay(6000);
  // Révolution 4
  digitalWrite(brakeA, LOW); // Remise en puissance du moteur
  digitalWrite(brakeB, LOW);
  myStepper.step(400);
  digitalWrite(brakeA, HIGH); // Coupure du courant dans le moteur
  digitalWrite(brakeB, HIGH);
  delay(6000);
  // Révolution 5
  digitalWrite(brakeA, LOW); // Remise en puissance du moteur
  digitalWrite(brakeB, LOW);
  myStepper.step(400);
  digitalWrite(brakeA, HIGH); // Coupure du courant dans le moteur
  digitalWrite(brakeB, HIGH);
  delay(6000);
  // Révolution 6
  digitalWrite(brakeA, LOW); // Remise en puissance du moteur
  digitalWrite(brakeB, LOW);
  myStepper.step(400);
  digitalWrite(brakeA, HIGH); // Coupure du courant dans le moteur
  digitalWrite(brakeB, HIGH);
  delay(6000);
  // Révolution 7
  digitalWrite(brakeA, LOW); // Remise en puissance du moteur
  digitalWrite(brakeB, LOW);
  myStepper.step(400);
  delay(6000);
  // Révolution 8
  digitalWrite(brakeA, LOW); // Remise en puissance du moteur
  digitalWrite(brakeB, LOW);
  myStepper.step(400);
  digitalWrite(brakeA, HIGH); // Coupure du courant dans le moteur
  digitalWrite(brakeB, HIGH);
  delay(6000);
  // Révolution 9
  digitalWrite(brakeA, LOW); // Remise en puissance du moteur
  digitalWrite(brakeB, LOW);
  myStepper.step(400);
  digitalWrite(brakeA, HIGH); // Coupure du courant dans le moteur
  digitalWrite(brakeB, HIGH);
  delay(6000);
  // Révolution 10
  digitalWrite(brakeA, LOW); // Remise en puissance du moteur
  digitalWrite(brakeB, LOW);
  myStepper.step(400);
  digitalWrite(brakeA, HIGH); // Coupure du courant dans le moteur
  digitalWrite(brakeB, HIGH);
  delay(6000);
  // Révolution 11
  digitalWrite(brakeA, LOW); // Remise en puissance du moteur
  digitalWrite(brakeB, LOW);
  myStepper.step(400);
  digitalWrite(brakeA, HIGH); // Coupure du courant dans le moteur
  digitalWrite(brakeB, HIGH);
  delay(6000);
  // Révolution 12
  digitalWrite(brakeA, LOW); // Remise en puissance du moteur
  digitalWrite(brakeB, LOW);
  myStepper.step(400);
  digitalWrite(brakeA, HIGH); // Coupure du courant dans le moteur
  digitalWrite(brakeB, HIGH);
  delay(12000);
  //Retour 
  digitalWrite(brakeA, LOW); // Remise en puissance du moteur
  digitalWrite(brakeB, LOW);
  myStepper.step(-4800);
  digitalWrite(brakeA, HIGH); // Coupure du courant dans le moteur
  digitalWrite(brakeB, HIGH);
  delay(60000);
}

Maintenant comme on a des ordres semblables et répétitif, on (peut) doit faire soit une boucle pour les premiers mouvement qui sont identiques genre:

void loop() {
  // Début 8h 
  // Delai en Ms 1s = 1000ms 1m = 6000ms 1h = 3600000ms 12h = 4320000ms
  delay(6000);

  // Révolutions
  for (revolution=1; revolution <=12; revolution++) {
    digitalWrite(brakeA, LOW); // Remise en puissance du moteur
    digitalWrite(brakeB, LOW);
    myStepper.step(400);
    digitalWrite(brakeA, HIGH); // Coupure du courant dans le moteur
    digitalWrite(brakeB, HIGH);
    delay(6000);
  }


  delay(6000); // Avec les 6000 précédents cela fait 12000
  //Retour 
  digitalWrite(brakeA, LOW); // Remise en puissance du moteur
  digitalWrite(brakeB, LOW);
  myStepper.step(-4800);
  digitalWrite(brakeA, HIGH); // Coupure du courant dans le moteur
  digitalWrite(brakeB, HIGH);
  delay(60000);
}

soit une fonction et éventuellement une boucle, genre:

void uneRevolution(word step, uint32_t temps) {
    digitalWrite(brakeA, LOW); // Remise en puissance du moteur
    digitalWrite(brakeB, LOW);
    myStepper.step(step);
    digitalWrite(brakeA, HIGH); // Coupure du courant dans le moteur
    digitalWrite(brakeB, HIGH);
    delay(temps);

void loop() {
  // Début 8h 
  // Delai en Ms 1s = 1000ms 1m = 6000ms 1h = 3600000ms 12h = 4320000ms
  delay(6000);

  // Révolutions
  for (revolution=1; revolution <=12; revolution++) uneRevolution(400, 6000);


  delay(6000); // Avec les 6000 précédents cela fait 12000
  //Retour 
  uneRevolution(-4800, 60000);
}

Merci pour ton aide :slight_smile:

Programme 1
Fonctionne dans IDE, je l'envois dans arduino pour voir

Programme 2
Compilation error: 'revolution' was not declared in this scope
Programme 3
Compilation error: 'revolution' was not declared in this scope

Oups
for (byte revolution=1; revolution <=12; revolution++) uneRevolution(400, 6000);
     ^---------- rajouter!

// Rotation sur une journée 15°/H sur 12h puis retour en arriére 

// Include the Stepper library:
#include <Stepper.h>

// Define number of steps per revolution:
const int stepsPerRevolution = 200;

// Give the motor control pins names:
#define pwmA 3
#define pwmB 11
#define dirA 12
#define dirB 13
#define brakeA 9 
#define brakeB 8

// Initialize the stepper library on the motor shield:
Stepper myStepper = Stepper(stepsPerRevolution, dirA, dirB);

void setup() {
  // Set the PWM and brake pins so that the direction pins can be used to control the motor:
  pinMode(pwmA, OUTPUT);
  pinMode(pwmB, OUTPUT);
  pinMode(brakeA, OUTPUT);
  pinMode(brakeB, OUTPUT);

  digitalWrite(pwmA, HIGH);
  digitalWrite(pwmB, HIGH);
  digitalWrite(brakeA, LOW);
  digitalWrite(brakeB, LOW);
  
  // Set the motor speed (RPMs):
  myStepper.setSpeed(40);
}

void loop() {
  // Début 8h 
  // Delai en Ms 1s = 1000ms 1m = 6000ms 1h = 3600000ms 12h = 4320000ms
  delay(6000);

  // Révolutions
  for (byte revolution=1; revolution <=12; revolution++) uneRevolution(400, 6000);


  delay(6000); // Avec les 6000 précédents cela fait 12000
  //Retour 
  uneRevolution(-4800, 60000);
}

J'ai toujours ces erreurs

C:\Users\diabl\Desktop\sketch_jun13\sketch_jun13.ino: In function 'void loop()':
C:\Users\diabl\Desktop\sketch_jun13\sketch_jun13.ino:42:58: error: 'uneRevolution' was not declared in this scope
   for (byte revolution=1; revolution <=12; revolution++) uneRevolution(400, 6000);
                                                          ^~~~~~~~~~~~~
C:\Users\diabl\Desktop\sketch_jun13\sketch_jun13.ino:42:58: note: suggested alternative: 'revolution'
   for (byte revolution=1; revolution <=12; revolution++) uneRevolution(400, 6000);
                                                          ^~~~~~~~~~~~~
                                                          revolution
C:\Users\diabl\Desktop\sketch_jun13\sketch_jun13.ino:47:3: error: 'uneRevolution' was not declared in this scope
   uneRevolution(-4800, 60000);
   ^~~~~~~~~~~~~
C:\Users\diabl\Desktop\sketch_jun13\sketch_jun13.ino:47:3: note: suggested alternative: 'stepsPerRevolution'
   uneRevolution(-4800, 60000);
   ^~~~~~~~~~~~~
   stepsPerRevolution

exit status 1

Compilation error: 'uneRevolution' was not declared in this scope

Pour le programme 1, il fonctionne parfaitement.
J'ai remarqué qu'au lieu des A+ B- d'allumer niveau LED maintenant c'est A+A-
La prise m'affiche 2w de conso dans les "delay", Il faudrait que j'allonge les délais pour en être sur.
Il n'y a a pas moyen d'en alimenter aucune pendant les "Delay" ?

il manque la fonction, a mettre avant loop ou après:

void uneRevolution(word step, uint32_t temps) {
    digitalWrite(brakeA, LOW); // Remise en puissance du moteur
    digitalWrite(brakeB, LOW);
    myStepper.step(step);
    digitalWrite(brakeA, HIGH); // Coupure du courant dans le moteur
    digitalWrite(brakeB, HIGH);
    delay(temps);


// Rotation sur une journée 15°/H sur 12h puis retour en arriére 

// Include the Stepper library:
#include <Stepper.h>

// Define number of steps per revolution:
const int stepsPerRevolution = 200;

// Give the motor control pins names:
#define pwmA 3
#define pwmB 11
#define dirA 12
#define dirB 13
#define brakeA 9 
#define brakeB 8

// Initialize the stepper library on the motor shield:
Stepper myStepper = Stepper(stepsPerRevolution, dirA, dirB);

void setup() {
  // Set the PWM and brake pins so that the direction pins can be used to control the motor:
  pinMode(pwmA, OUTPUT);
  pinMode(pwmB, OUTPUT);
  pinMode(brakeA, OUTPUT);
  pinMode(brakeB, OUTPUT);

  digitalWrite(pwmA, HIGH);
  digitalWrite(pwmB, HIGH);
  digitalWrite(brakeA, LOW);
  digitalWrite(brakeB, LOW);
  
  // Set the motor speed (RPMs):
  myStepper.setSpeed(40);
}
void uneRevolution(word step, uint32_t temps) {
  digitalWrite(brakeA, LOW); // Remise en puissance du moteur
  digitalWrite(brakeB, LOW);
  myStepper.step(step);
  digitalWrite(brakeA, HIGH); // Coupure du courant dans le moteur
  digitalWrite(brakeB, HIGH);
  delay(temps);
}
void loop() {
  // Début 8h 
  // Delai en Ms 1s = 1000ms 1m = 6000ms 1h = 3600000ms 12h = 4320000ms
  delay(6000);

  // Révolutions
  for (byte revolution=1; revolution <=12; revolution++) uneRevolution(400, 6000);


  delay(6000); // Avec les 6000 précédents cela fait 12000
  //Retour 
  uneRevolution(-4800, 60000);
}

Ce programme marche maintenant