LCDKeypad+tb6600+arduinomega

bonjour,
j'ai besoin d'aide afin de faire fonctionner mon moteur PàP en manuel avec les touches UP et DOWN du clavier intégré à l’écran LCD.


#include <LCDKeypad.h>
#include <AccelStepper.h> 
LCDKeypad lcdKeypad;
enum {
  BUTTON_NONE,
  BUTTON_UP,
  BUTTON_DOWN,
  BUTTON_LEFT,
  BUTTON_RIGHT,
  BUTTON_SELECT,};
const int btnsPin  = A0;
int btnsVal  = 0;
#define dirPin 22 //DIR+
#define stepPin 24 //PUL+
#define motorInterfaceType 1
AccelStepper stepper = AccelStepper ( AccelStepper::DRIVER, stepPin, dirPin) ;
const int stepsPerRevolution = 400;                 // Nombre de pas du servomoteur

long initial_homing = -100000;                      // utilisé pour le Home 

//Deinition des PIN pour les switchs
const int FDC_Home = 42;                            // pin 42 fin de course écartement mini

// Definition des PIN voyant
const int led_verte = 34;                           // pin 34 led verte
const int led_rouge = 32;                           // pin 32 led rouge

void setup(){{
  Serial.begin(115200);
    pinMode(stepPin, OUTPUT);                       //pin 24 PUL+ 
    pinMode(dirPin, OUTPUT);                        //pin 22 DIR+ 
    pinMode(FDC_Home, INPUT_PULLUP);                // pin 42 fin de course écartement mini
    pinMode(led_rouge, OUTPUT);                     // pin 32 led rouge defaut ou attendre
    pinMode(led_verte, OUTPUT);                     // pin 34 led vertevoyant ok 
  
  lcdKeypad.begin();   
  lcdKeypad.ecran.ecrire("Hello lolo",3,0);
  lcdKeypad.ecran.ecrire("ATTENDRE",4,1);
    delay(1000);
}
                                                    // Debut procedure de positionnement du prehensseur
  stepper.setMaxSpeed(1400.0);
  stepper.setAcceleration(800.0);
  
    digitalWrite(led_rouge, 1);

  lcdKeypad.ecran.effacer(1);
  lcdKeypad.ecran.ecrire("Positionnement",1,0);
  lcdKeypad.ecran.ecrire("initial en cours",0,1);
        
while (digitalRead(FDC_Home)) {                     // Fait tourner le moteur jusqu'à ce que le fdc soit activé
  stepper.moveTo(initial_homing);                   // Definit a quelle position bouger    
  stepper.run();                                    // Demarre le moteur
}
  stepper.setCurrentPosition(0);                    // Definit la position courante à O pas
  initial_homing = 1;

while (!digitalRead(FDC_Home)) {                    // Tourne le moteur dans l'autre sens juste pour desactiver le fdc
  stepper.moveTo(initial_homing);
  stepper.run();
  initial_homing++;
    delay(5);
}
  lcdKeypad.ecran.effacer(1);
  lcdKeypad.ecran.ecrire("Positionnement",1,0);
  lcdKeypad.ecran.ecrire("Fini",6,1);
    delay(1000);
    digitalWrite(led_verte, 1);digitalWrite(led_rouge, 0);
    delay(1000);
  lcdKeypad.ecran.effacer(1);
  lcdKeypad.ecran.ecrire("Position",4,0);
  lcdKeypad.ecran.ecrire("sac de 35 a 40cm",0,1);
}
void loop(){
 btnListener(getBtnPressed());
}

void btnListener(byte btnStatus) { /* function btnListener */
  //// Get button value when pressed
  
  switch (btnStatus) {
    case BUTTON_UP:
      lcdKeypad.ecran.effacer(1);
      lcdKeypad.ecran.ecrire("ATTENTION MANU",1,0);
      lcdKeypad.ecran.ecrire("AUGMENTE",4,1);
      break;
      

    case BUTTON_DOWN:
      lcdKeypad.ecran.effacer(1);
      lcdKeypad.ecran.ecrire("ATTENTION MANU",1,0);
      lcdKeypad.ecran.ecrire("REDUIRE",4,1);
      break;

    case BUTTON_LEFT:
      lcdKeypad.ecran.effacer(1);
      lcdKeypad.ecran.ecrire("Position",4,0);
      lcdKeypad.ecran.ecrire("sac de 42 a 45cm",0,1);
      stepper.runToNewPosition(600);
      break;

    case BUTTON_RIGHT:
      lcdKeypad.ecran.effacer(1);
      lcdKeypad.ecran.ecrire("Position",4,0);
      lcdKeypad.ecran.ecrire("sac de 45 a 52cm",0,1);
      stepper.runToNewPosition(700);
      break;

    case BUTTON_SELECT:
      lcdKeypad.ecran.effacer(1);
      lcdKeypad.ecran.ecrire("Position",4,0);
      lcdKeypad.ecran.ecrire("sac de 40 a 42cm",0,1);
      stepper.runToNewPosition(500);
      break;
  }
  delay(100);
  }

byte getBtnPressed() { /* function getBtnPressed */
  //// Get button value when pressed
  btnsVal = analogRead(btnsPin);
  if (btnsVal < 50)
    return BUTTON_RIGHT;
  else if (btnsVal < 250)
    return BUTTON_UP;
  else if (btnsVal < 350)
    return BUTTON_DOWN;
  else if (btnsVal < 450)
    return BUTTON_LEFT;
  else if (btnsVal < 650)
    return BUTTON_SELECT;
  else
    return BUTTON_NONE;
}

j'ai essayé pas mal de truc, au mieux le moteur fait un micro pas une pause un micro pas une pause ...et ainsi de suite.

Capture d’écran 2022-09-15 160935

au depart mon programme fonctionnait bien. mais le clavier à membrane est trop fragile, j'ai voulu passer au LCDKeypad (pas simple pour moi :slight_smile: )
voir Projet prehenseur votre avis compte :)

Bonsoir lolo8222

J'ai essayé ton programme sans LCDKeypad.h que je n'ai pas, il n'y a pas d'erreurs quand au mouvements des MPAP, juste ça

	pinMode(stepPin, OUTPUT);                       //pin 24 PUL+
	pinMode(dirPin, OUTPUT);                        //pin 22 DIR+

c'est inutile, c'est AccelStepper qui s'en occupe.

il y a quelques "aménagements" à faire dans la section de démarrage/mise en position de départ, entre autre des stepper.stop();
Voilà comment je verrai la séquence de mise à 0 de la position:

	stepper.moveTo(initial_homing);                   // Definit a quelle position bouger
	while (digitalRead(FDC_Home)) {                     // Fait tourner le moteur jusqu'à ce que le fdc soit activé
		stepper.run();                                    // Demarre le moteur
	}
	stepper.stop();

	stepper.setCurrentPosition(0);                    // Definit la position courante à O pas
	initial_homing = 1;
	delay(100);
	stepper.moveTo(stepsPerRevolution/4);
	while (!digitalRead(FDC_Home)) {                    // Tourne le moteur dans l'autre sens juste pour desactiver le fdc
		stepper.run();
		initial_homing++;
	}
	stepper.stop();

Cordialement
jpbbricole

bonsoir jpbbricole,
j'ai enlevé les deux lignes pinMode merci pour l'info :slight_smile: j'aime bien apprendre surtout si j'ai moins à ecrire.

j'ai modifié avec les stepper.stop();
je ne vois pas ce que ça change, ça fonctionne aussi. Par contre je veux bien savoir l'utilité même si mon problème n'est pas là :slight_smile:

ha non il y a un truc qui ne va pas, une fois le fin de course atteint le moteur tourne bien dans l'autre sens mais s’arrête trop vite, il n'a pas le temps de se décoller du fin de course. la boucle s’arrête quand même !?
si je triche en changeant stepper.moveTo(stepsPerRevolution/4); par stepper.moveTo(stepsPerRevolution/0.3); j'arrive à me decoller du FDC mais bon c'est pas propre je trouve

Bonsoir lolo8222

Je pense que c'est du a du "graillement" (rebonds) sur le contact, ,

Je ne saurai te détailler, j'ai repris des exemples et c'est ainsi, que pour moi, l'arrêt était le plus efficace. Tout le détail est ici.

Cordialement
jpbbricole

je sais pas j'ai pas de "rebond" avec ma version et ça s’arrête bien dès que je le lâche.

et pour les gens qui comme moi galère avec la langue de Shakespeare AccelStepper: AccelStepper Class Reference

j'arrive pas à me decoller de mon probleme, je suis sur que le truc est tout bete:
j'ai 5 boutons sur une broche analogique A0, j'arrive à lui dire qu'avec un bouton il doit tourner jusqu’à la position x, qu'avec un autre jusqu’à la position y mais je n'arrive pas à le faire tourner en continu dans un sens ou un autre avec un appui long . c'est fou :slight_smile:

Peut-être avec la bibliothèque AnalogKeypad by Makuna, je peux en faire l'essai, demain.

Cordialement
jpbbricole

merci, et bien sur la pression je me là met tout seul je ne l'impose pas ,demain ou plus tard c'est deja hyper sympa de vouloir m'aider MERCI

Bonjour lolo8222

J'ai inséré la bibliothèque AnalogKeypad by Makuna, dans ton programme, les actions suite à pression d'une touche, se passent dans buttonHandler.

Le réglage des touches analogiques se fait dans:

const int KeypadMap[] = {0, 312, 362, 450, 517};

Actuellement, comma action il n'y a que des textes explicatifs, tu peux, ainsi visualiser l'état de la touche pressée. Pour la pression longue, le temps se définit dans:

const uint16_t KeypadHoldTimeMs = 2000;

Attention!! comme j'adapte les entrées/sorties à mon installation, il se peut que j'oublie de les remettre en ordre, alors prudence!!!

#include <AnalogKeypad.h>
#include <LCDKeypad.h>
#include <AccelStepper.h>
LCDKeypad lcdKeypad;
enum {
	BUTTON_NONE,
	BUTTON_UP,
	BUTTON_DOWN,
	BUTTON_LEFT,
	BUTTON_RIGHT,
BUTTON_SELECT,};
//const int btnsPin  = A0;
//int btnsVal  = 0;

const int KeypadMap[] = {0, 312, 362, 450, 517};

const uint16_t KeypadHoldTimeMs = 2000;
const uint8_t KeypadAnalogPin = A0;

AnalogKeypad keypad(KeypadAnalogPin, KeypadMap, countof(KeypadMap), KeypadHoldTimeMs);

#define dirPin 22 //DIR+
#define stepPin 24 //PUL+
#define motorInterfaceType 1
AccelStepper stepper = AccelStepper ( AccelStepper::DRIVER, stepPin, dirPin) ;
const int stepsPerRevolution = 400;                 // Nombre de pas du servomoteur

long initial_homing = -100000;                      // utilisé pour le Home

//Deinition des PIN pour les switchs
const int FDC_Home = 42;                            // pin 42 fin de course écartement mini

// Definition des PIN voyant
const int led_verte = 34;                           // pin 34 led verte
const int led_rouge = 32;                           // pin 32 led rouge

void setup()
{
	Serial.begin(115200);

	pinMode(FDC_Home, INPUT_PULLUP);                // pin 42 fin de course écartement mini
	pinMode(led_rouge, OUTPUT);                     // pin 32 led rouge defaut ou attendre
	pinMode(led_verte, OUTPUT);                     // pin 34 led vertevoyant ok
	
	pinMode(A1, INPUT_PULLUP);
	pinMode(3, INPUT_PULLUP);
	lcdKeypad.begin();
	lcdKeypad.ecran.ecrire("Hello lolo",3,0);
	lcdKeypad.ecran.ecrire("ATTENDRE",4,1);
	delay(1000);

	// Debut procedure de positionnement du prehensseur
	stepper.setMaxSpeed(1400.0);
	stepper.setAcceleration(800.0);

	digitalWrite(led_rouge, 1);

	lcdKeypad.ecran.effacer(1);
	lcdKeypad.ecran.ecrire("Positionnement",1,0);
	lcdKeypad.ecran.ecrire("initial en cours",0,1);

	// Moteur pas à pas au départ
	stepper.moveTo(initial_homing);                   // Definit a quelle position bouger
	while (digitalRead(FDC_Home)) 
	{                     // Fait tourner le moteur jusqu'à ce que le fdc soit activé
		stepper.run();                                    // Demarre le moteur
	}
	stepper.stop();

	stepper.setCurrentPosition(0);                    // Definit la position courante à O pas
	initial_homing = 1;
	delay(100);
	stepper.moveTo(stepsPerRevolution/4);
	while (!digitalRead(FDC_Home)) 
	{                    // Tourne le moteur dans l'autre sens juste pour desactiver le fdc
		stepper.run();
		initial_homing++;
	}
	stepper.stop();

	// Initialisation écran
	lcdKeypad.ecran.effacer(1);
	lcdKeypad.ecran.ecrire("Positionnement",1,0);
	lcdKeypad.ecran.ecrire("Fini",6,1);
	delay(1000);
	digitalWrite(led_verte, 1);digitalWrite(led_rouge, 0);
	delay(1000);
	lcdKeypad.ecran.effacer(1);
	lcdKeypad.ecran.ecrire("Position",4,0);
	lcdKeypad.ecran.ecrire("sac de 35 a 40cm",0,1);

	Serial.println("Demarrage");
}

void loop()
{
	keypad.loop(buttonHandler);
	//btnListener(getBtnPressed());
}

//void btnListener(byte btnStatus) { /* function btnListener */
	////// Get button value when pressed
	//
	//switch (btnStatus) {
		//case BUTTON_UP:
		////lcdKeypad.ecran.effacer(1);
		////lcdKeypad.ecran.ecrire("ATTENTION MANU",1,0);
		////lcdKeypad.ecran.ecrire("AUGMENTE",4,1);
		//break;
		//
//
		//case BUTTON_DOWN:
		////lcdKeypad.ecran.effacer(1);
		////lcdKeypad.ecran.ecrire("ATTENTION MANU",1,0);
		////lcdKeypad.ecran.ecrire("REDUIRE",4,1);
		//break;
//
		//case BUTTON_LEFT:
		////lcdKeypad.ecran.effacer(1);
		////lcdKeypad.ecran.ecrire("Position",4,0);
		////lcdKeypad.ecran.ecrire("sac de 42 a 45cm",0,1);
		//stepper.runToNewPosition(600);
		//break;
//
		//case BUTTON_RIGHT:
		////lcdKeypad.ecran.effacer(1);
		////lcdKeypad.ecran.ecrire("Position",4,0);
		////lcdKeypad.ecran.ecrire("sac de 45 a 52cm",0,1);
		//stepper.runToNewPosition(700);
		//break;
//
		//case BUTTON_SELECT:
		////lcdKeypad.ecran.effacer(1);
		////lcdKeypad.ecran.ecrire("Position",4,0);
		////lcdKeypad.ecran.ecrire("sac de 40 a 42cm",0,1);
		//stepper.runToNewPosition(500);
		//break;
	//}
	//delay(100);
//}

void buttonHandler(const ButtonParam& param)
{
	Serial.print(param.button);
	Serial.print(" ");
	
	switch (param.state)
	{
		case ButtonState_Up:
		Serial.print("Up");
		break;
		
		case ButtonState_Down:
		Serial.print("Down");
		break;
		
		case ButtonState_Click:
		Serial.print("Click");
		break;
		
		case ButtonState_DoubleClick:
		Serial.print("Double Click");
		break;
		
		case ButtonState_Hold:
		Serial.print("Hold");
		break;
	}
	
	Serial.println();
}

//byte getBtnPressed() { /* function getBtnPressed */
	////// Get button value when pressed
	//btnsVal = 700; //analogRead(btnsPin);
	//if (digitalRead(A1) == LOW)
	//{
		//btnsVal = 45;
	//}
	//if (digitalRead(3) == LOW)
	//{
		//Serial.print("3");
		//btnsVal = 400;
	//}
	//if (btnsVal < 50)
	//return BUTTON_RIGHT;
	//else if (btnsVal < 250)
	//return BUTTON_UP;
	//else if (btnsVal < 350)
	//return BUTTON_DOWN;
	//else if (btnsVal < 450)
	//return BUTTON_LEFT;
	//else if (btnsVal < 650)
	//return BUTTON_SELECT;
	//else
	//return BUTTON_NONE;
//}

Si tu as des questions...

A+
Cordialement
jpbbricole

bonjour Jpbbricole,
Après le setup il ne se passe rien. j'ai essayé sans modif et aussi en modifient

const int KeypadMap[] = {0, 312, 362, 450, 517}; avec la valeur de mes touches.

dans le moniteur série j'ai juste des points d'interrogations à l'envers quand j'appuie sur les touches.

Bonjour lolo8222

Oui, c'est normal

Ce sera à toi a mettre les actions au bon endroit, actions qui seront à transférer de btnListener

As tu bien la console à 115200 ?

A+
Cordialement
jpbbricole

non maintenant oui :slight_smile:
du coup je vois bien sur quelle touche j’appuie
image

comment exploiter le chiffre? parce que toutes les touches sont "Click, Up, Down"

et si je reste appuyé c'est "hold"

Le temps d'appui avant l'action est réglé par
const uint16_t KeypadHoldTimeMs = 2000;
C'est bien ce que tu voulais?
La prochaine étape consiste à "envoyer" la touche ainsi que son état à btnListener, sachant que, dans buttonHandler on a param.button qui donne le numéro du bouton et param.state son état.
Tu peux t'en sortir ou tu veux de l'aide?

A+
Cordialement
jpbbricole

je suis un peu perdu ,je vais essayer...

Bonsoir lolo8222

Pas de souci, je vais te faire un exemple.

Cordialement
jpbbricole

Bonsoir lolo8222

Voilà un exemple, les boutons BUTTON_UP et BUTTON_UP ont un événement Click tandis que les boutons BUTTON_LEFT et BUTTON_RIGHT on un événement Hold (click long , 2 secondes dans l'exemple.(KeypadHoldTimeMs), à toi d'aménager le tout.
Cet exemple n'est pas totalement "nettoyé".

#include <AnalogKeypad.h>
#include <LCDKeypad.h>
#include <AccelStepper.h>
LCDKeypad lcdKeypad;
enum {
	BUTTON_NONE,
	BUTTON_UP,
	BUTTON_DOWN,
	BUTTON_LEFT,
	BUTTON_RIGHT,
BUTTON_SELECT,};
//const int btnsPin  = A0;
//int btnsVal  = 0;

ButtonParam param;
const int KeypadMap[] = {0, 312, 362, 450, 517};

const uint16_t KeypadHoldTimeMs = 2000;
const uint8_t KeypadAnalogPin = A0;

AnalogKeypad keypad(KeypadAnalogPin, KeypadMap, countof(KeypadMap), KeypadHoldTimeMs);

#define dirPin 22 //DIR+
#define stepPin 24 //PUL+
#define motorInterfaceType 1
AccelStepper stepper = AccelStepper ( AccelStepper::DRIVER, stepPin, dirPin) ;
const int stepsPerRevolution = 400;                 // Nombre de pas du servomoteur

long initial_homing = -100000;                      // utilisé pour le Home

//Deinition des PIN pour les switchs
const int FDC_Home = 42;                            // pin 42 fin de course écartement mini

// Definition des PIN voyant
const int led_verte = 34;                           // pin 34 led verte
const int led_rouge = 32;                           // pin 32 led rouge

void setup()
{
	Serial.begin(115200);

	pinMode(FDC_Home, INPUT_PULLUP);                // pin 42 fin de course écartement mini
	pinMode(led_rouge, OUTPUT);                     // pin 32 led rouge defaut ou attendre
	pinMode(led_verte, OUTPUT);                     // pin 34 led vertevoyant ok
	
	pinMode(A1, INPUT_PULLUP);
	pinMode(3, INPUT_PULLUP);
	lcdKeypad.begin();
	lcdKeypad.ecran.ecrire("Hello lolo",3,0);
	lcdKeypad.ecran.ecrire("ATTENDRE",4,1);
	delay(1000);

	// Debut procedure de positionnement du prehensseur
	stepper.setMaxSpeed(1400.0);
	stepper.setAcceleration(800.0);

	digitalWrite(led_rouge, 1);

	lcdKeypad.ecran.effacer(1);
	lcdKeypad.ecran.ecrire("Positionnement",1,0);
	lcdKeypad.ecran.ecrire("initial en cours",0,1);

	//// Moteur pas à pas au départ
	//stepper.moveTo(initial_homing);                   // Definit a quelle position bouger
	//while (digitalRead(FDC_Home)) 
	//{                     // Fait tourner le moteur jusqu'à ce que le fdc soit activé
		//stepper.run();                                    // Demarre le moteur
	//}
	//stepper.stop();
//
	//stepper.setCurrentPosition(0);                    // Definit la position courante à O pas
	//initial_homing = 1;
	//delay(100);
	//stepper.moveTo(stepsPerRevolution/4);
	//while (!digitalRead(FDC_Home)) 
	//{                    // Tourne le moteur dans l'autre sens juste pour desactiver le fdc
		//stepper.run();
		//initial_homing++;
	//}
	//stepper.stop();

	// Initialisation écran
	lcdKeypad.ecran.effacer(1);
	lcdKeypad.ecran.ecrire("Positionnement",1,0);
	lcdKeypad.ecran.ecrire("Fini",6,1);
	delay(1000);
	digitalWrite(led_verte, 1);digitalWrite(led_rouge, 0);
	delay(1000);
	lcdKeypad.ecran.effacer(1);
	lcdKeypad.ecran.ecrire("Position",4,0);
	lcdKeypad.ecran.ecrire("sac de 35 a 40cm",0,1);

	Serial.println("Demarrage");
}

void loop()
{
	keypad.loop(buttonHandler);
}


void buttonHandler(const ButtonParam& param)
{
	Serial.println(param.button);
	
	//switch (param.state)
	//{
		//case ButtonState_Up:
		//Serial.print("Up");
		//break;
		//
		//case ButtonState_Down:
		//Serial.print("Down");
		//break;
		//
		//case ButtonState_Click:
		//Serial.print("Click");
		//break;
		//
		//case ButtonState_DoubleClick:
		//Serial.print("Double Click");
		//break;
		//
		//case ButtonState_Hold:
		//Serial.print("Hold");
		//break;
	//}
	
	Serial.println();
	btnListener(param.button, param.state);
}

void btnListener(byte btnNum, byte btnStatus) 
{ /* function btnListener */
	//// Get button value when pressed
	
	switch (btnNum) {
		case BUTTON_UP:
			if (btnStatus == ButtonState_Click)
			{
				lcdKeypad.ecran.effacer(1);
				lcdKeypad.ecran.ecrire("ATTENTION MANU",1,0);
				lcdKeypad.ecran.ecrire("AUGMENTE",4,1);
				Serial.println("BUTTON_UP Click");
			}
			break;
		case BUTTON_DOWN:
			if (btnStatus == ButtonState_Click)
			{
				lcdKeypad.ecran.effacer(1);
				lcdKeypad.ecran.ecrire("ATTENTION MANU",1,0);
				lcdKeypad.ecran.ecrire("REDUIRE",4,1);
				Serial.println("BUTTON_DOWN Click");
			}
			break;

		case BUTTON_LEFT:
			if (btnStatus == ButtonState_Hold)
			{
				lcdKeypad.ecran.effacer(1);
				lcdKeypad.ecran.ecrire("Position",4,0);
				lcdKeypad.ecran.ecrire("sac de 42 a 45cm",0,1);
				Serial.println("BUTTON_LEFT Hold");
				stepper.runToNewPosition(600);
			}
		break;

		case BUTTON_RIGHT:
			if (btnStatus == ButtonState_Hold)
			{
				lcdKeypad.ecran.effacer(1);
				lcdKeypad.ecran.ecrire("Position",4,0);
				lcdKeypad.ecran.ecrire("sac de 45 a 52cm",0,1);
				Serial.println("BUTTON_RIGHT Hold");
				stepper.runToNewPosition(700);
			}
		break;

		case BUTTON_SELECT:     // Pas dans l'enum !!!
			if (btnStatus == ButtonState_Click)
			{
				lcdKeypad.ecran.effacer(1);
				lcdKeypad.ecran.ecrire("Position",4,0);
				lcdKeypad.ecran.ecrire("sac de 40 a 42cm",0,1);
				Serial.println("BUTTON_RIGHT Click");
				stepper.runToNewPosition(500);
			}
		break;
	}
	delay(100);
}

Pour des raisons pratiques, la partie remise à 0 du moteur, dans setup() est désactivée.

A+
Cordialement
jpbbricole

bonsoir Jpbbricole,

un grand merci à toi pour ton temps, maintenant je connais un peu cette bibliothèque mais malheureusement j'ai toujours le même problème.

je ne peux toujours pas faire fonctionner mon moteur en manu

si je ne lui donne pas une destination précise ça ne fonctionne pas .
Avec stepper.runToNewPosition(***);c'est bon le moteur va à la position
mais avec stepper.moveTo(***)ou stepper.move(***)il n'avance que d'un pas à chaque appui ou saccadé avec un appui long :slightly_frowning_face:

bonne soirée,
cordialement,
lolo