Débutant qui galère avec 2steps, 2servos, et 4 potentiomètre

Bonjour,

Je suis nouveau, j'utilise Arduino depuis peu. J'en est fait mon seul loisir tellement je veux faire plain de chose. Seulement voila j'ai suivi un Tuto d'initiation avec une soif d'apprendre mais un estomac trop petit pour digérer. trêve de présentation. :slight_smile:

Voici mon projet; je souhaite réaliser un mini bras robotique, avec deux servo-moteurs et deux moteurs pas à pas. Ceci dans le but d'apprendre à maîtriser ces deux type de moteurs. J'ai donc réaliser une tourelle 360° et le premier bras, avec les steps-moteurs. Les autres bras avec deux servo-moteurs. L'ensemble permet de manipuler un crayon en guise d’effecteur.

la liste de materiel:
-2 step motor 28BYJ-48 5v DC
-2 interfaces pour step motor 2PH64011A (avec ULN2003APG)
-2 servo-moteurs SG90
-Une planche à pain ( breadbord, ça me fait toujours rire de la traduire en français)
-Une alimentation pour planche à pain 545043 YwRobot cavalier en position 5 volts
-2 potentiomètres
-une analogue
-du plastique, du bois des vis des outils de bricoleur.
-Et j'allais oublier une carte arduino UNO R3

-Ci-joint un plan (pour ne pas dire schéma)

-mon programme:

#include <Stepper.h> //bibliothèque pour moteur pas à pas 
#include <Servo.h>   //bibliothèque pour Servo moteur 

//outil map = "map(valeur,min,max,transformation Min,transformation Max);"

Stepper moteur1(100, 9, 11, 10, 12);
Stepper moteur2(100, 5, 7, 6, 8);

int pinServo1 = 4;
int lecturePotar1 = 0;
int valeurPotar1 = 0;
int pinServo2 = 3;
int lecturePotar2 = 0;
int valeurPotar2 = 0;
Servo leServo1;
Servo leServo2;

int valeurPotentiometre1;
int valeurPotentiometre2;

int valeurAnalog1;
int valeurAnalog2;

int nombreDePas1;
int nombreDePas2;

int nombreDePasPrecedent1;
int nombreDePasPrecedent2;

void setup()
{
  moteur1.setSpeed(280);
  moteur2.setSpeed(280);

  leServo1.attach(pinServo1);
  leServo2.attach(pinServo2);
}

void loop()
{
//////////////////step motor/////////////////////
  valeurPotentiometre1 = analogRead(A2);
  valeurPotentiometre2 = analogRead(A3);

  nombreDePas1 = map(valeurPotentiometre1, 0, 1023, 0, 2047);
  nombreDePas2 = map(valeurPotentiometre2, 0, 1023, 0, 2047);

  moteur1.step(nombreDePas1 - nombreDePasPrecedent1); //nombre de pas exécuté ( 2048 pour faire un tour complet )
  moteur2.step(nombreDePas2 - nombreDePasPrecedent2);

  nombreDePasPrecedent1 = nombreDePas1;
  nombreDePasPrecedent2 = nombreDePas2;

//////////////////Servo-motor/////////////////////

  valeurAnalog1 = analogRead(A4);
  valeurAnalog2 = analogRead(A5);
 
  valeurPotar1 = map(valeurAnalog1, 0, 1023, 0, 170); //mapping pour obtenir 170° ( 179° max ! )
  leServo1.write(valeurPotar1);
 
  valeurPotar2 = map(valeurAnalog2, 0, 1023, 0, 170);
  leServo2.write(valeurPotar2);

}

Pendant 30 seconde je peux faire mumuse, tout vas bien, seulement voila tout s'emballe, les servo et les steps ne répondent plus de rien, il y un brouhaha d'engrenage qui bug, je stop tout, je recommence et rebelote.

Pas sûr que 280 RPM soit raisonnable pour ces moteurs - essayez avec 15 plutôt

Essayez avec la AccelStepper library for Arduino et passez en demi pas

Il existe un super tuto, celui d'Eskimon, dont tu trouvera un lien pour y accéder dans le message épinglé de bienvenue que tu as du lire (enfin j'espère ains que les deux autres).

Commence par appliquer les exemples fournis et tu verra que ce sera plus facile.

Dernier point : une chose nouvelle à la fois, tu essaye "un truc", quand il fonctionne tu essaye un autre.
Quand tout fonctionne séparément tu assemble.

proautobot:
... -2 step motor 28BYJ-48 5v DC
-2 interfaces pour step motor 2PH64011A (avec ULN2003APG) ...

Il y a quelques jours, j'ai acheté la même chose que ci-dessus pour m'amuser.

Après quelques déboires où les moteurs refusaient de tourner (câblage phases inversé), j'ai finalement constaté (pour ce qui me concerne) que le produit "Nombre de pas par tour x Vitesse en t/mn" ne devait pas dépasser 27000. Cette limite étant assez susceptible à la tension d'alimentation.

Dans votre cas, votre produit vaut 100 x 280 = 28000. Même si cela fonctionne, je pense que par prudence, il est judicieux de rester au moins 20 % en-deça de cette limite.

Cordialement.

Pierre

D'accord merci pour vos réponses, en effet j'ai lu les règles avant de poster. J’espérais d’ailleurs les respecter.

Quand j'ai vu que tout partait en (.....). J'ai testé les servos séparément et ils fonctionnent correctement, mise à par que je les trouve un peu brusque.

C'est de ce tuto: Redirection vers A petits pas, le moteur pas-à-pas dont vous me perlez ? il me faudrait en effet plutôt un tuto avec accelstepper.h. La bibliothèque semble plus complexe mais peut répondre à mes contraintes. Notamment pouvoir contrôler les moteurs pas à pas en même temps, et non un par un comme dans stepper.h.

J'ai vue qu'il ne fallait pas dépasser les 300 tr/min, en effet à cette vitesse le moteur décroche et ne tourne plus. pour comparer l'incomparable, les servos sont beaucoup plus réactifs, j'ai besoin de cette vitesse . Au faite pourquoi vous dite que cette limite est sensible à la tension d'alimentation.

Sur ceux, je poursuis donc mes recherches vers Accelstepper.h.

cordialement.

proautobot:
... Au fait pourquoi vous dites que cette limite est sensible à la tension d'alimentation. ...

Parce que le couple disponible est grosso modo proportionnel à la tension d'alimentation.

Cordialement.

Pierre

J'ai vue qu'il ne fallait pas dépasser les 300 tr/min, en effet à cette vitesse le moteur décroche et ne tourne plus. pour comparer l'incomparable, les servos sont beaucoup plus réactifs,

Les moteurs de ce que tu appelles des "steppers" sont des moteurs pas à pas.
Les moteurs des servo-moteur, sont des moteurs à courant continu classiques.

C'est parfaitement normal que deux moteurs de technologie différente se comportent différament.

Bonjour,

Je ne vois pas de rapport entre nb pas par tour X vitesse et le couple.

Ni couple et tension d'alim.

Je pense plutôt que nb pas par tour X vitesse donne une Info sur la fréquence de calcul, et que au delà d'une certaine fréquence le micro sature, il ne sait pas traiter tous les pas/secondes attendus à savoir (vitesse en tours par mn X nb pas par tour / 60)

Quand au couple.
1/ moteurs à vide, non mécaniquement reliés à une charge mécanique, le couple est minimum.

2/ en charge, le couple résistant influe sur la puissance consommée, qui elle même est fonction de la puissance utile de l'alim c'est à dire U, mais aussi et surtout I utile {P = UI}.

ZigZag:
... Je pense plutôt que nb pas par tour X vitesse donne une Info sur la fréquence de calcul, et que au delà d'une certaine fréquence le micro sature, il ne sait pas traiter tous les pas/secondes attendus à savoir (vitesse en tours par mn X nb pas par tour / 60) ...

Les essais que j'ai faits avec le moteur 28BYJ- 48 montrent qu'à la vitesse max que l'on peut atteindre, la fréquence des signaux délivrés par l'Arduino est de l'ordre de 150 Hz ; autant dire que l'Arduino en a encore largement sous le pied. Ce n'est pas lui qui limite la vitesse du moteur.

ZigZag:
... Ni couple et tension d'alim. ...

Dans un moteur, le déplacement angulaire A est proportionnel au couple C électromagnétique appliqué et inversement proportionnel au moment d'inertie J du rotor et de la charge. : A = 1/2 x C/J x t². J'oublie volonairement la charge qui va encore limiter la vitesse max.

Pour faire un pas, il faut donc un temps t = (2 x A x J / C)1/2

Le couple est proportionnel au courant, c'est-à-dire au rapport de la tension d'alimentation U par la résistance R des bobinages (passée la constant de temps électrique), soit C = k x U / R.

Au final, pour faire un pas il faut un temps t = (2 x A x J x k x R / U)1/2

On voit donc que plus U sera faible, plus le temps pour parcourir un pas sera long. Si le pas n'est pas atteint alors que la commande impose le pas suivant; le moteur va décrocher.

Cordialement.

Pierre

ChPr:
Le couple est proportionnel au courant, c'est-à-dire au rapport de la tension d'alimentation U par la résistance R des bobinages (passée la constant de temps électrique), soit C = k x U / R.

Et la force électromotrice dite E avec U (tension d'alim des bobinage) = E - RI, sans force électromotrice, il n'y a pas de motricité
Ainsi que le lien entre E x I = Couple (N/m) x A (rad/s) = Watts

Tout est bouclé de toute façon entre U et I

Vous avez raison, j'ai oublié la force contre-électromotrice. Mais de toutes façons, ça ne changera rien, le courant n'en sera que plus faible.

Cordialement.

Pierre

Je viens de faire un essai avec ce moteur couplé à un ULN2003.

  • Avec une alim de 5.08 V, j'arrive au maximum à 20 t/mn

  • Avec un alim de 4.05 V (batterie en direct), je monte au maximum à 16.7 t/mn

Cela fait un rapport 0.835 en vitesse pour un rapport de 0.797 en tension.

Selon mes calculs, je devrais être en racine carrée des tensions, c'est-à-dire à 0.893. Je n'y suis même pas.

Maintenant, si je compte la tension de saturation des transistors de l'ULN2003 à 1 V, le rapport de tension est alors (4.05-1) / (5.08-1) = 0.747 dont la racine vaut 0.865, on se rapproche du rapport de vitesse trouvées.

Cordialement.

Pierre

Courant, Tension, qui est la poule, qui est l'oeuf?

S'il n'y a pas de tension, il n'y a pas de courant c'est vrai, mais s'il n'y a pas de courant, il n'y a pas de vitesse.

C'est le principe même de l'electromagnétisme je crois.

C'est la tension qui crée le courant, et le courant (sous l'effet du flux magnétique) qui crée la vitesse, mais pas de tension, on est OK, pas de vitesse car pas de courant.

J'ai encore jamais vu un moteur tourner tout seul seulement sous la force du flux magnétique, il faut un courant même petit dans une boucle (ou un bobinage, ou une phase) pour que le champ magnétique fasse tourner celle-ci.

Donc si U - E (fcem) = RI = 0 (c'est à dire si U = E alors I = 0 et le moteur ne tourne plus, idem pour U < E) on est d'accord, mais est-ce du à U ou à I ?

Mais aprés c'est clair, plus on baisse U, plus le moteur risque de décrocher, le reste, la poule ou l'oeuf, c'est presque de la philosophie.

Bonjour,

j'ai modifié mon code, c'est légèrement mieux. j'ai rajouté des délais supprimé les servos moteurs pour éviter de m'y perdre et éviter le brouhaha d'engrenage en cas de bug.

#include <Stepper.h> //bibliothèque pour moteur pas à pas 

Stepper moteur1(100, 9, 11, 10, 12);
int valeurPotentiometre1;
int nombreDePas1;
int nombreDePasPrecedent1;

Stepper moteur2(100, 5, 7, 6, 8);
int valeurPotentiometre2;
int nombreDePas2;
int nombreDePasPrecedent2;

void setup()
{
  moteur1.setSpeed(280);

  moteur2.setSpeed(280);

}

void loop()
{
  valeurPotentiometre1 = analogRead(A2);
  moteur1.step( valeurPotentiometre1 - nombreDePasPrecedent1); //nombre de pas exécuté ( 2048 pour faire un tour complet )
  nombreDePasPrecedent1 =  valeurPotentiometre1;
  delay(30); // pour éviter le bruit de fax 

   valeurPotentiometre2 = analogRead(A3);
  moteur2.step( valeurPotentiometre2 - nombreDePasPrecedent2); //nombre de pas exécuté ( 2048 pour faire un tour complet )
  nombreDePasPrecedent2 =  valeurPotentiometre2;
  delay(30); // pour éviter le bruit de fax 

}

Résultat:
-J'ai toujours des sautés, à 0° rien, mais plus je m'en éloigne plus ca "bug" même sans rien toucher j'ai l'impression que mon moteur tente de communiquer en morse. et ça perturbe l'autre stepper.
-J'ai aussi remarqué que je ne faisais pas un tour complet de 360° mais 300°, sans doute un problème au niveau du mapping,
-Bientôt un essai avec accelstepper.h vous savez ou je peux trouver ça ?...

-Bientôt un essai avec accelstepper.h vous savez ou je peux trouver ça ?...

ici :slight_smile:

Sinon:

Stepper moteur1(100, 9, 11, 10, 12);

à mon avis votre 28BYJ-48 n'a pas 100 ticks (pas) par tour... essayez plutôt avec 64 ou 48 ou carrément 2048 ou 4096 mais 100 c'est louche

-2 interfaces pour step motor 2PH64011A (avec ULN2003APG)

vous avez un lien vers ce truc? vous l'avez acheté où?

Bonjour,

Je m'invite dans votre débat car je me demande si on a pensé à surveiller la tension d'alimentation (5V DC) quand le système "perd les pédales"

C'est à dire : l'alimentation continue est-elle toujours capable de fournir l'intensité sans que la tension s'écroule. (mettre un multimètre aux bornes pour surveiller)

Serge .D

J-M-L:
... à mon avis votre 28BYJ-48 n'a pas 100 ticks (pas) par tour... essayez plutôt avec 64 ou 48 ou carrément 2048 ou 4096 mais 100 c'est louche

Les essais que j'ai faits sur ce moteur, avec l'instruction "step(1), montrent que le nombre de pas est "2048" pour un tour de l'axe sortant.

Dans ces conditions, la vitesse max que j'ai pu obtenir sous 5 V est de 20 t/mn (setSpeed(20)) soit un tour en 3 secondes.

Cordialement.

Pierre

J-M-L:
ici :slight_smile:

Sinon:

Stepper moteur1(100, 9, 11, 10, 12);

à mon avis votre 28BYJ-48 n'a pas 100 ticks (pas) par tour... essayez plutôt avec 64 ou 48 ou carrément 2048 ou 4096 mais 100 c'est louche

vous avez un lien vers ce truc? vous l'avez acheté où?

-Sympa la blague, j'avais déjà les liens en violets. je pensais à un tuto vf , mais ainsi je vais travailler mon anglais. et puis j'ai tout de même trouvé ceci: https://openclassrooms.com/forum/sujet/arduino-programmation-d-un-moteur-pas-a-pas . c'est pas pour le même type de moteur mais je comprend mieux le sense d' accelstepper.h .

-J'ai trouvé un Tuto Tutoriels pour Arduino • Afficher le sujet - Moteur pas à pas unipolaire + driver ULN2003 + Arduino avec le même moteur utilisant 100...j'ai mal compris son origine alors je l'ai laissé. Erreur de débutant.

-J'ai 48 pas avec un réducteur 1/64 j'ai donc 48*64 , soit 3072 position angulaire. Si j'ordonne à mon moteur 48 pas ( la roue crantée) , je ne fait donc pas un tour complet mais seulement 48/64 soit 0,75 tour. Et d'ou il viennent les 2048 ? tout est confus

Mais merci, je vous envois mes résultats très prochainement.

Bon week-end.

proautobot:
... -J'ai 48 pas avec un réducteur 1/64 j'ai donc 48*64 , soit 3072 position angulaire. Si j'ordonne à mon moteur 48 pas ( la roue crantée) , je ne fait donc pas un tour complet mais seulement 48/64 soit 0,75 tour. Et d'ou il viennent les 2048 ? tout est confus ...

Comme je vous l'ai dit, ce moteur (28BYJ-48) comporte 2048 pas au niveau de l'axe de sortie. Comme nous n'avons pas accès à l'arbre moteur, il est impossible de dire comment se situe la répartition entre le moteur et le réducteur et de toutes façons, peu importe puisqu'on a seulement accès à l'axe de sortie.

Si vous commandez le moteur en demi-pas, vous en aurez 4096.

Cordialement.

Pierre

Bonsoir:

En regardant la doc du moteur, il s'avére que non, il n'a pas 48 pas au niveau du moteur, mais

"Stride Angle 5.625° /64" des pas de 5,625° avant reduction.
Soit 360/5,625=64 pas (electrique si on peut appeler cela ainsi).

Ensuite il y a un "moto-reducteur" qui fait une réduction de la vitesse de 1/64, ce qui veut dire que l'axe primaire fait 64 tours quand l'axe secondaire en fait 1.

Et comme l'axe primaire fait 64 pas, il faut pour faire 1 tour d'axe secondaire 64x64=4096 pas.

Voici un lien INSTRUCTIF ICI

Qui dit, en anglais, desolé:

"But ...

You must take something in consider :

This Motor has a Gear ratio of 64 , and Stride Angle 5.625° so this motor has a 4096 Steps ."