Switch/ Case avec le clavier. Contrôler plusieurs moteurs avec un potar.

Bonjour à tous,

Je cherche à contrôler deux moteurs pas à pas l’un après l’autre.

Une fois que l’un est bien positionné grâce à un potar, j’aimerais appuyer sur une touche du clavier afin de changer de cas avec “switch/case”, et de contrôler le second moteur avec le meme potar.

J’ai déjà fait le programme qui contrôle les moteurs l’un après l’autre avec des “switch/case” qui dépendent du temps et non du clavier.

#include <Keyboard.h>

///char ctrlKey = KEY_LEFT_GUI; // probleme


//*************MOTEUR PAP

#include <Stepper.h>

#include <AccelStepper.h>
#define HALFSTEP 4 // ou 4 --> 2048
//#define HALFSTEP 8 // ou 4 --> 4096

#define motorPin1  13     // IN1 on the ULN2003 driver 1
#define motorPin2  12    // IN2 on the ULN2003 driver 1
#define motorPin3  11     // IN3 on the ULN2003 driver 1
#define motorPin4  10     // IN4 on the ULN2003 driver 1

#define motor2Pin1  4  // IN1 on the ULN2003 driver 1
#define motor2Pin2  5   // IN2 on the ULN2003 driver 1
#define motor2Pin3  6    // IN3 on the ULN2003 driver 1
#define motor2Pin4  7     // IN4 on the ULN2003 driver 1

AccelStepper stepper(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);
AccelStepper stepper2(HALFSTEP, motor2Pin1, motor2Pin3, motor2Pin2, motor2Pin4);

#define ANALOG_IN A0

int analog_in; // position du potar
int positionX; //  positionX actuelle
int previousX; //  positionX precedente


void setup() {

  // https://www.makerguides.com/28byj-48-stepper-motor-arduino-tutorial/

  stepper.setMaxSpeed(3000);//  15 rpm/ max? 
   stepper.setAcceleration(1000);
   stepper2.setMaxSpeed(3000);//  15 rpm/ max?
   stepper2.setAcceleration(1000);
  
  Serial.begin(115200);
  
}
 
void loop() {

static uint8_t ETAT = 0;
static float reftempsGENERAL = millis();
switch (ETAT) {

case 0:

//Read new position
 analog_in = analogRead(ANALOG_IN);
  
  // Quand le potar est au plus bas --> va à 0, le potar au plus haut --> va au dernier pas à 2048.
  // Donc, il fait un tour complet. 
 positionX= map ( analog_in, 0, 1027,0 , 2048);// 

     stepper.moveTo(positionX);
    stepper.setAcceleration(42000);
    stepper.setSpeed(21000);
    stepper.runSpeedToPosition();

     // remember the previous value of the sensor
  previousX = positionX;
  
  Serial.print ( "A0: " ) , Serial.println ( analog_in );
  Serial.print ( "posX: " ) , Serial.println ( positionX );
  Serial.print ( "previous: " ) , Serial.println ( previousX );

if(millis() - reftempsGENERAL > 5000) { //*4// Il manque 1/2 tour aux moteurs 2,3 et 4
       reftempsGENERAL = millis();
     

      Serial.println ("PASSE AUTRE POTAR");
      
      
     ETAT=1;
     
       }

       break;

case 1:

  analog_in = analogRead(ANALOG_IN);
 
 positionX= map ( analog_in, 0, 1027,0 , 2048);// 
    
      stepper2.setAcceleration(1000);
   // stepper.moveTo(positionVirtuelle);
   stepper2.moveTo(positionX);
  stepper2.setSpeed(1000);
  stepper2.runSpeedToPosition();

   // remember the previous value of the sensor
  previousX = positionX;
  
  Serial.print ( "A0: " ) , Serial.println ( analog_in );
  Serial.print ( "posX: " ) , Serial.println ( positionX );
  Serial.print ( "previous: " ) , Serial.println ( previousX );

if(millis() - reftempsGENERAL > 5000) { 
       reftempsGENERAL = millis();
 
          Serial.println ("PASSE POTAR2");
             ETAT=0;
       }
 break;
  }

De quel clavier s'agit-il ?
Celui du PC ? un keypad ? autre ?

Celui du pc (mac dans mon cas). J'aimerai éviter de passer par Processing.

J'aimerai bien de positionner les moteurs pas à pas avec les flèches du mac, je peux aussi brancher un clavier sur le port usb de la carte Arduino Due.

J'ai trouvé une pseudo solution pas precise avec seulement un potar: j'ai rajouté un case 2 " à vide " pour recentrer le potar entre deux ajustements des moteurs 1 et 2.

Je positionne le moteur1 avec le potar pendant 5 secondes dans le case 0, je recentre le potar pendant 2 sec dans le case 2, je positionne le moteur2 avec le potar pendant 5sec dans le case 1.

Le problème est que en recentrant le potar dans le case 2, le moteur 2 en debut de case 1 va à la position du potar du case 2 et j'ai 5 secondes pour réajuster la position du moteur 2 pas à pas.

Ce serait bien qu'en changeant de cas, la position du moteur ne dependent de la position absolue du potar, et que je puisse finir l'ajustement avec la position relative du potar.

Merci. Je mets le programme

void potarControl() {

static uint8_t ETAT = 0;
static float reftempsGENERAL = millis();
switch (ETAT) {

case 0:

  positionX= previousX;
  
//Read new position
 analog_in = analogRead(ANALOG_IN);
  
 // Quand le potar est au plus bas à va 0, le potar au plus haut va au dernier pas à 2048.
 positionX= map ( analog_in, 0, 1027,0 , 2048);// 

    stepper.moveTo(positionX);
    stepper.setAcceleration(42000);
    stepper.setSpeed(21000);
    stepper.runSpeedToPosition();

     // remember the previous value of the sensor
//  previousX = positionX;
 /* 
  Serial.print ( "A0: " ) , Serial.println ( analog_in );
  Serial.print ( "posX: " ) , Serial.println ( positionX );
  Serial.print ( "previous: " ) , Serial.println ( previousX );
*/
if(millis() - reftempsGENERAL > 5000) { //*4// Il manque 1/2 tour aux moteurs 2,3 et 4
       reftempsGENERAL = millis();
     
   
        Serial.println ("Passe au moteur 2");
          
        previousX = positionX;  
     ETAT=2;
     
       }

       break;

case 1:

  positionX1= previousX1;

  analog_in = analogRead(ANALOG_IN);
  
  // Quand le potar est au plus bas à va 0, le potar au plus haut va au dernier pas à 2048.

 positionX1= map ( analog_in, 0, 1027,0 , 2048);

 
      stepper2.setAcceleration(1000);
   // stepper.moveTo(positionVirtuelle);
   stepper2.moveTo(positionX1);
  stepper2.setSpeed(1000);
  stepper2.runSpeedToPosition();

   // remember the previous value of the sensor
//  previousX = positionX;
 /* 
  Serial.print ( "A0: " ) , Serial.println ( analog_in );
  Serial.print ( "posX: " ) , Serial.println ( positionX );
  Serial.print ( "previous: " ) , Serial.println ( previousX );
*/
if(millis() - reftempsGENERAL > 5000) { // 
       reftempsGENERAL = millis();
   
          Serial.println ("PASSE AU MOTEUR 1");
       

                previousX1 = positionX1;
             ETAT=0;
     
       }
 break;

 case 2:

 // positionX= previousX;

  if(millis() - reftempsGENERAL > 5000) { 
       reftempsGENERAL = millis();

       Serial.println ("Recentre le potar");


      ETAT=1;
  
 }

  }

   }

  

void loop() {
 // potarControl();

  receiveData();

   //analog_in= w4; //(position du moteur simulé allant de vers l'avant de 0 à 4096 qui retourne à 0 au second tour)


  // W4= map ( analog_in, 0, 4096, 0, 4096);

  processingPosition = w4;
  processingPosition1 = w3;


  positionX += computeDeltaPosition(processingPosition);
  positionX1 += computeDeltaPosition1(processingPosition1);

  }

Je n'ai pas compris si tu veux garder la solution du potar ou utiliser le clavier.
Si non, la chose plus simple ( à mon avis ), est d'utiliser 2 (ou 3 ) boutons branchés sur l'arduino.
Avant de poster un code utilise CMD+T (il me semble pour un MAC) dans le IDE.