Amélioration de mon code

Voici mon code :

void loop ()

{
digitalWrite(13, HIGH);
pos1();
digitalWrite(13, LOW);
delay (1);
digitalWrite(13, HIGH);
pos2 ();
digitalWrite(13, LOW);
delay (1);
digitalWrite(13, HIGH);
pos3();
digitalWrite(13, LOW);
delay (1);
digitalWrite(13, HIGH);
pos4 ();
digitalWrite(13, LOW);
delay (1);
digitalWrite(13, HIGH);
pos5();
digitalWrite(13, LOW);
delay (1);
digitalWrite(13, HIGH);
pos6 ();
digitalWrite(13, LOW);
delay (1);
digitalWrite(13, HIGH);
pos7();
digitalWrite(13, LOW);
delay (1);
digitalWrite(13, HIGH);
pos8 ();
digitalWrite(13, LOW);
delay (1);
digitalWrite(13, HIGH);
pos7();
digitalWrite(13, LOW);
delay (1);
digitalWrite(13, HIGH);
pos6 ();
digitalWrite(13, LOW);
delay (1);
digitalWrite(13, HIGH);
pos5();
digitalWrite(13, LOW);
delay (1);
digitalWrite(13, HIGH);
pos4 ();
digitalWrite(13, LOW);
delay (1);
digitalWrite(13, HIGH);
pos3();
digitalWrite(13, LOW);
delay (1);
digitalWrite(13, HIGH);
pos2 ();
digitalWrite(13, LOW);
delay (1);
digitalWrite(13, HIGH);
pos1();
digitalWrite(13, LOW);
delay (1);

Quelqu'un aurait une idée de comment l'améliorer sans répéter systématiquement digitalWrite etc ? Avec un système de compteur par exemple ?

J'aimerai ajouter que c'est seulement une question de syntaxe. Je suis noté sur la fonctionnalité de mon programme non pas sur la syntaxe (qui n'est vraiment pas mon fort). Je maitrise peu les fonctionnalités du C mais j'arrive à m'en sortir. C'est donc seulement une question de présentation

hello teste ça( attention il t’appartient de vérifier que tu commandes bien les bons enroulement dans tes pos, je n’ai fais que repiquer ce que tu nous a déjà posté
tiens nous au courant

#include <Stepper.h>

int laser = 13;

Stepper moteur(85, 2, 3, 4, 5);
int A = 2;
int B = 3;
int C = 4;
int D = 5;
void setup() {
  // put your setup code here, to run once:

}

void pos(int position) 
{
if (position == 1) {digitalWrite(A, HIGH); digitalWrite(B, LOW);digitalWrite(C, LOW);digitalWrite(D, LOW);}
if (position == 2) {digitalWrite(A, HIGH);digitalWrite(B, LOW);digitalWrite(C, HIGH);digitalWrite(D, LOW);}
if (position == 3) {digitalWrite(A, LOW);digitalWrite(B, LOW);digitalWrite(C, HIGH);digitalWrite(D, LOW);}
if (position == 4) {digitalWrite(A, LOW);digitalWrite(B, HIGH);digitalWrite(C, HIGH);digitalWrite(D, LOW);}
if (position == 5) {digitalWrite(A, LOW);digitalWrite(B, HIGH);digitalWrite(C, LOW);digitalWrite(D, LOW);}
if (position == 6) {digitalWrite(A, LOW);digitalWrite(B, HIGH);digitalWrite(C, LOW);digitalWrite(D, HIGH);}
if (position == 7) {digitalWrite(A, LOW);digitalWrite(B, LOW);digitalWrite(C, LOW);digitalWrite(D, HIGH);}
if (position == 8) {digitalWrite(A, HIGH);digitalWrite(B, LOW);digitalWrite(C, LOW);digitalWrite(D, HIGH);}
}
  void loop ()

  {
    for (int f = 1; f < 9; f++)
    {
      digitalWrite(13, HIGH);
      pos(f);
      digitalWrite(13, LOW);
      delay(100);
    }
  }

je m'en vais tester ça, je te remercie :wink:

Mais as-tu pris en compte que le moteur doit faire :

POS1
POS2
POS3
4
5
6
7
6
5
4
3
2
1
2
3
4
5
6
7
6
5

ETC.
?

non

tu pouvais ouvrir le prog “1 pas à la fois” dans les exemple de la bibliothèque “stepper”

#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);
}

remplace la boucle “Loop” par ça:

void loop ()

  {
    for (int f = 1; f < 9; f++)
    {
      digitalWrite(13, HIGH);
      pos(f);
      digitalWrite(13, LOW);
      delay(5);                  
    }
    for (int f = 7; f > 0; f--)// 7 et non 8 car le 8 est fait pas la boucle "for" montante
    {
      digitalWrite(13, HIGH);
      pos(f);
      digitalWrite(13, LOW);
      delay(5);
    }
    
  }

Merci beaucoup :slight_smile:

Question dans ta boucle :

for (int f = 1; f < 9; f++)
    {
      digitalWrite(13, HIGH);
      pos(f);
      digitalWrite(13, LOW);
      delay(5);                  
    }

Pourquoi f<9 ?

tes pos vont bien de 1 à 8 ?
donc f>9 ==> f=8 maxi

nota: comme tu n’utilise pas la librairie stepper,
tu peux virer les lignes:
//#include <Stepper.h>
//Stepper moteur(85, 2, 3, 4, 5);

J’ai encore besoin d’aide dfgh :

j’ai décidé d’utiliser la libraire stepper, j’obtient donc ceci :

#include <Stepper.h>
Stepper moteur(48, 2, 3, 4, 5);
int laser=13;


int A = 2;
int B = 3;
int C = 4;
int D = 5;

void setup() {
  
  moteur.setSpeed(5);
  pinMode (laser, OUTPUT);
  

}

  void loop ()

  {
    for (int f = 1; f < 9; f++)
    {
      digitalWrite(laser, HIGH);
      moteur.step(1);
      digitalWrite(laser, LOW);
      delay(5);                  
    }
    for (int f = 7; f > 0; f--)// 7 et non 8 car le 8 est fait pas la boucle "for" montante
    {
      digitalWrite(laser, HIGH);
      moteur.step(-1);
      digitalWrite(laser, LOW);
      delay(5);
    }
    
  }

Mais je me rend compte qu’à chaque tour de boucle il y a un décalage de 1 pas je pense, ce qui entraine une rotation complète du moteur. Le moteur fait donc 7 pas VD puis 7 pas VG mais en meme temps il fait une rotation complète. Or ce n’est pas ce que je recherche. Aurais tu une idée ?

Ce serait bien de ne pas poser 2 fois les mêmes questions et d'essayer de comprendre un minimum ce que tu fais. Même sans parfaitement maîtriser le C avec un minimum d'effort on est capable de faire une boucle et de ne pas se tromper dans les tests de fin.

Sans compter que ce genre de remarque est plutôt déplacé:

Mais as-tu pris en compte que le moteur doit faire :

On te propose des solutions. C'est à toi de prendre en compte TES contraintes.

teste ça: (mais +1 avec mon voisin du dessus)

#include <Stepper.h>
Stepper moteur(48, 2, 3, 4, 5);//360°/48=7.5°
int laser = 13;

void setup() 
{
  Serial.begin(57600);                      //pour afficher sur moniteur
  moteur.setSpeed(5);
  pinMode (laser, OUTPUT);
}

void loop ()
{
  for (int f = 1; f < 9; f++)
  {
    //Serial.print("boucle 1   f = ");Serial.println(f);
    digitalWrite(laser, HIGH);
    delay(1000);
    digitalWrite(laser, LOW);
    moteur.step(1);
  }
  //Serial.println("");
  for (int f = 8; f > 0; f--)
  {
    moteur.step(-1);
    //Serial.print("boucle 2   f = ");Serial.println(f);
    digitalWrite(laser, HIGH);
    delay(1000);
    digitalWrite(laser, LOW);
  }

}