Séquence d'arrêt moteur pas à pas

Bonjour à vous, je suis tout nouveau dans ce forum et dans le monde magique de l'Arduino.
J'ai pour projet la réalisation d'un scanner de film 8mm, pratiquement tout est en place, j'ai suivi de nombreux tutoriel sur internet et bouquins pour bien comprendre la machine, mais voila que je bloque sur une chose.

Je voudrais savoir si vous pouvez me dire ce que je demande est possible ou non !

Je souhaite contrôler un moteur pas à pas Nema17 connecter à une Shield L298N, j'arrive à le faire tourner sans problème, changer la vitesse etc...

Mais ce que je voudrais c'est par exemple que le moteur avance pendant une seconde et s'arrête aussi pendant 1 seconde et cela à l'infini, pour qu'a chaque arrêt ma camera puisse faire une capture du film qui est placé devant elle et je n'est rien trouver sur cet fonction sur internet ou livre, du coup je me demande si cela est possible ou pas ?

j'utilise pour le moment ce simple code pour apprendre un peu mieux le fonctionnement des moteurs

#include <Stepper.h>

const int stepsPerRevolution = 200;  // change this to fit the number of steps per revolution
// 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() {
  // initialize the serial port:
  Serial.begin(9600);
}

void loop() {
  // step one step:
  myStepper.step(1);
  Serial.print("steps:");
  Serial.println(stepCount);
  stepCount++;
  delay(500);
}

nicotech70D:
Bonjour à vous, je suis tout nouveau dans ce forum et dans le monde magique de l'Arduino.
Mais ce que je voudrais c'est par exemple que le moteur avance pendant une seconde et s'arrête aussi pendant 1 seconde et cela à l'infini, pour qu'a chaque arrêt ma camera puisse faire une capture du film qui est placé devant elle et je n'est rien trouver sur cet fonction sur internet ou livre, du coup je me demande si cela est possible ou pas ?

c'est tout à fait possible :slight_smile:

Regardez plutôt la librairie Arduino AccelStepper library car elle donne pas mal de contrôle sur les moteurs.

Merci beaucoup pour votre réponse c'est exactement ce que je chercher, je vais voir ça de ce pas.
Soit c'est moi qui me fais vieux et j'ai beaucoup de mal mais je trouve qu'il est difficile de trouver des (dictionnaire de commande) pour l'arduino qui explique tel ou tel commande.
Car faut trier de nombreux site ou vidéo qui montre des projets ou autres sans explication.

Merci pour votre aide précieuse

ce serait faisable aussi avec la librairie de base, juste que l'autre est plus adaptée pour gérer tout finement

Bonsoir nicotech70D

nicotech70D:
Mais ce que je voudrais c'est par exemple que le moteur avance pendant une seconde et s'arrête aussi pendant 1 seconde et cela à l'infini, pour qu'a chaque arrêt ma camera puisse faire une capture du film qui est placé devant elle et je n'est rien trouver sur cet fonction sur internet ou livre, du coup je me demande si cela est possible ou pas ?

Oui, c'est possible, la bonne bibliothèque, comme indiqué par @J-M-L est AccelStepper un autre site en parle bien.

Pour ce qui est de ton objectif, tourner une seconde, les librairies n'ont, à ma connaissance, pas d'option de temps, c'est pas la fonction des moteurs pas à pas (MPA) qui est de compter des pas (vérité de La Palice :wink: ).
Par contre, avec le nombre de pas par tour de ton MPAP (Nema17 = 200) et la vitesse demandée:

mystepper.setSpeed(stepsPerSecond); (pour la bibliothèque AccelStepper)

Je te laisse cogiter et suis à ta disposition pour toute autre question.

Cordialement
jpbbricole

Tout à fait en ligne avec JP. vous allez définir la vitesse du moteur et le lancer. par exemple avec ce code votre moteur tournera à vitesse constante

#include <AccelStepper.h>
AccelStepper stepper; // Defaults to 4 pins on 2, 3, 4, 5
void setup()
{  
   stepper.setSpeed(50);	
}

void loop()
{  
   stepper.runSpeed();
}

runSpeed() doit être appelé fréquemment et s'occuper pour vous de faire un pas si c'est le bon moment. il faut donc l'appeler souvent.

si vous voulez ensuite introduite le temps, il faudra utiliser millis() et quand ce sera la bon moment appeler stop()

Pour bien débuter avec l'arduino, un bon point de départ c'est de lire les tutos d'eskimon. Il y a notamment l'article sur Introduire le temps qui vous sera utile ainsi que pour bien comprendre les moteurs c'est bien aussi de lire Le mouvement grâce aux moteurs.

Merci à vous tous de l'attention que vous me porter, je vois que effectivement il y a énormément de choses à apprendre et cela me fait plaisir, je vais regarder tous ça si je le temps ce weekend

bien cordialement à vous et encore merci, habituellement je n'aime pas faire de post mais je reconnais que j'étais perdu donc encore merci à vous.

Si j'ai peut être une petite question, habituellement le moteur est branché sur les PINS 8,9,10 et 11.
Je vois qu'avec AccelStepper cela va de 2 à 4.

Question toute bête surement pour vous, peut on changer directement le numéro des PINS sur le script ou c'est vraiment définis par AccelStepper ?

Je pose la question car comme je suis très curieux et je me connais j'aime bien bidouiller et je me dis souvent c'est en fesant des erreurs que l'on apprend mais j'ai pas envie non plus de cramer ma carte ou le moteur.

J'ai un petit peu regarder et il est vrais que Accel est vraiment complet par rapport à la librairie de base.

Quand vous instanciez votre moteur (créez un objet pour le piloter) si vous ne passez aucun paramètre voilà ceux qui seront retenus

AccelStepper::AccelStepper ( uint8_t interface = AccelStepper::FULL4WIRE,
uint8_t pin1 = 2,
uint8_t pin2 = 3,
uint8_t pin3 = 4,
uint8_t pin4 = 5,
bool enable = true 
)

on voit donc en effet que par défaut c'est 2 à 5 pour les 4 fils. mais vous pouvez passer dans le constructeur vos Nos de pins personnalisés

La doc explique:

Constructor. You can have multiple simultaneous steppers, all moving at different speeds and accelerations, provided you call their run() functions at frequent enough intervals. Current Position is set to 0, target position is set to 0. MaxSpeed and Acceleration default to 1.0. The motor pins will be initialised to OUTPUT mode during the constructor by a call to enableOutputs().

Parameters

  • interface Number of pins to interface to. Integer values are supported, but it is preferred to use the MotorInterfaceType symbolic names. AccelStepper::DRIVER (1) means a stepper driver (with Step and Direction pins). If an enable line is also needed, call setEnablePin() after construction. You may also invert the pins using setPinsInverted(). AccelStepper::FULL2WIRE (2) means a 2 wire stepper (2 pins required). AccelStepper::FULL3WIRE ( 3 ) means a 3 wire stepper, such as HDD spindle (3 pins required). AccelStepper::FULL4WIRE ( 4 ) means a 4 wire stepper (4 pins required). AccelStepper::HALF3WIRE ( 6 ) means a 3 wire half stepper, such as HDD spindle (3 pins required) AccelStepper::HALF4WIRE ( 8 ) means a 4 wire half stepper (4 pins required) Defaults to AccelStepper::FULL4WIRE ( 4 ) pins.
  • pin1 Arduino digital pin number for motor pin 1. Defaults to pin 2. For a AccelStepper::DRIVER (interface==1), this is the Step input to the driver. Low to high transition means to step)
  • pin2 Arduino digital pin number for motor pin 2. Defaults to pin 3. For a AccelStepper::DRIVER (interface==1), this is the Direction input the driver. High means forward.
  • pin3 Arduino digital pin number for motor pin 3. Defaults to pin 4.
  • pin4 Arduino digital pin number for motor pin 4. Defaults to pin 5.
  • enable If this is true (the default), enableOutputs() will be called to enable the output pins at construction time.

Clair et précis je vous remercie, je vais bien tout regarder et comprendre chaque fonction.
Merci à vous tous cela fait du bien de voir qu'il y a encore de l'entraide dans ce monde ^^

Bonjour
Je me demande si ce n’est parfois pas plus simple de faire un peu de programmation, plutôt que d’utiliser une librairie et d’aller fouiner sous son capot ? Exemple avec cette version allégée de démo.
Le moniteur série peu suffire, mais c’est plus parlant avec un moteur.
Mais un joystick, ou un potentiomètre monté en diviseur de tension, est indispensable, plus une connexion polarisée (au moins) avec un interrupteur poussoir sur le plus.
Il y a trois sections, une pour le servo moteur, deux pour le moteur pas à pas, pp 28byj-48 avec ULN2003A , le poussoir sert à changer de section.

Pin 8 à 11 : moteur pas à pas, dans l’ordre.
Pin 13 : poussoir (joystick)
Pin A0 : joystick.
Pin 7 : servo moteur.

//démo servo mot et mot pas à pas unipolaire
//commande par joystick, 2048pas /360°
int x,xx,m,mm,t;
int vmpp=3; //v motpp max à 3, chenillard si >30
byte p,pp;
void setup() {
pinMode(8,OUTPUT);//mot pp
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
 pinMode(7,OUTPUT);//servo mot
 pinMode(13,INPUT);//inter joystick
 // data joystick sur A0
Serial.begin(9600);
}
void loop() {
  x=900;
  t=200;
while (digitalRead(13)<1){
// servo mot, inv mot pp/servo si inter +
mm= map(x, 0, 1023, -90,90);//ratio V/angle
if (mm!=xx){ 
m= map(x, 0, 1023, 500, 2400);//ratio V/t impuls, 1500 +- 1000
digitalWrite(7, 1); //debut impuls
delayMicroseconds (m);
digitalWrite(7, 0);
delay (t); // pause entre impuls, ms
t=200; // mini 20 
Serial.print(mm);//angle
Serial.println("° ");
xx=mm; //limita impul
}
x= analogRead(A0); //capt joystick
}

m=12; // n de pas initial
  while (digitalRead(13)<1){
  //moteur pp en ajustement
      for (int t=0;t<abs(m);t=t+1){ 
pp=(pp+1)%4; //compt phases,4
if(m<0)p=3-pp; //inv sens
else p=pp;   
digitalWrite(8+p,1); // pin 8 à 11
delay(vmpp); //t impuls par pas, mini 3
digitalWrite(8+p,0);
Serial.println(8+p); // affich phase/pin actif  
      }
Serial.print(m);
Serial.print(" pas pour ");
Serial.print(m*0.176); 
Serial.println("°");
x=analogRead(A0);//capt joystick
m= map(x, 0, 1024, -1000,1000)+16;//plage V/pas +correction
delay (1000);
  }
  
  x=6; //pour tab à 0, colonne-1
while (digitalRead(13)<1){
//moteur pp programé
int tm[2][7]={
1024,-512,532,-30,10,-1054,30,
3,20,10,200,400,3,100};  // tab tours, vitesse
x=(x+1)%7; // param tab (7
if (x==0) xx=0;//prépa affich
m=tm [0][x];
      for (int t=0;t<abs(m);t=t+1){ 
pp=(pp+1)%4; //compt phases,4
if(m<0)p=3-pp; //inv sens
else p=pp;
digitalWrite(8+p,1); // pin 8 à 11
delay(tm[1][x]); //t impuls par pas
digitalWrite(8+p,0);
      }
xx=xx+m; //compt affich
Serial.print("position (miroir pour négatifs) : ");
Serial.print(xx*0.176); // position en °, 2048pas/360°
Serial.println(" °");
}
}
//par Pacien

Je souhaite contrôler un moteur pas à pas Nema17 connecter à une Shield L298N

Perso, je trouve aujourd'hui, que c'est une mauvaise idée, vu les tests que j'ai fait sur un Nema17 (c'est pas forcément le même, il y en a un paquet):

Le mien doit s'alimenter en 1.33A, ce qui fait que si je fais un arrêt sur image, la tension sur mes enroulements est de l'ordre de 2,8V. Il y a longtemps, j'avais alimenté un Nema17 sur le 5V et je trouvais que cela chauffait beaucoup. Les 2.8V est une bonne explication.

Je viens de faire tourner le mien en mode 1/16 pas. J'ai fais des essais de vitesse, et je me rends compte que je n'ai entre 2 pas que 26µs, et je trouve cela un peu juste pour faire le calcul du pas suivant si je veux faire une accélération (pour le calcul de la vitesse il faut extraire une racine carrée qui dure en double 28µs). Je suis repassé en mode pas, pour voir (16 foi plus de temps pour faire le calcul), et cela fait un bruit d'enfer, alors que c'est calme en 1/16 pas. Que ce soit à pleine vitesse ou à vitesse réduite, c'est pareil.

Avec un circuit spécialisé (A4988 pour les petites puissance, mais il en existe d'autres), pour établir le courant dans les enroulements (inductance des moteurs élevée) le circuit met la tension d'alimentation, plein pot, puis quand le courant est atteint, hache pour maintenir le courant de consigne. Pratiquement en tournant, doubler la tension permet de doubler la vitesse maximale avec le même couple. Je suppose qu'à vitesse constante, on peut avoir plus de couple.

Le seul défaut que j'ai vu, c'est que du fait du hachage, on a une petite musique y compris à l'arrêt. Mais on n'a pas les a coups bruyants.

Interrogations pratique sur le pas à pas :

Sans charge, je suppose qu’un moteur pas à pas est capable de s’ arrêter au dernier pas actif. Mais avec la vitesse et l’inertie d’une charge est-ce qu’il y a un moyen de connaître, autre que le calcul, la limite où une rampe (linéaire ou pas) devient indispensable à la précision, ou est-ce qu’une augmentation de la puissance moteur suffit ? Dans l’industrie est-ce qu’on fait des cycles pour vérifier la dérive de position ?
Cordialement