LOCODUINO

Parlons Arduino => Débuter => Discussion démarrée par: papytrain le septembre 27, 2019, 05:32:40 pm

Titre: Piloter un moteur pas à pas
Posté par: papytrain le septembre 27, 2019, 05:32:40 pm
Bonjour à tous

J'ai le projet de construire un pont tournant piloté par un arduino. Ce pont n'aura qu'une entrée sortie, donc il faudrait qu'il tourne de 180° à chaque appui sur un bouton poussoir.

Le matériel à ma disposition

1 carte Arduino
1 moteur nem17, bipolaire 200 pas
1 driver tb6600

Le soucis est que je suis complètement largué avec la programmation Arduino, malgré la lecture et relecture sur les moteurs pas à pas.

Voici le câblage que j'ai réalisé d'après un schéma trouvé sur le web

@+

Titre: Re : Piloter un moteur pas à pas
Posté par: msport le septembre 27, 2019, 09:15:26 pm
Bonsoir,
avez-vous testé le code de la page où vous avez trouvé votre schéma ?
https://wiki.dfrobot.com/TB6600_Stepper_Motor_Driver_SKU__DRI0043

7, 6, 5 sont les n° des broches de l'Arduino comme il apparait sur le schéma.
le fil rouge est au +5V.
Si votre moteur est bien un 200 pas, il correspond au programme avec un angle de 1,8° / pas.

Ce code fait faire alternativement 32 tours dans un sens puis 32 dans l'autre sens.
En modifiant le nombre de pas dans chaque sens à 100, comme ci-dessous, il fera des 1/2 tours :

Il vous reste à mettre un bouton entre GND et la pin 4 en INPUT_PULLUP, à tester sa valeur et alternativement sur chaque appui à lancer le forward et le backward.

Pensez à choisir votre alimentation pour la tension du moteur.


int PUL=7; //define Pulse pin
int DIR=6; //define Direction pin
int ENA=5; //define Enable Pin
void setup() {
  pinMode (PUL, OUTPUT);
  pinMode (DIR, OUTPUT);
  pinMode (ENA, OUTPUT);

}

void loop() {
  for (int i=0; i<100; i++)    //Forward 100 steps
  {
    digitalWrite(DIR,LOW);
    digitalWrite(ENA,HIGH);
    digitalWrite(PUL,HIGH);
    delayMicroseconds(50);
    digitalWrite(PUL,LOW);
    delayMicroseconds(50);
  }
  for (int i=0; i<100; i++)   //Backward 100 steps
  {
    digitalWrite(DIR,HIGH);
    digitalWrite(ENA,HIGH);
    digitalWrite(PUL,HIGH);
    delayMicroseconds(50);
    digitalWrite(PUL,LOW);
    delayMicroseconds(50);
  }
}
Titre: Re : Piloter un moteur pas à pas
Posté par: papytrain le septembre 28, 2019, 12:11:24 am
Bonsoir

Merci pour votre réponse.

Dans un premier temps j'ai fait un essai avec le programme donné sur votre lien. C'est ok, il tourne un certain nombre de tours dans un sens et idem dans l'autre sens. Je n'ai pas compté mais il fait plusieurs tours.

J'ai refait avec les valeurs que vous m'avez donné, il fait de même mais avec une vitesse lente. J'aurais voulu qu'il s'arrête à un demi-tour. Par contre pour la vitesse ce serait bon pour mon pont tournant.

Je pense qu'il faut ajouter du code..

@+
Titre: Re : Piloter un moteur pas à pas
Posté par: msport le septembre 28, 2019, 09:50:43 am
Curieux que le nombre de pas (6400) change la vitesse ...
Testez ceci (sans garantie), la commande est en mettant la broche 4 au GND
int PUL=7; //define Pulse pin
int DIR=6; //define Direction pin
int ENA=5; //define Enable Pin
int RUN=4; //define appui Pin
int appui=0; // sur le bouton
int sens=0; // sens 0, 1

void setup() {
  pinMode (PUL, OUTPUT);
  pinMode (DIR, OUTPUT);
  pinMode (ENA, OUTPUT);
  pinMode (RUN, INPUT_PULLUP);
}

void loop() {
  appui = digitalRead (RUN);
  if (appui == 0) {
    if (sens == 0) {
      aller();
    }
    else {
      retour();
    }
  }
}

void aller(){
  for (int i=0; i<100; i++)    //Forward 100 steps
  {
    digitalWrite(DIR,LOW);
    digitalWrite(ENA,HIGH);
    digitalWrite(PUL,HIGH);
    delayMicroseconds(50);
    digitalWrite(PUL,LOW);
    delayMicroseconds(50); 
  }
  sens = 1;
}

void retour(){
  for (int i=0; i<100; i++)   //Backward 100 steps
  {
    digitalWrite(DIR,HIGH);
    digitalWrite(ENA,HIGH);
    digitalWrite(PUL,HIGH);
    delayMicroseconds(50);
    digitalWrite(PUL,LOW);
    delayMicroseconds(50);
  }   
  sens = 0;
}
Titre: Re : Piloter un moteur pas à pas
Posté par: papytrain le septembre 28, 2019, 10:22:33 am
Vu votre réponse, une chose m'interpelle et j'aurais dû le signaler au 1er post, désolé.

Il y a 6 inters dip sur le driver avec un tableau pour la configuration. Je pense que le résultat obtenu d'après votre 1er codage vient de là.
Voir les photos jointes

@+
Titre: Re : Piloter un moteur pas à pas
Posté par: msport le septembre 28, 2019, 12:37:34 pm
Le sens du ON (flèche) me semble inversé, vérifiez sur la notice, 200 pas par tour est standard.
Ce qui voudrait dire que le courant du driver est réglé sur 2,8A. Vérifiez sur votre moteur si cela convient.
Avez vous adapté la tension à votre moteur ?

Mon premier code est, sauf erreur, exactement celui de l'exemple, sauf le nombre de pas décrit par le moteur : 100 au lieu de 6400 soit 1/2 tour au lieu de 32 tours.
Je ne vois pas ce qui aurait pu changer la vitesse avec l'exemple.
Le deuxième est la copie du 1er mais complété par un bouton qui lance une 1/2 rotation en sens inverse à chaque appui.
Ce code n'est bien sur pas testé.
Titre: Re : Piloter un moteur pas à pas
Posté par: papytrain le septembre 28, 2019, 01:48:41 pm
Le moteur a un courant de 1,7 A en nominal

Pour le régler à 200 pas, il faut que je mette s1 s2 sur on et s3 sur off si j'ai bien compris d'après le tableau?
Titre: Re : Piloter un moteur pas à pas
Posté par: msport le septembre 28, 2019, 04:09:32 pm
S1 s2 sur on et s3 sur off SI le ON sur le switch n'est pas inversé par rapport au montage lui-même. Il y a une notice ?
Et le site dit : Up: OFF; Down: "ON" = haut : OFF; bas : ON, or la flèche pour ON est en bas !

Si le site dit vrai, il faut mettre S4 haut, S5 haut, S6 bas et garder S1 S2 et S3

Et surtout si avec 100 pas, le moteur fait un demi-tour avec S1 S2 et S3 comme sur la photo.

Pour diminuer la vitesse de rotation, il suffit d'ajouter un delay entre chaque pas.
Titre: Re : Piloter un moteur pas à pas
Posté par: papytrain le septembre 28, 2019, 05:19:34 pm
Désolé, j'abandonne. Tout ça est trop compliqué pour moi. J'ai essayé de toutes les façons, ça ne marche pas. Je pense que tout vient de ce driver
@+
Titre: Re : Piloter un moteur pas à pas
Posté par: papytrain le septembre 28, 2019, 11:37:20 pm
Après réflexion, je pense que je n'ai pas le bon matériel. J'ai acheté ça sans réfléchir...D'ailleurs j'ai tout renvoyé à Amazon.

D'où ma question:

Que me conseillez-vous comme moteur pas à pas et quel driver faut'il?  ( Références )

@+
Titre: Re : Piloter un moteur pas à pas
Posté par: msport le septembre 29, 2019, 12:31:22 pm
L'article est fait pour vous :

http://locoduino.org/spip.php?article196#forum4022

Titre: Re : Piloter un moteur pas à pas
Posté par: papytrain le septembre 29, 2019, 01:27:50 pm
Merci, super!

J'ai passé commande

@+
Titre: Re : Piloter un moteur pas à pas
Posté par: papytrain le octobre 01, 2019, 06:52:06 pm
Hello

Impeccable, ça marche super avec le code indiqué sur la doc.

Maintenant que faut'il modifier pour un pas de 180° à chaque impulsion sur un bouton poussoir?

@+
Titre: Re : Piloter un moteur pas à pas
Posté par: msport le octobre 01, 2019, 06:54:32 pm
J'ai l'impression d'avoir joint un code à un précédent message pour cela.
Titre: Re : Piloter un moteur pas à pas
Posté par: papytrain le octobre 01, 2019, 11:51:04 pm
Le code sue vous m'aviez donné correspondait au driver microstep et les branchements sont différents par rapport au code sur l'article de Locoduino
Titre: Re : Piloter un moteur pas à pas
Posté par: msport le octobre 02, 2019, 11:21:09 am
Version 28BYJ-48 et bouton sur D4.
Titre: Re : Piloter un moteur pas à pas
Posté par: papytrain le octobre 02, 2019, 05:25:51 pm
J'ai laissé tombé le programme Locoduino pour le moment.

J'ai chargé le code qui est sur la doc livrée avec le moteur et le driver

#include <HCSR04.h>

#include <Stepper.h>

const int stepsPerRevolution=200;

//for your motor
// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
int stepCount=0; // number of steps the motor has taken

void setup(){
  // nothing to do inside the setup
 
}

void loop() {
  // read the sensor value:
  int sensorReading=analogRead(A0);
  // map it to a range from 0 to 100:
  int motorspeed = map(sensorReading, 0, 1023, 0, 100);
  // set the motor speed:
  if (motorSpeed > 0){
    myStepper.setSpeed(motorSpeed);
    // step 1/100 of a revolution:
    myStepper.step(stepsPerRevolution / 100;
  }
}

J'ai un message d'erreur sur cette ligne

if (motorSpeed > 0){
"motorSpeed"was not declared in this scope
Titre: Re : Piloter un moteur pas à pas
Posté par: Tony04 le octobre 02, 2019, 05:41:44 pm
Bonjour papytrain,
une variable est sensible à la casse, il faut donc garder les minuscules et majuscules à leur place.
on déclare motorspeed en minuscule puis plus loin on utilise motorSpeed avec un S majuscule ce qui n'est plus la même variable.
Cordialement
Antoine
Titre: Re : Piloter un moteur pas à pas
Posté par: msport le octobre 02, 2019, 06:25:57 pm
Et il manque la parenthèse ) :

myStepper.step(stepsPerRevolution / 100;

myStepper.step(stepsPerRevolution / 100);


Et apparemment, le nombre de pas/tour du code (200) ne correspond pas au nombre de pas/tour du moteur de l'article (4096).
Est-ce bien le même ?
Titre: Re : Piloter un moteur pas à pas
Posté par: papytrain le octobre 02, 2019, 06:32:25 pm
Merci à vous, c'est sympa.

Maintenant j'ai 2 programmes, super!

Je ferai les essais dans quelques jours car je dois m'absenter.

@+
Titre: Re : Piloter un moteur pas à pas
Posté par: msport le octobre 02, 2019, 06:47:58 pm
Avec un moteur 200 pas par tour, pour une plaque tournante de 300 mm de diamètre, soit environ un mètre de circonférence, chaque pas correspond à 1000 mm / 200 = 5 mm, c'est pas génial comme positionnement. Avec 4096 pas, on est a ~ 0,25 mm, c'est beaucoup mieux.
Titre: Re : Piloter un moteur pas à pas
Posté par: papytrain le octobre 02, 2019, 06:58:28 pm
En effet. Ma plaque tournante aura un diamètre de 190mm.
Cette plaque se situera sur le niveau + 1 de mon réseau. J'ai déjà une plaque sur le réseau principale qui est une Roco. Je ne voulais pas réinvestir dans une 2ième plaque, vu le prix.
Cette mini plaque du niveau 1 sera faite en impression 3d.
Titre: Re : Piloter un moteur pas à pas
Posté par: papytrain le octobre 02, 2019, 11:46:19 pm
Je n'ai pas pu attendre, le programme Locoduino est au top. Encore merci!

Pour l'autre petit programme je le testerai plus tard

@+
Titre: Re : Piloter un moteur pas à pas
Posté par: papytrain le juillet 08, 2020, 05:57:14 pm
Bonjour à tous
Je reviens sur ce sujet, car des soucis. Mon niveau 1 est prêt et après essai d'une loco ce n'est pas le top.
Le pont ne réagit pas pareil à vide qu'avec une loco. Je rappelle la procédure, un appui sur un bouton poussoir et rotation de 180° dans un sens. Un second appui et 180° dans l'autre sens.
Quelle modif faut'il faire dans le programme afin de supprimer l'automatisme de 180° et de faire la rotation manuellement lors de l'appui sur le bouton poussoir.
Le programme est stepper1 ( voir plus haut des messages ) et c'était Msport qui me l'a concocté.
En vous remerciant.
Papy
Titre: Re : Piloter un moteur pas à pas
Posté par: msport le juillet 08, 2020, 06:46:35 pm
Version 2 : deux boutons : bouton sur 4, un sens, bouton sur 5, sens inverse. Par impulsion. Compile mais non testé.
Titre: Re : Piloter un moteur pas à pas
Posté par: papytrain le juillet 08, 2020, 07:03:04 pm
Est-ce que ce serait possible de faire qu'avec 1 bouton ( que je n'aie pas à tout démonter en me couchant sous le réseau ) Peu importe du sens.
@+
Titre: Re : Piloter un moteur pas à pas
Posté par: msport le juillet 08, 2020, 07:29:36 pm
Le deuxième bouton n'est pas indispensable ...
Titre: Re : Piloter un moteur pas à pas
Posté par: papytrain le juillet 09, 2020, 04:30:30 pm
Bonjour
Merci
C'est ok.   ;)