Problème moteur pas à pas

Bonjour,
J’aimerai faire marcher un moteur de cette manière :

  • si la variable est égale à 1, le moteur tourne dans un sens
  • si elle égale à 0, le moteur tourne dans le sens inverse
    La variable est envoyé à Arduino par Python et elle se détermine à partir d’un flux vidéo donc elle change de valeur (ou pas) à chaque frame, elle est donc renvoyé à Arduino pour chaque frame.
    Cependant, durant la prise de valeur de la variable, mon moteur ne bouge pas, il ne répond que lorsque le flux vidéo s’arrête. Je pense que le problème vient du fait que le temps entre 2 envois de la valeur est trop faible pour que le moteur ait le temps de répondre.
    Voici le code Arduino :
#include <Stepper.h>
const int STEPS = 100;
Stepper m_stepper(STEPS, 8,10,9,11); 
int nombre = 0;

void setup() {
  Serial.begin(9600);
  m_stepper.setSpeed(200);
}

void loop() {
  if (Serial.available()) {
    nombre = Serial.parseInt();
    if (nombre == 1) {m_stepper.step(1);}
    if (nombre == 0) {m_stepper.step(-1);}
  }
}

Et le code Python :

var = x
if int(var) < 300 :
    a = 1
if int(var) >= 300 :
    a = 0
ser.write((str(a)+";").encode("utf-8"))

De plus, le sens de rotation du moteur ne change pas alors que mon pas est négatif lorsque nombre = 0.
J’espère que trouverez des solutions à mon problème, merci d’avance.

Essaye avec un delay après les commandes m_stepper.step ...?

Si je mets un time.sleep(1) après le ser.write((str(a)+";").encode("utf-8")) le moteur tourne mais la rotation est donc saccadé. J'aimerai que le moteur tourne de manière continue tant que la variable reste égale à 0 ou 1.

Essaye avec ça :

#include <Stepper.h>
const int STEPS = 100;
Stepper m_stepper(STEPS, 8, 10, 9, 11);
int nombre = 0;
int old_nombre = 2;

void setup() {
  Serial.begin(9600);
  m_stepper.setSpeed(200);
}

void loop() {
  if (Serial.available()) {
    nombre = Serial.parseInt();
    if (nombre != old_nombre) {
      m_stepper.step(2 * nombre - 1); // permet d'éviter le if
      old_nombre = nombre;
    }
  }
}

L’idée c’est de n’envoyer des commandes au moteur que si on change de sens.

J’ai essayé ton programme mais sans succès, je comprends l’intérêt mais je ne pense pas que ce soit ce que je désire faire.
J’ai finalement trouvé une solution à mon problème, pour ceux que ça intéresserait :

#include <Stepper.h>
const int STEPS = 100;
Stepper m_stepper(STEPS, 8,10,9,11); 
int nombre = 0;

void setup() {
  Serial.begin(115200);
  m_stepper.setSpeed(250);
}

void loop() {
    if (Serial.available())
    {
      nombre = Serial.parseInt();
      while (nombre == 1) {
        m_stepper.step(10);
        Serial.flush();
        nombre = Serial.parseInt();}
      while (nombre == 0) {
        m_stepper.step(-10);
        Serial.flush();
        nombre = Serial.parseInt();}
    }
   }

Comme les valeurs envoyées par Python sont très faiblement espacées dans le temps, il n’est pas nécessaire de poser la condition if (Serial.available()) dans les boucle while. Ainsi à chaque frame, la valeur de ‘nombre’ va changer ou rester constante et à chaque itération le moteur va tourner. On obtient ainsi une rotation saccadée mais relativement rapide donc c’est satisfaisant. Pour modifier cette vitesse de rotation, il suffit d’agir sur les valeurs de m_stepper.step(x) et dans la partie setup de la valeur m_stepper.setSpeed(x).
Voilà, merci pour tes réponses lesept !

De rien :slight_smile:
Du coup, je pense que ton loop est équivalent à celui-ci, plus simple :

void loop() {
  if (Serial.available())
  {
    nombre = Serial.parseInt();
    m_stepper.step(20 * nombre - 10);
    Serial.flush();
  }
}

(à tester)

Tu peux le rendre plus explicite en initialisant en début de code :
int vitesse = 10;et changeantm_stepper.step(vitesse*(2 * nombre - 1));