Problème avec la librairie Stepper

Salut !
Je travaille sur la motorisation d'une monture équatoriale, et je suis entrain de faire quelques test =)
Le problème c'est qu'avec un code incluant aucun librairie, tout marche très bien par exemple :

#define IN1  1
#define IN2  2
#define IN3  3
#define IN4  4
int Steps = 0;
int Direction = 0;
int number_steps=512;//= 2048/4
void setup()
{
Serial.begin(9600);
pinMode(IN1, OUTPUT); 
pinMode(IN2, OUTPUT); 
pinMode(IN3, OUTPUT); 
pinMode(IN4, OUTPUT); 
// delay(1000);
}
void loop()
{
stepper(number_steps);
delay(1000);
stepper(-number_steps);
delay(1000);
for(int thisStep=0;thisStep<number_steps;thisStep++){
  stepper(1);
}
delay(1000);
for(int thisStep=number_steps;thisStep>0;thisStep--){
  stepper(-1);
}
delay(1000);
}
void stepper(double nbStep){
if(nbStep>=0){
    Direction=1;
}else{
    Direction=0;
    nbStep=-nbStep;
}
for (int x=0;x<nbStep*8;x++){
  switch(Steps){
     case 0:
       digitalWrite(IN1, LOW); 
       digitalWrite(IN2, LOW);
       digitalWrite(IN3, LOW);
       digitalWrite(IN4, HIGH);
     break; 
     case 1:
       digitalWrite(IN1, LOW); 
       digitalWrite(IN2, LOW);
       digitalWrite(IN3, HIGH);
       digitalWrite(IN4, HIGH);
     break; 
     case 2:
       digitalWrite(IN1, LOW); 
       digitalWrite(IN2, LOW);
       digitalWrite(IN3, HIGH);
       digitalWrite(IN4, LOW);
     break; 
     case 3:
       digitalWrite(IN1, LOW); 
       digitalWrite(IN2, HIGH);
       digitalWrite(IN3, HIGH);
       digitalWrite(IN4, LOW);
     break; 
     case 4:
       digitalWrite(IN1, LOW); 
       digitalWrite(IN2, HIGH);
       digitalWrite(IN3, LOW);
       digitalWrite(IN4, LOW);
     break; 
     case 5:
       digitalWrite(IN1, HIGH); 
       digitalWrite(IN2, HIGH);
       digitalWrite(IN3, LOW);
       digitalWrite(IN4, LOW);
     break; 
       case 6:
       digitalWrite(IN1, HIGH); 
       digitalWrite(IN2, LOW);
       digitalWrite(IN3, LOW);
       digitalWrite(IN4, LOW);
     break; 
     case 7:
       digitalWrite(IN1, HIGH); 
       digitalWrite(IN2, LOW);
       digitalWrite(IN3, LOW);
       digitalWrite(IN4, HIGH);
     break; 
     default:
       digitalWrite(IN1, LOW); 
       digitalWrite(IN2, LOW);
       digitalWrite(IN3, LOW);
       digitalWrite(IN4, LOW);
     break; 
  }
delayMicroseconds(1000);
if(Direction==1){ Steps++;}
if(Direction==0){ Steps--; }
if(Steps>7){Steps=0;}
if(Steps<0){Steps=7; }
} 
}

Mais avec un code incluant une librairie le moteur vibre, ne tourne pas et se met à chauffer...

Je vous donne quand même le code :

#include <Stepper.h> 
double stepsPerRevolution = 2048;
Stepper myStepper(stepsPerRevolution, 1, 2, 3, 4);  // Pin inversion to make the library work
void setup() { 
myStepper.setSpeed(10);  
Serial.begin(9600); 
} 
[code]

void loop() {

Serial.println("counterclockwise");
myStepper.step(stepsPerRevolution);
delay(1000);
}
[/code]

Merci beaucoup !!

Il me semble que Stepper myStepper(stepsPerRevolution, 1, 2, 3, 4); indique qu'une phase est sur les pins 1 et 2 et l'autre sur 3 et 4.
D'après le programme je vois une phase sur 1 et 3, et la deuxième esur 2 et 4.

Essaie Stepper myStepper(stepsPerRevolution, 1, 3, 2, 4); ou une autre combinaison.

Si l'ordre des phase n'est pas bon, le moteur n'avance pas.

Si le moteur chauffe, c'est normal car il est mis sous tension. A l'arrêt il chauffe bien, et plus il va vite moins il chauffe. Normalement si on est à la tension nominale, il peut aller jusqu'à 100°C à l'intérieur, ce qui fait 60°C à l'extérieur.

Profite-en pour lire les règles du forum Bien editer son post pour les nuls

Salut !
Merci beaucoup le moteur tourne maintenant mais hier soir comme j'étais un peu bloqué j'ai cherché d'autres librairies et j'ai fais la découverte de la librairie accelstepper. Elle est intéressante elle permet par exemple d'arrêter le moteur "en douceur". Si jamais quelqu'un connais des petits trucs pour cette librairie je suis preneur :slight_smile:

J'ai modifié mon message merci (;

Je connais AccelStepper, et c'est pour cela que j'ai écrit QuickStep car avec accelStepper on ne peut tourner qu'à 1000 pas/s et que l'on est obligé de mettre une fonction run(). Dans la version 2 de Quickstep on pourra piloter plusieurs moteurs avec un seul timer (sortie prévue dans moins d'un mois) et en prévision une bibliothèque multitâche (pas encore de date).

Super projet mais je pense pas en avoir l'utilité car mon objectif me fait a arriver a par exemple un tour en 110 secondes...

Elle est intéressante elle permet par exemple d'arrêter le moteur "en douceur" [...] mon objectif me fait a arriver a par exemple un tour en 110 secondes...

Cela fait un grand choc si le moteur lancé à 0.5tr/mn s'arrêtait brusquement?

Pour le coup non ahaha
Ah et j'ai créé un code et je pense bien que c'est une erreure un peu idiote de débutant mais j'ai un message d'érreur "is not declared in this scope"
Tu saurais comment éviter ça je me doutes bien que ça ne doit pas être compliqué !

#include <AccelStepper.h>

AccelStepper stepper; 
int bouton =7;
int etatbouton=0;

void setup()
{  
  Serial.begin (9600);
  pinMode (bouton, INPUT_PULLUP);
   stepper.setMaxSpeed(1000);
   stepper.setSpeed(50);	
}

void loop()
{  
  etatbouton=digitalRead(bouton);
  if (etatbouton==LOW) {
   stepper.runSpeed();
  }
  else{
     stop()
  }
}
}

Re je trifouille pas mal la librairie (enfin a mon niveau) mais je ne trouve pas comment aller dans l'autre sens car même avec une valeur négative aucun changement....
Merci !

stop()

Cette fonction n'est pas définie dans le programme, ni ailleurs. Le compilateur ne sait pas quoi en faire. c'est le sens du message. Je suppose que tu voulais dire

stepper.stop();

Quand il y a une erreur, il faut donner en plus du code le message complet d'erreur, faire un couper coller grâce au bouton "recopier le message d'erreur", ca peut aider beaucoup. Ici le code est petit. Il faut se rappeler que si c'est facile de répondre, on répond, si c'est compliqué parce qu'incomplet, on risque de laisser tomber. Une questin bien documentée a beaucoup plus de chances d'obtenir une réponse.

même avec une valeur négative aucun changement....

sur quelle valeur?

Je pense à la chose suivante: si le moteur tourne toujours dans le même sens, cela peut venir du logiciel (il faut alors que tu donnes le programme qui ne fonctionne pas) ou alors du câblage (il faut alors que tu donnes le câblage fait). Comme en plus le programme dépend du câblage, il vaut mieux dans tous les cas donner les deux. Plus tu donnes de renseignements, plus c'est facile de te répondre et plus de personnes peuvent le faire. Cela m'arrive de ne pas répondre si je n'ai pas assez d'éléments, si je ne comprends pas la question...

Oui je vais faire ça !
Enfaite pour le tour dans l'autre sens j'ai fais :

stepper.setSpeed(-100);
stepper.runSpeed();

Je vous envois le code et le cablage juste apres ! (j'ai modifié le code)

#include <AccelStepper.h>

AccelStepper stepper; 
int bouton=7;
int etatbouton=0;
int led=12;

void setup()
{  
  Serial.begin(9600);
  pinMode (bouton, INPUT_PULLUP);
  pinMode (led, OUTPUT);
   stepper.setMaxSpeed(500.0);
    stepper.setAcceleration(200.0);
    stepper.moveTo(100);
}

void loop()
{   
  etatbouton=digitalRead(bouton);
  if (etatbouton==HIGH){
    digitalWrite(led, HIGH);
    stepper.setSpeed(100);
   stepper.runSpeed();
  }
  else{
    digitalWrite(led, LOW);
    stepper.stop();
  }
   
   
  
}

Et le code marche !

Alors mon objectif final est après calculs et en se basant sur le fait qu'il y a 2038 dans le moteur de faire 553.8 pas/minute mais quand j'éxecute ce code le moteur se bloque...

#include <AccelStepper.h>

AccelStepper stepper; 
int bouton=7;
int etatbouton=0;
int led=12;

void setup()
{  
  Serial.begin(9600);
  pinMode (bouton, INPUT_PULLUP);
  pinMode (led, OUTPUT);
   stepper.setMaxSpeed(1000);
    stepper.setAcceleration(200.0);
    stepper.moveTo(100);
}

void loop()
{   
  etatbouton=digitalRead(bouton);
  if (etatbouton==HIGH){
    digitalWrite(led, HIGH);
    stepper.setSpeed(553.8);
   stepper.runSpeed();
  }
  else{
    digitalWrite(led, LOW);
    stepper.stop();
  }
   
   
  
}
stepper.setSpeed(553.8);

C'est des pas par seconde et pas par minutes. Ton moteur si je suppose que c'est un 28BYJ-48 ne peut pas tourner à cette vitesse et se bloque. Essaie

stepper.setSpeed(553.8 / 60);

Ce devrait aller mieux

Merci !! Ca marche je reviendrais vers vous si j'ai d'autres problèmes !
Votre projet est de créer un orgue de barbarie si j'ai bien compris??

Au départ... Mais les étapes intermédiaires sont trop intéressantes.

Je pense bien !
Et aussi comment pouvons faire un mouvement dans le sens inverse?
Je n'y arrive pas...

J'ai fais ca mais ca ne marche pas du tout... Problème de branchements??

#include <AccelStepper.h>

AccelStepper stepper; 
int bouton=7;
int etatbouton=0;
int bouton1=9;
int etatbouton1=0;
int led=12;
int led1=11;
int led2=6;

void setup()
{  
  Serial.begin(9600);
  pinMode (bouton, INPUT_PULLUP);
  pinMode (bouton1, INPUT_PULLUP);
  pinMode (led, OUTPUT);
  pinMode (led1, OUTPUT);
  pinMode (led2, OUTPUT);
   stepper.setMaxSpeed(1000);
    stepper.setAcceleration(200.0);
    stepper.moveTo(100);
}

void loop()
{   
  etatbouton=digitalRead(bouton);
  if (etatbouton==LOW){
    digitalWrite(led1, HIGH);
    digitalWrite(led, LOW);
    digitalWrite(led2, LOW);
    stepper.setSpeed(100);
    stepper.runSpeed();
  }
  else if (etatbouton1==LOW) {
    digitalWrite(led, LOW);
    digitalWrite(led1, LOW);
    digitalWrite(led2, HIGH);
    stepper.setSpeed(-100);
    stepper.runSpeed();
  }
  else {
    digitalWrite(led, HIGH);
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    stepper.setSpeed(553.8 / 60);
    
  }
   
}

Problème de branchements??

Oui par défaut AccelStepper est en 2,3,4 et 5

Remplace

AccelStepper stepper;

par

AccelStepper stepper(FULL4WIRE, 1, 3, 2, 4);

ou

AccelStepper stepper(FULL4WIRE, 1, 2, 3, 4);

Ouïe !

Arduino : 1.8.13 (Windows 10), Carte : "Arduino Nano, ATmega328P"

ConstantSpeed111:5:22: error: 'FULL4WIRE' was not declared in this scope

AccelStepper stepper(FULL4WIRE, 1, 3, 2, 4);

^~~~~~~~~

exit status 1

'FULL4WIRE' was not declared in this scope

Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.