Go Down

Topic: Débutant qui galère avec 2steps, 2servos, et 4 potentiomètre  (Read 734 times) previous topic - next topic

proautobot

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. :)

      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:

 
Code: [Select]
#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.



   





J-M-L

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

Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

68tjs

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.

ChPr

... -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
Pourquoi faire simple alors qu'il est si facile de faire compliqué !

proautobot

   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: http://eskimon.fr/290-arduino-603-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.

ChPr

... 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
Pourquoi faire simple alors qu'il est si facile de faire compliqué !

68tjs

Quote
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.

ZigZag

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}.

ChPr

... 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.

... 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

Pourquoi faire simple alors qu'il est si facile de faire compliqué !

ZigZag

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

ChPr

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
Pourquoi faire simple alors qu'il est si facile de faire compliqué !

ChPr

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
Pourquoi faire simple alors qu'il est si facile de faire compliqué !

ZigZag

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.


proautobot

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.
Code: [Select]
#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 ?...

J-M-L

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

Sinon:
Code: [Select]
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

Quote
-2 interfaces pour step motor 2PH64011A (avec ULN2003APG)
vous avez un lien vers ce truc? vous l'avez acheté où?
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

Go Up