Moteur 6 fils, Stepper et motor shield (L298)

D'accord donc engrenage hélicoïdale, pas de soucis

Désolé, je n'avais pas vue le lien sur le téléphone

Le positionnement d'un panneau solaire n'exige pas un positionnement au °.
Il suffit que tu ais un fin de course pour te donner la position 0°. Ensuite tu détermines combien de pas moteur tu dois faire toutes les heures (ou toutes les ½ heure) par exemple pour couvrir la course du soleil. A la nuit tombée, tu fais un retour en arrière jusqu'à retrouver le fin de course, ce qui t'assure que tu pars toujours du même point même si par hasard le panneau s'était décalé pour une raison quelconque..

Oui c'est l'idée que j'en ai :slight_smile:

Quand tu dis fin de course, tu parle d'un contacteur , ou d'une fin de course mécanique donc je ne connais pas l'existence ?

Vue que je vais devoir dessiner la vis sans fin + roues
La roue interne mesure un dia 400mm pour être le plus loin du centre ne sera qu'un demi cercle ou 200°

Si je me souvient bien mes cours, plus j'exerce la force de rotation loin du centre, moins j'ai besoin de force ?

Il faut que je revois toute ma hauteur de plateau (8mm actuellement d'espace), maintenant, il me faut au moins la hauteur du corps du moteur 56.4mm ou déporter le moteur sur le coté avec une longue tige sur la quel je fixe ma vis sans fin
=>Je préfère que le moteur soit protéger de l'eau.
D'ailleurs, j'ai remarqué que le moteur n'avais pas de plat sur sa tige, c'est qui est embêtant pour vis une vis sans tête pour se maintenir sur l'axe solidement

Je pense à quelque chose comme ça, par exemple, manœuvré par une came solidaire de la roues dentée:
image
Mais ça pourrait aussi être un ILS (aussi appelé contact REED) sur le support avec un aimant solidaire de la roue dentée. Ce qui présente une meilleure tenue aux intempéries.

Juste au passage : 360/24 = 15.
Le soleil tourne de 15° par heure pas 10.

Je vais prévoir ça par la suite mais oui retour du moteur jusqu'au contact = arrêt et retour programme

Capture d'écran 2023-06-05 163257

Exacte, 15° mais je m'en serait rendus compte dans mes essais :slight_smile:
Sur une plage horaire dés 8h (pour que le soleil soit assez haut car le panneau sera quasi horizontal en été) jusqu'à 20h soit 12h = 180 degré pile
Le soir retour de 180 dégrée et le tour est joué :slight_smile: :+1:

On a bien avancé aujourd'hui, grâce à vous, Merci beaucoup
Je vais m'atteler à dessiner tout ça en 3D pour surélever mon support.

Niveau programmation, quelqu'un à une idée de quoi faire avec mon unipolaire réduit en bipolaire ?

Voila un début d'ébauche pour la vis et poulie

Si j'ai bien compris ce lien, ma vis va pouvoir être entrainé la roue, ce que je ne veux pas.
Il faut que je diminue l'angle sur ma phot entre 6 et 10°
Plus il est bas, plus la résistance est forte je suppose

Merci

Bonjour à tous
Le pojet avance bien :

  • Le support est fini
  • Les impressions 3D sont faites
  • Le code stepper fonctionne parfaitement pour ce que je veux faire.

Coder avec le Stepper.h

/* Example sketch to control a stepper motor with Arduino Motor Shield Rev3, Arduino UNO and Stepper.h library. More info: https://www.makerguides.com */

// 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 brakeA 9
#define brakeB 8
#define dirA 12
#define dirB 13

// 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(60);
}


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);

}

  1. J'ai testé de mettre ma main pour bloquer un peu le moteur et honnêtement, je m'attendait à beaucoup plus de couple que ça. Dés que je pose la main, le moteur saccade.
    Actuellement, il est certes en bipolaire, blanc et jaune non relié comme le disais @ vileroi > post #3
    Je voudrais tester la technique 2 mais que doit je modifier sur mon code ?

  2. Mon moteur est toujours alimenté avec Stepper.h à cause des breake Pin 8 et 9 (Faible de 2w certes) mais vue l'utilité de blocage de la vis sans fin, je voudrais enlever cette fonction.
    Le code rejette que je supprime Brake du code mais je pense pouvoir le mettre sur des pin non inutilisé ? 6 et 7 par exemple

  3. Sachant que le moteur ne tourne pas en permanence grâce à la vis sans fin, j'ai rebranché les com sur le GND, la puissance absorbé est de 10w donc je suppose que mon couple est le double de quand j'ai 5w

Merci

Comme le câblage a complètement changé, pour que l'on puisse comprendre, il faut redonner le câblage actuel.
Si on utilise un pont, il faut qu'il y ait des fils de moteurs en l'air. Si des fils sont branchées sur GND, quand un des enroulement est alimenté, l'autre est en court-circuit et comme il partagent le même champ magnétique une partie de l'énergie est perdue. Et donc pour le point3) j'ai tendance à dire qu'en branchant les deux GND, cela augmente la puissance absorbée et diminue le couple. Ce qui répond aussi à la question 1. Le couple est faible parce que les GND sont branchés sur le moteur.
C'est quoi la technique N°2?

En supprimant les 6 lignes?

Pour moi:
~ avec le L298 qui équipe me motor shield arduino on ne peut pas gérer un pas à pas unipolaire.
~ le moteur 1805283 peut être utilisé en unipolaire (on utilise les 6 fils) ou en bipolaire (première bobine qui utilise jaune/noire ou jaune/vert, l'autre qui utilise blanc/rouge ou blanc/bleu, et donc deux fils non connectés.
~ le L298 est très intéressant car c'est un des rares pont qui permet de débrancher le moteur ou de diminuer sa puissance.

Pour utiliser Stepper, je pense qu'il faut utiliser
Stepper myStepper = Stepper(stepsPerRevolution, dirA, brakeA, dirB, brakeB);
En tout cas
Stepper myStepper = Stepper(stepsPerRevolution, dirA, dirB);
ne peut pas fonctionner. Cela explique le manque de couple.

je ne sais pas d'où vient ce dir et brake. Pour le circuit, cela s'appelle in0 et in1 qui représente les tensions qu'il faut mettre sur les fils du moteur. pwm devrait s'appeler enable. Si on met brake fixe (par exemple à LOW, une phase est alimentée une fois sur deux. du coup il y a des moments ou le moteur n'est pas alimenté du tout. Et en mettant le doigt, cela fait revenir le moteur en arrière. On a alors un fonctionnement un pas en avant un pas en arrière, et cela ressemble à un manque de couple. A vide, le passage d'un pas au suivant va continuer la rotation dans le même sens par inertie quand le moteur n'est pas alimenté.

Quand on a un problème avec un moteur, il faut mettre une vitesse de 1 pas par seconde. Ainsi on se rend compte de ce qui ne va pas. Avec cette vitesse, tu devrais avoir parfois du couple et une seconde sur 4 rien du tout.


Le titre n'est pas du tout représentatif de la discussion. Si je n'avais pas été cité, je n'aurais pas ouvert ce post, n'étant pas spécialiste des connexions arduino-pc. Le titre peut s'éditer dans le premier post. "moteur 6 fils, Stepper et motor shield (L298)" serait par exemple plus représentatif

Désolé, J'ai modifié le titre pour que les personnes intéressés puisse nous rejoindre :slight_smile:

Pour le câblage, j'ai essayé sans le GND branché au Jaune / blanc (5W consommé), puis j'ai essayé le câblage d'origine comme annoncé dans la doc technique. (10W consommé)

Technique 2 :

Mon but est d'avoir le couple le plus grand possible, j'ai peur qu'avec le poids du support, du panneau et dees frottements de la vis sans fin, cela n'arrive pas à pousser l'ensemble.
Ta technique 2 aiderais peut être.

Du coup avec toutes ses explications certes clair, je m'y perd un peu.
Que dois je modifié dans mon code en branchant le câblage technique 2 pour avoir le maximum de couple ?

Seconde problème, la partie Brake

Effectivement, je n'avais supprimé que les 2 premières lignes qui parle de "Brake"
J'ai tout supprimé, vérifié et téléversé, malgré cela, les PIN A+ et B- restent allumé pendant delay, les Brake sont toujours actifs ?
J'ai une consommation de 5W lors de ces delay,
j'ai 2w lorsque le moteur tourne, c'est bizarre qu'il consomme si peu ?
Quand j'essaye de déplacer le moteur en mode delay, c'est effectivement plus difficile que de l'arrêter quand il tourne.

Voici mon programme avec mes 4 fils branché, hors jaune et blanc

/* 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

// 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);
  digitalWrite(pwmA, HIGH);
  digitalWrite(pwmB, HIGH);

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

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);

}

Je n'ai pas la doc (ou pas ta doc) du shield. Mais les noms dir, brake et pwm proviennent de l'utilisation d'un moteur à courant continu Avec 2 moteurs possibles A et B. Pour un moteur CC, si on veut faire varier la vitesse, il faut faire varier la tension moyenne. Ce n'est pas le cas des pas à pas. Il faut donc renommer les broches pour y comprendre un peu plus.

pwm Cette broche s'appelle enable sur le L298. Si on les met à HIGH, le pont délivre la tension demandée. A LOW, les transistors sont tous bloqués. C'est un peu comme si le pont était débranché. Pour notre pas à pas, on laisse à HIGH si on veut le couple maximal, On met à LOW pour ne plus alimenter le moteur et on peut mettre du PWM pour diminuer le couple. Diminuer le couple a un intérêt si on n'a pas besoin du couple maximum, car le moteur chauffera moins (10°C en moins c'est le doubler sa durée de vie). Mais pour que cela fonctionne il faut mettre la fréquence du PWM au moins deux fois plus élevée que la fréquence des pas. Avec le PWM par défaut des Arduinos, ce n'est pas possible, mais la solution existe.
dir permet de mettre HIGH ou LOW d'un côté de la bobine
brake permet de mettre HIGH ou LOW de l'autre côté de la bobine. Le coup du frein (brake), c'est uniquement quand on a des moteurs à courant continu!

Conclusion: pour que cela fonctionne, il faut comme tu l'as fait mettre les pwm à HIGH. si on veut plus tard diminuer la puissance, on y mettra le bon signal.
Mais il faut absolument utiliser dir et brake pour alimenter un enroulement. Et il faut que l'un soit à HIGH et l'autre à LOW ou le contraire. C'est ce que fait Stepper si on définit le moteur avec les 4 paramètres.

Pour la vitesse, setSpeed() n'accepte qu'un entier. 1 est le mieux que l'on puisse faire, mais cela fait pour les tests une vitesse de 1tr/mn. Si on veut pouvoir aller à 1 pas/s soit 1tr/200s soit environ 1tr/3mn ou 0.3RPM, on utilise alors l'astuce de dire que le moteur n'a que 60 pas par tour. Comme cela on aura 60 pas/mn.

Le programme doit être:
j'ai rajouté les lignes brake, changé la définition de myStepper, et passé le nombre de pas à 60, et remplacé le /* par // en début de programme

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

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

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

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

// Initialize the stepper library on the motor shield:
Stepper myStepper = Stepper(stepsPerRevolution, dirA, brakeA, dirB, brakeB); //   <--------- MODIFIE

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);
  digitalWrite(pwmA, HIGH);
  digitalWrite(pwmB, HIGH);

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

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);

}

Pour passer du câblage 2 bobines en série (jaune et blanc non connectés) au montage avec une seule bobine (noir er rouge non branchés), le code est le même. Mais je crois que je disais des bêtises habitué aux moteurs alimentés en courant et pas en tension comme ici. Si on alimente une bobine en 12V, on aura un courant I. Si on alimente les deux enroulements, le courant sera de moitié, mais le nombre de spires sera double. On a alors le même couple, et un échauffement moindre. Le montage avec les deux bobines est meilleur.

Voici la doc

Je regarderais le programme ce soir en détails et essayerais de l'injecter.

J'avais remis 1pas/min suite à ton message au dessus mais tu m'étais 1/seconde soit effectivement 60pas/min comme j'avais à la base.

Je laisse donc mon câblage comme il est ? Hors jaune et blanc câblé.
Ou j'ai mal compris ?

Merci pour votre aide précieuse :slight_smile:

Ça, c'est la doc du moteur.

Pour le shield, je suppose que c'est celui-ci.

Au départ c'était pas 60 pas/mn mais 60 tours/mn (RPM=rotate per minute), cela fait 200 fois plus. 0 1 pas/s on voit si tous les pas sont présents, si cela v toujours dans le même sens...

Oui

Merci, ça aide un peu, mais cela ne vaut pas un bon schéma.

A la lecture de la doc, je pense que je me suis trompé pour les broches. Il faut mettre
Brake à HIGH en permanence (ce doit être Enable) et les broches qui commute le pont doivent être DIR et PWM. Les lignes qui sont à modifier sont donc:

#define brakeA 9
#define brakeB 8
Stepper myStepper = Stepper(stepsPerRevolution, dirA, pwmA, dirB, pwmB);

et il faut remplacer

  pinMode(pwmA, OUTPUT);
  pinMode(pwmB, OUTPUT);
  digitalWrite(pwmA, HIGH);
  digitalWrite(pwmB, HIGH);

par

  pinMode(brakeA, OUTPUT);
  pinMode(brakeB, OUTPUT);
  digitalWrite(brakeA, HIGH);
  digitalWrite(brakeB, HIGH);

Et pour la vitesse de 1 pas/s soir 0,005 RPM:

const int stepsPerRevolution = 60;
myStepper.setSpeed(1);

Le schéma est dans le bas de la page.

Je viens de le voir aussi. Merci. DONC, c'est pas cela, il y a un ou exclusif non prévu qui s'est invité.
Il faut bien mettre break à LOW ou le laisser en l'air, il y a une pull-down, c'est lui qui permet d'avoir de la tension, et pwm à HIGH si on veut le couple maximum. Et on commande le moteur par 2 pins seulement (dir). Le code du post 32 est donc bon.

Passe quand même la vitesse à 1 pas/s pour vérifier que on a du couple tout le temps et que toutes les secondes, me moteur progresse.

C'est anormal. En plus à cette vitesse, le couple doit être à peu près le même qu'en rotation.

Une phase du moteur a une tension de 12V pour un courant de 0,42A. Elle doit consommer 5W. et avec les deux phases, on devrait être à 10W qu'il tourne ou qu'il soit arrêté. On dirait qu'il y a un enroulement qui n'est pas alimenté. Mais même dans ce cas, on devrait avoir 5W en permanence. Ce qui se passe à 1pas/s devrait nous en dire plus.

Si tu as la possibilité de faire le testeur suivant:
image
et de regarder quand le moteur tourne très lentement (c'est pour cela qu'un pas/s est impec)
les led quand les deux connexions sont branchées sur une bobine du moteur:
entre noir et vert
entre rouge et bleu
jaune et blanc en l'air

On doit voir alternance les leds s'allumer. On peut mettre des led de la même couleur c'est pareil. On peut aussi utiliser un voltmètre qui devrait indiquer +12V alterné avec -12V, mais le temps de réaction est plus grand. Au cas ou diminuer encore la vitesse (const int stepsPerRevolution = 30;)
Attention le stepsPerRevolution doit être multiple de 4

Tout à fait.

Il n'y a pas de principe différent entre un moteur "classique à collecteur et balais" et une génératrice "classique à collecteur et balais".

Quand un moteur n'est plus alimenté, il continue à tourner sur son inertie mécanique.
Il se comporte en génératrice qui transforme l'énergie mécanique en énergie électrique.

Si on court-circuite la sortie d'une génératrice, la demande en énergie électrique est très grande et la génératrice "se vide" de son énergie mécanique : d'où l'action de freinage.

Merci pour toutes vos réponses

  myStepper.setSpeed(1);
  1. Je confirme que le moteur avance d'un pas toute les secondes, les LED de couleur sur le Shield avance bien l'une à la suite.
  2. La consommation est de 5w
  3. En allongeant "delay", le moteur à l'arrêt consomme 5w aussi. Il faudrait pouvoir supprimer cela, mon but n'est pas d'avoir une conso de 5w en permanence mais que quand le moteur tourne (toutes les heures).
  4. je n'ai jamais vue 10w dans ce test à 1pas/s

5/

Je n'ai pas de LED à la maison mais sur le shield, il y en a qui s'allume dés qu'il ya une commande dessus je suppose.

Dans tes informations du post #36, dois je ajouter des choses à mon programme ? comme tu a barrer des infos ensuite, j'ai un doute.

Le programme du Post 33 ne fonctionne pas bien, il avance d'un puis deux sur place puis 1 et ça tourne que sur 2 led du shield
Merci