[Résolu] - Contôler mon moteur pas à pas avec un formulaire

Bonjour à tous,

Je suis débutant dans le monde Arduino.

J'ai pour projet de faire un rail micrométrique motorisé pour mon appareil photo.

Je voudrais passer par mon PC pour définir la vitesse du moteur, le nombre de tours pour faire avancer mon boitier et le nombre de répétitions qui correspondra à mon nombre de clichés à prendre.

J'ai fait mon interface avec Visual Studio 2019 (voir copie d'écran).

J'arrive à déclencher mon moteur en appuyant sur le bouton "Faire tourner" de mon interface.

Par contre, mon moteur tourne en continu.

Je ne sais pas comment indiquer à mon Arduino qu'il ne faut faire que le nombre de tour indiqué

Je vous place mon code ici


//Appel de la bibliothèque pour le moteur pas à pas
#include <Stepper.h>

// Initialisation des paramètres du moteur pas à pas
const int stepsPerRevolution = 32*64;
// Branchement IN1 --> pin6  IN2 --> pin9  IN3 --> pin10  IN4 --> pin11
Stepper myStepper(stepsPerRevolution, 9, 11, 10, 6);

// Déclaration des variables
int idxvitesse;
int idxtours;
int idxrep;

String vitessetxt;
String tourstxt;
String reptxt;
String readInstruction;
String montexte;

int vitesseint;
int toursint;
int repint;

void setup() {
  // put your setup code here, to run once:
  // Ouverture du port série
  Serial.begin(9600);
  // Paramétrage de la LED sur la carte Arduino
  pinMode(13,OUTPUT);

}

void loop() {
  // put your main code here, to run repeatedly:

//Lecture en continu du port série
while (Serial.available()){
  delay(10);
  if(Serial.available()>0){
    char c = Serial.read();
    if (isControl(c)){
      break;
    }
   readInstruction += c;
  }
}

montexte = readInstruction;

idxvitesse = montexte.indexOf("vitesse:");
idxtours = montexte.indexOf("tours:");
idxrep = montexte.indexOf("repetition:");

vitessetxt = montexte.substring(idxvitesse+8,idxtours-1);
vitesseint = vitessetxt.toInt();

tourstxt = montexte.substring(idxtours+6,idxrep-1);
toursint = tourstxt.toInt();

reptxt = montexte.substring(idxrep+11);
repint = reptxt.toInt();

myStepper.setSpeed(vitesseint);
myStepper.step(2048*toursint);

}

En espérant avoir été clair

Si quelqu'un peut me mettre sur la bonne voie, ce serait super sympa :wink:

Merci d'avance

2020-12-24 12_14_47-Window.jpg

2020-12-24 12_14_47-Window.jpg

pour votre programme il faut pouvoir envoyer diverses commandes depuis le PC donc définir une sorte de protocole de communication. Par exemple si une commande se termine par une fin de ligne vous pourriez avoir

GO
STOP
AVANT,nombre
ARRIÈRE,nombre
...

L’arduino lit une lign, décode la commande et exécute l’action

Si vous voulez étudier comment écouter le port série vous pouvez jeter un oeil à mon petit tuto sur le sujet

Au passage, j’ai un autre petit tuto qui pourra peut être aussi vous intéresser: Contrôler son Appareil photo et un Flash Cobra avec Arduino qui montre aussi un petit langage de commande simple

J'ai trouvé ma solution

j'ai ajouté un SerialEvent avec un variable que je passe de true a false à la fin de ma boucle


//Appel de la bibliothèque pour le moteur pas à pas
#include <Stepper.h>

// Initialisation des paramètres du moteur pas à pas
const int stepsPerRevolution = 32*64;
// Branchement IN1 --> pin6  IN2 --> pin9  IN3 --> pin10  IN4 --> pin11
Stepper myStepper(stepsPerRevolution, 9, 11, 10, 6);

// Déclaration des variables
float idxvitesse;
float idxtours;
float idxrep;

String vitessetxt;
String tourstxt;
String reptxt;
String readInstruction;
String montexte;

float vitesseint;
float toursint;
float repint;

String inputString = "";         // a String to hold incoming data
bool stringComplete = false;  // whether the string is complete

void setup() {
  // put your setup code here, to run once:
  // Ouverture du port série
  Serial.begin(9600);
  // Paramétrage de la LED sur la carte Arduino
  pinMode(13,OUTPUT);

}

void loop() {
  // put your main code here, to run repeatedly:

// print the string when a newline arrives:
  if (stringComplete) {
    Serial.println(montexte);
      idxvitesse = montexte.indexOf("vitesse:");
      idxtours = montexte.indexOf("tours:");
      idxrep = montexte.indexOf("repetition:");
      
      vitessetxt = montexte.substring(idxvitesse+8,idxtours-1);
      vitesseint = vitessetxt.toFloat();
      
      tourstxt = montexte.substring(idxtours+6,idxrep-1);
      toursint = tourstxt.toFloat();
      
      reptxt = montexte.substring(idxrep+11);
      repint = reptxt.toFloat();
      
      myStepper.setSpeed(vitesseint);
      myStepper.step(2048*toursint);
    // clear the string:
    montexte = "";
    stringComplete = false;
  }
}

void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    montexte += inChar;
    // if the incoming character is a newline, set a flag so the main loop can
    // do something about it:
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}

Merci J-M-L
j'irai voir les tutos pour m'en inspirer :wink: